1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
# frv testcase to generate fp_exception
# mach: fr500
.include "testutils.inc"
float_constants
start
load_float_constants
.global align
align:
; clear the packing bit if the insn at 'pack:'. We can't simply use
; '.p' because the assembler will catch the error.
set_gr_mem pack,gr10
and_gr_immed 0x7fffffff,gr10
set_mem_gr gr10,pack
set_gr_addr pack,gr10
flush_data_cache gr10
; Make the the source register number odd at badst. We can't simply
; code an odd register number because the assembler will catch the
; error.
set_gr_mem badst,gr10
or_gr_immed 0x02000000,gr10
set_mem_gr gr10,badst
set_gr_addr badst,gr10
flush_data_cache gr10
; Make the the dest register number odd at ld. We can't simply
; code an odd register number because the assembler will catch the
; error.
set_gr_mem badld,gr10
or_gr_immed 0x02000000,gr10
set_mem_gr gr10,badld
set_gr_addr badld,gr10
flush_data_cache gr10
and_spr_immed -4081,tbr ; clear tbr.tt
set_gr_spr tbr,gr17
inc_gr_immed 0x070,gr17 ; address of exception handler
set_bctrlr_0_0 gr17
inc_gr_immed 0x060,gr17 ; address of exception handler
set_bctrlr_0_0 gr17
set_spr_immed 128,lcr
set_spr_addr ok1,lr
set_psr_et 1
inc_gr_immed -4,sp ; for alignment
set_gr_immed 0,gr20 ; PC increment
set_gr_immed 0,gr15
set_spr_addr ok3,lr
badst: stdfi fr0,@(sp,0) ; misaligned reg -- slot I0
test_gr_immed 1,gr15
set_spr_addr ok4,lr
nop.p
badld: lddfi @(sp,0),fr8 ; misaligned reg -- slot I1
test_gr_immed 2,gr15
set_spr_addr ok5,lr
fnegs.p fr9,fr9
pack: fnegs fr10,fr10
fnegs fr10,fr11 ; packing violation
test_gr_immed 3,gr15
set_spr_addr ok1,lr
set_gr_immed 4,gr20 ; PC increment
bad: .word 0x83e502c4 ; fmadds fr16,fr4,fr1 (unimplemented)
test_gr_immed 4,gr15
and_spr_immed 0xfbffffff,fsr0 ; disable div/0 fp_exception
set_fr_iimmed 0x7f7f,0xffff,fr0
set_fr_iimmed 0x0000,0x0000,fr1
fdivs fr0,fr1,fr2 ; div/0 -- no exception
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is still set
test_spr_bits 0xfc00,10,0x4,fsr0 ; fsr0.aexc is still set
test_spr_bits 0xe0000,17,0x0,fsr0 ; fsr0.ftt is clear
and_spr_immed 0xffefffff,fsr0 ; Clear fsr0.qne
set_spr_addr ok2,lr
set_gr_immed 0,gr20 ; PC increment
or_spr_immed 0x04000000,fsr0 ; enable div/0 fp_exception
set_fr_iimmed 0xdead,0xbeef,fr2
fdivs fr0,fr1,fr2 ; fp_exception - div/0
test_fr_iimmed 0xdeadbeef,fr2 ; fr2 not updated
test_gr_immed 5,gr15
and_spr_immed 0xfdffffff,fsr0 ; disable inexact fp_exception
fsqrts fr32,fr2 ; inexact -- no exception
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is still set
test_spr_bits 0xfc00,10,0x6,fsr0 ; fsr0.aexc is set
test_spr_bits 0xe0000,17,0x0,fsr0 ; fsr0.ftt is clear
set_fr_fr fr2,fr3 ; sqrt 2
set_fr_iimmed 0xdead,0xbeef,fr2
set_spr_addr ok6,lr
or_spr_immed 0x02000000,fsr0 ; enable inexact fp_exception
fsqrts fr32,fr2 ; fp_exception - inexact
test_gr_immed 6,gr15 ; handler called
test_fr_fr fr2,fr3 ; fr2 updated
set_fr_iimmed 0xdead,0xbeef,fr2
set_spr_addr ok7,lr
fsqrts fr32,fr2 ; fp_exception - inexact again
test_gr_immed 7,gr15 ; handler called
test_fr_fr fr2,fr3 ; fr2 updated
pass
; exception handler 1 -- bad insn
ok1:
test_spr_immed 1,esfr1 ; esr0 active
test_spr_bits 0x3e,1,0x5,esr0 ; esr0.ec is set
test_spr_bits 0x1,0,0x1,esr0 ; esr0.valid is set
test_spr_addr bad,epcr0
bra ret
; exception handler 2 - fp_exception: divide by 0
ok2:
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is set
test_spr_bits 0xe0000,17,0x1,fsr0 ; fsr0.ftt is set
test_spr_bits 0xfc00,10,0x4,fsr0 ; fsr0.aexc is still set
test_spr_bits 0x80000000,31,0x0,fqst2 ; fq2.miv is set
test_spr_bits 0x18000,15,0x0,fqst2 ; fq2.sie is set
test_spr_bits 0x380,7,0x1,fqst2 ; fq2.ftt is set
test_spr_bits 0x7e,1,0x4,fqst2 ; fq2.cexc is set
test_spr_bits 0x1,0,0x1,fqst2 ; fq2.valid is set
test_spr_immed 0x85e40241,fqop2 ; fq2.opc
bra ret
; exception handler 3 - fp_exception: register exception
ok3:
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is set
test_spr_bits 0xe0000,17,0x6,fsr0 ; fsr0.ftt is set
test_spr_bits 0xfc00,10,0x0,fsr0 ; fsr0.aexc is clear
test_spr_bits 0x80000000,31,0x0,fqst2 ; fq2.miv is set
test_spr_bits 0x18000,15,0x0,fqst2 ; fq2.sie is set
test_spr_bits 0x380,7,0x6,fqst2 ; fq2.ftt is set
test_spr_bits 0x7e,1,0x0,fqst2 ; fq2.cexc is set
test_spr_bits 0x1,0,0x1,fqst2 ; fq2.valid is set
test_spr_immed 0x83581000,fqop2 ; fq2.opc
bra ret
; exception handler 4 - fp_exception: another register exception
ok4:
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is set
test_spr_bits 0xe0000,17,0x6,fsr0 ; fsr0.ftt is set
test_spr_bits 0xfc00,10,0x0,fsr0 ; fsr0.aexc is still clear
test_spr_bits 0x80000000,31,0x0,fqst3 ; fq3.miv is set
test_spr_bits 0x18000,15,0x0,fqst3 ; fq3.sie is set
test_spr_bits 0x380,7,0x6,fqst3 ; fq3.ftt is set
test_spr_bits 0x7e,1,0x0,fqst3 ; fq3.cexc is set
test_spr_bits 0x1,0,0x1,fqst3 ; fq3.valid is set
test_spr_immed 0x92ec1000,fqop3 ; fq3.opc
bra ret
; exception handler 5 - fp_exception: sequence violation
ok5:
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is set
test_spr_bits 0xe0000,17,0x4,fsr0 ; fsr0.ftt is set
test_spr_bits 0xfc00,10,0x0,fsr0 ; fsr0.aexc is still clear
test_spr_bits 0x80000000,31,0x0,fqst3 ; fq3.miv is set
test_spr_bits 0x18000,15,0x0,fqst3 ; fq3.sie is set
test_spr_bits 0x380,7,0x4,fqst3 ; fq3.ftt is set
test_spr_bits 0x7e,1,0x0,fqst3 ; fq3.cexc is set
test_spr_bits 0x1,0,0x1,fqst3 ; fq3.valid is set
test_spr_immed 0x97e400ca,fqop3 ; fq3.opc
bra ret
; exception handler 6 - fp_exception: inexact
ok6:
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is set
test_spr_bits 0xe0000,17,0x1,fsr0 ; fsr0.ftt is set
test_spr_bits 0xfc00,10,0x6,fsr0 ; fsr0.aexc is still set
test_spr_bits 0x80000000,31,0x0,fqst0 ; fq0.miv is set
test_spr_bits 0x18000,15,0x0,fqst0 ; fq0.sie is set
test_spr_bits 0x380,7,0x1,fqst0 ; fq0.ftt is set
test_spr_bits 0x7e,1,0x2,fqst0 ; fq0.cexc is set
test_spr_bits 0x1,0,0x1,fqst0 ; fq0.valid is set
test_spr_immed 0x85e40160,fqop0 ; fq0.opc
bra ret
; exception handler 7 - fp_exception: inexact again
ok7:
test_spr_bits 0x100000,20,0x1,fsr0 ; fsr0.qne is set
test_spr_bits 0xe0000,17,0x1,fsr0 ; fsr0.ftt is set
test_spr_bits 0xfc00,10,0x6,fsr0 ; fsr0.aexc is still set
test_spr_bits 0x80000000,31,0x0,fqst1 ; fq1.miv is set
test_spr_bits 0x18000,15,0x0,fqst1 ; fq1.sie is set
test_spr_bits 0x380,7,0x1,fqst1 ; fq1.ftt is set
test_spr_bits 0x7e,1,0x2,fqst1 ; fq1.cexc is set
test_spr_bits 0x1,0,0x1,fqst1 ; fq1.valid is set
test_spr_immed 0x85e40160,fqop1 ; fq1.opc
bra ret
ret:
inc_gr_immed 1,gr15
movsg pcsr,gr60
add gr60,gr20,gr60
movgs gr60,pcsr
rett 0
fail
|