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