xref: /netbsd-src/external/gpl3/gdb/dist/sim/testsuite/frv/interrupts/fp_exception-fr550.cgs (revision 4b169a6ba595ae283ca507b26b15fdff40495b1c)
1# frv testcase to generate fp_exception
2# mach: fr550
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 badld. 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
52	set_gr_immed	4,gr20		; PC increment
53badst:	stdfi		fr0,@(sp,0)	; misaligned reg -- slot I0
54	test_gr_immed	1,gr15
55
56	set_spr_addr	ok4,lr
57	set_gr_immed	8,gr20		; PC increment
58	nop.p
59badld:	lddfi		@(sp,0),fr8	; misaligned reg -- slot I1
60	test_gr_immed	2,gr15
61
62	set_spr_addr	ok5,lr
63	set_gr_immed	20,gr20		; PC increment
64	fnegs.p		fr9,fr9
65	fnegs.p		fr9,fr10
66	fnegs.p		fr9,fr11
67pack:	fnegs		fr10,fr12
68	fnegs		fr10,fr13	; packing violation
69	test_gr_immed	3,gr15
70
71	set_spr_addr	ok1,lr
72	set_gr_immed	4,gr20		; PC increment
73bad:	.word		0x83e502c4	; fmadds fr16,fr4,fr1 (unimplemented)
74	test_gr_immed	4,gr15
75
76	and_spr_immed	0xfbffffff,fsr0		; disable div/0 fp_exception
77	set_fr_iimmed	0x7f7f,0xffff,fr0
78	set_fr_iimmed	0x0000,0x0000,fr1
79	fdivs		fr0,fr1,fr2		; div/0 -- no exception
80	test_spr_bits	0x100000,20,0x0,fsr0	; fsr0.qne is never set
81	test_spr_bits	0xfc00,10,0x4,fsr0	; fsr0.aexc is still set
82	test_spr_bits	0xe0000,17,0x0,fsr0	; fsr0.ftt is clear
83
84	set_spr_addr	ok2,lr
85	set_gr_immed	0,gr20			; PC increment
86	or_spr_immed	0x04000000,fsr0		; enable div/0 fp_exception
87	set_fr_iimmed	0xdead,0xbeef,fr2
88div0:	fdivs		fr0,fr1,fr2		; fp_exception - div/0
89	test_fr_iimmed	0xdeadbeef,fr2		; fr2 not updated
90	test_gr_immed	5,gr15
91
92	and_spr_immed	0xfdffffff,fsr0		; disable inexact fp_exception
93	fsqrts		fr32,fr2		; inexact -- no exception
94	test_spr_bits	0x100000,20,0x0,fsr0	; fsr0.qne is never set
95	test_spr_bits	0xfc00,10,0x6,fsr0	; fsr0.aexc is set
96	test_spr_bits	0xe0000,17,0x0,fsr0	; fsr0.ftt is clear
97
98	set_fr_fr	fr2,fr3			; sqrt 2
99	set_fr_iimmed	0xdead,0xbeef,fr2
100	set_spr_addr	ok6,lr
101	or_spr_immed	0x02000000,fsr0		; enable inexact fp_exception
102inxt1:	fsqrts		fr32,fr2		; fp_exception - inexact
103	test_gr_immed	6,gr15			; handler called
104	test_fr_fr	fr2,fr3			; fr2 updated
105
106	set_fr_iimmed	0xdead,0xbeef,fr2
107	set_spr_addr	ok7,lr
108inxt2:	fsqrts		fr32,fr2		; fp_exception - inexact again
109	test_gr_immed	7,gr15			; handler called
110	test_fr_fr	fr2,fr3			; fr2 updated
111
112	pass
113
114; exception handler 1 -- illegal_instruction: bad insn
115ok1:
116	test_spr_immed	1,esfr1			; esr0 active
117	test_spr_bits	0x3e,1,0x5,esr0		; esr0.ec is set
118	test_spr_bits	0x1,0,0x1,esr0		; esr0.valid is set
119	bra		ret
120
121; exception handler 2 - fp_exception: divide by 0
122ok2:
123	test_spr_bits	0x100000,20,0x0,fsr0	; fsr0.qne is clear
124	test_spr_bits	0xe0000,17,0x1,fsr0	; fsr0.ftt is set
125	test_spr_bits	0xfc00,10,0x4,fsr0	; fsr0.aexc is still set
126
127	test_spr_immed	4,esfr1			; esr2 active
128	test_spr_bits	0x3e,1,0xd,esr2		; esr2.ec is set
129	test_spr_bits	0x1,0,0x1,esr2		; esr2.valid is set
130	test_spr_addr	div0,epcr2		; epcr2 is set
131	bra		ret
132
133; exception handler 3 - illegal_instruction: register exception
134ok3:
135	test_spr_immed	1,esfr1			; esr0 active
136	test_spr_bits	0x3e,1,0x5,esr0		; esr0.ec is set
137	test_spr_bits	0x1,0,0x1,esr0		; esr0.valid is set
138	bra		ret
139
140; exception handler 4 - illegal_instruction: register exception
141ok4:
142	test_spr_immed	1,esfr1			; esr0 active
143	test_spr_bits	0x3e,1,0x5,esr0		; esr0.ec is set
144	test_spr_bits	0x1,0,0x1,esr0		; esr0.valid is set
145	bra		ret
146
147; exception handler 5 - illegal_instruction: sequence violation
148ok5:
149	test_spr_immed	1,esfr1			; esr0 active
150	test_spr_bits	0x3e,1,0x5,esr0		; esr0.ec is set
151	test_spr_bits	0x1,0,0x1,esr0		; esr0.valid is set
152	bra		ret
153
154; exception handler 6 - fp_exception: inexact
155ok6:
156	test_spr_bits	0x100000,20,0x0,fsr0	; fsr0.qne is clear
157	test_spr_bits	0xe0000,17,0x1,fsr0	; fsr0.ftt is set
158	test_spr_bits	0xfc00,10,0x6,fsr0	; fsr0.aexc is still set
159
160	test_spr_immed	4,esfr1			; esr2 active
161	test_spr_bits	0x3e,1,0xd,esr2		; esr2.ec is set
162	test_spr_bits	0x1,0,0x1,esr2		; esr2.valid is set
163	test_spr_addr	inxt1,epcr2		; epcr2 is set
164	bra		ret
165
166; exception handler 7 - fp_exception: inexact again
167ok7:
168	test_spr_bits	0x100000,20,0x0,fsr0	; fsr0.qne is clear
169	test_spr_bits	0xe0000,17,0x1,fsr0	; fsr0.ftt is set
170	test_spr_bits	0xfc00,10,0x6,fsr0	; fsr0.aexc is still set
171
172	test_spr_immed	4,esfr1			; esr2 active
173	test_spr_bits	0x3e,1,0xd,esr2		; esr2.ec is set
174	test_spr_bits	0x1,0,0x1,esr2		; esr2.valid is set
175	test_spr_addr	inxt2,epcr2		; epcr2 is set
176	bra		ret
177
178ret:
179	inc_gr_immed	1,gr15
180	movsg		pcsr,gr60
181	add		gr60,gr20,gr60
182	movgs		gr60,pcsr
183	rett		0
184	fail
185
186