diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /tests/tcg/cris | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'tests/tcg/cris')
106 files changed, 7175 insertions, 0 deletions
diff --git a/tests/tcg/cris/.gdbinit b/tests/tcg/cris/.gdbinit new file mode 100644 index 00000000..5e8c1d32 --- /dev/null +++ b/tests/tcg/cris/.gdbinit @@ -0,0 +1,11 @@ +b main +b _fail +b exit +display /i $pc +display /x $srp +display /x $r0 +display /x $r1 +display /x $r2 +display /x $r3 +display /x $r4 +display /t $ccs diff --git a/tests/tcg/cris/Makefile b/tests/tcg/cris/Makefile new file mode 100644 index 00000000..d34bfd8f --- /dev/null +++ b/tests/tcg/cris/Makefile @@ -0,0 +1,155 @@ +-include ../../../config-host.mak + +CROSS=crisv32-axis-linux-gnu- +SIM=../../../cris-linux-user/qemu-cris -L ./ +SIMG=cris-axis-linux-gnu-run --sysroot=./ + +CC      = $(CROSS)gcc +#AS      = $(CROSS)as +AS	= $(CC) -x assembler-with-cpp +SIZE    = $(CROSS)size +LD      = $(CC) +OBJCOPY = $(CROSS)objcopy + +# we rely on GCC inline:ing the stuff we tell it to in many places here. +CFLAGS  = -Winline -Wall -g -O2 -static +NOSTDFLAGS = -nostartfiles -nostdlib +ASFLAGS += -g -Wa,-I,$(SRC_PATH)/tests/tcg/cris/ +LDLIBS  = +NOSTDLIBS = -lgcc + +CRT        = crt.o +SYS        = sys.o +TESTCASES += check_abs.tst +TESTCASES += check_addc.tst +TESTCASES += check_addcm.tst +TESTCASES += check_addo.tst +TESTCASES += check_addoq.tst +TESTCASES += check_addi.tst +TESTCASES += check_addiv32.tst +TESTCASES += check_addm.tst +TESTCASES += check_addr.tst +TESTCASES += check_addq.tst +TESTCASES += check_addxc.tst +TESTCASES += check_addxm.tst +TESTCASES += check_addxr.tst +TESTCASES += check_andc.tst +TESTCASES += check_andm.tst +TESTCASES += check_andr.tst +TESTCASES += check_andq.tst +TESTCASES += check_asr.tst +TESTCASES += check_ba.tst +TESTCASES += check_bas.tst +TESTCASES += check_bcc.tst +TESTCASES += check_bound.tst +TESTCASES += check_boundc.tst +TESTCASES += check_boundr.tst +TESTCASES += check_btst.tst +TESTCASES += check_clearfv32.tst +TESTCASES += check_cmpc.tst +TESTCASES += check_cmpr.tst +TESTCASES += check_cmpq.tst +TESTCASES += check_cmpm.tst +TESTCASES += check_cmpxc.tst +TESTCASES += check_cmpxm.tst +TESTCASES += check_cmp-2.tst +TESTCASES += check_clrjmp1.tst +TESTCASES += check_dstep.tst +TESTCASES += check_ftag.tst +TESTCASES += check_int64.tst +# check_jsr is broken. +#TESTCASES += check_jsr.tst +TESTCASES += check_mcp.tst +TESTCASES += check_movei.tst +TESTCASES += check_mover.tst +TESTCASES += check_moverm.tst +TESTCASES += check_moveq.tst +TESTCASES += check_movemr.tst +TESTCASES += check_movemrv32.tst +TESTCASES += check_movecr.tst +TESTCASES += check_movmp.tst +TESTCASES += check_movpr.tst +TESTCASES += check_movprv32.tst +TESTCASES += check_movdelsr1.tst +TESTCASES += check_movpmv32.tst +TESTCASES += check_movsr.tst +TESTCASES += check_movsm.tst +TESTCASES += check_movscr.tst +TESTCASES += check_movur.tst +TESTCASES += check_movum.tst +TESTCASES += check_movucr.tst +TESTCASES += check_mulx.tst +TESTCASES += check_mulv32.tst +TESTCASES += check_neg.tst +TESTCASES += check_not.tst +TESTCASES += check_lz.tst +TESTCASES += check_lapc.tst +TESTCASES += check_lsl.tst +TESTCASES += check_lsr.tst +TESTCASES += check_orc.tst +TESTCASES += check_orm.tst +TESTCASES += check_orr.tst +TESTCASES += check_orq.tst +TESTCASES += check_ret.tst +TESTCASES += check_swap.tst +TESTCASES += check_scc.tst +TESTCASES += check_subc.tst +TESTCASES += check_subq.tst +TESTCASES += check_subr.tst +TESTCASES += check_subm.tst +TESTCASES += check_glibc_kernelversion.tst +TESTCASES += check_xarith.tst + +TESTCASES += check_hello.ctst +TESTCASES += check_stat1.ctst +TESTCASES += check_stat2.ctst +TESTCASES += check_stat3.ctst +TESTCASES += check_stat4.ctst +TESTCASES += check_openpf1.ctst +TESTCASES += check_openpf2.ctst +TESTCASES += check_openpf3.ctst +TESTCASES += check_openpf4.ctst +TESTCASES += check_openpf5.ctst +TESTCASES += check_mapbrk.ctst +TESTCASES += check_mmap1.ctst +TESTCASES += check_mmap2.ctst +TESTCASES += check_mmap3.ctst +TESTCASES += check_sigalrm.ctst +TESTCASES += check_time1.ctst +TESTCASES += check_time2.ctst +TESTCASES += check_settls1.ctst + +TESTCASES += check_gcctorture_pr28634-1.ctst +#TESTCASES += check_gcctorture_pr28634.ctst + +all: build + +%.o: $(SRC_PATH)/tests/tcg/cris/%.c +	$(CC) $(CFLAGS) -c $< -o $@ + +%.o: $(SRC_PATH)/tests/tcg/cris/%.s +	$(AS) $(ASFLAGS) -c $< -o $@ + +%.tst: %.o +	$(CC) $(CFLAGS) $(NOSTDFLAGS) $(LDLIBS) $(NOSTDLIBS) $(CRT) $< $(SYS) -o $@ + +%.ctst: %.o +	$(CC) $(CFLAGS) $(LDLIBS) $< -o $@ + +build: $(CRT) $(SYS) $(TESTCASES) + +check: $(CRT) $(SYS) $(TESTCASES) +	@echo -e "\nQEMU simulator." +	for case in $(TESTCASES); do \ +		echo -n "$$case "; \ +		$(SIM) ./$$case; \ +	done +check-g: $(CRT) $(SYS) $(TESTCASES) +	@echo -e "\nGDB simulator." +	@for case in $(TESTCASES); do \ +		echo -n "$$case "; \ +		$(SIMG) $$case; \ +	done + +clean: +	$(RM) -fr $(TESTCASES) $(CRT) $(SYS) diff --git a/tests/tcg/cris/README b/tests/tcg/cris/README new file mode 100644 index 00000000..2e65a76f --- /dev/null +++ b/tests/tcg/cris/README @@ -0,0 +1 @@ +Test-suite for the cris port. Heavily based on the test-suite for the CRIS port of sim by Hans-Peter Nilsson. diff --git a/tests/tcg/cris/check_abs.c b/tests/tcg/cris/check_abs.c new file mode 100644 index 00000000..9770a8d9 --- /dev/null +++ b/tests/tcg/cris/check_abs.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +static inline int cris_abs(int n) +{ +	int r; +	asm ("abs\t%1, %0\n" : "=r" (r) : "r" (n)); +	return r; +} + +static inline void +verify_abs(int val, int res, +	   const int n, const int z, const int v, const int c) +{ +	int r; + +	cris_tst_cc_init(); +	r = cris_abs(val); +	cris_tst_cc(n, z, v, c); +	if (r != res) +		err(); +} + +int main(void) +{ +	verify_abs(-1, 1, 0, 0, 0, 0); +	verify_abs(0x80000000, 0x80000000, 1, 0, 0, 0); +	verify_abs(0x7fffffff, 0x7fffffff, 0, 0, 0, 0); +	verify_abs(42, 42, 0, 0, 0, 0); +	verify_abs(1, 1, 0, 0, 0, 0); +	verify_abs(0xffff, 0xffff, 0, 0, 0, 0); +	verify_abs(0xffff, 0xffff, 0, 0, 0, 0); +	verify_abs(-31, 0x1f, 0, 0, 0, 0); +	verify_abs(0, 0, 0, 1, 0, 0); +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_addc.c b/tests/tcg/cris/check_addc.c new file mode 100644 index 00000000..facd1bea --- /dev/null +++ b/tests/tcg/cris/check_addc.c @@ -0,0 +1,58 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +static inline int cris_addc(int a, const int b) +{ +	asm ("addc\t%1, %0\n" : "+r" (a) : "r" (b)); +	return a; +} + +#define verify_addc(a, b, res, n, z, v, c)  \ +{                                           \ +	int r;                              \ +	r = cris_addc((a), (b));            \ +	cris_tst_cc((n), (z), (v), (c));    \ +	if (r != (res))                     \ +		err();                      \ +} + +int main(void) +{ +	cris_tst_cc_init(); +	asm volatile ("clearf cz"); +	verify_addc(0, 0, 0, 0, 0, 0, 0); + +	cris_tst_cc_init(); +	asm volatile ("setf z"); +	verify_addc(0, 0, 0, 0, 1, 0, 0); + +	cris_tst_cc_init(); +	asm volatile ("setf cz"); +	verify_addc(0, 0, 1, 0, 0, 0, 0); +	cris_tst_cc_init(); +	asm volatile ("clearf c"); +	verify_addc(-1, 2, 1, 0, 0, 0, 1); + +	cris_tst_cc_init(); +	asm volatile ("clearf nzv"); +	asm volatile ("setf c"); +	verify_addc(-1, 2, 2, 0, 0, 0, 1); + +	cris_tst_cc_init(); +	asm volatile ("setf c"); +	verify_addc(0xffff, 0xffff, 0x1ffff, 0, 0, 0, 0); + +	cris_tst_cc_init(); +	asm volatile ("clearf nzvc"); +	verify_addc(-1, -1, 0xfffffffe, 1, 0, 0, 1); + +	cris_tst_cc_init(); +	asm volatile ("setf c"); +	verify_addc(0x78134452, 0x5432f789, 0xcc463bdc, 1, 0, 1, 0); + +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_addcm.c b/tests/tcg/cris/check_addcm.c new file mode 100644 index 00000000..7928bc99 --- /dev/null +++ b/tests/tcg/cris/check_addcm.c @@ -0,0 +1,85 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +/* need to avoid acr as source here.  */ +static inline int cris_addc_m(int a, const int *b) +{ +	asm volatile ("addc [%1], %0\n" : "+r" (a) : "r" (b)); +	return a; +} + +/* 'b' is a crisv32 constrain to avoid postinc with $acr.  */ +static inline int cris_addc_pi_m(int a, int **b) +{ +	asm volatile ("addc [%1+], %0\n" : "+r" (a), "+b" (*b)); +	return a; +} + +#define verify_addc_m(a, b, res, n, z, v, c)  \ +{                                           \ +	int r;                              \ +	r = cris_addc_m((a), (b));            \ +	cris_tst_cc((n), (z), (v), (c));    \ +	if (r != (res))                     \ +		err();                      \ +} + +#define verify_addc_pi_m(a, b, res, n, z, v, c)  \ +{                                           \ +	int r;                              \ +	r = cris_addc_pi_m((a), (b));            \ +	cris_tst_cc((n), (z), (v), (c));    \ +	if (r != (res))                     \ +		err();                      \ +} + +int x[] = { 0, 0, 2, -1, 0xffff, -1, 0x5432f789}; + +int main(void) +{ +	int *p = (void *)&x[0]; +#if 1 +	cris_tst_cc_init(); +	asm volatile ("clearf cz"); +	verify_addc_m(0, p, 0, 0, 0, 0, 0); + +	cris_tst_cc_init(); +	asm volatile ("setf z"); +	verify_addc_m(0, p, 0, 0, 1, 0, 0); + +	cris_tst_cc_init(); +	asm volatile ("setf c"); +	verify_addc_m(0, p, 1, 0, 0, 0, 0); + +	cris_tst_cc_init(); +	asm volatile ("clearf c"); +	verify_addc_pi_m(0, &p, 0, 0, 1, 0, 0); + +	p = &x[1]; +	cris_tst_cc_init(); +	asm volatile ("setf c"); +	verify_addc_pi_m(0, &p, 1, 0, 0, 0, 0); + +	if (p != &x[2]) +		err(); + +	cris_tst_cc_init(); +	asm volatile ("clearf c"); +	verify_addc_pi_m(-1, &p, 1, 0, 0, 0, 1); + +	if (p != &x[3]) +		err(); +#endif +	p = &x[3]; +	/* TODO: investigate why this one fails.  */ +	cris_tst_cc_init(); +	asm volatile ("setf c"); +	verify_addc_m(2, p, 2, 0, 0, 0, 1); +	p += 4; + +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_addi.s b/tests/tcg/cris/check_addi.s new file mode 100644 index 00000000..a00dec02 --- /dev/null +++ b/tests/tcg/cris/check_addi.s @@ -0,0 +1,57 @@ +# mach:  crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 0\n1\n2\n4\nbe02460f\n69d035a6\nc16c14d4\n + + .include "testutils.inc" + start + moveq 0,r3 + moveq 0,r4 + clearf zcvn + addi r4.b,r3 + test_cc 0 0 0 0 + checkr3 0 + + moveq 0,r3 + moveq 1,r4 + setf zcvn + addi r4.b,r3 + test_cc 1 1 1 1 + checkr3 1 + + moveq 0,r3 + moveq 1,r4 + setf cv + clearf zn + addi r4.w,r3 + test_cc 0 0 1 1 + checkr3 2 + + moveq 0,r3 + moveq 1,r4 + clearf cv + setf zn + addi r4.d,r3 + test_cc 1 1 0 0 + checkr3 4 + + move.d 0x12345678,r3 + move.d 0xabcdef97,r4 + clearf cn + setf zv + addi r4.b,r3 + test_cc 0 1 1 0 + checkr3 be02460f + + move.d 0x12345678,r3 + move.d 0xabcdef97,r4 + setf cn + clearf zv + addi r4.w,r3 + test_cc 1 0 0 1 + checkr3 69d035a6 + + move.d 0x12345678,r3 + move.d 0xabcdef97,r4 + addi r4.d,r3 + checkr3 c16c14d4 + + quit diff --git a/tests/tcg/cris/check_addiv32.s b/tests/tcg/cris/check_addiv32.s new file mode 100644 index 00000000..20ba25d2 --- /dev/null +++ b/tests/tcg/cris/check_addiv32.s @@ -0,0 +1,62 @@ +# mach: crisv32 +# output: 4455aa77\n4455aa77\nee19ccff\nff22\n4455aa77\nff224455\n55aa77ff\n + + .include "testutils.inc" + .data +x: + .dword 0x55aa77ff + .dword 0xccff2244 + .dword 0x88ccee19 + + start + setf cv + moveq -1,r0 + move.d x-32768,r5 + move.d 32769,r6 + addi r6.b,r5,acr + test_cc 0 0 1 1 + move.d [acr],r3 + checkr3 4455aa77 + + addu.w 32771,r5 + setf znvc + moveq -1,r8 + addi r8.w,r5,acr + test_cc 1 1 1 1 + move.d [acr],r3 + checkr3 4455aa77 + + moveq 5,r10 + clearf znvc + addi r10.b,acr,acr + test_cc 0 0 0 0 + move.d [acr],r3 + checkr3 ee19ccff + + subq 1,r5 + move.d r5,r8 + subq 1,r8 + moveq 1,r9 + addi r9.d,r8,acr + test_cc 0 0 0 0 + movu.w [acr],r3 + checkr3 ff22 + + moveq -2,r11 + addi r11.w,acr,acr + move.d [acr],r3 + checkr3 4455aa77 + + moveq 5,r9 + addi r9.d,acr,acr + subq 18,acr + move.d [acr],r3 + checkr3 ff224455 + + move.d -76789888/4,r12 + addi r12.d,r5,acr + add.d 76789886,acr + move.d [acr],r3 + checkr3 55aa77ff + + quit diff --git a/tests/tcg/cris/check_addm.s b/tests/tcg/cris/check_addm.s new file mode 100644 index 00000000..efece9f5 --- /dev/null +++ b/tests/tcg/cris/check_addm.s @@ -0,0 +1,96 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n1fffe\nfffffffe\ncc463bdb\nffff0001\n1\nfffe\nfedafffe\n78133bdb\nffffff01\n1\nfe\nfeda49fe\n781344db\n781344d0\n + + .include "testutils.inc" + .data +x: + .dword 2,-1,0xffff,-1,0x5432f789 + .word 2,-1,0xffff,0xf789 + .byte 2,0xff,0x89 + .byte 0x7e + + start + moveq -1,r3 + move.d x,r5 + add.d [r5+],r3 + test_cc 0 0 0 1 + checkr3 1 + + moveq 2,r3 + add.d [r5],r3 + test_cc 0 0 0 1 + addq 4,r5 + checkr3 1 + + move.d 0xffff,r3 + add.d [r5+],r3 + test_cc 0 0 0 0 + checkr3 1fffe + + moveq -1,r3 + add.d [r5+],r3 + test_cc 1 0 0 1 + checkr3 fffffffe + + move.d 0x78134452,r3 + add.d [r5+],r3 + test_cc 1 0 1 0 + checkr3 cc463bdb + + moveq -1,r3 + add.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 ffff0001 + + moveq 2,r3 + add.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xffff,r3 + add.w [r5],r3 + test_cc 1 0 0 1 + checkr3 fffe + + move.d 0xfedaffff,r3 + add.w [r5+],r3 + test_cc 1 0 0 1 + checkr3 fedafffe + + move.d 0x78134452,r3 + add.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 78133bdb + + moveq -1,r3 + add.b [r5],r3 + test_cc 0 0 0 1 + addq 1,r5 + checkr3 ffffff01 + + moveq 2,r3 + add.b [r5],r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xff,r3 + add.b [r5],r3 + test_cc 1 0 0 1 + checkr3 fe + + move.d 0xfeda49ff,r3 + add.b [r5+],r3 + test_cc 1 0 0 1 + checkr3 feda49fe + + move.d 0x78134452,r3 + add.b [r5+],r3 + test_cc 1 0 0 0 + checkr3 781344db + + move.d 0x78134452,r3 + add.b [r5],r3 + test_cc 1 0 1 0 + checkr3 781344d0 + + quit diff --git a/tests/tcg/cris/check_addo.c b/tests/tcg/cris/check_addo.c new file mode 100644 index 00000000..3d8e789f --- /dev/null +++ b/tests/tcg/cris/check_addo.c @@ -0,0 +1,125 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +/* this would be better to do in asm, it's an orgy in GCC inline asm now.  */ + +#define cris_addo_b(o, v) \ +	asm volatile ("addo.b\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr"); +#define cris_addo_w(o, v) \ +	asm volatile ("addo.w\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr"); +#define cris_addo_d(o, v) \ +	asm volatile ("addo.d\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr"); +#define cris_addo_pi_b(o, v) \ +	asm volatile ("addo.b\t[%0+], %1, $acr\n" \ +                         : "+b" (o): "r" (v) : "acr"); +#define cris_addo_pi_w(o, v) \ +	asm volatile ("addo.w\t[%0+], %1, $acr\n" \ +                         : "+b" (o): "r" (v) : "acr"); +#define cris_addo_pi_d(o, v) \ +	asm volatile ("addo.d\t[%0+], %1, $acr\n" \ +                         : "+b" (o): "r" (v) : "acr"); + +struct { +	uint32_t v1; +	uint16_t v2; +	uint32_t v3; +	uint8_t v4; +	uint8_t v5; +	uint16_t v6; +	uint32_t v7; +} y = { +	32769, +	-1, +	5, +	3, -4, +	2, +	-76789887 +}; + +static int x[3] = {0x55aa77ff, 0xccff2244, 0x88ccee19}; + +int main(void) +{ +	int *r; +	unsigned char *t, *p; + +	/* Note, this test-case will trig an unaligned access, partly +	   to x[0] and to [x1].  */ +	t = (unsigned char *)x; +	t -= 32768; +	p = (unsigned char *) &y.v1; +	mb(); /* dont reorder anything beyond here.  */ +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addo_pi_d(p, t); +	cris_tst_cc(1, 1, 1, 1); +	asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); +	if (*r != 0x4455aa77) +		err(); + + +	t += 32770; +	mb(); /* dont reorder anything beyond here.  */ +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addo_pi_w(p, t); +	cris_tst_cc(1, 1, 1, 1); +	asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); +	if (*r != 0x4455aa77) +		err(); + +	mb(); /* dont reorder anything beyond here.  */ +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addo_d(p, r); +	cris_tst_cc(1, 1, 1, 1); +	p += 4; +	asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); +	if (*r != 0xee19ccff) +		err(); + +	mb(); /* dont reorder anything beyond here.  */ +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addo_pi_b(p, t); +	cris_tst_cc(0, 0, 0, 0); +	asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); +	if (*(uint16_t*)r != 0xff22) +		err(); + +	mb(); /* dont reorder anything beyond here.  */ +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addo_b(p, r); +	cris_tst_cc(1, 1, 1, 1); +	p += 1; +	asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); +	if (*r != 0x4455aa77) +		err(); + +	mb(); /* dont reorder anything beyond here.  */ +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addo_w(p, r); +	cris_tst_cc(1, 1, 1, 1); +	p += 2; +	asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); +	if (*r != 0xff224455) +		err(); + +	mb(); /* dont reorder anything beyond here.  */ +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addo_pi_d(p, t); +	cris_tst_cc(0, 0, 0, 0); +	asm volatile ("move.d\t$acr, %0\n" : "=r" (r)); +	r = (void*)(((char *)r) + 76789885); +	if (*r != 0x55aa77ff) +		err(); + +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_addoq.c b/tests/tcg/cris/check_addoq.c new file mode 100644 index 00000000..ed509e27 --- /dev/null +++ b/tests/tcg/cris/check_addoq.c @@ -0,0 +1,44 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +/* this would be better to do in asm, it's an orgy in GCC inline asm now.  */ + +/* ACR will be clobbered.  */ +#define cris_addoq(o, v) \ +	asm volatile ("addoq\t%1, %0, $acr\n" : : "r" (v), "i" (o) : "acr"); + + +int main(void) +{ +	int x[3] = {0x55aa77ff, 0xccff2244, 0x88ccee19}; +	int *p, *t = x + 1; + +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addoq(0, t); +	cris_tst_cc(1, 1, 1, 1); +	asm volatile ("move.d\t$acr, %0\n" : "=r" (p)); +	if (*p != 0xccff2244) +		err(); + +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_addoq(4, t); +	cris_tst_cc(0, 0, 0, 0); +	asm volatile ("move.d\t$acr, %0\n" : "=r" (p)); +	if (*p != 0x88ccee19) +		err(); + +	cris_tst_cc_init(); +	asm volatile ("clearf\tzvnc\n"); +	cris_addoq(-8, t + 1); +	cris_tst_cc(0, 0, 0, 0); +	asm volatile ("move.d\t$acr, %0\n" : "=r" (p)); +	if (*p != 0x55aa77ff) +		err(); +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_addq.s b/tests/tcg/cris/check_addq.s new file mode 100644 index 00000000..e6f874f9 --- /dev/null +++ b/tests/tcg/cris/check_addq.s @@ -0,0 +1,47 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\n0\n1\n100\n10000\n47\n67\na6\n80000001\n + + .include "testutils.inc" + start + moveq -2,r3 + addq 1,r3 + test_cc 1 0 0 0 + checkr3 ffffffff + + addq 1,r3 + test_cc 0 1 0 1 + checkr3 0 + + addq 1,r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xff,r3 + addq 1,r3 + test_cc 0 0 0 0 + checkr3 100 + + move.d 0xffff,r3 + addq 1,r3 + test_cc 0 0 0 0 + checkr3 10000 + + move.d 0x42,r3 + addq 5,r3 + test_cc 0 0 0 0 + checkr3 47 + + addq 32,r3 + test_cc 0 0 0 0 + checkr3 67 + + addq 63,r3 + test_cc 0 0 0 0 + checkr3 a6 + + move.d 0x7ffffffe,r3 + addq 3,r3 + test_cc 1 0 1 0 + checkr3 80000001 + + quit diff --git a/tests/tcg/cris/check_addr.s b/tests/tcg/cris/check_addr.s new file mode 100644 index 00000000..7f55cdc1 --- /dev/null +++ b/tests/tcg/cris/check_addr.s @@ -0,0 +1,96 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n1fffe\nfffffffe\ncc463bdb\nffff0001\n1\nfffe\nfedafffe\n78133bdb\nffffff01\n1\nfe\nfeda49fe\n781344db\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + add.d r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + moveq 2,r3 + moveq -1,r4 + add.d r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xffff,r4 + move.d r4,r3 + add.d r4,r3 + test_cc 0 0 0 0 + checkr3 1fffe + + moveq -1,r4 + move.d r4,r3 + add.d r4,r3 + test_cc 1 0 0 1 + checkr3 fffffffe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + add.d r4,r3 + test_cc 1 0 1 0 + checkr3 cc463bdb + + moveq -1,r3 + moveq 2,r4 + add.w r4,r3 + test_cc 0 0 0 1 + checkr3 ffff0001 + + moveq 2,r3 + moveq -1,r4 + add.w r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xffff,r4 + move.d r4,r3 + add.w r4,r3 + test_cc 1 0 0 1 + checkr3 fffe + + move.d 0xfedaffff,r4 + move.d r4,r3 + add.w r4,r3 + test_cc 1 0 0 1 + checkr3 fedafffe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + add.w r4,r3 + test_cc 0 0 0 1 + checkr3 78133bdb + + moveq -1,r3 + moveq 2,r4 + add.b r4,r3 + test_cc 0 0 0 1 + checkr3 ffffff01 + + moveq 2,r3 + moveq -1,r4 + add.b r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xff,r4 + move.d r4,r3 + add.b r4,r3 + test_cc 1 0 0 1 + checkr3 fe + + move.d 0xfeda49ff,r4 + move.d r4,r3 + add.b r4,r3 + test_cc 1 0 0 1 + checkr3 feda49fe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + add.b r4,r3 + test_cc 1 0 0 0 + checkr3 781344db + + quit diff --git a/tests/tcg/cris/check_addxc.s b/tests/tcg/cris/check_addxc.s new file mode 100644 index 00000000..09c8355b --- /dev/null +++ b/tests/tcg/cris/check_addxc.s @@ -0,0 +1,91 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n101\n10001\n100fe\n1fffe\nfffe\nfffe\nfffffffe\nfe\nfffffffe\n781344db\n781343db\n78143bdb\n78133bdb\n800000ed\n0\n + + .include "testutils.inc" + start + moveq 2,r3 + adds.b 0xff,r3 + test_cc 0 0 0 1 + checkr3 1 + + moveq 2,r3 + adds.w 0xffff,r3 + test_cc 0 0 0 1 + checkr3 1 + + moveq 2,r3 + addu.b 0xff,r3 + checkr3 101 + + moveq 2,r3 + move.d 0xffffffff,r4 + addu.w -1,r3 + test_cc 0 0 0 0 + checkr3 10001 + + move.d 0xffff,r3 + addu.b -1,r3 + test_cc 0 0 0 0 + checkr3 100fe + + move.d 0xffff,r3 + addu.w -1,r3 + test_cc 0 0 0 0 + checkr3 1fffe + + move.d 0xffff,r3 + adds.b 0xff,r3 + test_cc 0 0 0 1 + checkr3 fffe + + move.d 0xffff,r3 + adds.w 0xffff,r3 + test_cc 0 0 0 1 + checkr3 fffe + + moveq -1,r3 + adds.b 0xff,r3 + test_cc 1 0 0 1 + checkr3 fffffffe + + moveq -1,r3 + adds.w 0xff,r3 + test_cc 0 0 0 1 + checkr3 fe + + moveq -1,r3 + adds.w 0xffff,r3 + test_cc 1 0 0 1 + checkr3 fffffffe + + move.d 0x78134452,r3 + addu.b 0x89,r3 + test_cc 0 0 0 0 + checkr3 781344db + + move.d 0x78134452,r3 + adds.b 0x89,r3 + test_cc 0 0 0 1 + checkr3 781343db + + move.d 0x78134452,r3 + addu.w 0xf789,r3 + test_cc 0 0 0 0 + checkr3 78143bdb + + move.d 0x78134452,r3 + adds.w 0xf789,r3 + test_cc 0 0 0 1 + checkr3 78133bdb + + move.d 0x7fffffee,r3 + addu.b 0xff,r3 + test_cc 1 0 1 0 + checkr3 800000ed + + move.d 0x1,r3 + adds.w 0xffff,r3 + test_cc 0 1 0 1 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_addxm.s b/tests/tcg/cris/check_addxm.s new file mode 100644 index 00000000..7563494b --- /dev/null +++ b/tests/tcg/cris/check_addxm.s @@ -0,0 +1,106 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n101\n10001\n100fe\n1fffe\nfffe\nfffe\nfffffffe\nfe\nfffffffe\n781344db\n781343db\n78143bdb\n78133bdb\n800000ed\n0\n + + .include "testutils.inc" + .data +x: + .byte 0xff + .word 0xffff + .word 0xff + .word 0xffff + .byte 0x89 + .word 0xf789 + .byte 0xff + .word 0xffff + + start + moveq 2,r3 + move.d x,r5 + adds.b [r5+],r3 + test_cc 0 0 0 1 + checkr3 1 + + moveq 2,r3 + adds.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 1 + + moveq 2,r3 + subq 3,r5 + addu.b [r5+],r3 + test_cc 0 0 0 0 + checkr3 101 + + moveq 2,r3 + addu.w [r5+],r3 + subq 3,r5 + test_cc 0 0 0 0 + checkr3 10001 + + move.d 0xffff,r3 + addu.b [r5],r3 + test_cc 0 0 0 0 + checkr3 100fe + + move.d 0xffff,r3 + addu.w [r5],r3 + test_cc 0 0 0 0 + checkr3 1fffe + + move.d 0xffff,r3 + adds.b [r5],r3 + test_cc 0 0 0 1 + checkr3 fffe + + move.d 0xffff,r3 + adds.w [r5],r3 + test_cc 0 0 0 1 + checkr3 fffe + + moveq -1,r3 + adds.b [r5],r3 + test_cc 1 0 0 1 + addq 3,r5 + checkr3 fffffffe + + moveq -1,r3 + adds.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 fe + + moveq -1,r3 + adds.w [r5+],r3 + test_cc 1 0 0 1 + checkr3 fffffffe + + move.d 0x78134452,r3 + addu.b [r5],r3 + test_cc 0 0 0 0 + checkr3 781344db + + move.d 0x78134452,r3 + adds.b [r5+],r3 + test_cc 0 0 0 1 + checkr3 781343db + + move.d 0x78134452,r3 + addu.w [r5],r3 + test_cc 0 0 0 0 + checkr3 78143bdb + + move.d 0x78134452,r3 + adds.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 78133bdb + + move.d 0x7fffffee,r3 + addu.b [r5+],r3 + test_cc 1 0 1 0 + checkr3 800000ed + + move.d 0x1,r3 + adds.w [r5+],r3 + test_cc 0 1 0 1 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_addxr.s b/tests/tcg/cris/check_addxr.s new file mode 100644 index 00000000..7f55cdc1 --- /dev/null +++ b/tests/tcg/cris/check_addxr.s @@ -0,0 +1,96 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n1fffe\nfffffffe\ncc463bdb\nffff0001\n1\nfffe\nfedafffe\n78133bdb\nffffff01\n1\nfe\nfeda49fe\n781344db\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + add.d r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + moveq 2,r3 + moveq -1,r4 + add.d r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xffff,r4 + move.d r4,r3 + add.d r4,r3 + test_cc 0 0 0 0 + checkr3 1fffe + + moveq -1,r4 + move.d r4,r3 + add.d r4,r3 + test_cc 1 0 0 1 + checkr3 fffffffe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + add.d r4,r3 + test_cc 1 0 1 0 + checkr3 cc463bdb + + moveq -1,r3 + moveq 2,r4 + add.w r4,r3 + test_cc 0 0 0 1 + checkr3 ffff0001 + + moveq 2,r3 + moveq -1,r4 + add.w r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xffff,r4 + move.d r4,r3 + add.w r4,r3 + test_cc 1 0 0 1 + checkr3 fffe + + move.d 0xfedaffff,r4 + move.d r4,r3 + add.w r4,r3 + test_cc 1 0 0 1 + checkr3 fedafffe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + add.w r4,r3 + test_cc 0 0 0 1 + checkr3 78133bdb + + moveq -1,r3 + moveq 2,r4 + add.b r4,r3 + test_cc 0 0 0 1 + checkr3 ffffff01 + + moveq 2,r3 + moveq -1,r4 + add.b r4,r3 + test_cc 0 0 0 1 + checkr3 1 + + move.d 0xff,r4 + move.d r4,r3 + add.b r4,r3 + test_cc 1 0 0 1 + checkr3 fe + + move.d 0xfeda49ff,r4 + move.d r4,r3 + add.b r4,r3 + test_cc 1 0 0 1 + checkr3 feda49fe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + add.b r4,r3 + test_cc 1 0 0 0 + checkr3 781344db + + quit diff --git a/tests/tcg/cris/check_andc.s b/tests/tcg/cris/check_andc.s new file mode 100644 index 00000000..a947b773 --- /dev/null +++ b/tests/tcg/cris/check_andc.s @@ -0,0 +1,80 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\nffff\nffffffff\n50124400\nffff0002\n2\nfffff\nfedaff0f\n78134400\nffffff02\n2\nf02\n78134401\n78134400\n + + .include "testutils.inc" + start + moveq -1,r3 + and.d 2,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + and.d -1,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + and.d 0xffff,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r3 + and.d -1,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + and.d 0x5432f789,r3 + test_move_cc 0 0 0 0 + checkr3 50124400 + + moveq -1,r3 + and.w 2,r3 + test_move_cc 0 0 0 0 + checkr3 ffff0002 + + moveq 2,r3 + and.w -1,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xfffff,r3 + and.w 0xffff,r3 + test_move_cc 1 0 0 0 + checkr3 fffff + + move.d 0xfedaffaf,r3 + and.w 0xff5f,r3 + test_move_cc 1 0 0 0 + checkr3 fedaff0f + + move.d 0x78134452,r3 + and.w 0xf789,r3 + test_move_cc 0 0 0 0 + checkr3 78134400 + + moveq -1,r3 + and.b 2,r3 + test_move_cc 0 0 0 0 + checkr3 ffffff02 + + moveq 2,r3 + and.b -1,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xfa7,r3 + and.b 0x5a,r3 + test_move_cc 0 0 0 0 + checkr3 f02 + + move.d 0x78134453,r3 + and.b 0x89,r3 + test_move_cc 0 0 0 0 + checkr3 78134401 + + and.b 0,r3 + test_move_cc 0 1 0 0 + checkr3 78134400 + + quit diff --git a/tests/tcg/cris/check_andm.s b/tests/tcg/cris/check_andm.s new file mode 100644 index 00000000..93858863 --- /dev/null +++ b/tests/tcg/cris/check_andm.s @@ -0,0 +1,90 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\nffff\nffffffff\n50124400\nffff0002\n2\nfffff\nfedaff0f\n78134400\nffffff02\n2\nf02\n78134401\n78134400\n + + .include "testutils.inc" + .data +x: + .dword 2,-1,0xffff,-1,0x5432f789 + .word 2,-1,0xffff,0xff5f,0xf789 + .byte 2,-1,0x5a,0x89,0 + + start + moveq -1,r3 + move.d x,r5 + and.d [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + and.d [r5],r3 + test_move_cc 0 0 0 0 + addq 4,r5 + checkr3 2 + + move.d 0xffff,r3 + and.d [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r3 + and.d [r5+],r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + and.d [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 50124400 + + moveq -1,r3 + and.w [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 ffff0002 + + moveq 2,r3 + and.w [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xfffff,r3 + and.w [r5],r3 + test_move_cc 1 0 0 0 + addq 2,r5 + checkr3 fffff + + move.d 0xfedaffaf,r3 + and.w [r5+],r3 + test_move_cc 1 0 0 0 + checkr3 fedaff0f + + move.d 0x78134452,r3 + and.w [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 78134400 + + moveq -1,r3 + and.b [r5],r3 + test_move_cc 0 0 0 0 + addq 1,r5 + checkr3 ffffff02 + + moveq 2,r3 + and.b [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xfa7,r3 + and.b [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 f02 + + move.d 0x78134453,r3 + and.b [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 78134401 + + and.b [r5],r3 + test_move_cc 0 1 0 0 + checkr3 78134400 + + quit diff --git a/tests/tcg/cris/check_andq.s b/tests/tcg/cris/check_andq.s new file mode 100644 index 00000000..55aa7b06 --- /dev/null +++ b/tests/tcg/cris/check_andq.s @@ -0,0 +1,46 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\nffff\nffffffff\n1f\nffffffe0\n78134452\n0\n + + .include "testutils.inc" + start + moveq -1,r3 + andq 2,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + andq -1,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + andq -1,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r3 + andq -1,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + andq 31,r3 + test_move_cc 0 0 0 0 + checkr3 1f + + moveq -1,r3 + andq -32,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffe0 + + move.d 0x78134457,r3 + andq -14,r3 + test_move_cc 0 0 0 0 + checkr3 78134452 + + moveq 0,r3 + andq -14,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_andr.s b/tests/tcg/cris/check_andr.s new file mode 100644 index 00000000..61aa1dc3 --- /dev/null +++ b/tests/tcg/cris/check_andr.s @@ -0,0 +1,95 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\nffff\nffffffff\n50124400\nffff0002\n2\nfffff\nfedaff0f\n78134400\nffffff02\n2\nf02\n78134401\n78134400\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + and.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + moveq -1,r4 + and.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r4 + move.d r4,r3 + and.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r4 + move.d r4,r3 + and.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + and.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 50124400 + + moveq -1,r3 + moveq 2,r4 + and.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff0002 + + moveq 2,r3 + moveq -1,r4 + and.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xfffff,r3 + move.d 0xffff,r4 + and.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 fffff + + move.d 0xfedaffaf,r3 + move.d 0xff5f,r4 + and.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 fedaff0f + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + and.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 78134400 + + moveq -1,r3 + moveq 2,r4 + and.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffffff02 + + moveq 2,r3 + moveq -1,r4 + and.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0x5a,r4 + move.d 0xfa7,r3 + and.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 f02 + + move.d 0x5432f789,r4 + move.d 0x78134453,r3 + and.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 78134401 + + moveq 0,r7 + and.b r7,r3 + test_move_cc 0 1 0 0 + checkr3 78134400 + + quit diff --git a/tests/tcg/cris/check_asr.s b/tests/tcg/cris/check_asr.s new file mode 100644 index 00000000..0a02ae6f --- /dev/null +++ b/tests/tcg/cris/check_asr.s @@ -0,0 +1,230 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\n1\nffffffff\nffffffff\n5a67f\nffffffff\nffffffff\nffffffff\nf699fc67\nffffffff\n1\nffffffff\nffffffff\n5a67f\nda67ffff\nda67ffff\nda67ffff\nda67fc67\nffffffff\nffffffff\n1\nffffffff\nffffffff\n5a670007\nda67f1ff\nda67f1ff\nda67f1ff\nda67f1e7\nffffffff\nffffffff\n1\nffffffff\nffffffff\nffffffff\n5a67f1ff\n5a67f1f9\n0\n5a670000\n + + .include "testutils.inc" + start + moveq -1,r3 + asrq 0,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + asrq 1,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + asrq 31,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + asrq 15,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x5a67f19f,r3 + asrq 12,r3 + test_move_cc 0 0 0 0 + checkr3 5a67f + + move.d 0xda67f19f,r3 + move.d 31,r4 + asr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0xda67f19f,r3 + move.d 32,r4 + asr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0xda67f19f,r3 + move.d 33,r4 + asr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0xda67f19f,r3 + move.d 66,r4 + asr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 f699fc67 + + moveq -1,r3 + moveq 0,r4 + asr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + asr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + moveq 31,r4 + asr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 15,r4 + asr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x5a67f19f,r3 + moveq 12,r4 + asr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 5a67f + + move.d 0xda67f19f,r3 + move.d 31,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67ffff + + move.d 0xda67f19f,r3 + move.d 32,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67ffff + + move.d 0xda67f19f,r3 + move.d 33,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67ffff + + move.d 0xda67f19f,r3 + move.d 66,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67fc67 + + moveq -1,r3 + moveq 0,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 1,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + asr.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + moveq 31,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 15,r4 + asr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x5a67719f,r3 + moveq 12,r4 + asr.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 5a670007 + + move.d 0xda67f19f,r3 + move.d 31,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67f1ff + + move.d 0xda67f19f,r3 + move.d 32,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67f1ff + + move.d 0xda67f19f,r3 + move.d 33,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67f1ff + + move.d 0xda67f19f,r3 + move.d 66,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67f1e7 + + moveq -1,r3 + moveq 0,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 1,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + asr.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + moveq 31,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 15,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 7,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + +; FIXME: was wrong. + move.d 0x5a67f19f,r3 + moveq 12,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 5a67f1ff + +; FIXME: was wrong. + move.d 0x5a67f19f,r3 + moveq 4,r4 + asr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 5a67f1f9 + + move.d 0x5a67f19f,r3 + asrq 31,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0x5a67419f,r3 + moveq 16,r4 + asr.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 5a670000 + + quit diff --git a/tests/tcg/cris/check_ba.s b/tests/tcg/cris/check_ba.s new file mode 100644 index 00000000..873a4086 --- /dev/null +++ b/tests/tcg/cris/check_ba.s @@ -0,0 +1,93 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: a\n + + + .set smalloffset,0 + .set largeoffset,0 + + +	.macro fail +	jump _fail +	.endm + +	.global	main +main: + moveq 0,$r3 + +; Short forward branch. + ba 0f + addq 1,$r3 + fail + +; Max short forward branch. +1: + ba 2f + addq 1,$r3 + fail + +; Short backward branch. +0: + ba 1b + addq 1,$r3 + fail + + .space 254-2+smalloffset+1b-.,0 + moveq 0,$r3 + +2: +; Transit branch (long). + ba 3f + addq 1,$r3 + fail + + moveq 0,$r3 +4: +; Long forward branch. + ba 5f + addq 1,$r3 + fail + + .space 256-2-smalloffset+4b-.,0 + + moveq 0,$r3 + +; Max short backward branch. +3: + ba 4b + addq 1,$r3 + fail + +5: +; Max long forward branch. + ba 6f + addq 1,$r3 + fail + + .space 32766+largeoffset-2+5b-.,0 + + moveq 0,$r3 +6: +; Transit branch. + ba 7f + addq 1,$r3 + fail + + moveq 0,$r3 +9: + jsr pass + nop + +; Transit branch. + moveq 0,$r3 +7: + ba 8f + addq 1,$r3 + fail + + .space 32768-largeoffset+9b-.,0 + +8: +; Max long backward branch. + ba 9b + addq 1,$r3 + fail diff --git a/tests/tcg/cris/check_bas.s b/tests/tcg/cris/check_bas.s new file mode 100644 index 00000000..11929d42 --- /dev/null +++ b/tests/tcg/cris/check_bas.s @@ -0,0 +1,102 @@ +# mach: crisv32 +# output: 0\n0\n0\nfb349abc\n0\n12124243\n0\n0\neab5baad\n0\nefb37832\n + + .include "testutils.inc" + start +x: + setf zncv + bsr 0f + nop +0: + test_cc 1 1 1 1 + move srp,r3 + sub.d 0b,r3 + checkr3 0 + + bas 1f,mof + moveq 0,r0 +6: + nop + quit + +2: + move srp,r3 + sub.d 3f,r3 + checkr3 0 + move srp,r4 + subq 4,r4 + move.d [r4],r3 + checkr3 fb349abc + + basc 4f,mof + nop + .dword 0x12124243 +7: + nop + quit + +8: + move mof,r3 + sub.d 7f,r3 + checkr3 0 + + move mof,r4 + subq 4,r4 + move.d [r4],r3 + checkr3 eab5baad + + jasc 9f,mof + nop + .dword 0xefb37832 +0: + quit + + quit +9: + move mof,r3 + sub.d 0b,r3 + checkr3 0 + + move mof,r4 + subq 4,r4 + move.d [r4],r3 + checkr3 efb37832 + + quit + +4: + move mof,r3 + sub.d 7b,r3 + checkr3 0 + move mof,r4 + subq 4,r4 + move.d [r4],r3 + checkr3 12124243 + basc 5f,bz + moveq 0,r3 + .dword 0x7634aeba + quit + + .space 32770,0 +1: + move mof,r3 + sub.d 6b,r3 + checkr3 0 + + bsrc 2b + nop + .dword 0xfb349abc +3: + + quit + +5: + move mof,r3 + sub.d 7b,r3 + checkr3 0 + move.d 8b,r6 + jasc r6,mof + nop + .dword 0xeab5baad +7: + quit diff --git a/tests/tcg/cris/check_bcc.s b/tests/tcg/cris/check_bcc.s new file mode 100644 index 00000000..c57ffa6f --- /dev/null +++ b/tests/tcg/cris/check_bcc.s @@ -0,0 +1,197 @@ +	.global	main +	.type	main, @function +main: +	clearf nzvc +	setf   nzv +	bcc    0f +	addq   1, $r3 +	jump   dofail + +0: +	clearf nzvc +	setf   nzv +	bcs    dofail +	addq   1,$r3 + +	clearf nzvc +	setf   ncv +	bne    1f +	addq   1, $r3 + +fail: +dofail: +	jump	_fail + +1: +	clearf nzvc +	setf ncv +	beq dofail +	addq 1,$r3 + +	clearf nzvc +	setf ncz +	bvc 2f +	addq 1,$r3 +	jump dofail + +2: +	clearf nzvc +	setf ncz +	bvs dofail +	addq 1,$r3 + +	clearf	nzvc +	setf	vcz +	bpl	3f +	addq	1,$r3 +	jump	fail +3: +	clearf	nzvc +	setf	vcz +	bmi	dofail +	addq	1,$r3 + +	clearf	nzvc +	setf	nv +	bls	dofail +	addq	1,$r3 + +	clearf	nzvc +	setf	nv +	bhi	4f +	addq	1,$r3 +	jump	dofail + +4: +	clearf	nzvc +	setf	zc +	bge	5f +	addq	1,$r3 +	jump	dofail + +5: +	clearf	nzvc +	setf zc +	blt dofail +	addq 1,$r3 + +	clearf nzvc +	setf c +	bgt 6f +	addq 1,$r3 +	jump  fail + +6: + clearf nzvc + setf c + ble dofail + addq 1,$r3 + +;;;;;;;;;; + + setf nzvc + clearf nzv + bcc dofail + addq 1,$r3 + + setf nzvc + clearf nzv + bcs 0f + addq 1,$r3 + jump fail + +0: + setf nzvc + clearf ncv + bne dofail + addq 1,$r3 + + setf nzvc + clearf ncv + beq 1f + addq 1,$r3 + jump fail + +1: + setf nzvc + clearf ncz + bvc dofail + addq 1,$r3 + + setf nzvc + clearf ncz + bvs 2f + addq 1,$r3 + jump fail + +2: + setf nzvc + clearf vcz + bpl dofail + addq 1,$r3 + + setf nzvc + clearf vcz + bmi 3f + addq 1,$r3 + jump fail + +3: + setf nzvc + clearf nv + bls 4f + addq 1,$r3 + jump fail + +4: + setf nzvc + clearf nv + bhi dofail + addq 1,$r3 + + setf zvc + clearf nzc + bge dofail + addq 1,$r3 + + setf nzc + clearf vzc + blt 5f + addq 1,$r3 + jump fail + +5: + setf nzvc + clearf c + bgt dofail + addq 1,$r3 + + setf nzvc + clearf c + ble 6f + addq 1,$r3 + jump fail + +6: +	; do a forward branch. +	ba   2f +	nop +	.fill	100 +1: +	ba	3f +	nop +	.fill	800 +2: +	ba	1b +	nop +	.fill	1024 +3: + +	moveq	31, $r0 +1:	bne	1b +	subq	1, $r0 + +	jsr	pass +	moveq	0, $r10 +	ret +	nop diff --git a/tests/tcg/cris/check_bound.c b/tests/tcg/cris/check_bound.c new file mode 100644 index 00000000..e8831754 --- /dev/null +++ b/tests/tcg/cris/check_bound.c @@ -0,0 +1,142 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +static inline int cris_bound_b(int v, int b) +{ +	int r = v; +	asm ("bound.b\t%1, %0\n" : "+r" (r) : "ri" (b)); +	return r; +} + +static inline int cris_bound_w(int v, int b) +{ +	int r = v; +	asm ("bound.w\t%1, %0\n" : "+r" (r) : "ri" (b)); +	return r; +} + +static inline int cris_bound_d(int v, int b) +{ +	int r = v; +	asm ("bound.d\t%1, %0\n" : "+r" (r) : "ri" (b)); +	return r; +} + +int main(void) +{ +	int r; + +	cris_tst_cc_init(); +	r = cris_bound_d(-1, 2); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 2) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_d(2, 0xffffffff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 2) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_d(0xffff, 0xffff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xffff) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_d(-1, 0xffffffff); +	cris_tst_cc(1, 0, 0, 0); +	if (r != 0xffffffff) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_d(0x78134452, 0x5432f789); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0x5432f789) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_w(-1, 2); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 2) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_w(-1, 0xffff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xffff) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_w(2, 0xffff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 2) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_w(0xfedaffff, 0xffff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xffff) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_w(0x78134452, 0xf789); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xf789) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_b(-1, 2); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 2) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_b(2, 0xff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 2) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_b(-1, 0xff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xff) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_b(0xff, 0xff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xff) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_b(0xfeda49ff, 0xff); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xff) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_b(0x78134452, 0x89); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0x89) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_w(0x78134452, 0); +	cris_tst_cc(0, 1, 0, 0); +	if (r != 0) +		err(); + +	cris_tst_cc_init(); +	r = cris_bound_b(0xffff, -1); +	cris_tst_cc(0, 0, 0, 0); +	if (r != 0xff) +		err(); + +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_boundc.s b/tests/tcg/cris/check_boundc.s new file mode 100644 index 00000000..fb9e5bc9 --- /dev/null +++ b/tests/tcg/cris/check_boundc.s @@ -0,0 +1,101 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\nffff\nffffffff\n5432f789\n2\nffff\n2\nffff\nffff\nf789\n2\n2\nff\nff\nff\n89\n0\nff\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + bound.d 2,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + bound.d 0xffffffff,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + bound.d 0xffff,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r3 + bound.d 0xffffffff,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + bound.d 0x5432f789,r3 + test_move_cc 0 0 0 0 + checkr3 5432f789 + + moveq -1,r3 + bound.w 2,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq -1,r3 + bound.w 0xffff,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq 2,r3 + bound.w 0xffff,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + bound.w 0xffff,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + move.d 0xfedaffff,r3 + bound.w 0xffff,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + move.d 0x78134452,r3 + bound.w 0xf789,r3 + test_move_cc 0 0 0 0 + checkr3 f789 + + moveq -1,r3 + bound.b 2,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + bound.b 0xff,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq -1,r3 + bound.b 0xff,r3 + test_move_cc 0 0 0 0 + checkr3 ff + + move.d 0xff,r3 + bound.b 0xff,r3 + test_move_cc 0 0 0 0 + checkr3 ff + + move.d 0xfeda49ff,r3 + bound.b 0xff,r3 + test_move_cc 0 0 0 0 + checkr3 ff + + move.d 0x78134452,r3 + bound.b 0x89,r3 + test_move_cc 0 0 0 0 + checkr3 89 + + bound.w 0,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0xffff,r3 + bound.b -1,r3 + test_move_cc 0 0 0 0 + checkr3 ff + + quit diff --git a/tests/tcg/cris/check_boundr.s b/tests/tcg/cris/check_boundr.s new file mode 100644 index 00000000..5c50cc5f --- /dev/null +++ b/tests/tcg/cris/check_boundr.s @@ -0,0 +1,125 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\nffff\nffffffff\n5432f789\n2\n2\nffff\nffff\nffff\nf789\n2\n2\nff\nff\n89\nfeda4953\nfeda4962\n0\n0\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + bound.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + moveq -1,r4 + bound.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r4 + move.d r4,r3 + bound.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r4 + move.d r4,r3 + bound.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + bound.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 5432f789 + + moveq -1,r3 + moveq 2,r4 + bound.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + moveq -1,r4 + bound.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq -1,r3 + bound.w r3,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + move.d 0xffff,r4 + move.d r4,r3 + bound.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + move.d 0xfedaffff,r4 + move.d r4,r3 + bound.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + bound.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 f789 + + moveq -1,r3 + moveq 2,r4 + bound.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + moveq 2,r3 + moveq -1,r4 + bound.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 2 + + move.d 0xff,r4 + move.d r4,r3 + bound.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 ff + + move.d 0xfeda49ff,r4 + move.d r4,r3 + bound.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 ff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + bound.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 89 + + move.d 0xfeda4956,r3 + move.d 0xfeda4953,r4 + bound.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 feda4953 + + move.d 0xfeda4962,r3 + move.d 0xfeda4963,r4 + bound.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 feda4962 + + move.d 0xfeda4956,r3 + move.d 0,r4 + bound.d r4,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0xfeda4956,r4 + move.d 0,r3 + bound.d r4,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_btst.s b/tests/tcg/cris/check_btst.s new file mode 100644 index 00000000..e39fc8f4 --- /dev/null +++ b/tests/tcg/cris/check_btst.s @@ -0,0 +1,96 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1111\n + + .include "testutils.inc" + start + clearf nzvc + moveq -1,r3 + .if 1 ;..asm.arch.cris.v32 + .else + setf vc + .endif + btstq 0,r3 + test_cc 1 0 0 0 + + moveq 2,r3 + btstq 1,r3 + test_cc 1 0 0 0 + + moveq 4,r3 + btstq 1,r3 + test_cc 0 1 0 0 + + moveq -1,r3 + btstq 31,r3 + test_cc 1 0 0 0 + + move.d 0x5a67f19f,r3 + btstq 12,r3 + test_cc 1 0 0 0 + + move.d 0xda67f19f,r3 + move.d 29,r4 + btst r4,r3 + test_cc 0 0 0 0 + + move.d 0xda67f19f,r3 + move.d 32,r4 + btst r4,r3 + test_cc 1 0 0 0 + + move.d 0xda67f191,r3 + move.d 33,r4 + btst r4,r3 + test_cc 0 0 0 0 + + moveq -1,r3 + moveq 0,r4 + btst r4,r3 + test_cc 1 0 0 0 + + moveq 2,r3 + moveq 1,r4 + btst r4,r3 + test_cc 1 0 0 0 + + moveq -1,r3 + moveq 31,r4 + btst r4,r3 + test_cc 1 0 0 0 + + moveq 4,r3 + btstq 1,r3 + test_cc 0 1 0 0 + + moveq -1,r3 + moveq 15,r4 + btst r4,r3 + test_cc 1 0 0 0 + + move.d 0x5a67f19f,r3 + moveq 12,r4 + btst r4,r3 + test_cc 1 0 0 0 + + move.d 0x5a678000,r3 + moveq 11,r4 + btst r4,r3 + test_cc 0 1 0 0 + + move.d 0x5a67f19f,r3 + btst r3,r3 + test_cc 0 0 0 0 + + move.d 0x1111,r3 + checkr3 1111 + + ; check that X gets cleared and that only the NZ flags are touched. + move.d	0xff, $r0 + move $r0, $ccs + btst r3,r3 + move $ccs, $r0 + and.d 0xff, $r0 + cmp.d	0xe3, $r0 + test_cc 0 1 0 0 + + quit diff --git a/tests/tcg/cris/check_clearfv32.s b/tests/tcg/cris/check_clearfv32.s new file mode 100644 index 00000000..4e913602 --- /dev/null +++ b/tests/tcg/cris/check_clearfv32.s @@ -0,0 +1,19 @@ +# mach: crisv32 +# output: ef\nef\n + +; Check that "clearf x" doesn't trivially fail. + + .include "testutils.inc" + start + setf puixnzvc + clearf x	; Actually, x would be cleared by almost-all other insns. + move ccs,r3 + and.d 0xff, $r3 + checkr3 ef + + setf puixnzvc + moveq 0, $r3	; moveq should only clear the xflag. + move ccs,r3 + and.d 0xff, $r3 + checkr3 ef + quit diff --git a/tests/tcg/cris/check_clrjmp1.s b/tests/tcg/cris/check_clrjmp1.s new file mode 100644 index 00000000..45a7005e --- /dev/null +++ b/tests/tcg/cris/check_clrjmp1.s @@ -0,0 +1,36 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: ffffff00\n + +; A bug resulting in a non-effectual clear.b discovered running the GCC +; testsuite; jump actually wrote to p0. + + .include "testutils.inc" + + start + jump 1f + nop + .p2align 8 +1: + move.d y,r4 + + .if 0 ;0 == ..asm.arch.cris.v32 +; There was a bug causing this insn to set special register p0 +; (byte-clear) to 8 (low 8 bits of location after insn). + jump [r4+] + .endif + +1: + move.d 0f,r4 + +; The corresponding bug would cause this insn too, to set p0. + jump r4 + nop + quit +0: + moveq -1,r3 + clear.b r3 + checkr3 ffffff00 + quit + +y: + .dword 1b diff --git a/tests/tcg/cris/check_cmp-2.s b/tests/tcg/cris/check_cmp-2.s new file mode 100644 index 00000000..414d3705 --- /dev/null +++ b/tests/tcg/cris/check_cmp-2.s @@ -0,0 +1,15 @@ + + +.include "testutils.inc" + +	start + +	move.d	4294967283, $r0 +	move.d	$r0, $r10 +	cmp.d	$r0, $r10 +	beq	1f +	move.d $r10, $r3 +	fail +1: +	pass +	quit diff --git a/tests/tcg/cris/check_cmpc.s b/tests/tcg/cris/check_cmpc.s new file mode 100644 index 00000000..267c9ba8 --- /dev/null +++ b/tests/tcg/cris/check_cmpc.s @@ -0,0 +1,86 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\n2\nffff\nffffffff\n78134452\nffffffff\n2\nffff\nfedaffff\n78134452\nffffffff\n2\nff\nfeda49ff\n78134452\n85649282\n + + .include "testutils.inc" + start + moveq -1,r3 + cmp.d -2,r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + cmp.d 1,r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + cmp.d -0xffff,r3 + test_cc 0 0 0 1 + checkr3 ffff + + moveq -1,r3 + cmp.d 1,r3 + test_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + cmp.d -0x5432f789,r3 + test_cc 1 0 1 1 + checkr3 78134452 + + moveq -1,r3 + cmp.w -2,r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + cmp.w 1,r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + cmp.w 1,r3 + test_cc 1 0 0 0 + checkr3 ffff + + move.d 0xfedaffff,r3 + cmp.w 1,r3 + test_cc 1 0 0 0 + checkr3 fedaffff + + move.d 0x78134452,r3 + cmp.w 0x877,r3 + test_cc 0 0 0 0 + checkr3 78134452 + + moveq -1,r3 + cmp.b -2,r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + cmp.b 1,r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d 0xff,r3 + cmp.b 1,r3 + test_cc 1 0 0 0 + checkr3 ff + + move.d 0xfeda49ff,r3 + cmp.b 1,r3 + test_cc 1 0 0 0 + checkr3 feda49ff + + move.d 0x78134452,r3 + cmp.b 0x77,r3 + test_cc 1 0 0 1 + checkr3 78134452 + + move.d 0x85649282,r3 + cmp.b 0x82,r3 + test_cc 0 1 0 0 + checkr3 85649282 + + quit diff --git a/tests/tcg/cris/check_cmpm.s b/tests/tcg/cris/check_cmpm.s new file mode 100644 index 00000000..e4dde15b --- /dev/null +++ b/tests/tcg/cris/check_cmpm.s @@ -0,0 +1,96 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\n2\nffff\nffffffff\n78134452\nffffffff\n2\nffff\nfedaffff\n78134452\nffffffff\n2\nff\nfeda49ff\n78134452\n85649222\n + + .include "testutils.inc" + .data +x: + .dword -2,1,-0xffff,1,-0x5432f789 + .word -2,1,1,0x877 + .byte -2,1,0x77 + .byte 0x22 + + start + moveq -1,r3 + move.d x,r5 + cmp.d [r5+],r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + cmp.d [r5],r3 + test_cc 0 0 0 0 + addq 4,r5 + checkr3 2 + + move.d 0xffff,r3 + cmp.d [r5+],r3 + test_cc 0 0 0 1 + checkr3 ffff + + moveq -1,r3 + cmp.d [r5+],r3 + test_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + cmp.d [r5+],r3 + test_cc 1 0 1 1 + checkr3 78134452 + + moveq -1,r3 + cmp.w [r5+],r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + cmp.w [r5+],r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + cmp.w [r5],r3 + test_cc 1 0 0 0 + checkr3 ffff + + move.d 0xfedaffff,r3 + cmp.w [r5+],r3 + test_cc 1 0 0 0 + checkr3 fedaffff + + move.d 0x78134452,r3 + cmp.w [r5+],r3 + test_cc 0 0 0 0 + checkr3 78134452 + + moveq -1,r3 + cmp.b [r5],r3 + test_cc 0 0 0 0 + addq 1,r5 + checkr3 ffffffff + + moveq 2,r3 + cmp.b [r5],r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d 0xff,r3 + cmp.b [r5],r3 + test_cc 1 0 0 0 + checkr3 ff + + move.d 0xfeda49ff,r3 + cmp.b [r5+],r3 + test_cc 1 0 0 0 + checkr3 feda49ff + + move.d 0x78134452,r3 + cmp.b [r5+],r3 + test_cc 1 0 0 1 + checkr3 78134452 + + move.d 0x85649222,r3 + cmp.b [r5],r3 + test_cc 0 1 0 0 + checkr3 85649222 + + quit diff --git a/tests/tcg/cris/check_cmpq.s b/tests/tcg/cris/check_cmpq.s new file mode 100644 index 00000000..5469141c --- /dev/null +++ b/tests/tcg/cris/check_cmpq.s @@ -0,0 +1,75 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n1\n1f\n1f\nffffffe1\nffffffe1\nffffffe0\n0\n0\nffffffff\nffffffff\n10000\n100\n5678900\n + + .include "testutils.inc" + start + moveq 1,r3 + cmpq 1,r3 + test_cc 0 1 0 0 + checkr3 1 + + cmpq -1,r3 + test_cc 0 0 0 1 + checkr3 1 + + cmpq 31,r3 + test_cc 1 0 0 1 + checkr3 1 + + moveq 31,r3 + cmpq 31,r3 + test_cc 0 1 0 0 + checkr3 1f + + cmpq -31,r3 + test_cc 0 0 0 1 + checkr3 1f + + movs.b -31,r3 + cmpq -31,r3 + test_cc 0 1 0 0 + checkr3 ffffffe1 + + cmpq -32,r3 + test_cc 0 0 0 0 + checkr3 ffffffe1 + + movs.b -32,r3 + cmpq -32,r3 + test_cc 0 1 0 0 + checkr3 ffffffe0 + + moveq 0,r3 + cmpq 1,r3 + test_cc 1 0 0 1 + checkr3 0 + + cmpq -32,r3 + test_cc 0 0 0 1 + checkr3 0 + + moveq -1,r3 + cmpq 1,r3 + test_cc 1 0 0 0 + checkr3 ffffffff + + cmpq -1,r3 + test_cc 0 1 0 0 + checkr3 ffffffff + + move.d 0x10000,r3 + cmpq 1,r3 + test_cc 0 0 0 0 + checkr3 10000 + + move.d 0x100,r3 + cmpq 1,r3 + test_cc 0 0 0 0 + checkr3 100 + + move.d 0x5678900,r3 + cmpq 7,r3 + test_cc 0 0 0 0 + checkr3 5678900 + + quit diff --git a/tests/tcg/cris/check_cmpr.s b/tests/tcg/cris/check_cmpr.s new file mode 100644 index 00000000..b30af7a5 --- /dev/null +++ b/tests/tcg/cris/check_cmpr.s @@ -0,0 +1,102 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\n2\nffff\nffffffff\n78134452\nffffffff\n2\nffff\nfedaffff\n78134452\nffffffff\n2\nff\nfeda49ff\n78134452\n85649222\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq -2,r4 + cmp.d r4,r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + cmp.d r4,r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + move.d -0xffff,r4 + cmp.d r4,r3 + test_cc 0 0 0 1 + checkr3 ffff + + moveq 1,r4 + moveq -1,r3 + cmp.d r4,r3 + test_cc 1 0 0 0 + checkr3 ffffffff + + move.d -0x5432f789,r4 + move.d 0x78134452,r3 + cmp.d r4,r3 + test_cc 1 0 1 1 + checkr3 78134452 + + moveq -1,r3 + moveq -2,r4 + cmp.w r4,r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + cmp.w r4,r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d 0xffff,r3 + move.d -0xffff,r4 + cmp.w r4,r3 + test_cc 1 0 0 0 + checkr3 ffff + + move.d 0xfedaffff,r3 + move.d -0xfedaffff,r4 + cmp.w r4,r3 + test_cc 1 0 0 0 + checkr3 fedaffff + + move.d -0x5432f789,r4 + move.d 0x78134452,r3 + cmp.w r4,r3 + test_cc 0 0 0 0 + checkr3 78134452 + + moveq -1,r3 + moveq -2,r4 + cmp.b r4,r3 + test_cc 0 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + cmp.b r4,r3 + test_cc 0 0 0 0 + checkr3 2 + + move.d -0xff,r4 + move.d 0xff,r3 + cmp.b r4,r3 + test_cc 1 0 0 0 + checkr3 ff + + move.d -0xfeda49ff,r4 + move.d 0xfeda49ff,r3 + cmp.b r4,r3 + test_cc 1 0 0 0 + checkr3 feda49ff + + move.d -0x5432f789,r4 + move.d 0x78134452,r3 + cmp.b r4,r3 + test_cc 1 0 0 1 + checkr3 78134452 + + move.d 0x85649222,r3 + move.d 0x77445622,r4 + cmp.b r4,r3 + test_cc 0 1 0 0 + checkr3 85649222 + + quit diff --git a/tests/tcg/cris/check_cmpxc.s b/tests/tcg/cris/check_cmpxc.s new file mode 100644 index 00000000..b237a931 --- /dev/null +++ b/tests/tcg/cris/check_cmpxc.s @@ -0,0 +1,92 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\n2\n2\nffff\nffff\nffff\nffff\nffffffff\nffffffff\nffffffff\n78134452\n78134452\n78134452\n78134452\n4452\n80000032\n + + .include "testutils.inc" + start + moveq 2,r3 + cmps.b 0xff,r3 + test_cc 0 0 0 1 + checkr3 2 + + moveq 2,r3 + cmps.w 0xffff,r3 + test_cc 0 0 0 1 + checkr3 2 + + moveq 2,r3 + cmpu.b 0xff,r3 + test_cc 1 0 0 1 + checkr3 2 + + moveq 2,r3 + move.d 0xffffffff,r4 + cmpu.w -1,r3 + test_cc 1 0 0 1 + checkr3 2 + + move.d 0xffff,r3 + cmpu.b -1,r3 + test_cc 0 0 0 0 + checkr3 ffff + + move.d 0xffff,r3 + cmpu.w -1,r3 + test_cc 0 1 0 0 + checkr3 ffff + + move.d 0xffff,r3 + cmps.b 0xff,r3 + test_cc 0 0 0 1 + checkr3 ffff + + move.d 0xffff,r3 + cmps.w 0xffff,r3 + test_cc 0 0 0 1 + checkr3 ffff + + moveq -1,r3 + cmps.b 0xff,r3 + test_cc 0 1 0 0 + checkr3 ffffffff + + moveq -1,r3 + cmps.w 0xff,r3 + test_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + cmps.w 0xffff,r3 + test_cc 0 1 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + cmpu.b 0x89,r3 + test_cc 0 0 0 0 + checkr3 78134452 + + move.d 0x78134452,r3 + cmps.b 0x89,r3 + test_cc 0 0 0 1 + checkr3 78134452 + + move.d 0x78134452,r3 + cmpu.w 0xf789,r3 + test_cc 0 0 0 0 + checkr3 78134452 + + move.d 0x78134452,r3 + cmps.w 0xf789,r3 + test_cc 0 0 0 1 + checkr3 78134452 + + move.d 0x4452,r3 + cmps.w 0x8002,r3 + test_cc 0 0 0 1 + checkr3 4452 + + move.d 0x80000032,r3 + cmpu.w 0x764,r3 + test_cc 0 0 1 0 + checkr3 80000032 + + quit diff --git a/tests/tcg/cris/check_cmpxm.s b/tests/tcg/cris/check_cmpxm.s new file mode 100644 index 00000000..87ea5bf8 --- /dev/null +++ b/tests/tcg/cris/check_cmpxm.s @@ -0,0 +1,106 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 2\n2\n2\n2\nffff\nffff\nffff\nffff\nffffffff\nffffffff\nffffffff\n78134452\n78134452\n78134452\n78134452\n4452\n80000032\n + + .include "testutils.inc" + .data +x: + .byte 0xff + .word 0xffff + .word 0xff + .word 0xffff + .byte 0x89 + .word 0xf789 + .word 0x8002 + .word 0x764 + + start + moveq 2,r3 + move.d x,r5 + cmps.b [r5+],r3 + test_cc 0 0 0 1 + checkr3 2 + + moveq 2,r3 + cmps.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 2 + + moveq 2,r3 + subq 3,r5 + cmpu.b [r5+],r3 + test_cc 1 0 0 1 + checkr3 2 + + moveq 2,r3 + cmpu.w [r5+],r3 + test_cc 1 0 0 1 + subq 3,r5 + checkr3 2 + + move.d 0xffff,r3 + cmpu.b [r5],r3 + test_cc 0 0 0 0 + checkr3 ffff + + move.d 0xffff,r3 + cmpu.w [r5],r3 + test_cc 0 1 0 0 + checkr3 ffff + + move.d 0xffff,r3 + cmps.b [r5],r3 + test_cc 0 0 0 1 + checkr3 ffff + + move.d 0xffff,r3 + cmps.w [r5],r3 + test_cc 0 0 0 1 + checkr3 ffff + + moveq -1,r3 + cmps.b [r5],r3 + test_cc 0 1 0 0 + addq 3,r5 + checkr3 ffffffff + + moveq -1,r3 + cmps.w [r5+],r3 + test_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + cmps.w [r5+],r3 + test_cc 0 1 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + cmpu.b [r5],r3 + test_cc 0 0 0 0 + checkr3 78134452 + + move.d 0x78134452,r3 + cmps.b [r5+],r3 + test_cc 0 0 0 1 + checkr3 78134452 + + move.d 0x78134452,r3 + cmpu.w [r5],r3 + test_cc 0 0 0 0 + checkr3 78134452 + + move.d 0x78134452,r3 + cmps.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 78134452 + + move.d 0x4452,r3 + cmps.w [r5+],r3 + test_cc 0 0 0 1 + checkr3 4452 + + move.d 0x80000032,r3 + cmpu.w [r5+],r3 + test_cc 0 0 1 0 + checkr3 80000032 + + quit diff --git a/tests/tcg/cris/check_dstep.s b/tests/tcg/cris/check_dstep.s new file mode 100644 index 00000000..bd43b838 --- /dev/null +++ b/tests/tcg/cris/check_dstep.s @@ -0,0 +1,42 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: fffffffc\n4\nffff\nfffffffe\n9bf3911b\n0\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + dstep r4,r3 + test_move_cc 1 0 0 0 + checkr3 fffffffc + + moveq 2,r3 + moveq -1,r4 + dstep r4,r3 + test_move_cc 0 0 0 0 + checkr3 4 + + move.d 0xffff,r4 + move.d r4,r3 + dstep r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r4 + move.d r4,r3 + dstep r4,r3 + test_move_cc 1 0 0 0 + checkr3 fffffffe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + dstep r4,r3 + test_move_cc 1 0 0 0 + checkr3 9bf3911b + + move.d 0xffff,r3 + move.d 0x1fffe,r4 + dstep r4,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_ftag.c b/tests/tcg/cris/check_ftag.c new file mode 100644 index 00000000..908773a3 --- /dev/null +++ b/tests/tcg/cris/check_ftag.c @@ -0,0 +1,37 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +static inline void cris_ftag_i(unsigned int x) +{ +	register unsigned int v asm("$r10") = x; +	asm ("ftagi\t[%0]\n" : : "r" (v) ); +} +static inline void cris_ftag_d(unsigned int x) +{ +	register unsigned int v asm("$r10") = x; +	asm ("ftagd\t[%0]\n" : : "r" (v) ); +} +static inline void cris_fidx_i(unsigned int x) +{ +	register unsigned int v asm("$r10") = x; +	asm ("fidxi\t[%0]\n" : : "r" (v) ); +} +static inline void cris_fidx_d(unsigned int x) +{ +	register unsigned int v asm("$r10") = x; +	asm ("fidxd\t[%0]\n" : : "r" (v) ); +} + + +int main(void) +{ +	cris_ftag_i(0); +	cris_ftag_d(0); +	cris_fidx_i(0); +	cris_fidx_d(0); +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_gcctorture_pr28634-1.c b/tests/tcg/cris/check_gcctorture_pr28634-1.c new file mode 100644 index 00000000..45ecd159 --- /dev/null +++ b/tests/tcg/cris/check_gcctorture_pr28634-1.c @@ -0,0 +1,15 @@ +/* PR rtl-optimization/28634.  On targets with delayed branches, +   dbr_schedule could do the next iteration's addition in the +   branch delay slot, then subtract the value again if the branch +   wasn't taken.  This can lead to rounding errors.  */ +int x = -1; +int y = 1; +int +main (void) +{ +  while (y > 0) +    y += x; +  if (y != x + 1) +    abort (); +  exit (0); +} diff --git a/tests/tcg/cris/check_gcctorture_pr28634.c b/tests/tcg/cris/check_gcctorture_pr28634.c new file mode 100644 index 00000000..a0c52549 --- /dev/null +++ b/tests/tcg/cris/check_gcctorture_pr28634.c @@ -0,0 +1,15 @@ +/* PR rtl-optimization/28634.  On targets with delayed branches, +   dbr_schedule could do the next iteration's addition in the +   branch delay slot, then subtract the value again if the branch +   wasn't taken.  This can lead to rounding errors.  */ +double x = -0x1.0p53; +double y = 1; +int +main (void) +{ +  while (y > 0) +    y += x; +  if (y != x + 1) +    abort (); +  exit (0); +} diff --git a/tests/tcg/cris/check_glibc_kernelversion.c b/tests/tcg/cris/check_glibc_kernelversion.c new file mode 100644 index 00000000..07448722 --- /dev/null +++ b/tests/tcg/cris/check_glibc_kernelversion.c @@ -0,0 +1,116 @@ +/* + * Check the lz insn. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" + +#define __LINUX_KERNEL_VERSION 131584 + +#define DL_SYSDEP_OSCHECK(FATAL) \ +  do {                                                                        \ +    /* Test whether the kernel is new enough.  This test is only              \ +       performed if the library is not compiled to run on all                 \ +       kernels.  */                                                           \ +    if (__LINUX_KERNEL_VERSION > 0)                                           \ +      {                                                                       \ +        char bufmem[64];                                                      \ +        char *buf = bufmem;                                                   \ +        unsigned int version;                                                 \ +        int parts;                                                            \ +        char *cp;                                                             \ +        struct utsname uts;                                                   \ +                                                                              \ +        /* Try the uname syscall */                                           \ +        if (__uname (&uts))                                                   \ +          {                                                                   \ +            /* This was not successful.  Now try reading the /proc            \ +               filesystem.  */                                                \ +            ssize_t reslen;                                                   \ +            int fd = __open ("/proc/sys/kernel/osrelease", O_RDONLY);         \ +            if (fd == -1                                                      \ +                || (reslen = __read (fd, bufmem, sizeof (bufmem))) <= 0)      \ +              /* This also didn't work.  We give up since we cannot           \ +                 make sure the library can actually work.  */                 \ +              FATAL ("FATAL: cannot determine library version\n");            \ +            __close (fd);                                                     \ +            buf[MIN (reslen, (ssize_t) sizeof (bufmem) - 1)] = '\0';          \ +          }                                                                   \ +        else                                                                  \ +          buf = uts.release;                                                  \ +                                                                              \ +        /* Now convert it into a number.  The string consists of at most      \ +           three parts.  */                                                   \ +        version = 0;                                                          \ +        parts = 0;                                                            \ +        cp = buf;                                                             \ +        while ((*cp >= '0') && (*cp <= '9'))                                  \ +          {                                                                   \ +            unsigned int here = *cp++ - '0';                                  \ +                                                                              \ +            while ((*cp >= '0') && (*cp <= '9'))                              \ +              {                                                               \ +                here *= 10;                                                   \ +                here += *cp++ - '0';                                          \ +              }                                                               \ +                                                                              \ +            ++parts;                                                          \ +            version <<= 8;                                                    \ +            version |= here;                                                  \ +                                                                              \ +            if (*cp++ != '.')                                                 \ +              /* Another part following?  */                                  \ +              break;                                                          \ +          }                                                                   \ +                                                                              \ +        if (parts < 3)                                                        \ +          version <<= 8 * (3 - parts);                                        \ +                                                                              \ +        /* Now we can test with the required version.  */                     \ +        if (version < __LINUX_KERNEL_VERSION)                                 \ +          /* Not sufficient.  */                                               \ +          FATAL ("FATAL: kernel too old\n");                                  \ +                                                                              \ +        _dl_osversion = version;                                              \ +      }                                                                       \ +  } while (0) + +int main(void) +{ +        char bufmem[64] = "2.6.22"; +        char *buf = bufmem; +        unsigned int version; +        int parts; +        char *cp; + +        version = 0; +        parts = 0; +        cp = buf; +        while ((*cp >= '0') && (*cp <= '9')) +          { +            unsigned int here = *cp++ - '0'; + +            while ((*cp >= '0') && (*cp <= '9')) +              { +                here *= 10; +                here += *cp++ - '0'; +              } + +            ++parts; +            version <<= 8; +            version |= here; + +            if (*cp++ != '.') +              /* Another part following?  */ +              break; +          } + +        if (parts < 3) +          version <<= 8 * (3 - parts); +	if (version < __LINUX_KERNEL_VERSION) +		err(); +	pass(); +	exit(0); +} diff --git a/tests/tcg/cris/check_hello.c b/tests/tcg/cris/check_hello.c new file mode 100644 index 00000000..fb403ba9 --- /dev/null +++ b/tests/tcg/cris/check_hello.c @@ -0,0 +1,7 @@ +#include <stdio.h> +#include <stdlib.h> +int main () +{ +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_int64.c b/tests/tcg/cris/check_int64.c new file mode 100644 index 00000000..fc600176 --- /dev/null +++ b/tests/tcg/cris/check_int64.c @@ -0,0 +1,47 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + + +static inline int64_t add64(const int64_t a, const int64_t b) +{ +	return a + b; +} + +static inline int64_t sub64(const int64_t a, const int64_t b) +{ +	return a - b; +} + +int main(void) +{ +	int64_t a = 1; +	int64_t b = 2; + +	/* FIXME: add some tests.  */ +	a = add64(a, b); +	if (a != 3) +		err(); + +	a = sub64(a, b); +	if (a != 1) +		err(); + +	a = add64(a, -4); +	if (a != -3) +		err(); + +	a = add64(a, 3); +	if (a != 0) +		err(); + +	a = 0; +	a = sub64(a, 1); +	if (a != -1) +		err(); + +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_jsr.s b/tests/tcg/cris/check_jsr.s new file mode 100644 index 00000000..10602378 --- /dev/null +++ b/tests/tcg/cris/check_jsr.s @@ -0,0 +1,85 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 0\n0\n0\n0\n0\n0\n + +# Test that jsr Rn and jsr [PC+] work. + + .include "testutils.inc" + start +x: + move.d 0f,r6 + setf nzvc + jsr r6 + .if 1; ..asm.arch.cris.v32 + nop + .endif +0: + test_move_cc 1 1 1 1 + move srp,r3 + sub.d 0b,r3 + checkr3 0 + + move.d 1f,r0 + setf nzvc + jsr r0 + .if 1 ; ..asm.arch.cris.v32 + moveq 0,r0 + .endif +6: + nop + quit + +2: + test_move_cc 0 0 0 0 + move srp,r3 + sub.d 3f,r3 + checkr3 0 + jsr 4f + .if 1 ; ..asm.arch.cris.v32 + nop + .endif +7: + nop + quit + +8: + move srp,r3 + sub.d 7b,r3 + checkr3 0 + quit + +4: + move srp,r3 + sub.d 7b,r3 + checkr3 0 + move.d 5f,r3 + jump r3 + .if 1; ..asm.arch.cris.v32 + moveq 0,r3 + .endif + quit + + .space 32770,0 +1: + test_move_cc 1 1 1 1 + move srp,r3 + sub.d 6b,r3 + checkr3 0 + + clearf cznv + jsr 2b + .if 1; ..asm.arch.cris.v32 + nop + .endif +3: + + quit + +5: + move srp,r3 + sub.d 7b,r3 + checkr3 0 + jump 8b + .if 1 ; ..asm.arch.cris.v32 + nop + .endif + quit diff --git a/tests/tcg/cris/check_lapc.s b/tests/tcg/cris/check_lapc.s new file mode 100644 index 00000000..9a6150b7 --- /dev/null +++ b/tests/tcg/cris/check_lapc.s @@ -0,0 +1,78 @@ +# mach: crisv32 +# output: 0\n0\nfffffffa\nfffffffe\nffffffda\n1e\n1e\n0\n + +.include "testutils.inc" + +; To accommodate dumpr3 with more than one instruction, keep it +; out of lapc operand ranges and difference calculations. + + start + lapc.d 0f,r3 +0: + sub.d .,r3 + checkr3 0 + + lapcq 0f,r3 +0: + sub.d .,r3 + checkr3 0 + + lapc.d .,r3 + sub.d .,r3 + checkr3 fffffffa + + lapcq .,r3 + sub.d .,r3 + checkr3 fffffffe + +0: + .rept 16 + nop + .endr + lapc.d 0b,r3 + sub.d .,r3 + checkr3 ffffffda + + setf zcvn + lapc.d 0f,r3 + test_cc 1 1 1 1 + sub.d .,r3 + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +0: + checkr3 1e +0: + lapcq 0f,r3 + sub.d 0b,r3 + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +0: + checkr3 1e + clearf cn + setf zv +1: + lapcq .,r3 + test_cc 0 1 1 0 + sub.d 1b,r3 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_lsl.s b/tests/tcg/cris/check_lsl.s new file mode 100644 index 00000000..9e2ddd7c --- /dev/null +++ b/tests/tcg/cris/check_lsl.s @@ -0,0 +1,217 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\n4\n80000000\nffff8000\n7f19f000\n80000000\n0\n0\n699fc67c\nffffffff\n4\n80000000\nffff8000\n7f19f000\nda670000\nda670000\nda670000\nda67c67c\nffffffff\nfffafffe\n4\nffff0000\nffff8000\n5a67f000\nda67f100\nda67f100\nda67f100\nda67f17c\nfff3faff\nfff3fafe\n4\nffffff00\nffffff00\nffffff80\n5a67f100\n5a67f1f0\n + + .include "testutils.inc" + start + moveq -1,r3 + lslq 0,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + lslq 1,r3 + test_move_cc 0 0 0 0 + checkr3 4 + + moveq -1,r3 + lslq 31,r3 + test_move_cc 1 0 0 0 + checkr3 80000000 + + moveq -1,r3 + lslq 15,r3 + test_move_cc 1 0 0 0 + checkr3 ffff8000 + + move.d 0x5a67f19f,r3 + lslq 12,r3 + test_move_cc 0 0 0 0 + checkr3 7f19f000 + + move.d 0xda67f19f,r3 + move.d 31,r4 + lsl.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 80000000 + + move.d 0xda67f19f,r3 + move.d 32,r4 + lsl.d r4,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0xda67f19f,r3 + move.d 33,r4 + lsl.d r4,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0xda67f19f,r3 + move.d 66,r4 + lsl.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 699fc67c + + moveq -1,r3 + moveq 0,r4 + lsl.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + lsl.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 4 + + moveq -1,r3 + moveq 31,r4 + lsl.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 80000000 + + moveq -1,r3 + moveq 15,r4 + lsl.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffff8000 + + move.d 0x5a67f19f,r3 + moveq 12,r4 + lsl.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 7f19f000 + + move.d 0xda67f19f,r3 + move.d 31,r4 + lsl.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 da670000 + + move.d 0xda67f19f,r3 + move.d 32,r4 + lsl.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 da670000 + + move.d 0xda67f19f,r3 + move.d 33,r4 + lsl.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 da670000 + + move.d 0xda67f19f,r3 + move.d 66,r4 + lsl.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 da67c67c + + moveq -1,r3 + moveq 0,r4 + lsl.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0xfffaffff,r3 + moveq 1,r4 + lsl.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 fffafffe + + moveq 2,r3 + moveq 1,r4 + lsl.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 4 + + moveq -1,r3 + moveq 31,r4 + lsl.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 ffff0000 + + moveq -1,r3 + moveq 15,r4 + lsl.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffff8000 + + move.d 0x5a67f19f,r3 + moveq 12,r4 + lsl.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 5a67f000 + + move.d 0xda67f19f,r3 + move.d 31,r4 + lsl.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 da67f100 + + move.d 0xda67f19f,r3 + move.d 32,r4 + lsl.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 da67f100 + + move.d 0xda67f19f,r3 + move.d 33,r4 + lsl.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 da67f100 + + move.d 0xda67f19f,r3 + move.d 66,r4 + lsl.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 da67f17c + + move.d 0xfff3faff,r3 + moveq 0,r4 + lsl.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 fff3faff + + move.d 0xfff3faff,r3 + moveq 1,r4 + lsl.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 fff3fafe + + moveq 2,r3 + moveq 1,r4 + lsl.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 4 + + moveq -1,r3 + moveq 31,r4 + lsl.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 ffffff00 + + moveq -1,r3 + moveq 15,r4 + lsl.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 ffffff00 + + moveq -1,r3 + moveq 7,r4 + lsl.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffff80 + + move.d 0x5a67f19f,r3 + moveq 12,r4 + lsl.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 5a67f100 + + move.d 0x5a67f19f,r3 + moveq 4,r4 + lsl.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 5a67f1f0 + + quit diff --git a/tests/tcg/cris/check_lsr.s b/tests/tcg/cris/check_lsr.s new file mode 100644 index 00000000..18fdbef9 --- /dev/null +++ b/tests/tcg/cris/check_lsr.s @@ -0,0 +1,218 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\n1\n1\n1ffff\n5a67f\n1\n0\n0\n3699fc67\nffffffff\n1\n1\n1ffff\n5a67f\nda670000\nda670000\nda670000\nda673c67\nffffffff\nffff7fff\n1\nffff0000\nffff0001\n5a67000f\nda67f100\nda67f100\nda67f100\nda67f127\nffffffff\nffffff7f\n1\nffffff00\nffffff00\nffffff01\n5a67f100\n5a67f109\n + + .include "testutils.inc" + start + moveq -1,r3 + lsrq 0,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + lsrq 1,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + lsrq 31,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + lsrq 15,r3 + test_move_cc 0 0 0 0 + checkr3 1ffff + + move.d 0x5a67f19f,r3 + lsrq 12,r3 + test_move_cc 0 0 0 0 + checkr3 5a67f + + move.d 0xda67f19f,r3 + move.d 31,r4 + lsr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + move.d 0xda67f19f,r3 + move.d 32,r4 + lsr.d r4,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0xda67f19f,r3 + move.d 33,r4 + lsr.d r4,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0xda67f19f,r3 + move.d 66,r4 + lsr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 3699fc67 + + moveq -1,r3 + moveq 0,r4 + lsr.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 2,r3 + moveq 1,r4 + lsr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + moveq 31,r4 + lsr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + moveq 15,r4 + lsr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 1ffff + + move.d 0x5a67f19f,r3 + moveq 12,r4 + lsr.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 5a67f + + move.d 0xda67f19f,r3 + move.d 31,r4 + lsr.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 da670000 + + move.d 0xda67f19f,r3 + move.d 32,r4 + lsr.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 da670000 + + move.d 0xda67f19f,r3 + move.d 33,r4 + lsr.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 da670000 + + move.d 0xda67f19f,r3 + move.d 66,r4 + lsr.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 da673c67 + + moveq -1,r3 + moveq 0,r4 + lsr.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 1,r4 + lsr.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff7fff + + moveq 2,r3 + moveq 1,r4 + lsr.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + +;; FIXME: this was wrong. Z should be set. + moveq -1,r3 + moveq 31,r4 + lsr.w r4,r3 + test_move_cc 0 1 0 0 + checkr3 ffff0000 + + moveq -1,r3 + moveq 15,r4 + lsr.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff0001 + + move.d 0x5a67f19f,r3 + moveq 12,r4 + lsr.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 5a67000f + + move.d 0xda67f19f,r3 + move.d 31,r4 + lsr.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 da67f100 + + move.d 0xda67f19f,r3 + move.d 32,r4 + lsr.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 da67f100 + + move.d 0xda67f19f,r3 + move.d 33,r4 + lsr.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 da67f100 + + move.d 0xda67f19f,r3 + move.d 66,r4 + lsr.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 da67f127 + + moveq -1,r3 + moveq 0,r4 + lsr.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq -1,r3 + moveq 1,r4 + lsr.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffffff7f + + moveq 2,r3 + moveq 1,r4 + lsr.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + moveq -1,r3 + moveq 31,r4 + lsr.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 ffffff00 + + moveq -1,r3 + moveq 15,r4 + lsr.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 ffffff00 + + moveq -1,r3 + moveq 7,r4 + lsr.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffffff01 + + move.d 0x5a67f19f,r3 + moveq 12,r4 + lsr.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 5a67f100 + + move.d 0x5a67f19f,r3 + moveq 4,r4 + lsr.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 5a67f109 + + quit diff --git a/tests/tcg/cris/check_lz.c b/tests/tcg/cris/check_lz.c new file mode 100644 index 00000000..69c2e6d4 --- /dev/null +++ b/tests/tcg/cris/check_lz.c @@ -0,0 +1,49 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" + +static inline int cris_lz(int x) +{ +	int r; +	asm ("lz\t%1, %0\n" : "=r" (r) : "r" (x)); +	return r; +} + +void check_lz(void) +{ +	int i; + +	if (cris_lz(0) != 32) +		err(); +	if (cris_lz(1) != 31) +		err(); +	if (cris_lz(2) != 30) +		err(); +	if (cris_lz(4) != 29) +		err(); +	if (cris_lz(8) != 28) +		err(); + +	/* try all positions with a single bit.  */ +	for (i = 1; i < 32; i++) { +		if (cris_lz(1 << (i-1)) != (32 - i)) +			err(); +	} + +	/* try all positions with all bits.  */ +	for (i = 1; i < 32; i++) { +		/* split up this computation to clarify it.  */ +		uint32_t val; +		val = (unsigned int)-1 >> (32 - i); +		if (cris_lz(val) != (32 - i)) +			err(); +	} +} + +int main(void) +{ +	check_lz(); +	pass(); +	exit(0); +} diff --git a/tests/tcg/cris/check_mapbrk.c b/tests/tcg/cris/check_mapbrk.c new file mode 100644 index 00000000..1aff7622 --- /dev/null +++ b/tests/tcg/cris/check_mapbrk.c @@ -0,0 +1,39 @@ +#include <stdio.h> +#include <stdlib.h> + +/* Basic sanity check that syscalls to implement malloc (brk, mmap2, +   munmap) are trivially functional.  */ + +int main () +{ +  void *p1, *p2, *p3, *p4, *p5, *p6; + +  if ((p1 = malloc (8100)) == NULL +      || (p2 = malloc (16300)) == NULL +      || (p3 = malloc (4000)) == NULL +      || (p4 = malloc (500)) == NULL +      || (p5 = malloc (1023*1024)) == NULL +      || (p6 = malloc (8191*1024)) == NULL) +  { +    printf ("fail\n"); +    exit (1); +  } + +  free (p1); +  free (p2); +  free (p3); +  free (p4); +  free (p5); +  free (p6); + +  p1 = malloc (64000); +  if (p1 == NULL) +  { +    printf ("fail\n"); +    exit (1); +  } +  free (p1); + +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_mcp.s b/tests/tcg/cris/check_mcp.s new file mode 100644 index 00000000..e65ccddf --- /dev/null +++ b/tests/tcg/cris/check_mcp.s @@ -0,0 +1,49 @@ +# mach: crisv32 +# output: fffffffe\n1\n1ffff\nfffffffe\ncc463bdc\n4c463bdc\n0\n + + .include "testutils.inc" + start + +; Set R, clear C. + move 0x100,ccs + moveq -5,r3 + move 2,mof + mcp mof,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + + moveq 2,r3 + move -1,srp + mcp srp,r3 + test_cc 0 0 0 0 + checkr3 1 + + move 0xffff,srp + move srp,r3 + mcp srp,r3 + test_cc 0 0 0 0 + checkr3 1ffff + + move -1,mof + move mof,r3 + mcp mof,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + + move 0x5432f789,mof + move.d 0x78134452,r3 + mcp mof,r3 + test_cc 1 0 1 0 + checkr3 cc463bdc + + move 0x80000000,srp + mcp srp,r3 + test_cc 0 0 1 0 + checkr3 4c463bdc + + move 0xb3b9c423,srp + mcp srp,r3 + test_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_mmap1.c b/tests/tcg/cris/check_mmap1.c new file mode 100644 index 00000000..b803f0c4 --- /dev/null +++ b/tests/tcg/cris/check_mmap1.c @@ -0,0 +1,48 @@ +/* +#notarget: cris*-*-elf +*/ + +#define _GNU_SOURCE +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/mman.h> + +int main (int argc, char *argv[]) +{ +  int fd = open (argv[0], O_RDONLY); +  struct stat sb; +  int size; +  void *a; +  const char *str = "a string you'll only find in the program"; + +  if (fd == -1) +    { +      perror ("open"); +      abort (); +    } + +  if (fstat (fd, &sb) < 0) +    { +      perror ("fstat"); +      abort (); +    } + +  size = sb.st_size; + +  /* We want to test mmapping a size that isn't exactly a page.  */ +  if ((size & 8191) == 0) +    size--; + +  a = mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); + +  if (memmem (a, size, str, strlen (str) + 1) == NULL) +    abort (); + +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_mmap2.c b/tests/tcg/cris/check_mmap2.c new file mode 100644 index 00000000..35139a0e --- /dev/null +++ b/tests/tcg/cris/check_mmap2.c @@ -0,0 +1,48 @@ +/* +#notarget: cris*-*-elf +*/ + +#define _GNU_SOURCE +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/mman.h> + +int main (int argc, char *argv[]) +{ +  int fd = open (argv[0], O_RDONLY); +  struct stat sb; +  int size; +  void *a; +  const char *str = "a string you'll only find in the program"; + +  if (fd == -1) +    { +      perror ("open"); +      abort (); +    } + +  if (fstat (fd, &sb) < 0) +    { +      perror ("fstat"); +      abort (); +    } + +  size = sb.st_size; + +  /* We want to test mmapping a size that isn't exactly a page.  */ +  if ((size & 8191) == 0) +    size--; + +  a = mmap (NULL, size, PROT_READ, MAP_SHARED, fd, 0); + +  if (memmem (a, size, str, strlen (str) + 1) == NULL) +    abort (); + +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_mmap3.c b/tests/tcg/cris/check_mmap3.c new file mode 100644 index 00000000..34401fa0 --- /dev/null +++ b/tests/tcg/cris/check_mmap3.c @@ -0,0 +1,33 @@ +/* +#notarget: cris*-*-elf +*/ + +#define _GNU_SOURCE +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <sys/mman.h> + +int main (int argc, char *argv[]) +{ +  volatile unsigned char *a; + +  /* Check that we can map a non-multiple of a page and still get a full page.  */ +  a = mmap (NULL, 0x4c, PROT_READ | PROT_WRITE | PROT_EXEC, +	    MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +  if (a == NULL || a == (unsigned char *) -1) +    abort (); + +  a[0] = 0xbe; +  a[8191] = 0xef; +  memset ((char *) a + 1, 0, 8190); + +  if (a[0] != 0xbe || a[8191] != 0xef) +    abort (); + +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_movdelsr1.s b/tests/tcg/cris/check_movdelsr1.s new file mode 100644 index 00000000..300cc877 --- /dev/null +++ b/tests/tcg/cris/check_movdelsr1.s @@ -0,0 +1,33 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: aa117acd\n +# output: eeaabb42\n + +; Bug with move to special register in delay slot, due to +; special flush-insn-cache simulator use.  Ordinary move worked; +; special register caused branch to fail. + + .include "testutils.inc" + start + move -1,srp + + move.d 0xaa117acd,r1 + moveq 3,r9 + cmpq 1,r9 + bhi 0f + move.d r1,r3 + + fail +0: + checkr3 aa117acd + + move.d 0xeeaabb42,r1 + moveq 3,r9 + cmpq 1,r9 + bhi 0f + move r1,srp + + fail +0: + move srp,r3 + checkr3 eeaabb42 + quit diff --git a/tests/tcg/cris/check_movecr.s b/tests/tcg/cris/check_movecr.s new file mode 100644 index 00000000..da8ec262 --- /dev/null +++ b/tests/tcg/cris/check_movecr.s @@ -0,0 +1,37 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: ffffff42\n94\nffff4321\n9234\n76543210\n76540000\n + +; Move constant byte, word, dword to register.  Check that no extension is +; performed, that only part of the register is set. + + .include "testutils.inc" + startnostack + moveq -1,r3 + move.b 0x42,r3 + test_move_cc 0 0 0 0 + checkr3 ffffff42 + + moveq 0,r3 + move.b 0x94,r3 + test_move_cc 1 0 0 0 + checkr3 94 + + moveq -1,r3 + move.w 0x4321,r3 + test_move_cc 0 0 0 0 + checkr3 ffff4321 + + moveq 0,r3 + move.w 0x9234,r3 + test_move_cc 1 0 0 0 + checkr3 9234 + + move.d 0x76543210,r3 + test_move_cc 0 0 0 0 + checkr3 76543210 + + move.w 0,r3 + test_move_cc 0 1 0 0 + checkr3 76540000 + + quit diff --git a/tests/tcg/cris/check_movei.s b/tests/tcg/cris/check_movei.s new file mode 100644 index 00000000..bbfa6333 --- /dev/null +++ b/tests/tcg/cris/check_movei.s @@ -0,0 +1,50 @@ +# mach: crisv32 +# output: fffffffe\n +# output: fffffffe\n + +; Check basic integral-write semantics regarding flags. + + .include "testutils.inc" + start + + move.d 0, $r3	 +; A write that works.  Check that flags are set correspondingly. + move.d d,r4 + ;; store to bring it into the tlb with the right prot bits + move.d r3,[r4] + moveq -2,r5 + setf c + clearf p + move.d [r4],r3 + ax + move.d r5,[r4] + move.d [r4],r3 + + bcc 0f + nop + fail + +0: + checkr3 fffffffe + +; A write that fails; check flags too. + move.d d,r4 + moveq 23,r5 + setf p + clearf c + move.d [r4],r3 + ax + move.d r5,[r4] + move.d [r4],r3 + + bcs 0f + nop + fail + +0: + checkr3 fffffffe + quit + + .data +d: + .dword 42424242 diff --git a/tests/tcg/cris/check_movemr.s b/tests/tcg/cris/check_movemr.s new file mode 100644 index 00000000..88489dee --- /dev/null +++ b/tests/tcg/cris/check_movemr.s @@ -0,0 +1,78 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 12345678\n10234567\n12345678\n12344567\n12344523\n76543210\nffffffaa\naa\n9911\nffff9911\n78\n56\n3456\n6712\n + + .include "testutils.inc" + start + + .data +mem1: + .dword 0x12345678 +mem2: + .word 0x4567 +mem3: + .byte 0x23 + .dword 0x76543210 + .byte 0xaa,0x11,0x99 + + .text + move.d mem1,r2 + move.d [r2],r3 + test_move_cc 0 0 0 0 + checkr3 12345678 + + move.d mem2,r3 + move.d [r3],r3 + test_move_cc 0 0 0 0 + checkr3 10234567 + + move.d mem1,r2 + move.d [r2+],r3 + test_move_cc 0 0 0 0 + checkr3 12345678 + + move.w [r2+],r3 + test_move_cc 0 0 0 0 + checkr3 12344567 + + move.b [r2+],r3 + test_move_cc 0 0 0 0 + checkr3 12344523 + + move.d [r2+],r3 + test_move_cc 0 0 0 0 + checkr3 76543210 + + movs.b [r2],r3 + test_move_cc 1 0 0 0 + checkr3 ffffffaa + + movu.b [r2+],r3 + test_move_cc 0 0 0 0 + checkr3 aa + + movu.w [r2],r3 + test_move_cc 0 0 0 0 + checkr3 9911 + + movs.w [r2+],r3 + test_move_cc 1 0 0 0 + checkr3 ffff9911 + + move.d mem1,r13 + movs.b [r13+],r3 + test_move_cc 0 0 0 0 + checkr3 78 + + movu.b [r13],r3 + test_move_cc 0 0 0 0 + checkr3 56 + + movs.w [r13+],r3 + test_move_cc 0 0 0 0 + checkr3 3456 + + movu.w [r13+],r3 + test_move_cc 0 0 0 0 + checkr3 6712 + + quit diff --git a/tests/tcg/cris/check_movemrv32.s b/tests/tcg/cris/check_movemrv32.s new file mode 100644 index 00000000..53950abd --- /dev/null +++ b/tests/tcg/cris/check_movemrv32.s @@ -0,0 +1,96 @@ +# mach: crisv32 +# output: 15\n7\n2\nffff1234\nb\n16\nf\n2\nffffffef\nf\nffff1234\nf\nfffffff4\nd\nfffffff2\n10\nfffffff2\nd\n + + .include "testutils.inc" + .data +x: + .dword 8,9,10,11 +y: + .dword -12,13,-14,15,16 + + start + moveq 7,r0 + moveq 2,r1 + move.d 0xffff1234,r2 + moveq 21,r3 + move.d x,r4 + setf zcvn + movem r2,[r4+] + test_cc 1 1 1 1 + subq 12,r4 + + checkr3 15 + + move.d [r4+],r3 + checkr3 7 + + move.d [r4+],r3 + checkr3 2 + + move.d [r4+],r3 + checkr3 ffff1234 + + move.d [r4+],r3 + checkr3 b + + subq 16,r4 + moveq 22,r0 + moveq 15,r1 + clearf zcvn + movem r0,[r4] + test_cc 0 0 0 0 + move.d [r4+],r3 + checkr3 16 + + move.d r1,r3 + checkr3 f + + move.d [r4+],r3 + checkr3 2 + + subq 8,r4 + moveq 10,r2 + moveq -17,r0 + clearf zc + setf vn + movem r1,[r4] + test_cc 1 0 1 0 + move.d [r4+],r3 + checkr3 ffffffef + + move.d [r4+],r3 + checkr3 f + + move.d [r4+],r3 + checkr3 ffff1234 + + move.d y,r4 + setf zc + clearf vn + movem [r4+],r3 + test_cc 0 1 0 1 + checkr3 f + + move.d r0,r3 + checkr3 fffffff4 + + move.d r1,r3 + checkr3 d + + move.d r2,r3 + checkr3 fffffff2 + + move.d [r4],r3 + checkr3 10 + + subq 8,r4 + setf zcvn + movem [r4+],r0 + test_cc 1 1 1 1 + move.d r0,r3 + checkr3 fffffff2 + + move.d r1,r3 + checkr3 d + + quit diff --git a/tests/tcg/cris/check_moveq.c b/tests/tcg/cris/check_moveq.c new file mode 100644 index 00000000..80f2dff6 --- /dev/null +++ b/tests/tcg/cris/check_moveq.c @@ -0,0 +1,51 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +#define cris_moveq(dst, src) \ +               asm volatile ("moveq %1, %0\n" : "=r" (dst) : "i" (src)); + + + +int main(void) +{ +	int t; + +	cris_tst_cc_init(); +	asm volatile ("setf\tzvnc\n"); +	cris_moveq(t, 10); +	cris_tst_cc(1, 1, 1, 1); +	if (t != 10) +		err(); + +	/* make sure moveq doesn't clobber the zflag.  */ +	cris_tst_cc_init(); +	asm volatile ("setf vnc\n"); +	asm volatile ("clearf z\n"); +	cris_moveq(t, 0); +	cris_tst_cc(1, 0, 1, 1); +	if (t != 0) +		err(); + +	/* make sure moveq doesn't clobber the nflag. +	   Also check large immediates  */ +	cris_tst_cc_init(); +	asm volatile ("setf zvc\n"); +	asm volatile ("clearf n\n"); +	cris_moveq(t, -31); +	cris_tst_cc(0, 1, 1, 1); +	if (t != -31) +		err(); + +	cris_tst_cc_init(); +	asm volatile ("setf nzvc\n"); +	cris_moveq(t, 31); +	cris_tst_cc(1, 1, 1, 1); +	if (t != 31) +		err(); + +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_mover.s b/tests/tcg/cris/check_mover.s new file mode 100644 index 00000000..b4db595d --- /dev/null +++ b/tests/tcg/cris/check_mover.s @@ -0,0 +1,28 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: ffffff05\nffff0005\n5\nffffff00\n + +; Move between registers.  Check that just the subreg is copied. + + .include "testutils.inc" + startnostack + moveq -30,r3 + moveq 5,r4 + move.b r4,r3 + test_move_cc 0 0 0 0  		; FIXME + checkr3 ffffff05 + + move.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff0005 + + move.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 5 + + moveq -1,r3 + moveq 0,r4 + move.b r4,r3 + test_move_cc 0 1 0 0 + checkr3 ffffff00 + + quit diff --git a/tests/tcg/cris/check_moverm.s b/tests/tcg/cris/check_moverm.s new file mode 100644 index 00000000..eabc9588 --- /dev/null +++ b/tests/tcg/cris/check_moverm.s @@ -0,0 +1,45 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 7823fec2\n10231879\n102318fe\n + + .include "testutils.inc" + start + + .data +mem1: + .dword 0x12345678 +mem2: + .word 0x4567 +mem3: + .byte 0x23 + .dword 0x76543210 + .byte 0xaa,0x11,0x99 + + .text + move.d mem1,r2 + move.d 0x7823fec2,r4 + setf nzvc + move.d r4,[r2+] + test_cc 1 1 1 1 + subq 4,r2 + move.d [r2],r3 + checkr3 7823fec2 + + move.d mem2,r3 + move.d 0x45231879,r4 + clearf nzvc + move.w r4,[r3] + test_cc 0 0 0 0 + move.d [r3],r3 + checkr3 10231879 + + move.d mem2,r2 + moveq -2,r4 + clearf nc + setf zv + move.b r4,[r2+] + test_cc 0 1 1 0 + subq 1,r2 + move.d [r2],r3 + checkr3 102318fe + + quit diff --git a/tests/tcg/cris/check_movmp.s b/tests/tcg/cris/check_movmp.s new file mode 100644 index 00000000..7fc11f06 --- /dev/null +++ b/tests/tcg/cris/check_movmp.s @@ -0,0 +1,131 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: ffffff00\nffff0000\n0\nffffff00\nffff0000\n0\nffffff00\nffff0000\n0\nbb113344\n664433aa\ncc557788\nabcde012\nabcde000\n77880000\n0\n + +# Test generic "move Ps,[]" and "move [],Pd" insns; the ones with +# functionality common to all models. + + .include "testutils.inc" + start + + .data +filler: + .byte 0xaa + .word 0x4433 + .dword 0x55778866 + .byte 0xcc + + .text +; Test that writing to zero-registers is a nop + .if 0 + ; We used to just ignore the writes, but now an error is emitted.  We + ; keep the test-code but disabled, in case we need to change this again. + move 0xaa,p0 + move 0x4433,p4 + move 0x55774433,p8 + .endif + + moveq -1,r3 + setf zcvn + clear.b r3 + test_cc 1 1 1 1 + checkr3 ffffff00 + + moveq -1,r3 + clearf zcvn + clear.w r3 + test_cc 0 0 0 0 + checkr3 ffff0000 + + moveq -1,r3 + clear.d r3 + checkr3 0 + +; "Write" using ordinary memory references too. + .if 0 ; See ".if 0" above. + move.d filler,r6 + move [r6],p0 + move [r6],p4 + move [r6],p8 + .endif + +# ffffff00\nffff0000\n0\nffffff00\nffff0000\n0\nbb113344\n664433aa\ncc557788\nabcde012\nabcde000\n77880000\n0\n + + moveq -1,r3 + clear.b r3 + checkr3 ffffff00 + + moveq -1,r3 + clear.w r3 + checkr3 ffff0000 + + moveq -1,r3 + clear.d r3 + checkr3 0 + +; And postincremented. + .if 0 ; See ".if 0" above. + move [r6+],p0 + move [r6+],p4 + move [r6+],p8 + .endif + +# ffffff00\nffff0000\n0\nbb113344\n664433aa\ncc557788\nabcde012\nabcde000\n77880000\n0\n + + moveq -1,r3 + clear.b r3 + checkr3 ffffff00 + + moveq -1,r3 + clear.w r3 + checkr3 ffff0000 + + moveq -1,r3 + clear.d r3 + checkr3 0 + +; Now see that we can write to the registers too. +# bb113344\n664433aa\ncc557788\nabcde012\nabcde000\n77880000\n0\n +; [PC+] + move.d filler,r9 + move 0xbb113344,srp + move srp,r3 + checkr3 bb113344 + +; [R+] + move [r9+],srp + move srp,r3 + checkr3 664433aa + +; [R] + move [r9],srp + move srp,r3 + checkr3 cc557788 + +; And check writing to memory, clear and srp. + + move.d filler,r9 + move 0xabcde012,srp + setf zcvn + move srp,[r9+] + test_cc 1 1 1 1 + subq 4,r9 + move.d [r9],r3 + checkr3 abcde012 + + clearf zcvn + clear.b [r9] + test_cc 0 0 0 0 + move.d [r9],r3 + checkr3 abcde000 + + addq 2,r9 + clear.w [r9+] + subq 2,r9 + move.d [r9],r3 + checkr3 77880000 + + clear.d [r9] + move.d [r9],r3 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_movpmv32.s b/tests/tcg/cris/check_movpmv32.s new file mode 100644 index 00000000..daf0970e --- /dev/null +++ b/tests/tcg/cris/check_movpmv32.s @@ -0,0 +1,35 @@ +# mach: crisv32 +# output: 11223320\nbb113344\naa557711\n + +# Test v32-specific special registers.  FIXME: more registers. + + .include "testutils.inc" + start + .data +store: + .dword 0x11223344 + .dword 0x77665544 + + .text + moveq -1,r3 + move.d store,r4 + move vr,[r4] + move [r4+],mof + move mof,r3 + checkr3 11223320 + + moveq -1,r3 + clearf zcvn + move 0xbb113344,mof + test_cc 0 0 0 0 + move mof,r3 + checkr3 bb113344 + + setf zcvn + move 0xaa557711,mof + test_cc 1 1 1 1 + move mof,[r4] + move.d [r4],r3 + checkr3 aa557711 + + quit diff --git a/tests/tcg/cris/check_movpr.s b/tests/tcg/cris/check_movpr.s new file mode 100644 index 00000000..eef9bdb4 --- /dev/null +++ b/tests/tcg/cris/check_movpr.s @@ -0,0 +1,28 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: ffffff00\nffff0000\n0\nbb113344\n + +# Test generic "move Ps,Rd" and "move Rs,Pd" insns; the ones with +# functionality common to all models. + + .include "testutils.inc" + start + moveq -1,r3 + clear.b r3 + checkr3 ffffff00 + + moveq -1,r3 + clear.w r3 + checkr3 ffff0000 + + moveq -1,r3 + clear.d r3 + checkr3 0 + + moveq -1,r3 + move.d 0xbb113344,r4 + setf zcvn + move r4,srp + move srp,r3 + test_cc 1 1 1 1 + checkr3 bb113344 + quit diff --git a/tests/tcg/cris/check_movprv32.s b/tests/tcg/cris/check_movprv32.s new file mode 100644 index 00000000..d0d90e12 --- /dev/null +++ b/tests/tcg/cris/check_movprv32.s @@ -0,0 +1,21 @@ +# mach: crisv32 +# output: ffffff20\nbb113344\n + +# Test v32-specific special registers.  FIXME: more registers. + + .include "testutils.inc" + start + moveq -1,r3 + setf zcvn + move vr,r3 + test_cc 1 1 1 1 + checkr3 ffffff20 + + moveq -1,r3 + move.d 0xbb113344,r4 + clearf cvnz + move r4,mof + test_cc 0 0 0 0 + move mof,r3 + checkr3 bb113344 + quit diff --git a/tests/tcg/cris/check_movscr.s b/tests/tcg/cris/check_movscr.s new file mode 100644 index 00000000..53c8ce6b --- /dev/null +++ b/tests/tcg/cris/check_movscr.s @@ -0,0 +1,29 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 42\nffffff85\n7685\nffff8765\n0\n + +; Move constant byte, word, dword to register.  Check that sign-extension +; is performed. + + .include "testutils.inc" + start + moveq -1,r3 + movs.b 0x42,r3 + checkr3 42 + + movs.b 0x85,r3 + test_move_cc 1 0 0 0 + checkr3 ffffff85 + + movs.w 0x7685,r3 + test_move_cc 0 0 0 0 + checkr3 7685 + + movs.w 0x8765,r3 + test_move_cc 1 0 0 0 + checkr3 ffff8765 + + movs.w 0,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_movsm.s b/tests/tcg/cris/check_movsm.s new file mode 100644 index 00000000..7074336e --- /dev/null +++ b/tests/tcg/cris/check_movsm.s @@ -0,0 +1,44 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 5\nfffffff5\n5\nfffffff5\n0\n + +; Movs between registers.  Check that sign-extension is performed and the +; full register is set. + + .include "testutils.inc" + + .data +x: + .byte 5,-11 + .word 5,-11 + .word 0 + + start + move.d x,r5 + + moveq -1,r3 + movs.b [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 5 + + moveq 0,r3 + movs.b [r5],r3 + test_move_cc 1 0 0 0 + addq 1,r5 + checkr3 fffffff5 + + moveq -1,r3 + movs.w [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 5 + + moveq 0,r3 + movs.w [r5],r3 + test_move_cc 1 0 0 0 + addq 2,r5 + checkr3 fffffff5 + + movs.w [r5],r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_movsr.s b/tests/tcg/cris/check_movsr.s new file mode 100644 index 00000000..d1889a7a --- /dev/null +++ b/tests/tcg/cris/check_movsr.s @@ -0,0 +1,46 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 5\nfffffff5\n5\nfffffff5\n0\n + +; Movs between registers.  Check that sign-extension is performed and the +; full register is set. + + .include "testutils.inc" + start + moveq -1,r5 + moveq 5,r4 + move.b r4,r5 + moveq -1,r3 + movs.b r5,r3 + test_move_cc 0 0 0 0 + checkr3 5 + + moveq 0,r5 + moveq -11,r4 + move.b r4,r5 + moveq 0,r3 + movs.b r5,r3 + test_move_cc 1 0 0 0 + checkr3 fffffff5 + + moveq -1,r5 + moveq 5,r4 + move.w r4,r5 + moveq -1,r3 + movs.w r5,r3 + test_move_cc 0 0 0 0 + checkr3 5 + + moveq 0,r5 + moveq -11,r4 + move.w r4,r5 + moveq 0,r3 + movs.w r5,r3 + test_move_cc 1 0 0 0 + checkr3 fffffff5 + + moveq 0,r5 + movs.b r5,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_movucr.s b/tests/tcg/cris/check_movucr.s new file mode 100644 index 00000000..7c8487d1 --- /dev/null +++ b/tests/tcg/cris/check_movucr.s @@ -0,0 +1,33 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 42\n85\n7685\n8765\n0\n + +; Move constant byte, word, dword to register.  Check that zero-extension +; is performed. + + .include "testutils.inc" + start + moveq -1,r3 + movu.b 0x42,r3 + test_move_cc 0 0 0 0 + checkr3 42 + + moveq -1,r3 + movu.b 0x85,r3 + test_move_cc 0 0 0 0 + checkr3 85 + + moveq -1,r3 + movu.w 0x7685,r3 + test_move_cc 0 0 0 0 + checkr3 7685 + + moveq -1,r3 + movu.w 0x8765,r3 + test_move_cc 0 0 0 0 + checkr3 8765 + + movu.b 0,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_movum.s b/tests/tcg/cris/check_movum.s new file mode 100644 index 00000000..038e5394 --- /dev/null +++ b/tests/tcg/cris/check_movum.s @@ -0,0 +1,40 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 5\nf5\n5\nfff5\n0\n + +; Movu between registers.  Check that zero-extension is performed and the +; full register is set. + + .include "testutils.inc" + + .data +x: + .byte 5,-11 + .word 5,-11 + .word 0 + + start + move.d x,r5 + + movu.b [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 5 + + movu.b [r5],r3 + test_move_cc 0 0 0 0 + addq 1,r5 + checkr3 f5 + + movu.w [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 5 + + movu.w [r5],r3 + test_move_cc 0 0 0 0 + addq 2,r5 + checkr3 fff5 + + movu.w [r5],r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_movur.s b/tests/tcg/cris/check_movur.s new file mode 100644 index 00000000..3ecf475f --- /dev/null +++ b/tests/tcg/cris/check_movur.s @@ -0,0 +1,45 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 5\nf5\n5\nfff5\n0\n + +; Movu between registers.  Check that zero-extension is performed and the +; full register is set. + + .include "testutils.inc" + start + moveq -1,r5 + moveq 5,r4 + move.b r4,r5 + moveq -1,r3 + movu.b r5,r3 + test_move_cc 0 0 0 0 + checkr3 5 + + moveq 0,r5 + moveq -11,r4 + move.b r4,r5 + moveq -1,r3 + movu.b r5,r3 + test_move_cc 0 0 0 0 + checkr3 f5 + + moveq -1,r5 + moveq 5,r4 + move.w r4,r5 + moveq -1,r3 + movu.w r5,r3 + test_move_cc 0 0 0 0 + checkr3 5 + + moveq 0,r5 + moveq -11,r4 + move.w r4,r5 + moveq -1,r3 + movu.w r5,r3 + test_move_cc 0 0 0 0 + checkr3 fff5 + + movu.w 0,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_mulv32.s b/tests/tcg/cris/check_mulv32.s new file mode 100644 index 00000000..f3793587 --- /dev/null +++ b/tests/tcg/cris/check_mulv32.s @@ -0,0 +1,51 @@ +# mach: crisv32 +# output: fffffffe\n +# output: ffffffff\n +# output: fffffffe\n +# output: 1\n +# output: fffffffe\n +# output: ffffffff\n +# output: fffffffe\n +# output: 1\n + +; Check that carry is not modified on v32. + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + setf c + muls.d r4,r3 + test_cc 1 0 0 1 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq -1,r3 + moveq 2,r4 + setf c + mulu.d r4,r3 + test_cc 0 0 1 1 + checkr3 fffffffe + move mof,r3 + checkr3 1 + + moveq -1,r3 + moveq 2,r4 + clearf c + muls.d r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq -1,r3 + moveq 2,r4 + clearf c + mulu.d r4,r3 + test_cc 0 0 1 0 + checkr3 fffffffe + move mof,r3 + checkr3 1 + + quit diff --git a/tests/tcg/cris/check_mulx.s b/tests/tcg/cris/check_mulx.s new file mode 100644 index 00000000..d43241a6 --- /dev/null +++ b/tests/tcg/cris/check_mulx.s @@ -0,0 +1,246 @@ +# mach: crisv10 crisv32 +# output: fffffffe\nffffffff\nfffffffe\n1\nfffffffe\nffffffff\nfffffffe\n1\nfffe0001\n0\nfffe0001\n0\n1\n0\n1\nfffffffe\n193eade2\n277e3a49\n193eade2\n277e3a49\nfffffffe\nffffffff\n1fffe\n0\nfffffffe\nffffffff\n1fffe\n0\n1\n0\nfffe0001\n0\nfdbdade2\nffffffff\n420fade2\n0\nfffffffe\nffffffff\n1fe\n0\nfffffffe\nffffffff\n1fe\n0\n1\n0\nfe01\n0\n1\n0\nfe01\n0\nffffd9e2\nffffffff\n2be2\n0\n0\n0\n0\n0\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq 2,r4 + muls.d r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq -1,r3 + moveq 2,r4 + mulu.d r4,r3 + test_cc 0 0 1 0 + checkr3 fffffffe + move mof,r3 + checkr3 1 + + moveq 2,r3 + moveq -1,r4 + muls.d r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq 2,r3 + moveq -1,r4 + mulu.d r4,r3 + test_cc 0 0 1 0 + checkr3 fffffffe + move mof,r3 + checkr3 1 + + move.d 0xffff,r4 + move.d r4,r3 + muls.d r4,r3 + test_cc 0 0 1 0 + checkr3 fffe0001 + move mof,r3 + checkr3 0 + + move.d 0xffff,r4 + move.d r4,r3 + mulu.d r4,r3 + test_cc 0 0 0 0 + checkr3 fffe0001 + move mof,r3 + checkr3 0 + + moveq -1,r4 + move.d r4,r3 + muls.d r4,r3 + test_cc 0 0 0 0 + checkr3 1 + move mof,r3 + checkr3 0 + + moveq -1,r4 + move.d r4,r3 + mulu.d r4,r3 + test_cc 1 0 1 0 + checkr3 1 + move mof,r3 + checkr3 fffffffe + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + muls.d r4,r3 + test_cc 0 0 1 0 + checkr3 193eade2 + move mof,r3 + checkr3 277e3a49 + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + mulu.d r4,r3 + test_cc 0 0 1 0 + checkr3 193eade2 + move mof,r3 + checkr3 277e3a49 + + move.d 0xffff,r3 + moveq 2,r4 + muls.w r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq -1,r3 + moveq 2,r4 + mulu.w r4,r3 + test_cc 0 0 0 0 + checkr3 1fffe + move mof,r3 + checkr3 0 + + moveq 2,r3 + move.d 0xffff,r4 + muls.w r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq 2,r3 + moveq -1,r4 + mulu.w r4,r3 + test_cc 0 0 0 0 + checkr3 1fffe + move mof,r3 + checkr3 0 + + move.d 0xffff,r4 + move.d r4,r3 + muls.w r4,r3 + test_cc 0 0 0 0 + checkr3 1 + move mof,r3 + checkr3 0 + + moveq -1,r4 + move.d r4,r3 + mulu.w r4,r3 + test_cc 0 0 0 0 + checkr3 fffe0001 + move mof,r3 + checkr3 0 + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + muls.w r4,r3 + test_cc 1 0 0 0 + checkr3 fdbdade2 + move mof,r3 + checkr3 ffffffff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + mulu.w r4,r3 + test_cc 0 0 0 0 + checkr3 420fade2 + move mof,r3 + checkr3 0 + + move.d 0xff,r3 + moveq 2,r4 + muls.b r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq -1,r3 + moveq 2,r4 + mulu.b r4,r3 + test_cc 0 0 0 0 + checkr3 1fe + move mof,r3 + checkr3 0 + + moveq 2,r3 + moveq -1,r4 + muls.b r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + move mof,r3 + checkr3 ffffffff + + moveq 2,r3 + moveq -1,r4 + mulu.b r4,r3 + test_cc 0 0 0 0 + checkr3 1fe + move mof,r3 + checkr3 0 + + move.d 0xff,r4 + move.d r4,r3 + muls.b r4,r3 + test_cc 0 0 0 0 + checkr3 1 + move mof,r3 + checkr3 0 + + moveq -1,r4 + move.d r4,r3 + mulu.b r4,r3 + test_cc 0 0 0 0 + checkr3 fe01 + move mof,r3 + checkr3 0 + + move.d 0xfeda49ff,r4 + move.d r4,r3 + muls.b r4,r3 + test_cc 0 0 0 0 + checkr3 1 + move mof,r3 + checkr3 0 + + move.d 0xfeda49ff,r4 + move.d r4,r3 + mulu.b r4,r3 + test_cc 0 0 0 0 + checkr3 fe01 + move mof,r3 + checkr3 0 + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + muls.b r4,r3 + test_cc 1 0 0 0 + checkr3 ffffd9e2 + move mof,r3 + checkr3 ffffffff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + mulu.b r4,r3 + test_cc 0 0 0 0 + checkr3 2be2 + move mof,r3 + checkr3 0 + + moveq 0,r3 + move.d 0xf87f4aeb,r4 + muls.d r4,r3 + test_cc 0 1 0 0 + checkr3 0 + move mof,r3 + checkr3 0 + + move.d 0xf87f4aeb,r3 + moveq 0,r4 + mulu.d r4,r3 + test_cc 0 1 0 0 + checkr3 0 + move mof,r3 + checkr3 0 + + quit diff --git a/tests/tcg/cris/check_neg.s b/tests/tcg/cris/check_neg.s new file mode 100644 index 00000000..963c4b6f --- /dev/null +++ b/tests/tcg/cris/check_neg.s @@ -0,0 +1,104 @@ +# mach:  crisv0 crisv3 crisv8 crisv10 crisv32 +# output: ffffffff\nffffffff\n0\n80000000\n1\nba987655\nffff\nffff\n0\n89ab8000\nffff0001\n45677655\nff\nff\n0\n89abae80\nffffff01\n45678955\n + + .include "testutils.inc" + start + moveq 0,r3 + moveq 1,r4 + neg.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 1,r3 + moveq 0,r4 + neg.d r3,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + +;; FIXME: this was wrong. + moveq 0,r3 + neg.d r3,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0x80000000,r3 + neg.d r3,r3 + test_move_cc 1 0 0 0 + checkr3 80000000 + + moveq -1,r3 + neg.d r3,r3 + test_move_cc 0 0 0 0 + checkr3 1 + + move.d 0x456789ab,r3 + neg.d r3,r3 + test_move_cc 1 0 0 0 + checkr3 ba987655 + + moveq 0,r3 + moveq 1,r4 + neg.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffff + + moveq 1,r3 + moveq 0,r4 + neg.w r3,r3 + test_move_cc 1 0 0 0 + checkr3 ffff + + moveq 0,r3 + neg.w r3,r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0x89ab8000,r3 + neg.w r3,r3 + test_move_cc 1 0 0 0 + checkr3 89ab8000 + + moveq -1,r3 + neg.w r3,r3 + test_move_cc 0 0 0 0 + checkr3 ffff0001 + + move.d 0x456789ab,r3 + neg.w r3,r3 + test_move_cc 0 0 0 0 + checkr3 45677655 + + moveq 0,r3 + moveq 1,r4 + neg.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 ff + + moveq 1,r3 + moveq 0,r4 + neg.b r3,r3 + test_move_cc 1 0 0 0 + checkr3 ff + + moveq 0,r3 + neg.b r3,r3 + test_move_cc 0 1 0 0 + checkr3 0 + +;; FIXME: was wrong. + move.d 0x89abae80,r3 + neg.b r3,r3 + test_move_cc 1 0 0 1 + checkr3 89abae80 + + moveq -1,r3 + neg.b r3,r3 + test_move_cc 0 0 0 0 + checkr3 ffffff01 + + move.d 0x456789ab,r3 + neg.b r3,r3 + test_move_cc 0 0 0 0 + checkr3 45678955 + + quit diff --git a/tests/tcg/cris/check_not.s b/tests/tcg/cris/check_not.s new file mode 100644 index 00000000..33bcf155 --- /dev/null +++ b/tests/tcg/cris/check_not.s @@ -0,0 +1,31 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: fffffffe\nfffffffd\nffff0f00\n0\n87ecbbad\n + + .include "testutils.inc" + start + moveq 1,r3 + not r3 + test_move_cc 1 0 0 0 + checkr3 fffffffe + + moveq 2,r3 + not r3 + test_move_cc 1 0 0 0 + checkr3 fffffffd + + move.d 0xf0ff,r3 + not r3 + test_move_cc 1 0 0 0 + checkr3 ffff0f00 + + moveq -1,r3 + not r3 + test_move_cc 0 1 0 0 + checkr3 0 + + move.d 0x78134452,r3 + not r3 + test_move_cc 1 0 0 0 + checkr3 87ecbbad + + quit diff --git a/tests/tcg/cris/check_openpf1.c b/tests/tcg/cris/check_openpf1.c new file mode 100644 index 00000000..fdcf4c5c --- /dev/null +++ b/tests/tcg/cris/check_openpf1.c @@ -0,0 +1,38 @@ +/* Check that --sysroot is applied to open(2). +#sim: --sysroot=@exedir@ + +   We assume, with EXE being the name of the executable: +   - The simulator executes with cwd the same directory where the executable +     is located (so argv[0] contains a plain filename without directory +     components). +   - There's no /EXE on the host file system.  */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +int main (int argc, char *argv[]) +{ +  char *fnam = argv[0]; +  FILE *f; +  if (argv[0][0] != '/') +    { +      fnam = malloc (strlen (argv[0]) + 2); +      if (fnam == NULL) +	abort (); +      strcpy (fnam, "/"); +      strcat (fnam, argv[0]); +    } + +  f = fopen (fnam, "rb"); +  if (f == NULL) +    abort (); +  fclose(f); + +  /* Cover another execution path.  */ +  if (fopen ("/nonexistent", "rb") != NULL +      || errno != ENOENT) +    abort (); +  printf ("pass\n"); +  return 0; +} diff --git a/tests/tcg/cris/check_openpf2.c b/tests/tcg/cris/check_openpf2.c new file mode 100644 index 00000000..5d56189f --- /dev/null +++ b/tests/tcg/cris/check_openpf2.c @@ -0,0 +1,16 @@ +/* Check that the simulator has chdir:ed to the --sysroot argument +#sim: --sysroot=@srcdir@ +   (or that  --sysroot is applied to relative file paths).  */ + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +int main (int argc, char *argv[]) +{ +  FILE *f = fopen ("check_openpf2.c", "rb"); +  if (f == NULL) +    abort (); +  fclose(f); +  printf ("pass\n"); +  return 0; +} diff --git a/tests/tcg/cris/check_openpf3.c b/tests/tcg/cris/check_openpf3.c new file mode 100644 index 00000000..557adee9 --- /dev/null +++ b/tests/tcg/cris/check_openpf3.c @@ -0,0 +1,49 @@ +/* Basic file operations (rename, unlink); once without sysroot.  We +   also test that the simulator has chdir:ed to PREFIX, when defined.  */ + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#ifndef PREFIX +#define PREFIX +#endif + +void err (const char *s) +{ +  perror (s); +  abort (); +} + +int main (int argc, char *argv[]) +{ +  FILE *f; +  struct stat buf; + +  unlink (PREFIX "testfoo2.tmp"); + +  f = fopen ("testfoo1.tmp", "w"); +  if (f == NULL) +    err ("open"); +  fclose (f); + +  if (rename (PREFIX "testfoo1.tmp", PREFIX "testfoo2.tmp") != 0) +    err ("rename"); + +  if (stat (PREFIX "testfoo2.tmp", &buf) != 0 +      || !S_ISREG (buf.st_mode)) +    err ("stat 1"); + +  if (stat ("testfoo2.tmp", &buf) != 0 +      || !S_ISREG (buf.st_mode)) +    err ("stat 2"); + +  if (unlink (PREFIX "testfoo2.tmp") != 0) +    err ("unlink"); + +  printf ("pass\n"); +  return 0; +} diff --git a/tests/tcg/cris/check_openpf4.c b/tests/tcg/cris/check_openpf4.c new file mode 100644 index 00000000..8bbee41a --- /dev/null +++ b/tests/tcg/cris/check_openpf4.c @@ -0,0 +1,5 @@ +/* Basic file operations, now *with* sysroot. +#sim: --sysroot=@exedir@ +*/ +#define PREFIX "/" +#include "check_openpf3.c" diff --git a/tests/tcg/cris/check_openpf5.c b/tests/tcg/cris/check_openpf5.c new file mode 100644 index 00000000..1f86ea28 --- /dev/null +++ b/tests/tcg/cris/check_openpf5.c @@ -0,0 +1,56 @@ +/* Check that TRT happens when error on too many opened files. +#notarget: cris*-*-elf +#sim: --sysroot=@exedir@ +*/ +#include <stddef.h> +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> +#include <limits.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> + +int main (int argc, char *argv[]) +{ +  int i; +  int filemax; + +#ifdef OPEN_MAX +  filemax = OPEN_MAX; +#else +  filemax = sysconf (_SC_OPEN_MAX); +#endif + +  char *fn = malloc (strlen (argv[0]) + 2); +  if (fn == NULL) +    abort (); +  strcpy (fn, "/"); +  strcat (fn, argv[0]); + +  for (i = 0; i < filemax + 1; i++) +    { +      if (open (fn, O_RDONLY) < 0) +	{ +	  /* Shouldn't happen too early.  */ +	  if (i < filemax - 3 - 1) +	    { +	      fprintf (stderr, "i: %d\n", i); +	      abort (); +	    } +	  if (errno != EMFILE) +	    { +	      perror ("open"); +	      abort (); +	    } +	  goto ok; +	} +    } +  abort (); + +ok: +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_orc.s b/tests/tcg/cris/check_orc.s new file mode 100644 index 00000000..c733f036 --- /dev/null +++ b/tests/tcg/cris/check_orc.s @@ -0,0 +1,71 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 3\n3\nffff\nffffffff\n7c33f7db\nffff0003\n3\nfedaffff\n7813f7db\n3\n3\nfeb\n781344db\n + + .include "testutils.inc" + start + moveq 1,r3 + or.d 2,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + moveq 2,r3 + or.d 1,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xf0ff,r3 + or.d 0xff0f,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r3 + or.d -1,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x78134452,r3 + or.d 0x5432f789,r3 + test_move_cc 0 0 0 0 + checkr3 7c33f7db + + move.d 0xffff0001,r3 + or.w 2,r3 + test_move_cc 0 0 0 0 + checkr3 ffff0003 + + moveq 2,r3 + or.w 1,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xfedaffaf,r3 + or.w 0xff5f,r3 + test_move_cc 1 0 0 0 + checkr3 fedaffff + + move.d 0x78134452,r3 + or.w 0xf789,r3 + test_move_cc 1 0 0 0 + checkr3 7813f7db + + moveq 1,r3 + or.b 2,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + moveq 2,r3 + or.b 1,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xfa3,r3 + or.b 0x4a,r3 + test_move_cc 1 0 0 0 + checkr3 feb + + move.d 0x78134453,r3 + or.b 0x89,r3 + test_move_cc 1 0 0 0 + checkr3 781344db + + quit diff --git a/tests/tcg/cris/check_orm.s b/tests/tcg/cris/check_orm.s new file mode 100644 index 00000000..ee723a6a --- /dev/null +++ b/tests/tcg/cris/check_orm.s @@ -0,0 +1,75 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 3\n3\nffff\nffffffff\n7c33f7db\nffff0003\n3\nfedaffff\n7813f7db\n3\n3\nfeb\n781344db\n + + .include "testutils.inc" + .data +x: + .dword 2,1,0xff0f,-1,0x5432f789 + .word 2,1,0xff5f,0xf789 + .byte 2,1,0x4a,0x89 + + start + moveq 1,r3 + move.d x,r5 + or.d [r5+],r3 + checkr3 3 + + moveq 2,r3 + or.d [r5],r3 + addq 4,r5 + checkr3 3 + + move.d 0xf0ff,r3 + or.d [r5+],r3 + checkr3 ffff + + moveq -1,r3 + or.d [r5+],r3 + checkr3 ffffffff + + move.d 0x78134452,r3 + or.d [r5+],r3 + checkr3 7c33f7db + + move.d 0xffff0001,r3 + or.w [r5+],r3 + checkr3 ffff0003 + + moveq 2,r3 + or.w [r5],r3 + addq 2,r5 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xfedaffaf,r3 + or.w [r5+],r3 + test_move_cc 1 0 0 0 + checkr3 fedaffff + + move.d 0x78134452,r3 + or.w [r5+],r3 + test_move_cc 1 0 0 0 + checkr3 7813f7db + + moveq 1,r3 + or.b [r5+],r3 + test_move_cc 0 0 0 0 + checkr3 3 + + moveq 2,r3 + or.b [r5],r3 + addq 1,r5 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xfa3,r3 + or.b [r5+],r3 + test_move_cc 1 0 0 0 + checkr3 feb + + move.d 0x78134453,r3 + or.b [r5],r3 + test_move_cc 1 0 0 0 + checkr3 781344db + + quit diff --git a/tests/tcg/cris/check_orq.s b/tests/tcg/cris/check_orq.s new file mode 100644 index 00000000..5060edc7 --- /dev/null +++ b/tests/tcg/cris/check_orq.s @@ -0,0 +1,41 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 3\n3\nffffffff\nffffffff\n1f\nffffffe0\n7813445e\n + + .include "testutils.inc" + start + moveq 1,r3 + orq 2,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + moveq 2,r3 + orq 1,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xf0ff,r3 + orq -1,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 0,r3 + orq -1,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + moveq 0,r3 + orq 31,r3 + test_move_cc 0 0 0 0 + checkr3 1f + + moveq 0,r3 + orq -32,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffe0 + + move.d 0x78134452,r3 + orq 12,r3 + test_move_cc 0 0 0 0 + checkr3 7813445e + + quit diff --git a/tests/tcg/cris/check_orr.s b/tests/tcg/cris/check_orr.s new file mode 100644 index 00000000..a514c11b --- /dev/null +++ b/tests/tcg/cris/check_orr.s @@ -0,0 +1,84 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 3\n3\nffff\nffffffff\n7c33f7db\nffff0003\n3\nfedaffff\n7813f7db\n3\n3\nfeb\n781344db\n + + .include "testutils.inc" + start + moveq 1,r3 + moveq 2,r4 + or.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + moveq 2,r3 + moveq 1,r4 + or.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xff0f,r4 + move.d 0xf0ff,r3 + or.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff + + moveq -1,r4 + move.d r4,r3 + or.d r4,r3 + test_move_cc 1 0 0 0 + checkr3 ffffffff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + or.d r4,r3 + test_move_cc 0 0 0 0 + checkr3 7c33f7db + + move.d 0xffff0001,r3 + moveq 2,r4 + or.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 ffff0003 + + moveq 2,r3 + move.d 0xffff0001,r4 + or.w r4,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0xfedaffaf,r3 + move.d 0xffffff5f,r4 + or.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 fedaffff + + move.d 0x5432f789,r4 + move.d 0x78134452,r3 + or.w r4,r3 + test_move_cc 1 0 0 0 + checkr3 7813f7db + + moveq 1,r3 + move.d 0xffffff02,r4 + or.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + moveq 2,r3 + moveq 1,r4 + or.b r4,r3 + test_move_cc 0 0 0 0 + checkr3 3 + + move.d 0x4a,r4 + move.d 0xfa3,r3 + or.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 feb + + move.d 0x5432f789,r4 + move.d 0x78134453,r3 + or.b r4,r3 + test_move_cc 1 0 0 0 + checkr3 781344db + + quit diff --git a/tests/tcg/cris/check_ret.s b/tests/tcg/cris/check_ret.s new file mode 100644 index 00000000..b44fb259 --- /dev/null +++ b/tests/tcg/cris/check_ret.s @@ -0,0 +1,25 @@ +# mach: crisv3 crisv8 crisv10 +# output: 3\n + +# Test that ret works. + + .include "testutils.inc" + start +x: + moveq 0,r3 + jsr z +w: + quit +y: + addq 1,r3 + checkr3 3 + quit + +z: + addq 1,r3 + move srp,r2 + add.d y-w,r2 + move r2,srp + ret + addq 1,r3 + quit diff --git a/tests/tcg/cris/check_scc.s b/tests/tcg/cris/check_scc.s new file mode 100644 index 00000000..4a8674cc --- /dev/null +++ b/tests/tcg/cris/check_scc.s @@ -0,0 +1,95 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n0\n1\n0\n1\n0\n1\n0\n0\n1\n1\n0\n1\n0\n1\n0\n1\n0\n0\n1\n0\n1\n1\n0\n1\n0\n0\n1\n1\n0\n1\n1\n0\n + + .include "testutils.inc" + + .macro lcheckr3 v +	move	 $ccs, $r9 +	checkr3 \v +	move	$r9, $ccs + .endm + + start + clearf nzvc + scc r3 + lcheckr3 1 + scs r3 + lcheckr3 0 + sne r3 + lcheckr3 1 + seq r3 + lcheckr3 0 + svc r3 + lcheckr3 1 + svs r3 + lcheckr3 0 + spl r3 + lcheckr3 1 + smi r3 + lcheckr3 0 + sls r3 + lcheckr3 0 + shi r3 + lcheckr3 1 + sge r3 + lcheckr3 1 + slt r3 + lcheckr3 0 + sgt r3 + lcheckr3 1 + sle r3 + lcheckr3 0 + sa r3 + lcheckr3 1 + setf nzvc + scc r3 + lcheckr3 0 + scs r3 + lcheckr3 1 + sne r3 + lcheckr3 0 + svc r3 + lcheckr3 0 + svs r3 + lcheckr3 1 + spl r3 + lcheckr3 0 + smi r3 + lcheckr3 1 + sls r3 + lcheckr3 1 + shi r3 + lcheckr3 0 + sge r3 + lcheckr3 1 + slt r3 + lcheckr3 0 + sgt r3 + lcheckr3 0 + sle r3 + lcheckr3 1 + sa r3 + lcheckr3 1 + clearf n + sge r3 + lcheckr3 0 + slt r3 + lcheckr3 1 + + .if 1 ;..asm.arch.cris.v32 + setf p + ssb r3 + .else + moveq 1,r3 + .endif + lcheckr3 1 + + .if 1 ;..asm.arch.cris.v32 + clearf p + ssb r3 + .else + moveq 0,r3 + .endif + lcheckr3 0 + + quit diff --git a/tests/tcg/cris/check_settls1.c b/tests/tcg/cris/check_settls1.c new file mode 100644 index 00000000..69d20265 --- /dev/null +++ b/tests/tcg/cris/check_settls1.c @@ -0,0 +1,45 @@ +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <unistd.h> + +#include <sys/syscall.h> + +#ifndef SYS_set_thread_area +#define SYS_set_thread_area 243 +#endif + +int main (void) +{ +    unsigned long tp, old_tp; +    int ret; + +    asm volatile ("move $pid,%0" : "=r" (old_tp)); +    old_tp &= ~0xff; + +    ret = syscall (SYS_set_thread_area, 0xf0); +    if (ret != -1 || errno != EINVAL) { +        syscall (SYS_set_thread_area, old_tp); +        perror ("Invalid thread area accepted:"); +        abort(); +    } + +    ret = syscall (SYS_set_thread_area, 0xeddeed00); +    if (ret != 0) { +        perror ("Valid thread area not accepted: "); +        abort (); +    } + +    asm volatile ("move $pid,%0" : "=r" (tp)); +    tp &= ~0xff; +    syscall (SYS_set_thread_area, old_tp); + +    if (tp != 0xeddeed00) { +	* (volatile int *) 0 = 0; +        perror ("tls2"); +        abort (); +    } + +    printf ("pass\n"); +    return EXIT_SUCCESS; +} diff --git a/tests/tcg/cris/check_sigalrm.c b/tests/tcg/cris/check_sigalrm.c new file mode 100644 index 00000000..39fa8d9b --- /dev/null +++ b/tests/tcg/cris/check_sigalrm.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <stdlib.h> +#include <signal.h> +#include <unistd.h> + +#define MAGIC (0xdeadbeef) + +int s = 0; +void sighandler(int sig) +{ +	s = MAGIC; +} + +int main(int argc, char **argv) +{ +	int p; + +	p = getpid(); +	signal(SIGALRM, sighandler); +	kill(p, SIGALRM); +	if (s != MAGIC) +		return EXIT_FAILURE; + +	printf ("passed\n"); +	return EXIT_SUCCESS; +} diff --git a/tests/tcg/cris/check_stat1.c b/tests/tcg/cris/check_stat1.c new file mode 100644 index 00000000..2e2cae51 --- /dev/null +++ b/tests/tcg/cris/check_stat1.c @@ -0,0 +1,16 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ +  struct stat buf; + +  if (stat (".", &buf) != 0 +      || !S_ISDIR (buf.st_mode)) +    abort (); +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_stat2.c b/tests/tcg/cris/check_stat2.c new file mode 100644 index 00000000..e36172ed --- /dev/null +++ b/tests/tcg/cris/check_stat2.c @@ -0,0 +1,20 @@ +/* +#notarget: cris*-*-elf +*/ + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ +  struct stat buf; + +  if (lstat (".", &buf) != 0 +      || !S_ISDIR (buf.st_mode)) +    abort (); +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_stat3.c b/tests/tcg/cris/check_stat3.c new file mode 100644 index 00000000..36a9d5d2 --- /dev/null +++ b/tests/tcg/cris/check_stat3.c @@ -0,0 +1,25 @@ +/* Simulator options: +#sim: --sysroot=@exedir@ +*/ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +int main (int argc, char *argv[]) +{ +  char path[1024] = "/"; +  struct stat buf; + +  strncat(path, argv[0], sizeof(path) - 2); +  if (stat (".", &buf) != 0 +      || !S_ISDIR (buf.st_mode)) +    abort (); +  if (stat (path, &buf) != 0 +      || !S_ISREG (buf.st_mode)) +    abort (); +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_stat4.c b/tests/tcg/cris/check_stat4.c new file mode 100644 index 00000000..04f21fe7 --- /dev/null +++ b/tests/tcg/cris/check_stat4.c @@ -0,0 +1,27 @@ +/* Simulator options: +#notarget: cris*-*-elf +#sim: --sysroot=@exedir@ +*/ + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +int main (int argc, char *argv[]) +{ +  char path[1024] = "/"; +  struct stat buf; + +  strncat(path, argv[0], sizeof(path) - 2); +  if (lstat (".", &buf) != 0 +      || !S_ISDIR (buf.st_mode)) +    abort (); +  if (lstat (path, &buf) != 0 +      || !S_ISREG (buf.st_mode)) +    abort (); +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_subc.s b/tests/tcg/cris/check_subc.s new file mode 100644 index 00000000..e34b5448 --- /dev/null +++ b/tests/tcg/cris/check_subc.s @@ -0,0 +1,87 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n1fffe\nfffffffe\ncc463bdb\nffff0001\n1\nfffe\nfedafffe\n78133bdb\nffffff01\n1\nfe\nfeda49fe\n781344db\n85649200\n + + .include "testutils.inc" + start + + moveq -1,r3 + sub.d -2,r3 + test_cc 0 0 0 0 + checkr3 1 + + moveq 2,r3 + sub.d 1,r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xffff,r3 + sub.d -0xffff,r3 + test_cc 0 0 0 1 + checkr3 1fffe + + moveq -1,r3 + sub.d 1,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + + move.d 0x78134452,r3 + sub.d -0x5432f789,r3 + test_cc 1 0 1 1 + checkr3 cc463bdb + + moveq -1,r3 + sub.w -2,r3 + test_cc 0 0 0 0 + checkr3 ffff0001 + + moveq 2,r3 + sub.w 1,r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xffff,r3 + sub.w 1,r3 + test_cc 1 0 0 0 + checkr3 fffe + + move.d 0xfedaffff,r3 + sub.w 1,r3 + test_cc 1 0 0 0 + checkr3 fedafffe + + move.d 0x78134452,r3 + sub.w 0x877,r3 + test_cc 0 0 0 0 + checkr3 78133bdb + + moveq -1,r3 + sub.b -2,r3 + test_cc 0 0 0 0 + checkr3 ffffff01 + + moveq 2,r3 + sub.b 1,r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xff,r3 + sub.b 1,r3 + test_cc 1 0 0 0 + checkr3 fe + + move.d 0xfeda49ff,r3 + sub.b 1,r3 + test_cc 1 0 0 0 + checkr3 feda49fe + + move.d 0x78134452,r3 + sub.b 0x77,r3 + test_cc 1 0 0 1 + checkr3 781344db + + move.d 0x85649282,r3 + sub.b 0x82,r3 + test_cc 0 1 0 0 + checkr3 85649200 + + quit diff --git a/tests/tcg/cris/check_subm.s b/tests/tcg/cris/check_subm.s new file mode 100644 index 00000000..e07ea02d --- /dev/null +++ b/tests/tcg/cris/check_subm.s @@ -0,0 +1,96 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n1fffe\nfffffffe\ncc463bdb\nffff0001\n1\nfffe\nfedafffe\n78133bdb\nffffff01\n1\nfe\nfeda49fe\n781344db\n85649200\n + + .include "testutils.inc" + .data +x: + .dword -2,1,-0xffff,1,-0x5432f789 + .word -2,1,1,0x877 + .byte -2,1,0x77 + .byte 0x22 + + start + moveq -1,r3 + move.d x,r5 + sub.d [r5+],r3 + test_cc 0 0 0 0 + checkr3 1 + + moveq 2,r3 + sub.d [r5],r3 + test_cc 0 0 0 0 + addq 4,r5 + checkr3 1 + + move.d 0xffff,r3 + sub.d [r5+],r3 + test_cc 0 0 0 1 + checkr3 1fffe + + moveq -1,r3 + sub.d [r5+],r3 + test_cc 1 0 0 0 + checkr3 fffffffe + + move.d 0x78134452,r3 + sub.d [r5+],r3 + test_cc 1 0 1 1 + checkr3 cc463bdb + + moveq -1,r3 + sub.w [r5+],r3 + test_cc 0 0 0 0 + checkr3 ffff0001 + + moveq 2,r3 + sub.w [r5+],r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xffff,r3 + sub.w [r5],r3 + test_cc 1 0 0 0 + checkr3 fffe + + move.d 0xfedaffff,r3 + sub.w [r5+],r3 + test_cc 1 0 0 0 + checkr3 fedafffe + + move.d 0x78134452,r3 + sub.w [r5+],r3 + test_cc 0 0 0 0 + checkr3 78133bdb + + moveq -1,r3 + sub.b [r5],r3 + test_cc 0 0 0 0 + addq 1,r5 + checkr3 ffffff01 + + moveq 2,r3 + sub.b [r5],r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xff,r3 + sub.b [r5],r3 + test_cc 1 0 0 0 + checkr3 fe + + move.d 0xfeda49ff,r3 + sub.b [r5+],r3 + test_cc 1 0 0 0 + checkr3 feda49fe + + move.d 0x78134452,r3 + sub.b [r5+],r3 + test_cc 1 0 0 1 + checkr3 781344db + + move.d 0x85649222,r3 + sub.b [r5],r3 + test_cc 0 1 0 0 + checkr3 85649200 + + quit diff --git a/tests/tcg/cris/check_subq.s b/tests/tcg/cris/check_subq.s new file mode 100644 index 00000000..9e34fa31 --- /dev/null +++ b/tests/tcg/cris/check_subq.s @@ -0,0 +1,52 @@ +# mach: crisv3 crisv8 crisv10 crisv32 +# output: 0\nffffffff\nfffffffe\nffff\nff\n56788f9\n56788d9\n567889a\n0\n7ffffffc\n + + .include "testutils.inc" + start + moveq 1,r3 + subq 1,r3 + test_cc 0 1 0 0 + checkr3 0 + + subq 1,r3 + test_cc 1 0 0 1 + checkr3 ffffffff + + subq 1,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + + move.d 0x10000,r3 + subq 1,r3 + test_cc 0 0 0 0 + checkr3 ffff + + move.d 0x100,r3 + subq 1,r3 + test_cc 0 0 0 0 + checkr3 ff + + move.d 0x5678900,r3 + subq 7,r3 + test_cc 0 0 0 0 + checkr3 56788f9 + + subq 32,r3 + test_cc 0 0 0 0 + checkr3 56788d9 + + subq 63,r3 + test_cc 0 0 0 0 + checkr3 567889a + + move.d 34,r3 + subq 34,r3 + test_cc 0 1 0 0 + checkr3 0 + + move.d 0x80000024,r3 + subq 40,r3 + test_cc 0 0 1 0 + checkr3 7ffffffc + + quit diff --git a/tests/tcg/cris/check_subr.s b/tests/tcg/cris/check_subr.s new file mode 100644 index 00000000..742fbc89 --- /dev/null +++ b/tests/tcg/cris/check_subr.s @@ -0,0 +1,102 @@ +# mach: crisv0 crisv3 crisv8 crisv10 crisv32 +# output: 1\n1\n1fffe\nfffffffe\ncc463bdb\nffff0001\n1\nfffe\nfedafffe\n78133bdb\nffffff01\n1\nfe\nfeda49fe\n781344db\n85649200\n + + .include "testutils.inc" + start + moveq -1,r3 + moveq -2,r4 + sub.d r4,r3 + test_cc 0 0 0 0 + checkr3 1 + + moveq 2,r3 + moveq 1,r4 + sub.d r4,r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xffff,r3 + move.d -0xffff,r4 + sub.d r4,r3 + test_cc 0 0 0 1 + checkr3 1fffe + + moveq 1,r4 + moveq -1,r3 + sub.d r4,r3 + test_cc 1 0 0 0 + checkr3 fffffffe + + move.d -0x5432f789,r4 + move.d 0x78134452,r3 + sub.d r4,r3 + test_cc 1 0 1 1 + checkr3 cc463bdb + + moveq -1,r3 + moveq -2,r4 + sub.w r4,r3 + test_cc 0 0 0 0 + checkr3 ffff0001 + + moveq 2,r3 + moveq 1,r4 + sub.w r4,r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d 0xffff,r3 + move.d -0xffff,r4 + sub.w r4,r3 + test_cc 1 0 0 0 + checkr3 fffe + + move.d 0xfedaffff,r3 + move.d -0xfedaffff,r4 + sub.w r4,r3 + test_cc 1 0 0 0 + checkr3 fedafffe + + move.d -0x5432f789,r4 + move.d 0x78134452,r3 + sub.w r4,r3 + test_cc 0 0 0 0 + checkr3 78133bdb + + moveq -1,r3 + moveq -2,r4 + sub.b r4,r3 + test_cc 0 0 0 0 + checkr3 ffffff01 + + moveq 2,r3 + moveq 1,r4 + sub.b r4,r3 + test_cc 0 0 0 0 + checkr3 1 + + move.d -0xff,r4 + move.d 0xff,r3 + sub.b r4,r3 + test_cc 1 0 0 0 + checkr3 fe + + move.d -0xfeda49ff,r4 + move.d 0xfeda49ff,r3 + sub.b r4,r3 + test_cc 1 0 0 0 + checkr3 feda49fe + + move.d -0x5432f789,r4 + move.d 0x78134452,r3 + sub.b r4,r3 + test_cc 1 0 0 1 + checkr3 781344db + + move.d 0x85649222,r3 + move.d 0x77445622,r4 + sub.b r4,r3 + test_cc 0 1 0 0 + checkr3 85649200 + + quit diff --git a/tests/tcg/cris/check_swap.c b/tests/tcg/cris/check_swap.c new file mode 100644 index 00000000..f851cbce --- /dev/null +++ b/tests/tcg/cris/check_swap.c @@ -0,0 +1,76 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "sys.h" +#include "crisutils.h" + +#define N 8 +#define W 4 +#define B 2 +#define R 1 + +static inline int cris_swap(const int mode, int x) +{ +	switch (mode) +	{ +		case N: asm ("swapn\t%0\n" : "+r" (x) : "0" (x)); break; +		case W: asm ("swapw\t%0\n" : "+r" (x) : "0" (x)); break; +		case B: asm ("swapb\t%0\n" : "+r" (x) : "0" (x)); break; +		case R: asm ("swapr\t%0\n" : "+r" (x) : "0" (x)); break; +		case B|R: asm ("swapbr\t%0\n" : "+r" (x) : "0" (x)); break; +		case W|R: asm ("swapwr\t%0\n" : "+r" (x) : "0" (x)); break; +		case W|B: asm ("swapwb\t%0\n" : "+r" (x) : "0" (x)); break; +		case W|B|R: asm ("swapwbr\t%0\n" : "+r" (x) : "0" (x)); break; +		case N|R: asm ("swapnr\t%0\n" : "+r" (x) : "0" (x)); break; +		case N|B: asm ("swapnb\t%0\n" : "+r" (x) : "0" (x)); break; +		case N|B|R: asm ("swapnbr\t%0\n" : "+r" (x) : "0" (x)); break; +		case N|W: asm ("swapnw\t%0\n" : "+r" (x) : "0" (x)); break; +		default: +			err(); +			break; +	} +	return x; +} + +/* Made this a macro to be able to pick up the location of the errors.  */ +#define verify_swap(mode, val, expected, n, z)          \ +do {                                                    \ +        int r;                                          \ +        cris_tst_cc_init();                             \ +	r = cris_swap(mode, val);                       \ +        cris_tst_mov_cc(n, z);                          \ +	if (r != expected)                              \ +		err();                                  \ +} while(0) + +void check_swap(void) +{ +	/* Some of these numbers are borrowed from GDB's cris sim +	   testsuite.  */ +	if (cris_swap(N, 0) != 0xffffffff) +		err(); +	if (cris_swap(W, 0x12345678) != 0x56781234) +		err(); +	if (cris_swap(B, 0x12345678) != 0x34127856) +		err(); + +	verify_swap(R, 0x78134452, 0x1ec8224a, 0, 0); +	verify_swap(B, 0x78134452, 0x13785244, 0, 0); +	verify_swap(B|R, 0x78134452, 0xc81e4a22, 1, 0); +	verify_swap(W, 0x78134452, 0x44527813, 0, 0); +	verify_swap(W|R, 0x78134452, 0x224a1ec8, 0, 0); +	verify_swap(W|B|R, 0x78134452, 0x4a22c81e, 0, 0); +	verify_swap(N, 0x78134452, 0x87ecbbad, 1, 0); +	verify_swap(N|R, 0x78134452, 0xe137ddb5, 1, 0); +	verify_swap(N|B, 0x78134452, 0xec87adbb, 1, 0); +	verify_swap(N|B|R, 0x78134452, 0x37e1b5dd, 0, 0); +	verify_swap(N|W, 0x78134452, 0xbbad87ec, 1, 0); +	verify_swap(N|B|R, 0xffffffff, 0, 0, 1); +} + +int main(void) +{ +	check_swap(); +	pass(); +	return 0; +} diff --git a/tests/tcg/cris/check_time1.c b/tests/tcg/cris/check_time1.c new file mode 100644 index 00000000..3fcf0e15 --- /dev/null +++ b/tests/tcg/cris/check_time1.c @@ -0,0 +1,46 @@ +/* Basic time functionality test: check that milliseconds are +   incremented for each syscall (does not work on host).  */ +#include <stdio.h> +#include <time.h> +#include <sys/time.h> +#include <string.h> +#include <stdlib.h> + +void err (const char *s) +{ +  perror (s); +  abort (); +} + +int +main (void) +{ +  struct timeval t_m = {0, 0}; +  struct timezone t_z = {0, 0}; +  struct timeval t_m1 = {0, 0}; +  int i; + +  if (gettimeofday (&t_m, &t_z) != 0) +    err ("gettimeofday"); + +  for (i = 1; i < 10000; i++) +    if (gettimeofday (&t_m1, NULL) != 0) +      err ("gettimeofday 1"); +    else +      if (t_m1.tv_sec * 1000000 + t_m1.tv_usec +	  != (t_m.tv_sec * 1000000 + t_m.tv_usec + i * 1000)) +	{ +	  fprintf (stderr, "t0 (%ld, %ld), i %d, t1 (%ld, %ld)\n", +		   t_m.tv_sec, t_m.tv_usec, i, t_m1.tv_sec, t_m1.tv_usec); +	  abort (); +	} + +  if (time (NULL) != t_m1.tv_sec) +    { +      fprintf (stderr, "time != gettod\n"); +      abort (); +    } + +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_time2.c b/tests/tcg/cris/check_time2.c new file mode 100644 index 00000000..20b69b4f --- /dev/null +++ b/tests/tcg/cris/check_time2.c @@ -0,0 +1,18 @@ +/* CB_SYS_time doesn't implement the Linux time syscall; the return +   value isn't written to the argument.  */ + +#include <time.h> +#include <stdio.h> +#include <stdlib.h> + +int +main (void) +{ +  time_t x = (time_t) -1; +  time_t t = time (&x); + +  if (t == (time_t) -1 || t != x) +    abort (); +  printf ("pass\n"); +  exit (0); +} diff --git a/tests/tcg/cris/check_xarith.s b/tests/tcg/cris/check_xarith.s new file mode 100644 index 00000000..80038b2a --- /dev/null +++ b/tests/tcg/cris/check_xarith.s @@ -0,0 +1,72 @@ + +.include "testutils.inc" + +	start + +	moveq	-1, $r0 +	moveq	0, $r1 +	addq	1, $r0 +	ax +	addq	0, $r1 + +	move.d	$r0, $r3 +	checkr3 0 +	move.d	$r1, $r3 +	checkr3 1 + +	move.d  0, $r0 +	moveq	-1, $r1 +	subq	1, $r0 +	ax +	subq	0, $r1 + +	move.d	$r0, $r3 +	checkr3 ffffffff +	move.d	$r1, $r3 +	checkr3 fffffffe + + +	moveq	-1, $r0 +	moveq	-1, $r1 +	cmpq	-1, $r0 +	ax +	cmpq	-1, $r1 +	beq	1f +	nop +	fail +1: +	cmpq	0, $r0 +	ax +	cmpq	-1, $r1 +	bne	1f +	nop +	fail +1: + +	;; test for broken X sequence, run it several times. +	moveq	8, $r0 +1: +	moveq	0, $r3 +	move.d	$r0, $r1 +	andq	1, $r1 +	lslq	4, $r1 +	moveq	1, $r2 +	or.d	$r1, $r2 +	ba	2f +	move	$r2, $ccs +2: +	addq	0, $r3 +	move.d	$r0, $r4 +	move.d	$r1, $r5 +	move.d	$r2, $r6 +	move.d	$r3, $r7 +	lsrq	4, $r1 +	move.d	$r1, $r8 +	xor	$r1, $r3 +	checkr3	0 +	subq	1, $r0 +	bne	1b +	nop + +	pass +	quit diff --git a/tests/tcg/cris/crisutils.h b/tests/tcg/cris/crisutils.h new file mode 100644 index 00000000..3456b9d5 --- /dev/null +++ b/tests/tcg/cris/crisutils.h @@ -0,0 +1,76 @@ +#ifndef CRISUTILS_H +#define CRISUTILS_H 1 + +static char *tst_cc_loc = NULL; + +#define cris_tst_cc_init() \ +do { tst_cc_loc = "test_cc failed at " CURRENT_LOCATION; } while(0) + +/* We need a real symbol to signal error.  */ +void _err(void) { +	if (!tst_cc_loc) +		tst_cc_loc = "tst_cc_failed\n"; +	_fail(tst_cc_loc); +} + +static inline void cris_tst_cc_n1(void) +{ +	asm volatile ("bpl _err\n" +		      "nop\n"); +} +static inline void cris_tst_cc_n0(void) +{ +	asm volatile ("bmi _err\n" +		      "nop\n"); +} + +static inline void cris_tst_cc_z1(void) +{ +	asm volatile ("bne _err\n" +		      "nop\n"); +} +static inline void cris_tst_cc_z0(void) +{ +	asm volatile ("beq _err\n" +		      "nop\n"); +} +static inline void cris_tst_cc_v1(void) +{ +	asm volatile ("bvc _err\n" +		      "nop\n"); +} +static inline void cris_tst_cc_v0(void) +{ +	asm volatile ("bvs _err\n" +		      "nop\n"); +} + +static inline void cris_tst_cc_c1(void) +{ +	asm volatile ("bcc _err\n" +		      "nop\n"); +} +static inline void cris_tst_cc_c0(void) +{ +	asm volatile ("bcs _err\n" +		      "nop\n"); +} + +static inline void cris_tst_mov_cc(int n, int z) +{ +	if (n) cris_tst_cc_n1(); else cris_tst_cc_n0(); +	if (z) cris_tst_cc_z1(); else cris_tst_cc_z0(); +	asm volatile ("" : : "g" (_err)); +} + +static inline void cris_tst_cc(const int n, const int z, +			       const int v, const int c) +{ +	if (n) cris_tst_cc_n1(); else cris_tst_cc_n0(); +	if (z) cris_tst_cc_z1(); else cris_tst_cc_z0(); +	if (v) cris_tst_cc_v1(); else cris_tst_cc_v0(); +	if (c) cris_tst_cc_c1(); else cris_tst_cc_c0(); +	asm volatile ("" : : "g" (_err)); +} + +#endif diff --git a/tests/tcg/cris/crt.s b/tests/tcg/cris/crt.s new file mode 100644 index 00000000..af027d74 --- /dev/null +++ b/tests/tcg/cris/crt.s @@ -0,0 +1,13 @@ +	.data +_stack_start: +	.space	8192, 0 +_stack_end: +	.text +	.global	_start +_start: +	move.d	_stack_end, $sp +	jsr	main +	nop +	moveq	0, $r10 +	jump	exit +	nop diff --git a/tests/tcg/cris/sys.c b/tests/tcg/cris/sys.c new file mode 100644 index 00000000..551c5dd7 --- /dev/null +++ b/tests/tcg/cris/sys.c @@ -0,0 +1,51 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +static inline int mystrlen(char *s) { +	int i = 0; +	while (s[i]) +		i++; +	return i; +} + +void pass(void) { +	char s[] = "passed.\n"; +	write (1, s, sizeof (s) - 1); +	exit (0); +} + +void _fail(char *reason) { +	char s[] = "\nfailed: "; +	int len = mystrlen(reason); +	write (1, s, sizeof (s) - 1); +	write (1, reason, len); +	write (1, "\n", 1); +//	exit (1); +} + +void *memset (void *s, int c, size_t n) { +	char *p = s; +	int i; +	for (i = 0; i < n; i++) +		p[i] = c; +	return p; +} + +void exit (int status) { +	asm volatile ("moveq 1, $r9\n" /* NR_exit.  */ +		      "break 13\n"); +	while(1) +		; +} + +ssize_t write (int fd, const void *buf, size_t count) { +	int r; +	asm ("move.d %0, $r10\n" +	     "move.d %1, $r11\n" +	     "move.d %2, $r12\n" +	     "moveq 4, $r9\n" /* NR_write.  */ +	     "break 13\n" : : "r" (fd), "r" (buf), "r" (count) : "memory"); +	asm ("move.d $r10, %0\n" : "=r" (r)); +	return r; +} diff --git a/tests/tcg/cris/sys.h b/tests/tcg/cris/sys.h new file mode 100644 index 00000000..c5f88e1a --- /dev/null +++ b/tests/tcg/cris/sys.h @@ -0,0 +1,16 @@ +#include <unistd.h> + +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) + +#define CURRENT_LOCATION __FILE__ ":" TOSTRING(__LINE__) + +#define err()                         \ +{                                     \ +  _fail("at " CURRENT_LOCATION " ");  \ +} + +#define mb() asm volatile ("" : : : "memory") + +void pass(void); +void _fail(char *reason); diff --git a/tests/tcg/cris/testutils.inc b/tests/tcg/cris/testutils.inc new file mode 100644 index 00000000..aa1641b2 --- /dev/null +++ b/tests/tcg/cris/testutils.inc @@ -0,0 +1,117 @@ +	.syntax	no_register_prefix + +	.macro	start +	.text +	.global	main +main: +	.endm + +	.macro	quit +	jump	pass +	nop +	.endm + +	.macro	pass +	jump	pass +	nop +	.endm + +	.macro	startnostack +	start +	.endm + +	.macro	fail +	.data +99: +	.asciz " checkr3 failed\n" +	.text +	move.d	99b, $r10 +	jsr	_fail +	nop +	.endm + +	.macro	checkr3 val +	cmp.d	0x\val, $r3 +	beq	100f +	nop +	.data +99: +	.asciz "checkr3 failed\n" +	.text +	move.d	99b, $r10 +	jsr	_fail +	nop +100: +	.endm + +; Test the condition codes +        .macro test_cc N Z V C +        .if \N +        bpl 9f +        nop +        .else +        bmi 9f +        nop +        .endif +        .if \Z +        bne 9f +        nop +        .else +        beq 9f +        nop +        .endif +        .if \V +        bvc 9f +        nop +        .else +        bvs 9f +        nop +        .endif +        .if \C +        bcc 9f +        nop +        .else +        bcs 9f +        nop +        .endif +        ba 8f +        nop +9: +	.data +99: +	.asciz "test_move_cc failed\n" +	.text +	move.d	99b, $r10 +	jsr	_fail +	nop +8: +        .endm + + +        .macro test_move_cc N Z V C +        .if \N +        bpl 9f +        nop +        .else +        bmi 9f +        nop +        .endif +        .if \Z +        bne 9f +        nop +        .else +        beq 9f +        nop +        .endif +        ba 8f +        nop +9: +	.data +99: +	.asciz "test_move_cc failed\n" +	.text +	move.d	99b, $r10 +	jsr	_fail +	nop +8: +        .endm  | 
