summaryrefslogtreecommitdiff
path: root/sim/testsuite/sim/frv/interrupts/fp_exception.cgs
blob: 710b5baa129a3606f8e25fd8c7e2eb88e48490b6 (plain)
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
# 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

	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
	stdfi		fr1,@(sp,0)	; misaligned reg -- slot I0
	test_gr_immed	1,gr15

	set_spr_addr	ok4,lr
	nop.p
	lddfi		@(sp,0),fr9	; 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:	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