Home | History | Annotate | Line # | Download | only in frv
      1      1.1  christos # gr28-gr31, fr31, icc3, fcc3 are used as tmps.
      2      1.1  christos # consider them call clobbered by these macros.
      3      1.1  christos 
      4      1.1  christos 	.macro start
      5      1.1  christos 	.data
      6      1.1  christos failmsg:
      7      1.1  christos 	.ascii "fail\n"
      8      1.1  christos passmsg:
      9      1.1  christos 	.ascii "pass\n"
     10      1.1  christos 	.text
     11      1.1  christos 	.global _start
     12      1.1  christos _start:
     13      1.1  christos 	; enable data and insn caches in copy-back mode
     14      1.1  christos 	; Also enable all registers
     15      1.1  christos 	or_spr_immed	0xc80003c0,hsr0
     16      1.1  christos 	and_spr_immed	0xfffff3ff,hsr0
     17      1.1  christos 
     18      1.1  christos 	; turn on psr.nem, psr.cm, psr.ef, psr.em, psr.esr,
     19      1.1  christos 	; disable external interrupts
     20      1.1  christos 	or_spr_immed	0x69f8,psr
     21      1.1  christos 
     22      1.1  christos 	; If fsr exists, enable all fp_exceptions except inexact
     23      1.1  christos 	movsg		psr,gr28
     24      1.1  christos 	srli		gr28,28,gr28
     25      1.1  christos 	subicc 		gr28,0x2,gr0,icc3 ; is fr400?
     26      1.1  christos 	beq 		icc3,0,nofsr0
     27      1.1  christos 	or_spr_immed	0x3d000000,fsr0
     28      1.1  christos nofsr0:
     29      1.1  christos 
     30      1.1  christos 	; Set the stack pointer
     31      1.1  christos 	sethi.p		0x7,sp
     32      1.1  christos 	setlo		0xfffc,sp	; TODO -- what's a good value for this?
     33      1.1  christos 
     34      1.1  christos 	; Set the TBR address
     35      1.1  christos 	sethi.p		0xf,gr28
     36      1.1  christos 	setlo		0xf000,gr28
     37      1.1  christos 	movgs		gr28,tbr	; TODO -- what's a good value for this?
     38      1.1  christos 
     39      1.1  christos 	; Go to user mode -- causes too many problems
     40      1.1  christos 	;and_spr_immed	0xfffffffb,psr
     41      1.1  christos 	.endm
     42      1.1  christos 
     43      1.1  christos ; Set GR with another GR
     44      1.1  christos 	.macro set_gr_gr src targ
     45      1.1  christos 	addi	\src,0,\targ
     46      1.1  christos 	.endm
     47      1.1  christos 
     48      1.1  christos ; Set GR with immediate value
     49      1.1  christos 	.macro set_gr_immed val reg
     50      1.1  christos 	.if (\val >= -32768) && (\val <= 23767)
     51      1.1  christos 	setlos	\val,\reg
     52      1.1  christos 	.else
     53      1.1  christos 	setlo.p	%lo(\val),\reg
     54      1.1  christos 	sethi	%hi(\val),\reg
     55      1.1  christos 	.endif
     56      1.1  christos 	.endm
     57      1.1  christos 
     58      1.1  christos 	.macro set_gr_limmed valh vall reg
     59      1.1  christos 	sethi.p	\valh,\reg
     60      1.1  christos 	setlo	\vall,\reg
     61      1.1  christos 	.endm
     62      1.1  christos 
     63      1.1  christos ; Set GR with address value
     64      1.1  christos 	.macro set_gr_addr addr reg
     65      1.1  christos 	sethi.p	%hi(\addr),\reg
     66      1.1  christos 	setlo	%lo(\addr),\reg
     67      1.1  christos 	.endm
     68      1.1  christos 
     69      1.1  christos ; Set GR with SPR
     70      1.1  christos 	.macro set_gr_spr src targ
     71      1.1  christos 	movsg	\src,\targ
     72      1.1  christos 	.endm
     73      1.1  christos 
     74      1.1  christos ; Set GR with a value from memory
     75      1.1  christos 	.macro set_gr_mem addr reg
     76      1.1  christos 	set_gr_addr	\addr,gr28
     77      1.1  christos 	ldi		@(gr28,0),\reg
     78      1.1  christos 	.endm
     79      1.1  christos 
     80      1.1  christos ; Increment GR with immediate value
     81      1.1  christos 	.macro inc_gr_immed val reg
     82      1.1  christos 	.if (\val >= -2048) && (\val <= 2047)
     83      1.1  christos 	addi \reg,\val,\reg
     84      1.1  christos 	.else
     85      1.1  christos 	set_gr_immed \val,gr28
     86      1.1  christos 	add \reg,gr28,\reg
     87      1.1  christos 	.endif
     88      1.1  christos 	.endm
     89      1.1  christos 
     90      1.1  christos ; AND GR with immediate value
     91      1.1  christos 	.macro and_gr_immed val reg
     92      1.1  christos 	.if (\val >= -2048) && (\val <= 2047)
     93      1.1  christos 	andi \reg,\val,\reg
     94      1.1  christos 	.else
     95      1.1  christos 	set_gr_immed \val,gr28
     96      1.1  christos 	and \reg,gr28,\reg
     97      1.1  christos 	.endif
     98      1.1  christos 	.endm
     99      1.1  christos 
    100      1.1  christos ; OR GR with immediate value
    101      1.1  christos 	.macro or_gr_immed val reg
    102      1.1  christos 	.if (\val >= -2048) && (\val <= 2047)
    103      1.1  christos 	ori \reg,\val,\reg
    104      1.1  christos 	.else
    105      1.1  christos 	set_gr_immed \val,gr28
    106      1.1  christos 	or \reg,gr28,\reg
    107      1.1  christos 	.endif
    108      1.1  christos 	.endm
    109      1.1  christos 
    110      1.1  christos ; Set FR with another FR
    111      1.1  christos 	.macro set_fr_fr src targ
    112      1.1  christos 	fmovs	\src,\targ
    113      1.1  christos 	.endm
    114      1.1  christos 
    115      1.1  christos ; Set FR with integer immediate value
    116      1.1  christos 	.macro set_fr_iimmed valh vall reg
    117      1.1  christos 	set_gr_limmed	\valh,\vall,gr28
    118      1.1  christos 	movgf		gr28,\reg
    119      1.1  christos 	.endm
    120      1.1  christos 
    121      1.1  christos ; Set FR with integer immediate value
    122      1.1  christos 	.macro set_fr_immed val reg
    123      1.1  christos 	set_gr_immed	\val,gr28
    124      1.1  christos 	movgf		gr28,\reg
    125      1.1  christos 	.endm
    126      1.1  christos 
    127      1.1  christos ; Set FR with a value from memory
    128      1.1  christos 	.macro set_fr_mem addr reg
    129      1.1  christos 	set_gr_addr	\addr,gr28
    130      1.1  christos 	ldfi		@(gr28,0),\reg
    131      1.1  christos 	.endm
    132      1.1  christos 
    133      1.1  christos ; Set double FR with another double FR
    134      1.1  christos 	.macro set_dfr_dfr src targ
    135      1.1  christos 	fmovd	\src,\targ
    136      1.1  christos 	.endm
    137      1.1  christos 
    138      1.1  christos ; Set double FR with a value from memory
    139      1.1  christos 	.macro set_dfr_mem addr reg
    140      1.1  christos 	set_gr_addr	\addr,gr28
    141      1.1  christos 	lddfi		@(gr28,0),\reg
    142      1.1  christos 	.endm
    143      1.1  christos 
    144      1.1  christos ; Set CPR with immediate value
    145      1.1  christos 	.macro set_cpr_immed val reg
    146      1.1  christos 	addi		sp,-4,gr28
    147      1.1  christos 	set_gr_immed	\val,gr29
    148      1.1  christos 	st		gr29,@(gr28,gr0)
    149      1.1  christos 	ldc		@(gr28,gr0),\reg
    150      1.1  christos 	.endm
    151      1.1  christos 
    152      1.1  christos 	.macro set_cpr_limmed valh vall reg
    153      1.1  christos 	addi		sp,-4,gr28
    154      1.1  christos 	set_gr_limmed	\valh,\vall,gr29
    155      1.1  christos 	st		gr29,@(gr28,gr0)
    156      1.1  christos 	ldc		@(gr28,gr0),\reg
    157      1.1  christos 	.endm
    158      1.1  christos 
    159      1.1  christos ; Set SPR with immediate value
    160      1.1  christos 	.macro set_spr_immed val reg
    161      1.1  christos 	set_gr_immed	\val,gr28
    162      1.1  christos 	movgs		gr28,\reg
    163      1.1  christos 	.endm
    164      1.1  christos 
    165      1.1  christos 	.macro set_spr_limmed valh vall reg
    166      1.1  christos 	set_gr_limmed	\valh,\vall,gr28
    167      1.1  christos 	movgs		gr28,\reg
    168      1.1  christos 	.endm
    169      1.1  christos 
    170      1.1  christos 	.macro set_spr_addr addr reg
    171      1.1  christos 	set_gr_addr	\addr,gr28
    172      1.1  christos 	movgs		gr28,\reg
    173      1.1  christos 	.endm
    174      1.1  christos 
    175      1.1  christos ; increment SPR with immediate value
    176      1.1  christos 	.macro inc_spr_immed val reg
    177      1.1  christos 	movsg		\reg,gr28
    178      1.1  christos 	inc_gr_immed 	\val,gr28
    179      1.1  christos 	movgs		gr28,\reg
    180      1.1  christos 	.endm
    181      1.1  christos 
    182      1.1  christos ; OR spr with immediate value
    183      1.1  christos 	.macro or_spr_immed val reg
    184      1.1  christos 	movsg		\reg,gr28
    185      1.1  christos 	set_gr_immed 	\val,gr29
    186      1.1  christos 	or		gr28,gr29,gr28
    187      1.1  christos 	movgs		gr28,\reg
    188      1.1  christos 	.endm
    189      1.1  christos 
    190      1.1  christos ; AND spr with immediate value
    191      1.1  christos 	.macro and_spr_immed val reg
    192      1.1  christos 	movsg		\reg,gr28
    193      1.1  christos 	set_gr_immed 	\val,gr29
    194      1.1  christos 	and		gr28,gr29,gr28
    195      1.1  christos 	movgs		gr28,\reg
    196      1.1  christos 	.endm
    197      1.1  christos 
    198      1.1  christos ; Set accumulator with immediate value
    199      1.1  christos 	.macro set_acc_immed val reg
    200      1.1  christos 	set_fr_immed	\val,fr31
    201      1.1  christos 	mwtacc		fr31,\reg
    202      1.1  christos 	.endm
    203      1.1  christos 
    204      1.1  christos ; Set accumulator guard with immediate value
    205      1.1  christos 	.macro set_accg_immed val reg
    206      1.1  christos 	set_fr_immed	\val,fr31
    207      1.1  christos 	mwtaccg		fr31,\reg
    208      1.1  christos 	.endm
    209      1.1  christos 
    210      1.1  christos ; Set memory with immediate value
    211      1.1  christos 	.macro set_mem_immed val base
    212      1.1  christos 	set_gr_immed	\val,gr28
    213      1.1  christos 	sti		gr28,@(\base,0)
    214      1.1  christos 	.endm
    215      1.1  christos 
    216      1.1  christos 	.macro set_mem_limmed valh vall base
    217      1.1  christos 	set_gr_limmed	\valh,\vall,gr28
    218      1.1  christos 	sti		gr28,@(\base,0)
    219      1.1  christos 	.endm
    220      1.1  christos 
    221      1.1  christos ; Set memory with GR value
    222      1.1  christos 	.macro set_mem_gr reg addr
    223      1.1  christos 	set_gr_addr	\addr,gr28
    224      1.1  christos 	sti		\reg,@(gr28,0)
    225      1.1  christos 	.endm
    226      1.1  christos 
    227      1.1  christos ; Test the value of a general register against another general register
    228      1.1  christos 	.macro test_gr_gr reg1 reg2
    229      1.1  christos 	subcc \reg1,\reg2,gr0,icc3
    230      1.1  christos 	beq icc3,0,test_gr\@
    231      1.1  christos 	fail
    232      1.1  christos test_gr\@:
    233      1.1  christos 	.endm
    234      1.1  christos 
    235      1.1  christos ; Test the value of an immediate against a general register
    236      1.1  christos 	.macro test_gr_immed val reg
    237      1.1  christos 	.if (\val >= -512) && (\val <= 511)
    238      1.1  christos 	subicc \reg,\val,gr0,icc3
    239      1.1  christos 	.else
    240      1.1  christos 	set_gr_immed \val,gr28
    241      1.1  christos 	subcc \reg,gr28,gr0,icc3
    242      1.1  christos 	.endif
    243      1.1  christos 	beq icc3,0,test_gr\@
    244      1.1  christos 	fail
    245      1.1  christos test_gr\@:
    246      1.1  christos 	.endm
    247      1.1  christos 
    248      1.1  christos 	.macro test_gr_limmed valh vall reg
    249      1.1  christos 	set_gr_limmed \valh,\vall,gr28
    250      1.1  christos 	subcc \reg,gr28,gr0,icc3
    251      1.1  christos 	beq icc3,0,test_gr\@
    252      1.1  christos 	fail
    253      1.1  christos test_gr\@:
    254      1.1  christos 	.endm
    255      1.1  christos 
    256      1.1  christos ; Test the value of an floating register against an integer immediate
    257      1.1  christos 	.macro test_fr_limmed valh vall reg
    258      1.1  christos 	movfg		\reg,gr29
    259      1.1  christos 	set_gr_limmed	\valh,\vall,gr28
    260      1.1  christos 	subcc		gr29,gr28,gr0,icc3
    261      1.1  christos 	beq icc3,0,test_gr\@
    262      1.1  christos 	fail
    263      1.1  christos test_gr\@:
    264      1.1  christos 	.endm
    265      1.1  christos 
    266      1.1  christos 	.macro test_fr_iimmed val reg
    267      1.1  christos 	movfg		\reg,gr29
    268      1.1  christos 	set_gr_immed	\val,gr28
    269      1.1  christos 	subcc		gr29,gr28,gr0,icc3
    270      1.1  christos 	beq icc3,0,test_gr\@
    271      1.1  christos 	fail
    272      1.1  christos test_gr\@:
    273      1.1  christos 	.endm
    274      1.1  christos 
    275      1.1  christos ; Test the value of a floating register against another floating point register
    276      1.1  christos 	.macro test_fr_fr reg1 reg2
    277      1.1  christos 	fcmps	\reg1,\reg2,fcc3
    278      1.1  christos 	fbeq 	fcc3,0,test_gr\@
    279      1.1  christos 	fail
    280      1.1  christos test_gr\@:
    281      1.1  christos 	.endm
    282      1.1  christos 
    283      1.1  christos ; Test the value of a double floating register against another
    284      1.1  christos ; double floating point register
    285      1.1  christos 	.macro test_dfr_dfr reg1 reg2
    286      1.1  christos 	fcmpd	\reg1,\reg2,fcc3
    287      1.1  christos 	fbeq 	fcc3,0,test_gr\@
    288      1.1  christos 	fail
    289      1.1  christos test_gr\@:
    290      1.1  christos 	.endm
    291      1.1  christos 
    292      1.1  christos ; Test the value of a special purpose register against an integer immediate
    293      1.1  christos 	.macro test_spr_immed val reg
    294      1.1  christos 	movsg		\reg,gr29
    295      1.1  christos 	set_gr_immed	\val,gr28
    296      1.1  christos 	subcc		gr29,gr28,gr0,icc3
    297      1.1  christos 	beq icc3,0,test_gr\@
    298      1.1  christos 	fail
    299      1.1  christos test_gr\@:
    300      1.1  christos 	.endm
    301      1.1  christos 
    302      1.1  christos 	.macro test_spr_limmed valh vall reg
    303      1.1  christos 	movsg		\reg,gr29
    304      1.1  christos 	set_gr_limmed	\valh,\vall,gr28
    305      1.1  christos 	subcc		gr29,gr28,gr0,icc3
    306      1.1  christos 	beq icc3,0,test_gr\@
    307      1.1  christos 	fail
    308      1.1  christos test_gr\@:
    309      1.1  christos 	.endm
    310      1.1  christos 
    311      1.1  christos 	.macro test_spr_gr spr gr
    312      1.1  christos 	movsg		\spr,gr28
    313      1.1  christos 	test_gr_gr	\gr,gr28
    314      1.1  christos 	.endm
    315      1.1  christos 
    316      1.1  christos 	.macro test_spr_addr addr reg
    317      1.1  christos 	movsg		\reg,gr29
    318      1.1  christos 	set_gr_addr	\addr,gr28
    319      1.1  christos 	test_gr_gr	gr28,gr29
    320      1.1  christos 	.endm
    321      1.1  christos 
    322      1.1  christos ; Test spr bits masked and shifted against the given value
    323      1.1  christos 	.macro test_spr_bits	mask,shift,val,reg
    324      1.1  christos 	movsg		\reg,gr28
    325      1.1  christos 	set_gr_immed 	\mask,gr29
    326      1.1  christos 	and		gr28,gr29,gr28
    327      1.1  christos 	srli		gr28,\shift,gr29
    328      1.1  christos 	test_gr_immed	\val,gr29
    329      1.1  christos 	.endm
    330      1.1  christos 
    331      1.1  christos 
    332      1.1  christos ; Test the value of an accumulator against an integer immediate
    333      1.1  christos 	.macro test_acc_immed val reg
    334      1.1  christos 	mrdacc		\reg,fr31
    335      1.1  christos 	test_fr_iimmed	\val,fr31
    336      1.1  christos 	.endm
    337      1.1  christos 
    338      1.1  christos ; Test the value of an accumulator against an integer immediate
    339      1.1  christos 	.macro test_acc_limmed valh vall reg
    340      1.1  christos 	mrdacc		\reg,fr31
    341      1.1  christos 	test_fr_limmed	\valh,\vall,fr31
    342      1.1  christos 	.endm
    343      1.1  christos 
    344      1.1  christos ; Test the value of an accumulator guard against an integer immediate
    345      1.1  christos 	.macro test_accg_immed val reg
    346      1.1  christos 	mrdaccg		\reg,fr31
    347      1.1  christos 	test_fr_iimmed	\val,fr31
    348      1.1  christos 	.endm
    349      1.1  christos 
    350  1.1.1.2  christos ; Test CPR against an immediate value
    351      1.1  christos 	.macro test_cpr_limmed valh vall reg
    352      1.1  christos 	addi		sp,-4,gr31
    353      1.1  christos 	stc		\reg,@(gr31,gr0)
    354      1.1  christos 	test_mem_limmed	\valh,\vall,gr31
    355      1.1  christos 	.endm
    356      1.1  christos 
    357      1.1  christos ; Test the value of an immediate against memory
    358      1.1  christos 	.macro test_mem_immed val base
    359      1.1  christos 	ldi		@(\base,0),gr29
    360      1.1  christos 	.if (\val >= -512) && (\val <= 511)
    361      1.1  christos 	subicc gr29,\val,gr0,icc3
    362      1.1  christos 	.else
    363      1.1  christos 	set_gr_immed \val,gr28
    364      1.1  christos 	subcc gr29,gr28,gr0,icc3
    365      1.1  christos 	.endif
    366      1.1  christos 	beq icc3,0,test_gr\@
    367      1.1  christos 	fail
    368      1.1  christos test_gr\@:
    369      1.1  christos 	.endm
    370      1.1  christos 
    371      1.1  christos 	.macro test_mem_limmed valh vall base
    372      1.1  christos 	ldi		@(\base,0),gr29
    373      1.1  christos 	set_gr_limmed \valh,\vall,gr28
    374      1.1  christos 	subcc gr29,gr28,gr0,icc3
    375      1.1  christos 	beq icc3,0,test_gr\@
    376      1.1  christos 	fail
    377      1.1  christos test_gr\@:
    378      1.1  christos 	.endm
    379      1.1  christos 
    380      1.1  christos ; Set an integer condition code
    381      1.1  christos 	.macro set_icc mask iccno
    382      1.1  christos 	set_gr_immed	4,gr29
    383      1.1  christos 	smuli		gr29,\iccno,gr30
    384      1.1  christos 	addi		gr31,16,gr31
    385      1.1  christos 	set_gr_immed	0xf,gr28
    386      1.1  christos 	sll		gr28,gr31,gr28
    387      1.1  christos 	not		gr28,gr28
    388      1.1  christos 	movsg		ccr,gr29
    389      1.1  christos 	and		gr28,gr29,gr29
    390      1.1  christos 	set_gr_immed	\mask,gr28
    391      1.1  christos 	sll		gr28,gr31,gr28
    392      1.1  christos 	or		gr28,gr29,gr29
    393      1.1  christos 	movgs		gr29,ccr
    394      1.1  christos 	.endm
    395      1.1  christos ; started here
    396      1.1  christos ; Test the condition codes
    397      1.1  christos 	.macro test_icc N Z V C iccno
    398      1.1  christos 	.if (\N == 1)
    399      1.1  christos 	bp   \iccno,0,fail\@
    400      1.1  christos 	.else
    401      1.1  christos 	bn   \iccno,0,fail\@
    402      1.1  christos 	.endif
    403      1.1  christos 	.if (\Z == 1)
    404      1.1  christos 	bne  \iccno,0,fail\@
    405      1.1  christos 	.else
    406      1.1  christos 	beq   \iccno,0,fail\@
    407      1.1  christos 	.endif
    408      1.1  christos 	.if (\V == 1)
    409      1.1  christos 	bnv \iccno,0,fail\@
    410      1.1  christos 	.else
    411      1.1  christos 	bv   \iccno,0,fail\@
    412      1.1  christos 	.endif
    413      1.1  christos 	.if (\C == 1)
    414      1.1  christos 	bnc   \iccno,0,fail\@
    415      1.1  christos 	.else
    416      1.1  christos 	bc   \iccno,0,fail\@
    417      1.1  christos 	.endif
    418      1.1  christos 	bra test_cc\@
    419      1.1  christos fail\@:
    420      1.1  christos 	fail
    421      1.1  christos test_cc\@:
    422      1.1  christos 	.endm
    423      1.1  christos 
    424      1.1  christos ; Set an floating point condition code
    425      1.1  christos 	.macro set_fcc mask fccno
    426      1.1  christos 	set_gr_immed	4,gr29
    427      1.1  christos 	smuli		gr29,\fccno,gr30
    428      1.1  christos 	set_gr_immed	0xf,gr28
    429      1.1  christos 	sll		gr28,gr31,gr28
    430      1.1  christos 	not		gr28,gr28
    431      1.1  christos 	movsg		ccr,gr29
    432      1.1  christos 	and		gr28,gr29,gr29
    433      1.1  christos 	set_gr_immed	\mask,gr28
    434      1.1  christos 	sll		gr28,gr31,gr28
    435      1.1  christos 	or		gr28,gr29,gr29
    436      1.1  christos 	movgs		gr29,ccr
    437      1.1  christos 	.endm
    438      1.1  christos 
    439      1.1  christos ; Test the condition codes
    440      1.1  christos 	.macro test_fcc val fccno
    441      1.1  christos 	set_gr_immed	4,gr29
    442      1.1  christos 	smuli		gr29,\fccno,gr30
    443      1.1  christos 	movsg		ccr,gr29
    444      1.1  christos 	srl		gr29,gr31,gr29
    445      1.1  christos 	andi		gr29,0xf,gr29
    446      1.1  christos 	test_gr_immed	\val,gr29
    447      1.1  christos 	.endm
    448      1.1  christos 
    449      1.1  christos ; Set PSR.ET
    450      1.1  christos 	.macro set_psr_et val
    451      1.1  christos 	movsg		psr,gr28
    452      1.1  christos 	.if (\val == 1)
    453      1.1  christos 	ori		gr28,1,gr28		; Turn on SPR.ET
    454      1.1  christos 	.else
    455      1.1  christos 	andi		gr28,0xfffffffe,gr28	; Turn off SPR.ET
    456      1.1  christos 	.endif
    457      1.1  christos 	movgs		gr28,psr
    458      1.1  christos 	.endm
    459      1.1  christos 
    460      1.1  christos ; Floating point constants
    461      1.1  christos 	.macro float_constants
    462      1.1  christos f0:		.float	0.0
    463      1.1  christos f1:		.float	1.0
    464      1.1  christos f2:		.float	2.0
    465      1.1  christos f3:		.float	3.0
    466      1.1  christos f6:		.float	6.0
    467      1.1  christos f9:		.float	9.0
    468      1.1  christos fn0:		.float	-0.0
    469      1.1  christos fn1:		.float	-1.0
    470      1.1  christos finf:		.long	0x7f800000
    471      1.1  christos fninf:		.long	0xff800000
    472      1.1  christos fmax:		.long	0x7f7fffff
    473      1.1  christos fmin:		.long	0xff7fffff
    474      1.1  christos feps:		.long	0x00400000
    475      1.1  christos fneps:		.long	0x80400000
    476      1.1  christos fnan1:		.long	0x7fc00000
    477      1.1  christos fnan2:		.long	0x7f800001
    478      1.1  christos 	.endm
    479      1.1  christos 
    480      1.1  christos 	.macro double_constants
    481      1.1  christos d0:		.double	0.0
    482      1.1  christos d1:		.double	1.0
    483      1.1  christos d2:		.double	2.0
    484      1.1  christos d3:		.double	3.0
    485      1.1  christos d6:		.double	6.0
    486      1.1  christos d9:		.double	9.0
    487      1.1  christos dn0:		.double	-0.0
    488      1.1  christos dn1:		.double	-1.0
    489      1.1  christos dinf:		.long	0x7ff00000
    490      1.1  christos 		.long	0x00000000
    491      1.1  christos dninf:		.long	0xfff00000
    492      1.1  christos 		.long	0x00000000
    493      1.1  christos dmax:		.long	0x7fefffff
    494      1.1  christos 		.long	0xffffffff
    495      1.1  christos dmin:		.long	0xffefffff
    496      1.1  christos 		.long	0xffffffff
    497      1.1  christos deps:		.long	0x00080000
    498      1.1  christos 		.long	0x00000000
    499      1.1  christos dneps:		.long	0x80080000
    500      1.1  christos 		.long	0x00000000
    501      1.1  christos dnan1:		.long	0x7ff80000
    502      1.1  christos 		.long	0x00000000
    503      1.1  christos dnan2:		.long	0x7ff00000
    504      1.1  christos 		.long	0x00000001
    505      1.1  christos 	.endm
    506      1.1  christos 
    507      1.1  christos ; Load floating point constants
    508      1.1  christos 	.macro load_float_constants
    509      1.1  christos 	set_fr_mem	fninf,fr0
    510      1.1  christos 	set_fr_mem	fmin,fr4
    511      1.1  christos 	set_fr_mem	fn1,fr8
    512      1.1  christos 	set_fr_mem	fneps,fr12
    513      1.1  christos 	set_fr_mem	fn0,fr16
    514      1.1  christos 	set_fr_mem	f0,fr20
    515      1.1  christos 	set_fr_mem	feps,fr24
    516      1.1  christos 	set_fr_mem	f1,fr28
    517      1.1  christos 	set_fr_mem	f2,fr32
    518      1.1  christos 	set_fr_mem	f3,fr36
    519      1.1  christos 	set_fr_mem	f6,fr40
    520      1.1  christos 	set_fr_mem	f9,fr44
    521      1.1  christos 	set_fr_mem	fmax,fr48
    522      1.1  christos 	set_fr_mem	finf,fr52
    523      1.1  christos 	set_fr_mem	fnan1,fr56
    524      1.1  christos 	set_fr_mem	fnan2,fr60
    525      1.1  christos 	.endm
    526      1.1  christos 
    527      1.1  christos 	.macro load_float_constants1
    528      1.1  christos 	set_fr_mem	fninf,fr1
    529      1.1  christos 	set_fr_mem	fmin,fr5
    530      1.1  christos 	set_fr_mem	fn1,fr9
    531      1.1  christos 	set_fr_mem	fneps,fr13
    532      1.1  christos 	set_fr_mem	fn0,fr17
    533      1.1  christos 	set_fr_mem	f0,fr21
    534      1.1  christos 	set_fr_mem	feps,fr25
    535      1.1  christos 	set_fr_mem	f1,fr29
    536      1.1  christos 	set_fr_mem	f2,fr33
    537      1.1  christos 	set_fr_mem	f3,fr37
    538      1.1  christos 	set_fr_mem	f6,fr41
    539      1.1  christos 	set_fr_mem	f9,fr45
    540      1.1  christos 	set_fr_mem	fmax,fr49
    541      1.1  christos 	set_fr_mem	finf,fr53
    542      1.1  christos 	set_fr_mem	fnan1,fr57
    543      1.1  christos 	set_fr_mem	fnan2,fr61
    544      1.1  christos 	.endm
    545      1.1  christos 
    546      1.1  christos 	.macro load_float_constants2
    547      1.1  christos 	set_fr_mem	fninf,fr2
    548      1.1  christos 	set_fr_mem	fmin,fr6
    549      1.1  christos 	set_fr_mem	fn1,fr10
    550      1.1  christos 	set_fr_mem	fneps,fr14
    551      1.1  christos 	set_fr_mem	fn0,fr18
    552      1.1  christos 	set_fr_mem	f0,fr22
    553      1.1  christos 	set_fr_mem	feps,fr26
    554      1.1  christos 	set_fr_mem	f1,fr30
    555      1.1  christos 	set_fr_mem	f2,fr34
    556      1.1  christos 	set_fr_mem	f3,fr38
    557      1.1  christos 	set_fr_mem	f6,fr42
    558      1.1  christos 	set_fr_mem	f9,fr46
    559      1.1  christos 	set_fr_mem	fmax,fr50
    560      1.1  christos 	set_fr_mem	finf,fr54
    561      1.1  christos 	set_fr_mem	fnan1,fr58
    562      1.1  christos 	set_fr_mem	fnan2,fr62
    563      1.1  christos 	.endm
    564      1.1  christos 
    565      1.1  christos 	.macro load_float_constants3
    566      1.1  christos 	set_fr_mem	fninf,fr3
    567      1.1  christos 	set_fr_mem	fmin,fr7
    568      1.1  christos 	set_fr_mem	fn1,fr11
    569      1.1  christos 	set_fr_mem	fneps,fr15
    570      1.1  christos 	set_fr_mem	fn0,fr19
    571      1.1  christos 	set_fr_mem	f0,fr23
    572      1.1  christos 	set_fr_mem	feps,fr27
    573      1.1  christos 	set_fr_mem	f1,fr31
    574      1.1  christos 	set_fr_mem	f2,fr35
    575      1.1  christos 	set_fr_mem	f3,fr39
    576      1.1  christos 	set_fr_mem	f6,fr43
    577      1.1  christos 	set_fr_mem	f9,fr47
    578      1.1  christos 	set_fr_mem	fmax,fr51
    579      1.1  christos 	set_fr_mem	finf,fr55
    580      1.1  christos 	set_fr_mem	fnan1,fr59
    581      1.1  christos 	set_fr_mem	fnan2,fr63
    582      1.1  christos 	.endm
    583      1.1  christos 
    584      1.1  christos 	.macro load_double_constants
    585      1.1  christos 	set_dfr_mem	dninf,fr0
    586      1.1  christos 	set_dfr_mem	dmin,fr4
    587      1.1  christos 	set_dfr_mem	dn1,fr8
    588      1.1  christos 	set_dfr_mem	dneps,fr12
    589      1.1  christos 	set_dfr_mem	dn0,fr16
    590      1.1  christos 	set_dfr_mem	d0,fr20
    591      1.1  christos 	set_dfr_mem	deps,fr24
    592      1.1  christos 	set_dfr_mem	d1,fr28
    593      1.1  christos 	set_dfr_mem	d2,fr32
    594      1.1  christos 	set_dfr_mem	d3,fr36
    595      1.1  christos 	set_dfr_mem	d6,fr40
    596      1.1  christos 	set_dfr_mem	d9,fr44
    597      1.1  christos 	set_dfr_mem	dmax,fr48
    598      1.1  christos 	set_dfr_mem	dinf,fr52
    599      1.1  christos 	set_dfr_mem	dnan1,fr56
    600      1.1  christos 	set_dfr_mem	dnan2,fr60
    601      1.1  christos 	.endm
    602      1.1  christos 
    603      1.1  christos ; Lock the insn cache at the given address
    604      1.1  christos 	.macro lock_insn_cache address
    605      1.1  christos 	icpl		\address,gr0,1
    606      1.1  christos 	.endm
    607      1.1  christos 
    608      1.1  christos ; Lock the data cache at the given address
    609      1.1  christos 	.macro lock_data_cache address
    610      1.1  christos 	dcpl		\address,gr0,1
    611      1.1  christos 	.endm
    612      1.1  christos 
    613      1.1  christos ; Invalidate the data cache at the given address
    614      1.1  christos 	.macro invalidate_data_cache address
    615      1.1  christos 	dci		@(\address,gr0)
    616      1.1  christos 	.endm
    617      1.1  christos 
    618      1.1  christos ; Flush the data cache at the given address
    619      1.1  christos 	.macro flush_data_cache address
    620      1.1  christos 	dcf		@(\address,gr0)
    621      1.1  christos 	.endm
    622      1.1  christos 
    623      1.1  christos ; Write a bctrlr 0,0 insn at the address contained in the given register
    624      1.1  christos 	.macro set_bctrlr_0_0 address
    625      1.1  christos 	set_mem_immed	0x80382000,\address	; bctrlr 0,0
    626      1.1  christos 	flush_data_cache \address
    627      1.1  christos 	.endm
    628      1.1  christos 
    629      1.1  christos ; Exit with return code
    630      1.1  christos 	.macro exit rc
    631      1.1  christos 	setlos		#1,gr7
    632      1.1  christos 	set_gr_immed	\rc,gr8
    633      1.1  christos 	tira		gr0,#0
    634      1.1  christos 	.endm
    635      1.1  christos 
    636      1.1  christos ; Pass the test case
    637      1.1  christos 	.macro pass
    638      1.1  christos pass\@:
    639      1.1  christos 	setlos.p	#5,gr10
    640      1.1  christos 	setlos		#1,gr8
    641      1.1  christos 	setlos		#5,gr7
    642      1.1  christos 	set_gr_addr  	passmsg,gr9
    643      1.1  christos 	tira		gr0,#0
    644      1.1  christos 	exit		#0
    645      1.1  christos 	.endm
    646      1.1  christos 
    647      1.1  christos ; Fail the testcase
    648      1.1  christos 	.macro fail
    649      1.1  christos fail\@:
    650      1.1  christos 	setlos.p	#5,gr10
    651      1.1  christos 	setlos		#1,gr8
    652      1.1  christos 	setlos		#5,gr7
    653      1.1  christos 	set_gr_addr	failmsg,gr9
    654      1.1  christos 	tira		gr0,#0
    655      1.1  christos 	exit		#1
    656      1.1  christos 	.endm
    657