dnl $Id: macros.m4,v 1.2 2007/07/26 22:15:36 drp Exp $
dnl rdth_id // returns thread id in %o1
dnl rdth_id_p // returns thread id in %o1
dnl th_join(instance, shared-counter-asddress, %reg1, %reg2, time-out)
dnl th_sync(instance, shared_counter, timmer)
dnl th_wr_pcontext_p(val13,%reg0,%reg1)
dnl th_wr_scontext_p(val13,%reg0,%reg1)
dnl th_wr_pcontext(val13,%reg0,%reg1)
dnl th_wr_scontext(val13,%reg0,%reg1)
dnl th_setx(val64,%reg0,%reg1,stride)
dnl k_svc[1,2,3,4](func_num, arg1, ...) ! args in %o0, %o1 etc.
define([M4_thread_idx], eval(THREAD_COUNT-1))dnl
define([M4_thread_mask], THREAD_MASK)dnl
define([M4_thread_mask_porta], THREAD_MASK & 0xff)dnl
define([M4_thread_mask_porta], THREAD_MASK )dnl
define([M4_thread_mask64], format([0x%08x%08x],mpeval(THREAD_MASK>>32+0),mpeval(THREAD_MASK&0xffffffff+0)))dnl
define([M4_thread_mask_minus_lsb],[ifelse( [0x]mpeval(THREAD_MASK & 0x00000001,16), 0x1, [0x]mpeval(THREAD_MASK ^ 0x00000001,16),
[0x]mpeval(THREAD_MASK & 0x00000002,16), 0x2, [0x]mpeval(THREAD_MASK ^ 0x00000002,16),
[0x]mpeval(THREAD_MASK & 0x00000004,16), 0x4, [0x]mpeval(THREAD_MASK ^ 0x00000004,16),
[0x]mpeval(THREAD_MASK & 0x00000008,16), 0x8, [0x]mpeval(THREAD_MASK ^ 0x00000008,16),
[0x]mpeval(THREAD_MASK & 0x00000010,16), 0x10, [0x]mpeval(THREAD_MASK ^ 0x00000010,16),
[0x]mpeval(THREAD_MASK & 0x00000020,16), 0x20, [0x]mpeval(THREAD_MASK ^ 0x00000020,16),
[0x]mpeval(THREAD_MASK & 0x00000040,16), 0x40, [0x]mpeval(THREAD_MASK ^ 0x00000040,16),
[0x]mpeval(THREAD_MASK & 0x00000080,16), 0x80, [0x]mpeval(THREAD_MASK ^ 0x00000080,16),
[0x]mpeval(THREAD_MASK & 0x00000100,16), 0x100, [0x]mpeval(THREAD_MASK ^ 0x00000100,16),
[0x]mpeval(THREAD_MASK & 0x00000200,16), 0x200, [0x]mpeval(THREAD_MASK ^ 0x00000200,16),
[0x]mpeval(THREAD_MASK & 0x00000400,16), 0x400, [0x]mpeval(THREAD_MASK ^ 0x00000400,16),
[0x]mpeval(THREAD_MASK & 0x00000800,16), 0x800, [0x]mpeval(THREAD_MASK ^ 0x00000800,16),
[0x]mpeval(THREAD_MASK & 0x00001000,16), 0x1000, [0x]mpeval(THREAD_MASK ^ 0x00001000,16),
[0x]mpeval(THREAD_MASK & 0x00002000,16), 0x2000, [0x]mpeval(THREAD_MASK ^ 0x00002000,16),
[0x]mpeval(THREAD_MASK & 0x00004000,16), 0x4000, [0x]mpeval(THREAD_MASK ^ 0x00004000,16),
[0x]mpeval(THREAD_MASK & 0x00008000,16), 0x8000, [0x]mpeval(THREAD_MASK ^ 0x00008000,16),
[0x]mpeval(THREAD_MASK & 0x00010000,16), 0x10000, [0x]mpeval(THREAD_MASK ^ 0x00010000,16),
[0x]mpeval(THREAD_MASK & 0x00020000,16), 0x20000, [0x]mpeval(THREAD_MASK ^ 0x00020000,16),
[0x]mpeval(THREAD_MASK & 0x00040000,16), 0x40000, [0x]mpeval(THREAD_MASK ^ 0x00040000,16),
[0x]mpeval(THREAD_MASK & 0x00080000,16), 0x80000, [0x]mpeval(THREAD_MASK ^ 0x00080000,16),
[0x]mpeval(THREAD_MASK & 0x00100000,16), 0x100000, [0x]mpeval(THREAD_MASK ^ 0x00100000,16),
[0x]mpeval(THREAD_MASK & 0x00200000,16), 0x200000, [0x]mpeval(THREAD_MASK ^ 0x00200000,16),
[0x]mpeval(THREAD_MASK & 0x00400000,16), 0x400000, [0x]mpeval(THREAD_MASK ^ 0x00400000,16),
[0x]mpeval(THREAD_MASK & 0x00800000,16), 0x800000, [0x]mpeval(THREAD_MASK ^ 0x00800000,16),
[0x]mpeval(THREAD_MASK & 0x01000000,16), 0x1000000, [0x]mpeval(THREAD_MASK ^ 0x01000000,16),
[0x]mpeval(THREAD_MASK & 0x02000000,16), 0x2000000, [0x]mpeval(THREAD_MASK ^ 0x02000000,16),
[0x]mpeval(THREAD_MASK & 0x04000000,16), 0x4000000, [0x]mpeval(THREAD_MASK ^ 0x04000000,16),
[0x]mpeval(THREAD_MASK & 0x08000000,16), 0x8000000, [0x]mpeval(THREAD_MASK ^ 0x08000000,16),
[0x]mpeval(THREAD_MASK & 0x10000000,16), 0x10000000, [0x]mpeval(THREAD_MASK ^ 0x10000000,16),
[0x]mpeval(THREAD_MASK & 0x20000000,16), 0x20000000, [0x]mpeval(THREAD_MASK ^ 0x20000000,16),
[0x]mpeval(THREAD_MASK & 0x40000000,16), 0x40000000, [0x]mpeval(THREAD_MASK ^ 0x40000000,16),
[0x]mpeval(THREAD_MASK & 0x80000000,16), 0x80000000, [0x]mpeval(THREAD_MASK ^ 0x80000000,16),
[0x]mpeval(THREAD_MASK & 0x100000000,16), 0x100000000, [0x]mpeval(THREAD_MASK ^ 0x100000000,16),
[0x]mpeval(THREAD_MASK & 0x200000000,16), 0x200000000, [0x]mpeval(THREAD_MASK ^ 0x200000000,16),
[0x]mpeval(THREAD_MASK & 0x400000000,16), 0x400000000, [0x]mpeval(THREAD_MASK ^ 0x400000000,16),
[0x]mpeval(THREAD_MASK & 0x800000000,16), 0x800000000, [0x]mpeval(THREAD_MASK ^ 0x800000000,16),
[0x]mpeval(THREAD_MASK & 0x1000000000,16), 0x1000000000, [0x]mpeval(THREAD_MASK ^ 0x1000000000,16),
[0x]mpeval(THREAD_MASK & 0x2000000000,16), 0x2000000000, [0x]mpeval(THREAD_MASK ^ 0x2000000000,16),
[0x]mpeval(THREAD_MASK & 0x4000000000,16), 0x4000000000, [0x]mpeval(THREAD_MASK ^ 0x4000000000,16),
[0x]mpeval(THREAD_MASK & 0x8000000000,16), 0x8000000000, [0x]mpeval(THREAD_MASK ^ 0x8000000000,16),
[0x]mpeval(THREAD_MASK & 0x10000000000,16), 0x10000000000, [0x]mpeval(THREAD_MASK ^ 0x10000000000,16),
[0x]mpeval(THREAD_MASK & 0x20000000000,16), 0x20000000000, [0x]mpeval(THREAD_MASK ^ 0x20000000000,16),
[0x]mpeval(THREAD_MASK & 0x40000000000,16), 0x40000000000, [0x]mpeval(THREAD_MASK ^ 0x40000000000,16),
[0x]mpeval(THREAD_MASK & 0x80000000000,16), 0x80000000000, [0x]mpeval(THREAD_MASK ^ 0x80000000000,16),
[0x]mpeval(THREAD_MASK & 0x100000000000,16), 0x100000000000, [0x]mpeval(THREAD_MASK ^ 0x100000000000,16),
[0x]mpeval(THREAD_MASK & 0x200000000000,16), 0x200000000000, [0x]mpeval(THREAD_MASK ^ 0x200000000000,16),
[0x]mpeval(THREAD_MASK & 0x400000000000,16), 0x400000000000, [0x]mpeval(THREAD_MASK ^ 0x400000000000,16),
[0x]mpeval(THREAD_MASK & 0x800000000000,16), 0x800000000000, [0x]mpeval(THREAD_MASK ^ 0x800000000000,16),
[0x]mpeval(THREAD_MASK & 0x1000000000000,16), 0x1000000000000, [0x]mpeval(THREAD_MASK ^ 0x1000000000000,16),
[0x]mpeval(THREAD_MASK & 0x2000000000000,16), 0x2000000000000, [0x]mpeval(THREAD_MASK ^ 0x2000000000000,16),
[0x]mpeval(THREAD_MASK & 0x4000000000000,16), 0x4000000000000, [0x]mpeval(THREAD_MASK ^ 0x4000000000000,16),
[0x]mpeval(THREAD_MASK & 0x8000000000000,16), 0x8000000000000, [0x]mpeval(THREAD_MASK ^ 0x8000000000000,16),
[0x]mpeval(THREAD_MASK & 0x10000000000000,16), 0x10000000000000, [0x]mpeval(THREAD_MASK ^ 0x10000000000000,16),
[0x]mpeval(THREAD_MASK & 0x20000000000000,16), 0x20000000000000, [0x]mpeval(THREAD_MASK ^ 0x20000000000000,16),
[0x]mpeval(THREAD_MASK & 0x40000000000000,16), 0x40000000000000, [0x]mpeval(THREAD_MASK ^ 0x40000000000000,16),
[0x]mpeval(THREAD_MASK & 0x80000000000000,16), 0x80000000000000, [0x]mpeval(THREAD_MASK ^ 0x80000000000000,16),
[0x]mpeval(THREAD_MASK & 0x100000000000000,16), 0x100000000000000, [0x]mpeval(THREAD_MASK ^ 0x100000000000000,16),
[0x]mpeval(THREAD_MASK & 0x200000000000000,16), 0x200000000000000, [0x]mpeval(THREAD_MASK ^ 0x200000000000000,16),
[0x]mpeval(THREAD_MASK & 0x400000000000000,16), 0x400000000000000, [0x]mpeval(THREAD_MASK ^ 0x400000000000000,16),
[0x]mpeval(THREAD_MASK & 0x800000000000000,16), 0x800000000000000, [0x]mpeval(THREAD_MASK ^ 0x800000000000000,16),
[0x]mpeval(THREAD_MASK & 0x1000000000000000,16), 0x1000000000000000, [0x]mpeval(THREAD_MASK ^ 0x1000000000000000,16),
[0x]mpeval(THREAD_MASK & 0x2000000000000000,16), 0x2000000000000000, [0x]mpeval(THREAD_MASK ^ 0x2000000000000000,16),
[0x]mpeval(THREAD_MASK & 0x4000000000000000,16), 0x4000000000000000, [0x]mpeval(THREAD_MASK ^ 0x4000000000000000,16),
[0x]mpeval(THREAD_MASK & 0x8000000000000000,16), 0x8000000000000000, [0x]mpeval(THREAD_MASK ^ 0x8000000000000000,16))])
define([M4_lsb_thread],[ifelse( [0x]mpeval(THREAD_MASK & 0x00000001,16), 0x1, 0x1,
[0x]mpeval(THREAD_MASK & 0x00000002,16), 0x2, 0x2,
[0x]mpeval(THREAD_MASK & 0x00000004,16), 0x4, 0x4,
[0x]mpeval(THREAD_MASK & 0x00000008,16), 0x8, 0x8,
[0x]mpeval(THREAD_MASK & 0x00000010,16), 0x10, 0x10,
[0x]mpeval(THREAD_MASK & 0x00000020,16), 0x20, 0x20,
[0x]mpeval(THREAD_MASK & 0x00000040,16), 0x40, 0x40,
[0x]mpeval(THREAD_MASK & 0x00000080,16), 0x80, 0x80,
[0x]mpeval(THREAD_MASK & 0x00000100,16), 0x100, 0x100,
[0x]mpeval(THREAD_MASK & 0x00000200,16), 0x200, 0x200,
[0x]mpeval(THREAD_MASK & 0x00000400,16), 0x400, 0x400,
[0x]mpeval(THREAD_MASK & 0x00000800,16), 0x800, 0x800,
[0x]mpeval(THREAD_MASK & 0x00001000,16), 0x1000, 0x1000,
[0x]mpeval(THREAD_MASK & 0x00002000,16), 0x2000, 0x2000,
[0x]mpeval(THREAD_MASK & 0x00004000,16), 0x4000, 0x4000,
[0x]mpeval(THREAD_MASK & 0x00008000,16), 0x8000, 0x8000,
[0x]mpeval(THREAD_MASK & 0x00010000,16), 0x10000, 0x10000,
[0x]mpeval(THREAD_MASK & 0x00020000,16), 0x20000, 0x20000,
[0x]mpeval(THREAD_MASK & 0x00040000,16), 0x40000, 0x40000,
[0x]mpeval(THREAD_MASK & 0x00080000,16), 0x80000, 0x80000,
[0x]mpeval(THREAD_MASK & 0x00100000,16), 0x100000, 0x100000,
[0x]mpeval(THREAD_MASK & 0x00200000,16), 0x200000, 0x200000,
[0x]mpeval(THREAD_MASK & 0x00400000,16), 0x400000, 0x400000,
[0x]mpeval(THREAD_MASK & 0x00800000,16), 0x800000, 0x800000,
[0x]mpeval(THREAD_MASK & 0x01000000,16), 0x1000000, 0x1000000,
[0x]mpeval(THREAD_MASK & 0x02000000,16), 0x2000000, 0x2000000,
[0x]mpeval(THREAD_MASK & 0x04000000,16), 0x4000000, 0x4000000,
[0x]mpeval(THREAD_MASK & 0x08000000,16), 0x8000000, 0x8000000,
[0x]mpeval(THREAD_MASK & 0x10000000,16), 0x10000000, 0x10000000,
[0x]mpeval(THREAD_MASK & 0x20000000,16), 0x20000000, 0x20000000,
[0x]mpeval(THREAD_MASK & 0x40000000,16), 0x40000000, 0x40000000,
[0x]mpeval(THREAD_MASK & 0x80000000,16), 0x80000000, 0x80000000,
[0x]mpeval(THREAD_MASK & 0x100000000,16), 0x100000000, 0x100000000,
[0x]mpeval(THREAD_MASK & 0x200000000,16), 0x200000000, 0x200000000,
[0x]mpeval(THREAD_MASK & 0x400000000,16), 0x400000000, 0x400000000,
[0x]mpeval(THREAD_MASK & 0x800000000,16), 0x800000000, 0x800000000,
[0x]mpeval(THREAD_MASK & 0x1000000000,16), 0x1000000000, 0x1000000000,
[0x]mpeval(THREAD_MASK & 0x2000000000,16), 0x2000000000, 0x2000000000,
[0x]mpeval(THREAD_MASK & 0x4000000000,16), 0x4000000000, 0x4000000000,
[0x]mpeval(THREAD_MASK & 0x8000000000,16), 0x8000000000, 0x8000000000,
[0x]mpeval(THREAD_MASK & 0x10000000000,16), 0x10000000000, 0x10000000000,
[0x]mpeval(THREAD_MASK & 0x20000000000,16), 0x20000000000, 0x20000000000,
[0x]mpeval(THREAD_MASK & 0x40000000000,16), 0x40000000000, 0x40000000000,
[0x]mpeval(THREAD_MASK & 0x80000000000,16), 0x80000000000, 0x80000000000,
[0x]mpeval(THREAD_MASK & 0x100000000000,16), 0x100000000000, 0x100000000000,
[0x]mpeval(THREAD_MASK & 0x200000000000,16), 0x200000000000, 0x200000000000,
[0x]mpeval(THREAD_MASK & 0x400000000000,16), 0x400000000000, 0x400000000000,
[0x]mpeval(THREAD_MASK & 0x800000000000,16), 0x800000000000, 0x800000000000,
[0x]mpeval(THREAD_MASK & 0x1000000000000,16), 0x1000000000000, 0x1000000000000,
[0x]mpeval(THREAD_MASK & 0x2000000000000,16), 0x2000000000000, 0x2000000000000,
[0x]mpeval(THREAD_MASK & 0x4000000000000,16), 0x4000000000000, 0x4000000000000,
[0x]mpeval(THREAD_MASK & 0x8000000000000,16), 0x8000000000000, 0x8000000000000,
[0x]mpeval(THREAD_MASK & 0x10000000000000,16), 0x10000000000000, 0x10000000000000,
[0x]mpeval(THREAD_MASK & 0x20000000000000,16), 0x20000000000000, 0x20000000000000,
[0x]mpeval(THREAD_MASK & 0x40000000000000,16), 0x40000000000000, 0x40000000000000,
[0x]mpeval(THREAD_MASK & 0x80000000000000,16), 0x80000000000000, 0x80000000000000,
[0x]mpeval(THREAD_MASK & 0x100000000000000,16), 0x100000000000000, 0x100000000000000,
[0x]mpeval(THREAD_MASK & 0x200000000000000,16), 0x200000000000000, 0x200000000000000,
[0x]mpeval(THREAD_MASK & 0x400000000000000,16), 0x400000000000000, 0x400000000000000,
[0x]mpeval(THREAD_MASK & 0x800000000000000,16), 0x800000000000000, 0x800000000000000,
[0x]mpeval(THREAD_MASK & 0x1000000000000000,16), 0x1000000000000000, 0x1000000000000000,
[0x]mpeval(THREAD_MASK & 0x2000000000000000,16), 0x2000000000000000, 0x2000000000000000,
[0x]mpeval(THREAD_MASK & 0x4000000000000000,16), 0x4000000000000000, 0x4000000000000000,
[0x]mpeval(THREAD_MASK & 0x8000000000000000,16), 0x8000000000000000, 0x8000000000000000)])
define([M4_core_lsb_thread],[ifelse(
[0x]mpeval(0x[$1] & 0x01,16), 0x1, 0x01,
[0x]mpeval(0x[$1] & 0x2,16), 0x2, 0x02,
[0x]mpeval(0x[$1] & 0x4,16), 0x4, 0x04,
[0x]mpeval(0x[$1] & 0x8,16), 0x8, 0x08,
[0x]mpeval(0x[$1] & 0x10,16), 0x10, 0x10,
[0x]mpeval(0x[$1] & 0x20,16), 0x20, 0x20,
[0x]mpeval(0x[$1] & 0x40,16), 0x40, 0x40,
[0x]mpeval(0x[$1] & 0x80,16), 0x80, 0x80,0x00)])
define([M4_core_lsb_mask],
[[0x]mpeval((M4_core_lsb_thread(substr(M4_thread_mask64,2,2))<<56)|
(M4_core_lsb_thread(substr(M4_thread_mask64,4,2))<<48)|
(M4_core_lsb_thread(substr(M4_thread_mask64,6,2))<<40)|
(M4_core_lsb_thread(substr(M4_thread_mask64,8,2))<<32)|
(M4_core_lsb_thread(substr(M4_thread_mask64,10,2))<<24)|
(M4_core_lsb_thread(substr(M4_thread_mask64,12,2))<<16)|
(M4_core_lsb_thread(substr(M4_thread_mask64,14,2))<<8)|
(M4_core_lsb_thread(substr(M4_thread_mask64,16,2))),16)])
#define MT_THREAD_COUNT 8
#define MT_THREAD_COUNT THREAD_COUNT
#define MT_THREAD_MASK THREAD_MASK & 0xff
#define MT_THREAD_COUNT THREAD_COUNT
#define MT_THREAD_MASK THREAD_MASK
define([M4_user_text_idx], eval(MT_THREAD_COUNT-1))dnl
define([M4_user_text_mask], MT_THREAD_MASK)dnl
define([M4_user_text_idx], 0)dnl
define([M4_user_text_mask], 0x00000001)dnl
define([M4_user_data_idx], eval(MT_THREAD_COUNT-1))dnl
define([M4_user_data_mask], MT_THREAD_MASK)dnl
define([M4_user_data_idx], 0)dnl
define([M4_user_data_mask], 0x00000001)dnl
[pushdef([$1], [$2])_forloop([$1], [$2], [$3], [$4])popdef([$1])])dnl
[define([$1], incr($1))_forloop([$1], [$2], [$3], [$4])])])dnl
dnl This macro enumerates from zero to the mask width. It only expands the user's
dnl expression if the corresponding bit in the mask is set to one.
dnl i = index, counts from 0 to mask_width
dnl Usage : foreachbit([i], mask_width, hex_mask, [your code with i as index])
dnl Example: foreachbit([i], 32, 0x88facef6, [[my_label]i ])
[pushdef([$1], 0)_foreachbit([$1], [$2], [$3], [$4])popdef([$1])])dnl
[ifelse(mpeval(($3 >> $1) & 0x1, 16), 1, [$4])[]ifelse($1, [$2], ,
[define([$1], incr($1))_foreachbit([$1], [$2], [$3], [$4])])])dnl
foreachbit([i], 64, M4_lsb_thread, [
define([M4_master_tid],i)
! thread_mask_minus_lsb M4_thread_mask_minus_lsb
! THREAD MASK THREAD_MASK
! thread_mask M4_thread_mask
! thread_mask_pc M4_thread_mask_porta
! user_text_mask M4_user_text_mask
! user_data_mask M4_user_data_mask
! thread_mask64 M4_thread_mask64
! core lsb mask M4_core_lsb_mask
! master thread M4_lsb_thread
! master TID M4_master_tid
! THREAD COUNT THREAD_COUNT
!! TODO: - Fix this macro for N2 & CMP ?
define([start_th_expand],
! THIS NEEDS TO BE FIXED FO N2 ??
! determine if current thread is the bootstrap thread (thread 0)
! if not; skip over all start_th code
! setx 0x9800000830, %g1, %g2
and %l1[[`,']] %g1[[`,']] %l1
srlx %l1[[`,']] 8[[`,']] %l1 ! %l1 has thread ID
brnz %l1[[`,']] skip_start_th
! set up constants for start_th
setx 0x0000010001[[`,']] %g1[[`,']] %g2 ! type=reset traptype=POR
setx 0x9800000800[[`,']] %g1[[`,']] %g3 ! PA of INT_VEC_DIS
foreachbit([i], 64, M4_thread_mask_minus_lsb, [
nop ! $EV trig_pc_d(1,expr(@VA(.RED_EXT_SEC.[[$1_]]eval(i)) + (4*((THREAD_START_X * i) % THREAD_START_Y)), 16, 16)) -> intp(eval(i,16), 1, 1)
mov i*THREAD_STRIDE[[`,']] %g1
sllx %g1[[`,']] 8[[`,']] %g1
or %g1[[`,']] %g2[[`,']] %g1 ! %g1 contains the command for INT_VEC_DIS
stx %g1[[`,']] [[[%g3]]] ! write to INT_VEC_DIS
define([th_expand], start_th_expand(`$1'))dnl
dnl ****************************************
define([start_fork_expand],
foreachbit([i], 64, M4_thread_mask_porta, [
define([start_fork_expand_jmp],
foreachbit([i], 64, M4_thread_mask_porta, [
setx [[$1_]]eval(i)[[, %g2, %g3]]
define([fork_expand], start_fork_expand(`$1'))dnl
define([fork_expand_jmp], start_fork_expand_jmp(`$1'))dnl
dnl ***********************************************************************
dnl These are the non-changequote versions of foreachbit ..
`pushdef(`$1', 0)_foreachbit2(`$1', `$2', `$3', `$4')popdef(`$1')')dnl
`ifelse(mpeval(($3 >> $1) & 0x1, 16), 1, `$4')`'ifelse($1, `$2', ,
`define(`$1', incr($1))_foreachbit2(`$1', `$2', `$3', `$4')')')dnl
`ifelse(eval($1),1,$2`while(`$1',`$2')')')
dnl ***********************************************************************
dnl This Macro will use either setx, set or mov based on the value of
dnl the first argument. Useful when loading a register with a define, so
dnl as to optimize the # of instructions used.. (Jan 2005)
define(best_set_reg2,`ifelse(mpeval(($1 > 0xffffffff),2),1,
mpeval(($1 > 0xfff),2),1,
[set $1, $3], [mov $1, $3]) ')
define(best_set_reg,` ifelse(mpeval(($1 > 0xffffffff),2),1,
mpeval(($1 > 0xfff),2),1,
`set $1, $3', `mov $1, $3') ')
dnl ***********************************************************************
dnl These macros will replace a hexadecimal mask with thread IDs
dnl mask2tid,mask2lstid : of lowest thread set
dnl mask2mstid : of highest thread set
define(mask2tid, `define(`i',0)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',incr(i))')dnl
define(mask2lstid, `define(`i',0)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',incr(i))')dnl
define(mask2mstid, `define(`i',63)while(`mpeval((`$1' >> i) & 0x1,16)!=1' ,`define(`i',decr(i))')dnl
define(`start_threads', th_expand(start_th))dnl
define(`start_threads', `! single thread')dnl
setx sync_thr_counter, %l1, %l0
bne sync_thr_wait_for_all
define(`cmp_sync_threads', `
setx sync_thr_counter, %l1, %l0
best_set_reg(M4_thread_mask, %l1, %l3)
#if (!defined SIXGUNS && defined PORTABLE_CORE)
define(`sync_threads', `! single thread')dnl
define(`cmp_sync_threads', `! single thread')dnl
define(`exit_sync_threads', `
setx exit_sync_thr_counter, %l1, %l0
exit_sync_thr_wait_for_inc:
be exit_sync_thr_wait_for_inc
exit_sync_thr_wait_for_all:
bne exit_sync_thr_wait_for_all
define(`exit_sync_threads', `
dnl: thread-to-get-intp (in hex without 0x), section, label, offset
! $EV trig_pc_d(1,expr(@VA(.$2.$3) + $4, 16, 16)) -> intp($1, 1, 1)
dnl setx [[$1]]+i [[, %g1, %g2]]
dnl read-thread-id from user mode 0..31
dnl read-thread-id from priv mode 0..31
dnl read-thread-id from user mode 0..31
dnl tid2vtid translation for partial cores..
dnl uses g1,g2 temp vars. returns vtid in same reg
dnl as specified in macro
ldxa [%g0]ASI_CMP_CORE, %g2
dnl read-thread-id from priv mode 0..31
ta T_MUTEX_UNLOCK ! GL = 2
stxa $2, [$3] ASI_PRIMARY_CONTEXT_REG
stxa $2, [$3] ASI_SECONDARY_CONTEXT_REG
define(th_wr_pcontext_p, `
stxa $2, [$3] ASI_PRIMARY_CONTEXT_REG
define(th_wr_scontext_p, `
stxa $2, [$3] ASI_SECONDARY_CONTEXT_REG
define(make_reg, `%$1')dnl
define(itlb_demap_ctx_forever, `
bne %xcc, .itlb_demap_ctx_end
! if thread-id == $1; i-tlb-demap; loop
bne %xcc, .itlb_demap_ctx_loop1
define(dtlb_demap_ctx_forever, `
be %xcc, .dtlb_demap_ctx_end
! if thread-id == $1; i-tlb-demap; loop
bne %xcc, .dtlb_demap_ctx_loop1
define(th_clear_barrier, `
define(th_wait_for_barrier_clear, `
! wait_for_barrier_clear_macro
define( `data_size', mpeval($3))
define( `blk_len', mpeval($2))
ifelse(data_size,8,`gen_value',
`errprint(ERROR: "init_mem" data size=data_size is illegal)')')
`ifelse(data_size,8,.xword `0x'mpeval(init_val opr1 sec_val,16,16),
data_size,4,.word `0x'mpeval(init_val opr1 sec_val,16,8),
data_size,2,.half `0x'mpeval(init_val opr1 sec_val,16,4),
data_size,1,.byte `0x'mpeval(init_val opr1 sec_val,16,2)) dnl
ifelse(mpeval(len(opr1)>0),1,`define(`sec_val',`0x'mpeval(sec_val opr2 opnd3,16,16))') dnl
define(`it_count', incr(it_count))
ifelse(mpeval(it_count>blk_len),1,,`gen_value')')
! Compare the strand ID with first parameter and jumps to label if equal.
! Provided for use by CSRDiag tool.
! Usage: JUMP_ 2_THREAD ( strand id, label )
! Example: JUMP_ 2_THREAD( 2, main_thread2 )
! Note: uses the registers %o1, %o2, %o3