1# Hitachi H8 testcase 'xor.b'
2# mach(): all
3# as(h8300):	--defsym sim_cpu=0
4# as(h8300h):	--defsym sim_cpu=1
5# as(h8300s):	--defsym sim_cpu=2
6# as(h8sx):	--defsym sim_cpu=3
7# ld(h8300h):	-m h8300helf
8# ld(h8300s):	-m h8300self
9# ld(h8sx):	-m h8300sxelf
10
11	.include "testutils.inc"
12
13	# Instructions tested:
14	# xor.b #xx:8, rd	;                     d rd   xxxxxxxx
15	# xor.b #xx:8, @erd	;         7 d rd ???? d ???? xxxxxxxx
16	# xor.b #xx:8, @erd+	; 0 1 7 4 6 c rd 1??? d ???? xxxxxxxx
17	# xor.b #xx:8, @erd-	; 0 1 7 6 6 c rd 1??? d ???? xxxxxxxx
18	# xor.b #xx:8, @+erd	; 0 1 7 5 6 c rd 1??? d ???? xxxxxxxx
19	# xor.b #xx:8, @-erd	; 0 1 7 7 6 c rd 1??? d ???? xxxxxxxx
20	# xor.b rs, rd		;                     1 5 rs rd
21	# xor.b reg8, @erd	;         7 d rd ???? 1 5 rs ????
22	# xor.b reg8, @erd+	;         0 1 7     9 8 rd 5 rs
23	# xor.b reg8, @erd-	;         0 1 7     9 a rd 5 rs
24	# xor.b reg8, @+erd	;         0 1 7     9 9 rd 5 rs
25	# xor.b reg8, @-erd	;         0 1 7     9 b rd 5 rs
26	#
27	# xorc #xx:8, ccr	;
28	# xorc #xx:8, exr	;
29
30	# Coming soon:
31	# ...
32
33.data
34pre_byte:	.byte 0
35byte_dest:	.byte 0xa5
36post_byte:	.byte 0
37
38	start
39
40xor_b_imm8_reg:
41	set_grs_a5a5		; Fill all general regs with a fixed pattern
42	;;  fixme set ccr
43
44	;;  xor.b #xx:8,Rd
45	xor.b	#0xff, r0l	; Immediate 8-bit operand
46
47	;; fixme test ccr	; H=0 N=1 Z=0 V=0 C=0
48	test_h_gr16 0xa55a r0	; xor result:	a5 ^ ff
49.if (sim_cpu)			; non-zero means h8300h, s, or sx
50	test_h_gr32 0xa5a5a55a er0	; xor result:	 a5 ^ ff
51.endif
52	test_gr_a5a5 1		; Make sure other general regs not disturbed
53	test_gr_a5a5 2
54	test_gr_a5a5 3
55	test_gr_a5a5 4
56	test_gr_a5a5 5
57	test_gr_a5a5 6
58	test_gr_a5a5 7
59
60.if (sim_cpu == h8sx)
61xor_b_imm8_rdind:
62	set_grs_a5a5		; Fill all general regs with a fixed pattern
63	set_ccr_zero
64
65	;;  xor.b #xx:8,@eRd
66	mov	#byte_dest, er0
67	xor.b	#0xff:8, @er0	; Immediate 8-bit src, reg indirect dst
68;;; 	.word	0x7d00
69;;; 	.word	0xd0ff
70
71	test_carry_clear	; H=0 N=0 Z=0 V=0 C=0
72	test_ovf_clear
73	test_zero_clear
74	test_neg_clear
75
76	test_h_gr32 byte_dest, er0	; er0 still contains address
77	test_gr_a5a5 1		; Make sure other general regs not disturbed
78	test_gr_a5a5 2
79	test_gr_a5a5 3
80	test_gr_a5a5 4
81	test_gr_a5a5 5
82	test_gr_a5a5 6
83	test_gr_a5a5 7
84
85	;; Now check the result of the xor to memory.
86	sub.b	r0l, r0l
87	mov.b	@byte_dest, r0l
88	cmp.b	#0x5a, r0l
89	beq	.L1
90	fail
91.L1:
92
93xor_b_imm8_postinc:
94	set_grs_a5a5		; Fill all general regs with a fixed pattern
95	set_ccr_zero
96
97	;;  xor.b #xx:8,@eRd+
98	mov	#byte_dest, er0
99	xor.b	#0xff:8, @er0+	; Immediate 8-bit src, reg indirect dst
100;;; 	.word	0x0174
101;;; 	.word	0x6c08
102;;; 	.word	0xd0ff
103
104	test_carry_clear	; H=0 N=1 Z=0 V=0 C=0
105	test_ovf_clear
106	test_zero_clear
107	test_neg_set
108
109	test_h_gr32 post_byte, er0	; er0 contains address plus one
110	test_gr_a5a5 1		; Make sure other general regs not disturbed
111	test_gr_a5a5 2
112	test_gr_a5a5 3
113	test_gr_a5a5 4
114	test_gr_a5a5 5
115	test_gr_a5a5 6
116	test_gr_a5a5 7
117
118	;; Now check the result of the xor to memory.
119	sub.b	r0l, r0l
120	mov.b	@byte_dest, r0l
121	cmp.b	#0xa5, r0l
122	beq	.L2
123	fail
124.L2:
125
126xor_b_imm8_rdpostdec:
127	set_grs_a5a5		; Fill all general regs with a fixed pattern
128	set_ccr_zero
129
130	;;  xor.b #xx:8,@eRd-
131	mov	#byte_dest, er0
132	xor.b	#0xff:8, @er0-	; Immediate 8-bit src, reg indirect dst
133;;;  	.word	0x0176
134;;;  	.word	0x6c08
135;;;  	.word	0xd0ff
136
137	test_carry_clear	; H=0 N=0 Z=0 V=0 C=0
138	test_ovf_clear
139	test_zero_clear
140	test_neg_clear
141
142	test_h_gr32 pre_byte, er0	; er0 contains address minus one
143	test_gr_a5a5 1		; Make sure other general regs not disturbed
144	test_gr_a5a5 2
145	test_gr_a5a5 3
146	test_gr_a5a5 4
147	test_gr_a5a5 5
148	test_gr_a5a5 6
149	test_gr_a5a5 7
150
151	;; Now check the result of the xor to memory.
152	sub.b	r0l, r0l
153	mov.b	@byte_dest, r0l
154	cmp.b	#0x5a, r0l
155	beq	.L3
156	fail
157.L3:
158.endif
159
160xor_b_reg8_reg8:
161	set_grs_a5a5		; Fill all general regs with a fixed pattern
162	;;  fixme set ccr
163
164	;;  xor.b Rs,Rd
165	mov.b	#0xff, r0h
166	xor.b	r0h, r0l	; Register operand
167
168	;; fixme test ccr	; H=0 N=1 Z=0 V=0 C=0
169	test_h_gr16 0xff5a r0	; xor result:	a5 ^ ff
170.if (sim_cpu)			; non-zero means h8300h, s, or sx
171	test_h_gr32 0xa5a5ff5a er0	; xor result:	a5 ^ ff
172.endif
173	test_gr_a5a5 1		; Make sure other general regs not disturbed
174	test_gr_a5a5 2
175	test_gr_a5a5 3
176	test_gr_a5a5 4
177	test_gr_a5a5 5
178	test_gr_a5a5 6
179	test_gr_a5a5 7
180
181.if (sim_cpu == h8sx)
182xor_b_reg8_rdind:
183	set_grs_a5a5		; Fill all general regs with a fixed pattern
184	set_ccr_zero
185
186	;;  xor.b rs8,@eRd	; xor reg8 to register indirect
187	mov	#byte_dest, er0
188	mov	#0xff, r1l
189	xor.b	r1l, @er0	; reg8 src, reg indirect dest
190;;; 	.word	0x7d00
191;;; 	.word	0x1590
192
193	test_carry_clear	; H=0 N=1 Z=0 V=0 C=0
194	test_ovf_clear
195	test_zero_clear
196	test_neg_set
197
198	test_h_gr32 byte_dest er0	; er0 still contains address
199	test_h_gr32 0xa5a5a5ff er1	; er1 has the test load
200
201	test_gr_a5a5 2		; Make sure other general regs not disturbed
202	test_gr_a5a5 3
203	test_gr_a5a5 4
204	test_gr_a5a5 5
205	test_gr_a5a5 6
206	test_gr_a5a5 7
207
208	;; Now check the result of the or to memory.
209	sub.b	r0l, r0l
210	mov.b	@byte_dest, r0l
211	cmp.b	#0xa5, r0l
212	beq	.L4
213	fail
214.L4:
215
216xor_b_reg8_rdpostinc:
217	set_grs_a5a5		; Fill all general regs with a fixed pattern
218	set_ccr_zero
219
220	;;  xor.b rs8,@eRd+	; xor reg8 to register post-increment
221	mov	#byte_dest, er0
222	mov	#0xff, r1l
223	xor.b	r1l, @er0+	; reg8 src, reg post-increment dest
224;;; 	.word	0x0179
225;;; 	.word	0x8059
226
227	test_carry_clear	; H=0 N=0 Z=0 V=0 C=0
228	test_ovf_clear
229	test_zero_clear
230	test_neg_clear
231
232	test_h_gr32 post_byte er0	; er0 contains address plus one
233	test_h_gr32 0xa5a5a5ff er1	; er1 has the test load
234
235	test_gr_a5a5 2		; Make sure other general regs not disturbed
236	test_gr_a5a5 3
237	test_gr_a5a5 4
238	test_gr_a5a5 5
239	test_gr_a5a5 6
240	test_gr_a5a5 7
241
242	;; Now check the result of the or to memory.
243	sub.b	r0l, r0l
244	mov.b	@byte_dest, r0l
245	cmp.b	#0x5a, r0l
246	beq	.L5
247	fail
248.L5:
249	;; special case same register
250	mov.l	#byte_dest, er0
251	mov.b	r0l, r1l
252	mov.b	@er0, r1h
253	xor.b	r0l, @er0+
254	inc.b	r1l
255	xor.b	r1h, r1l
256	mov.b	@byte_dest, r0l
257	cmp.b	r1l, r0l
258	beq	.L25
259	fail
260.L25:
261	mov.b	r1h, @byte_dest
262
263xor_b_reg8_rdpostdec:
264	set_grs_a5a5		; Fill all general regs with a fixed pattern
265	set_ccr_zero
266
267	;;  xor.b rs8,@eRd-	; xor reg8 to register post-decrement
268	mov	#byte_dest, er0
269	mov	#0xff, r1l
270	xor.b	r1l, @er0-	; reg8 src, reg indirect dest
271;;; 	.word	0x0179
272;;; 	.word	0xa059
273
274	test_carry_clear	; H=0 N=1 Z=0 V=0 C=0
275	test_ovf_clear
276	test_zero_clear
277	test_neg_set
278
279	test_h_gr32 pre_byte er0	; er0 contains address minus one
280	test_h_gr32 0xa5a5a5ff er1	; er1 has the test load
281
282	test_gr_a5a5 2		; Make sure other general regs not disturbed
283	test_gr_a5a5 3
284	test_gr_a5a5 4
285	test_gr_a5a5 5
286	test_gr_a5a5 6
287	test_gr_a5a5 7
288
289	;; Now check the result of the or to memory.
290	sub.b	r0l, r0l
291	mov.b	@byte_dest, r0l
292	cmp.b	#0xa5, r0l
293	beq	.L6
294	fail
295.L6:
296	;; special case same register
297	mov.l	#byte_dest, er0
298	mov.b	r0l, r1l
299	mov.b	@er0, r1h
300	xor.b	r0l, @er0-
301	dec.b	r1l
302	xor.b	r1h, r1l
303	mov.b	@byte_dest, r0l
304	cmp.b	r1l, r0l
305	beq	.L26
306	fail
307.L26:
308
309.endif				; h8sx
310
311xorc_imm8_ccr:
312	set_grs_a5a5		; Fill all general regs with a fixed pattern
313	set_ccr_zero
314
315	;;  xorc #xx:8,ccr
316
317	test_neg_clear
318	xorc	#0x8, ccr	; Immediate 8-bit operand (neg flag)
319	test_neg_set
320	xorc	#0x8, ccr
321	test_neg_clear
322
323	test_zero_clear
324	xorc	#0x4, ccr	; Immediate 8-bit operand (zero flag)
325	test_zero_set
326	xorc	#0x4, ccr
327	test_zero_clear
328
329	test_ovf_clear
330	xorc	#0x2, ccr	; Immediate 8-bit operand (overflow flag)
331	test_ovf_set
332	xorc	#0x2, ccr
333	test_ovf_clear
334
335	test_carry_clear
336	xorc	#0x1, ccr	; Immediate 8-bit operand (carry flag)
337	test_carry_set
338	xorc	#0x1, ccr
339	test_carry_clear
340
341	test_gr_a5a5 0		; Make sure other general regs not disturbed
342	test_gr_a5a5 1
343	test_gr_a5a5 2
344	test_gr_a5a5 3
345	test_gr_a5a5 4
346	test_gr_a5a5 5
347	test_gr_a5a5 6
348	test_gr_a5a5 7
349
350.if (sim_cpu == h8300s || sim_cpu == h8sx)	; Earlier versions, no exr
351xorc_imm8_exr:
352	set_grs_a5a5		; Fill all general regs with a fixed pattern
353	ldc	#0, exr
354	stc	exr, r0l
355	test_h_gr8 0, r0l
356
357	set_ccr_zero
358	;;  xorc #xx:8,exr
359
360	xorc	#0x80, exr
361	test_cc_clear
362	stc	exr, r0l
363	test_h_gr8 0x80, r0l
364	xorc	#0x80, exr
365	stc	exr, r0l
366	test_h_gr8 0, r0l
367
368	xorc	#0x4, exr
369	stc	exr, r0l
370	test_h_gr8 4, r0l
371	xorc	#0x4, exr
372	stc	exr, r0l
373	test_h_gr8 0, r0l
374
375	xorc	#0x2, exr	; Immediate 8-bit operand (overflow flag)
376	stc	exr, r0l
377	test_h_gr8 2, r0l
378	xorc	#0x2, exr
379	stc	exr, r0l
380	test_h_gr8 0, r0l
381
382	xorc	#0x1, exr	; Immediate 8-bit operand (carry flag)
383	stc	exr, r0l
384	test_h_gr8 1, r0l
385	xorc	#0x1, exr
386	stc	exr, r0l
387	test_h_gr8 0, r0l
388
389	test_h_gr32  0xa5a5a500 er0
390	test_gr_a5a5 1		; Make sure other general regs not disturbed
391	test_gr_a5a5 2
392	test_gr_a5a5 3
393	test_gr_a5a5 4
394	test_gr_a5a5 5
395	test_gr_a5a5 6
396	test_gr_a5a5 7
397.endif				; not h8300 or h8300h
398
399	pass
400
401	exit 0
402