1# frv testcase for csdiv $GRi,$GRj,$GRk,$CCi,$cond
2# mach: all
3
4	.include "../testutils.inc"
5
6	start
7
8	.global csdiv
9csdiv:
10	set_spr_immed	0x1b1b,cccr
11
12	; simple division 12 / 3
13	set_gr_immed   	3,gr3
14	set_gr_immed   	12,gr1
15	csdiv      	gr1,gr3,gr2,cc4,1
16	test_gr_immed  	4,gr2
17
18	; Random example
19	set_gr_limmed  	0x0123,0x4567,gr3
20	set_gr_limmed  	0xfedc,0xba98,gr1
21	csdiv      	gr1,gr3,gr2,cc4,1
22	test_gr_immed  	-1,gr2
23
24	; Special case from the Arch Spec Vol 2
25	and_spr_immed	-33,isr		; turn off isr.edem
26	; set up exception handler
27	set_psr_et	1
28	and_spr_immed	-4081,tbr	; clear tbr.tt
29	set_gr_spr	tbr,gr17
30	inc_gr_immed	0x170,gr17	; address of exception handler
31	set_bctrlr_0_0  gr17
32	set_spr_immed	128,lcr
33	set_gr_immed	0,gr15
34
35	; divide will cause overflow
36	set_spr_addr	ok1,lr
37	set_gr_immed  	-1,gr3
38	set_gr_limmed  	0x8000,0x0000,gr1
39e1:	csdiv      	gr1,gr3,gr2,cc4,1
40	test_gr_immed	1,gr15
41	test_gr_limmed 	0x8000,0x0000,gr2
42
43	; Special case from the Arch Spec Vol 2
44	or_spr_immed	0x20,isr	; turn on isr.edem
45	set_gr_immed  	-1,gr3
46	set_gr_limmed  	0x8000,0x0000,gr1
47	csdiv      	gr1,gr3,gr2,cc4,1
48	test_gr_limmed 	0x7fff,0xffff,gr2
49
50	; simple division 12 / 3
51	set_gr_immed   	3,gr3
52	set_gr_immed   	12,gr1
53	csdiv      	gr1,gr3,gr2,cc4,0
54	test_gr_limmed 	0x7fff,0xffff,gr2
55
56	; Random example
57	set_gr_limmed  	0x0123,0x4567,gr3
58	set_gr_limmed  	0xfedc,0xba98,gr1
59	csdiv      	gr1,gr3,gr2,cc4,0
60	test_gr_limmed 	0x7fff,0xffff,gr2
61
62	; Special case from the Arch Spec Vol 2
63	and_spr_immed	-33,isr		; turn off isr.edem
64	set_gr_immed  	-1,gr3
65	set_gr_limmed  	0x8000,0x0000,gr1
66	csdiv      	gr1,gr3,gr2,cc4,0
67	test_gr_limmed 	0x7fff,0xffff,gr2
68
69	or_spr_immed	0x20,isr	; turn on isr.edem
70	set_gr_immed  	-1,gr3
71	set_gr_limmed  	0x8000,0x0000,gr1
72	csdiv      	gr1,gr3,gr2,cc4,0
73	test_gr_limmed 	0x7fff,0xffff,gr2
74
75	; simple division 12 / 3
76	set_gr_immed   	3,gr3
77	set_gr_immed   	12,gr1
78	csdiv      	gr1,gr3,gr2,cc5,0
79	test_gr_immed  	4,gr2
80
81	; Random example
82	set_gr_limmed  	0x0123,0x4567,gr3
83	set_gr_limmed  	0xfedc,0xba98,gr1
84	csdiv      	gr1,gr3,gr2,cc5,0
85	test_gr_immed  	-1,gr2
86
87	; Special case from the Arch Spec Vol 2
88	and_spr_immed	-33,isr		; turn off isr.edem
89	; divide will cause overflow
90	set_spr_addr	ok1,lr
91	set_gr_immed  	-1,gr3
92	set_gr_limmed  	0x8000,0x0000,gr1
93e2:	csdiv      	gr1,gr3,gr2,cc5,0
94	test_gr_immed	2,gr15
95	test_gr_limmed 	0x8000,0x0000,gr2
96
97	; Special case from the Arch Spec Vol 2
98	or_spr_immed	0x20,isr	; turn on isr.edem
99	set_gr_immed  	-1,gr3
100	set_gr_limmed  	0x8000,0x0000,gr1
101	csdiv      	gr1,gr3,gr2,cc5,0
102	test_gr_limmed 	0x7fff,0xffff,gr2
103
104	; simple division 12 / 3
105	set_gr_immed   	3,gr3
106	set_gr_immed   	12,gr1
107	csdiv      	gr1,gr3,gr2,cc5,1
108	test_gr_limmed 	0x7fff,0xffff,gr2
109
110	; Random example
111	set_gr_limmed  	0x0123,0x4567,gr3
112	set_gr_limmed  	0xfedc,0xba98,gr1
113	csdiv      	gr1,gr3,gr2,cc5,1
114	test_gr_limmed 	0x7fff,0xffff,gr2
115
116	; Special case from the Arch Spec Vol 2
117	and_spr_immed	-33,isr		; turn off isr.edem
118	set_gr_immed  	-1,gr3
119	set_gr_limmed  	0x8000,0x0000,gr1
120	csdiv      	gr1,gr3,gr2,cc5,1
121	test_gr_limmed 	0x7fff,0xffff,gr2
122
123	or_spr_immed	0x20,isr	; turn on isr.edem
124	set_gr_immed  	-1,gr3
125	set_gr_limmed  	0x8000,0x0000,gr1
126	csdiv      	gr1,gr3,gr2,cc5,1
127	test_gr_limmed 	0x7fff,0xffff,gr2
128
129	; simple division 12 / 3
130	set_gr_immed   	3,gr3
131	set_gr_immed   	12,gr1
132	csdiv      	gr1,gr3,gr2,cc6,0
133	test_gr_limmed 	0x7fff,0xffff,gr2
134
135	; Random example
136	set_gr_limmed  	0x0123,0x4567,gr3
137	set_gr_limmed  	0xfedc,0xba98,gr1
138	csdiv      	gr1,gr3,gr2,cc6,0
139	test_gr_limmed 	0x7fff,0xffff,gr2
140
141	; Special case from the Arch Spec Vol 2
142	and_spr_immed	-33,isr		; turn off isr.edem
143	set_gr_immed  	-1,gr3
144	set_gr_limmed  	0x8000,0x0000,gr1
145	csdiv      	gr1,gr3,gr2,cc6,0
146	test_gr_limmed 	0x7fff,0xffff,gr2
147
148	or_spr_immed	0x20,isr	; turn on isr.edem
149	set_gr_immed  	-1,gr3
150	set_gr_limmed  	0x8000,0x0000,gr1
151	csdiv      	gr1,gr3,gr2,cc6,0
152	test_gr_limmed 	0x7fff,0xffff,gr2
153
154	; simple division 12 / 3
155	set_gr_immed   	3,gr3
156	set_gr_immed   	12,gr1
157	csdiv      	gr1,gr3,gr2,cc7,1
158	test_gr_limmed 	0x7fff,0xffff,gr2
159
160	; Random example
161	set_gr_limmed  	0x0123,0x4567,gr3
162	set_gr_limmed  	0xfedc,0xba98,gr1
163	csdiv      	gr1,gr3,gr2,cc7,1
164	test_gr_limmed 	0x7fff,0xffff,gr2
165
166	; Special case from the Arch Spec Vol 2
167	and_spr_immed	-33,isr		; turn off isr.edem
168	set_gr_immed  	-1,gr3
169	set_gr_limmed  	0x8000,0x0000,gr1
170	csdiv      	gr1,gr3,gr2,cc7,1
171	test_gr_limmed 	0x7fff,0xffff,gr2
172
173	or_spr_immed	0x20,isr	; turn on isr.edem
174	set_gr_immed  	-1,gr3
175	set_gr_limmed  	0x8000,0x0000,gr1
176	csdiv      	gr1,gr3,gr2,cc7,1
177	test_gr_limmed 	0x7fff,0xffff,gr2
178
179	pass
180
181ok1:	; exception handler for overflow
182	test_spr_bits	0x18,3,0x2,isr		; isr.dtt is set
183	test_spr_bits	0x0001,0,0x1,esr0	; esr0 is valid
184	test_spr_bits	0x003e,1,0x13,esr0	; esr0.ec is set
185	inc_gr_immed	1,gr15
186	rett		0
187	fail
188