|
From: <sv...@va...> - 2012-09-23 00:43:02
|
florian 2012-09-23 01:42:49 +0100 (Sun, 23 Sep 2012)
New Revision: 13012
Log:
s390: Add testcase for some integer comparison insns
Added files:
trunk/none/tests/s390x/comp-1.c
trunk/none/tests/s390x/comp-1.stderr.exp
trunk/none/tests/s390x/comp-1.stdout.exp
trunk/none/tests/s390x/comp-1.vgtest
trunk/none/tests/s390x/comp-2.c
trunk/none/tests/s390x/comp-2.stderr.exp
trunk/none/tests/s390x/comp-2.stdout.exp
trunk/none/tests/s390x/comp-2.vgtest
Modified directories:
trunk/none/tests/s390x/
Modified files:
trunk/none/tests/s390x/Makefile.am
Modified: trunk/none/tests/s390x/
Added: trunk/none/tests/s390x/comp-1.stderr.exp (+2 -0)
===================================================================
--- trunk/none/tests/s390x/comp-1.stderr.exp 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-1.stderr.exp 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1,2 @@
+
+
Modified: trunk/none/tests/s390x/Makefile.am (+1 -1)
===================================================================
--- trunk/none/tests/s390x/Makefile.am 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/Makefile.am 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -10,7 +10,7 @@
cs csg cds cdsg cu21 cu21_1 cu24 cu24_1 cu42 cu12 cu12_1 \
ex_sig ex_clone cu14 cu14_1 cu41 fpconv ecag fpext fpext_warn \
rounding-1 rounding-2 rounding-3 rounding-4 rounding-5 bfp-1 \
- bfp-2 bfp-3 bfp-4 srnm srnmb
+ bfp-2 bfp-3 bfp-4 srnm srnmb comp-1 comp-2
check_PROGRAMS = $(INSN_TESTS) \
allexec \
Added: trunk/none/tests/s390x/comp-2.stdout.exp (+162 -0)
===================================================================
--- trunk/none/tests/s390x/comp-2.stdout.exp 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-2.stdout.exp 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1,162 @@
+clr (0, 0) --> cc = 0
+clr (0, 1) --> cc = 1
+clr (1, 0) --> cc = 2
+clr (2, 1) --> cc = 2
+clr (2, 2) --> cc = 0
+clr (2, 3) --> cc = 1
+clr (0, 127) --> cc = 1
+clr (127, 0) --> cc = 2
+clr (127, 126) --> cc = 2
+clr (127, 127) --> cc = 0
+clr (0, 32767) --> cc = 1
+clr (32767, 0) --> cc = 2
+clr (32767, 32767) --> cc = 0
+clr (32767, 32766) --> cc = 2
+clr (0, 2147483647) --> cc = 1
+clr (2147483647, 0) --> cc = 2
+clr (2147483647, 2147483647) --> cc = 0
+clr (2147483647, 2147483646) --> cc = 2
+clgr (0, 0) --> cc = 0
+clgr (0, 1) --> cc = 1
+clgr (1, 0) --> cc = 2
+clgr (2, 1) --> cc = 2
+clgr (2, 2) --> cc = 0
+clgr (2, 3) --> cc = 1
+clgr (0, 127) --> cc = 1
+clgr (127, 0) --> cc = 2
+clgr (127, 126) --> cc = 2
+clgr (127, 127) --> cc = 0
+clgr (0, 32767) --> cc = 1
+clgr (32767, 0) --> cc = 2
+clgr (32767, 32767) --> cc = 0
+clgr (32767, 32766) --> cc = 2
+clgr (0, 2147483647) --> cc = 1
+clgr (2147483647, 0) --> cc = 2
+clgr (2147483647, 2147483647) --> cc = 0
+clgr (2147483647, 2147483646) --> cc = 2
+clgr (9223372036854775808, 9223372036854775808) --> cc = 0
+clgr (9223372036854775808, 9223372036854775807) --> cc = 2
+clgr (9223372036854775807, 9223372036854775808) --> cc = 1
+clgr (9223372036854775807, 9223372036854775807) --> cc = 0
+clgfr (0, 0) --> cc = 0
+clgfr (0, 1) --> cc = 1
+clgfr (1, 0) --> cc = 2
+clgfr (2, 1) --> cc = 2
+clgfr (2, 2) --> cc = 0
+clgfr (2, 3) --> cc = 1
+clgfr (0, 127) --> cc = 1
+clgfr (127, 0) --> cc = 2
+clgfr (127, 126) --> cc = 2
+clgfr (127, 127) --> cc = 0
+clgfr (0, 32767) --> cc = 1
+clgfr (32767, 0) --> cc = 2
+clgfr (32767, 32767) --> cc = 0
+clgfr (32767, 32766) --> cc = 2
+clgfr (0, 2147483647) --> cc = 1
+clgfr (2147483647, 0) --> cc = 2
+clgfr (2147483647, 2147483647) --> cc = 0
+clgfr (2147483647, 2147483646) --> cc = 2
+clgfr (9223372036854775808, 18446744071562067968) --> cc = 2
+clgfr (9223372036854775808, 2147483647) --> cc = 2
+clgfr (9223372036854775807, 18446744071562067968) --> cc = 2
+clgfr (9223372036854775807, 2147483647) --> cc = 2
+cl (0, 0) --> cc = 0
+cl (0, 1) --> cc = 1
+cl (1, 0) --> cc = 2
+cl (2, 1) --> cc = 2
+cl (2, 2) --> cc = 0
+cl (2, 3) --> cc = 1
+cl (0, 127) --> cc = 1
+cl (127, 0) --> cc = 2
+cl (127, 126) --> cc = 2
+cl (127, 127) --> cc = 0
+cl (0, 32767) --> cc = 1
+cl (32767, 0) --> cc = 2
+cl (32767, 32766) --> cc = 2
+cl (32767, 32767) --> cc = 0
+cl (0, 2147483647) --> cc = 1
+cl (2147483647, 0) --> cc = 2
+cl (2147483647, 2147483646) --> cc = 2
+cl (2147483647, 2147483647) --> cc = 0
+clg (0, 0) --> cc = 0
+clg (0, 1) --> cc = 1
+clg (1, 0) --> cc = 2
+clg (2, 1) --> cc = 2
+clg (2, 2) --> cc = 0
+clg (2, 3) --> cc = 1
+clg (0, 127) --> cc = 1
+clg (127, 0) --> cc = 2
+clg (127, 126) --> cc = 2
+clg (127, 127) --> cc = 0
+clg (0, 32767) --> cc = 1
+clg (32767, 0) --> cc = 2
+clg (32767, 32766) --> cc = 2
+clg (32767, 32767) --> cc = 0
+clg (0, 2147483647) --> cc = 1
+clg (2147483647, 0) --> cc = 2
+clg (2147483647, 2147483646) --> cc = 2
+clg (2147483647, 2147483647) --> cc = 0
+clg (9223372036854775808, 9223372036854775808) --> cc = 0
+clg (9223372036854775808, 9223372036854775807) --> cc = 2
+clg (9223372036854775807, 9223372036854775808) --> cc = 1
+clg (9223372036854775807, 9223372036854775807) --> cc = 0
+clgf (0, 0) --> cc = 0
+clgf (0, 1) --> cc = 1
+clgf (1, 0) --> cc = 2
+clgf (2, 1) --> cc = 2
+clgf (2, 2) --> cc = 0
+clgf (2, 3) --> cc = 1
+clgf (0, 127) --> cc = 1
+clgf (127, 0) --> cc = 2
+clgf (127, 126) --> cc = 2
+clgf (127, 127) --> cc = 0
+clgf (0, 32767) --> cc = 1
+clgf (32767, 0) --> cc = 2
+clgf (32767, 32766) --> cc = 2
+clgf (32767, 32767) --> cc = 0
+clgf (0, 2147483647) --> cc = 1
+clgf (2147483647, 0) --> cc = 2
+clgf (2147483647, 2147483646) --> cc = 2
+clgf (2147483647, 2147483647) --> cc = 0
+clgf (9223372036854775808, 18446744071562067968) --> cc = 2
+clgf (9223372036854775808, 2147483647) --> cc = 2
+clgf (9223372036854775807, 18446744071562067968) --> cc = 2
+clgf (9223372036854775807, 2147483647) --> cc = 2
+CLFI (0, 0) --> cc = 0
+CLFI (0, 1) --> cc = 1
+CLFI (1, 0) --> cc = 2
+CLFI (2, 1) --> cc = 2
+CLFI (2, 2) --> cc = 0
+CLFI (2, 3) --> cc = 1
+CLFI (127, 0) --> cc = 2
+CLFI (127, 126) --> cc = 2
+CLFI (127, 127) --> cc = 0
+CLFI (0, 32767) --> cc = 1
+CLFI (32767, 0) --> cc = 2
+CLFI (32767, 32767) --> cc = 0
+CLFI (32767, 32766) --> cc = 2
+CLFI (0, 2147483647) --> cc = 1
+CLFI (2147483647, 0) --> cc = 2
+CLFI (2147483647, 2147483647) --> cc = 0
+CLFI (2147483647, 2147483646) --> cc = 2
+CLGFI (0, 0) --> cc = 0
+CLGFI (0, 1) --> cc = 1
+CLGFI (1, 0) --> cc = 2
+CLGFI (2, 1) --> cc = 2
+CLGFI (2, 2) --> cc = 0
+CLGFI (2, 3) --> cc = 1
+CLGFI (127, 0) --> cc = 2
+CLGFI (127, 126) --> cc = 2
+CLGFI (127, 127) --> cc = 0
+CLGFI (0, 32767) --> cc = 1
+CLGFI (32767, 0) --> cc = 2
+CLGFI (32767, 32767) --> cc = 0
+CLGFI (32767, 32766) --> cc = 2
+CLGFI (0, 2147483647) --> cc = 1
+CLGFI (2147483647, 0) --> cc = 2
+CLGFI (2147483647, 2147483647) --> cc = 0
+CLGFI (2147483647, 2147483646) --> cc = 2
+CLGFI (9223372036854775808, 18446744071562067968) --> cc = 2
+CLGFI (9223372036854775808, 2147483647) --> cc = 2
+CLGFI (9223372036854775807, 18446744071562067968) --> cc = 2
+CLGFI (9223372036854775807, 2147483647) --> cc = 2
Added: trunk/none/tests/s390x/comp-1.vgtest (+1 -0)
===================================================================
--- trunk/none/tests/s390x/comp-1.vgtest 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-1.vgtest 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1 @@
+prog: comp-1
Property changed: trunk/none/tests/s390x (+0 -0)
___________________________________________________________________
Name: svn:ignore
- .deps
add
add_EI
add_GE
allexec
and
and_EI
clc
clcle
cvb
cvd
div
ex_clone
ex_sig
flogr
icm
insert
insert_EI
lam_stam
lpr
Makefile
Makefile.in
mul
mul_GE
mvst
or
or_EI
srst
sub
sub_EI
tcxb
xc
xor
xor_EI
stck
stcke
stckf
op_exception
fgx
condloadstore
fold_And16
stfle
op00
cksm
clcl
mvcl
troo
trot
trto
trtt
tr
tre
clrj
clgrj
crj
cgrj
clij
clgij
cij
cgij
cs
csg
cds
cdsg
cu21
cu21_1
cu24
cu24_1
cu42
cu12
cu12_1
cu14
cu14_1
cu41
ecag
fpext
fpext_warn
fpconv
rounding-1
rounding-2
rounding-3
rounding-4
rounding-5
bfp-1
bfp-2
bfp-3
bfp-4
srnm
srnmb
+ .deps
add
add_EI
add_GE
allexec
and
and_EI
clc
clcle
cvb
cvd
div
ex_clone
ex_sig
flogr
icm
insert
insert_EI
lam_stam
lpr
Makefile
Makefile.in
mul
mul_GE
mvst
or
or_EI
srst
sub
sub_EI
tcxb
xc
xor
xor_EI
stck
stcke
stckf
op_exception
fgx
condloadstore
fold_And16
stfle
op00
cksm
clcl
mvcl
troo
trot
trto
trtt
tr
tre
clrj
clgrj
crj
cgrj
clij
clgij
cij
cgij
cs
csg
cds
cdsg
cu21
cu21_1
cu24
cu24_1
cu42
cu12
cu12_1
cu14
cu14_1
cu41
ecag
fpext
fpext_warn
fpconv
rounding-1
rounding-2
rounding-3
rounding-4
rounding-5
bfp-1
bfp-2
bfp-3
bfp-4
srnm
srnmb
comp-1
comp-2
Added: trunk/none/tests/s390x/comp-2.vgtest (+1 -0)
===================================================================
--- trunk/none/tests/s390x/comp-2.vgtest 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-2.vgtest 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1 @@
+prog: comp-2
Added: trunk/none/tests/s390x/comp-2.c (+198 -0)
===================================================================
--- trunk/none/tests/s390x/comp-2.c 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-2.c 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1,198 @@
+/* Test unsigned integer comparison ops
+ clr, clgr, clgfr, cl, clg, clgf, clfi, clgfi
+
+ missing: cly, clrl, clgrl, clgfrl
+*/
+
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <limits.h>
+#include "opcodes.h"
+
+#undef RIL_RU
+#define RIL_RU(op1,r1,op2,i2) \
+ ".short 0x" #op1 #r1 #op2 "\n\t" \
+ ".long " #i2 "\n\t"
+
+
+/* Perform a single unsigned comparison
+ Both operands in register */
+#define SCOMP_REG_REG(insn, v1, v2) \
+({ \
+ int cc; \
+ uint64_t op1 = v1; \
+ uint64_t op2 = v2; \
+ asm volatile( #insn " %1, %2\n\t" \
+ "ipm %0\n\t" \
+ "srl %0,28\n\t" \
+ : "=d" (cc) \
+ : "d" (op1), "d" (op2) \
+ : "cc"); \
+ printf("%.6s (%"PRIu64", %"PRIu64") --> cc = %d\n", \
+ #insn, op1, op2, cc); \
+})
+
+/* Perform a single unsigned comparison
+ Left operand in register, right operand in memory */
+#define SCOMP_REG_MEM(insn, v1, v2, op2_t) \
+({ \
+ int cc; \
+ uint64_t op1 = v1; \
+ op2_t op2 = v2; \
+ asm volatile( #insn " %1, %2\n\t" \
+ "ipm %0\n\t" \
+ "srl %0,28\n\t" \
+ : "=d" (cc) \
+ : "d" (op1), "Q" (op2) \
+ : "cc"); \
+ printf("%.6s (%"PRIu64", %"PRIu64") --> cc = %d\n", \
+ #insn, op1, (uint64_t)op2, cc); \
+})
+
+/* Perform a single unsigned comparison
+ Left operand in register, right operand is an immediate constant */
+#define SCOMP_REG_IMM(insn, v1, v2) \
+({ \
+ int cc; \
+ register uint64_t op1 asm("8") = v1; \
+ asm volatile( insn(8, v2) \
+ "ipm %0\n\t" \
+ "srl %0,28\n\t" \
+ : "=d" (cc) \
+ : "d" (op1) \
+ : "cc"); \
+ printf("%.6s (%"PRIu64", %"PRIu64") --> cc = %d\n", \
+ #insn, op1, (uint64_t)v2, cc); \
+})
+
+/* Run a sequence of unsigned comparisons for a given insn */
+#define run_scomp_reg_reg(insn) \
+({ \
+ SCOMP_REG_REG(insn, 0, 0); \
+ SCOMP_REG_REG(insn, 0, 1); \
+ SCOMP_REG_REG(insn, 1, 0); \
+ SCOMP_REG_REG(insn, 2, 1); \
+ SCOMP_REG_REG(insn, 2, 2); \
+ SCOMP_REG_REG(insn, 2, 3); \
+ SCOMP_REG_REG(insn, 0, INT8_MAX); \
+ SCOMP_REG_REG(insn, INT8_MAX, 0); \
+ SCOMP_REG_REG(insn, INT8_MAX, INT8_MAX-1); \
+ SCOMP_REG_REG(insn, INT8_MAX, INT8_MAX); \
+ SCOMP_REG_REG(insn, 0, INT16_MAX); \
+ SCOMP_REG_REG(insn, INT16_MAX, 0); \
+ SCOMP_REG_REG(insn, INT16_MAX, INT16_MAX); \
+ SCOMP_REG_REG(insn, INT16_MAX, INT16_MAX-1); \
+ SCOMP_REG_REG(insn, 0, INT32_MAX); \
+ SCOMP_REG_REG(insn, INT32_MAX, 0); \
+ SCOMP_REG_REG(insn, INT32_MAX, INT32_MAX); \
+ SCOMP_REG_REG(insn, INT32_MAX, INT32_MAX-1); \
+})
+
+/* Run a sequence of signed comparisons for a given insn */
+#define run_scomp_reg_mem(insn, op2_t) \
+({ \
+ SCOMP_REG_MEM(insn, 0, 0, op2_t); \
+ SCOMP_REG_MEM(insn, 0, 1, op2_t); \
+ SCOMP_REG_MEM(insn, 1, 0, op2_t); \
+ SCOMP_REG_MEM(insn, 2, 1, op2_t); \
+ SCOMP_REG_MEM(insn, 2, 2, op2_t); \
+ SCOMP_REG_MEM(insn, 2, 3, op2_t); \
+ SCOMP_REG_MEM(insn, 0, INT8_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT8_MAX, 0, op2_t); \
+ SCOMP_REG_MEM(insn, INT8_MAX, INT8_MAX-1, op2_t); \
+ SCOMP_REG_MEM(insn, INT8_MAX, INT8_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, 0, INT16_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT16_MAX, 0, op2_t); \
+ SCOMP_REG_MEM(insn, INT16_MAX, INT16_MAX-1, op2_t); \
+ SCOMP_REG_MEM(insn, INT16_MAX, INT16_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, 0, INT32_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT32_MAX, 0, op2_t); \
+ SCOMP_REG_MEM(insn, INT32_MAX, INT32_MAX-1, op2_t); \
+ SCOMP_REG_MEM(insn, INT32_MAX, INT32_MAX, op2_t); \
+})
+
+/* Run a sequence of signed comparisons for a given insn */
+#define run_scomp_reg_imm(insn) \
+({ \
+ SCOMP_REG_IMM(insn, 0, 0); \
+ SCOMP_REG_IMM(insn, 0, 1); \
+ SCOMP_REG_IMM(insn, 1, 0); \
+ SCOMP_REG_IMM(insn, 2, 1); \
+ SCOMP_REG_IMM(insn, 2, 2); \
+ SCOMP_REG_IMM(insn, 2, 3); \
+ SCOMP_REG_IMM(insn, INT8_MAX, 0); \
+ SCOMP_REG_IMM(insn, INT8_MAX, INT8_MAX-1); \
+ SCOMP_REG_IMM(insn, INT8_MAX, INT8_MAX); \
+ SCOMP_REG_IMM(insn, 0, INT16_MAX); \
+ SCOMP_REG_IMM(insn, INT16_MAX, 0); \
+ SCOMP_REG_IMM(insn, INT16_MAX, INT16_MAX); \
+ SCOMP_REG_IMM(insn, INT16_MAX, INT16_MAX-1); \
+ SCOMP_REG_IMM(insn, 0, INT32_MAX); \
+ SCOMP_REG_IMM(insn, INT32_MAX, 0); \
+ SCOMP_REG_IMM(insn, INT32_MAX, INT32_MAX); \
+ SCOMP_REG_IMM(insn, INT32_MAX, INT32_MAX-1); \
+})
+
+void
+signed_comparison_reg_reg(void)
+{
+ run_scomp_reg_reg(clr);
+
+ run_scomp_reg_reg(clgr);
+ /* Special cases for clgr */
+ SCOMP_REG_REG(clgr, INT64_MIN, INT64_MIN);
+ SCOMP_REG_REG(clgr, INT64_MIN, INT64_MAX);
+ SCOMP_REG_REG(clgr, INT64_MAX, INT64_MIN);
+ SCOMP_REG_REG(clgr, INT64_MAX, INT64_MAX);
+
+ run_scomp_reg_reg(clgfr);
+ /* Special cases for clgfr */
+ SCOMP_REG_REG(clgfr, INT64_MIN, INT32_MIN);
+ SCOMP_REG_REG(clgfr, INT64_MIN, INT32_MAX);
+ SCOMP_REG_REG(clgfr, INT64_MAX, INT32_MIN);
+ SCOMP_REG_REG(clgfr, INT64_MAX, INT32_MAX);
+}
+
+void
+signed_comparison_reg_mem(void)
+{
+ run_scomp_reg_mem(cl, int32_t);
+
+ run_scomp_reg_mem(clg, int64_t);
+ /* Special cases for clg */
+ SCOMP_REG_MEM(clg, INT64_MIN, INT64_MIN, int64_t);
+ SCOMP_REG_MEM(clg, INT64_MIN, INT64_MAX, int64_t);
+ SCOMP_REG_MEM(clg, INT64_MAX, INT64_MIN, int64_t);
+ SCOMP_REG_MEM(clg, INT64_MAX, INT64_MAX, int64_t);
+
+ run_scomp_reg_mem(clgf, int32_t);
+ /* Special cases for clgf */
+ SCOMP_REG_MEM(clgf, INT64_MIN, INT32_MIN, int32_t);
+ SCOMP_REG_MEM(clgf, INT64_MIN, INT32_MAX, int32_t);
+ SCOMP_REG_MEM(clgf, INT64_MAX, INT32_MIN, int32_t);
+ SCOMP_REG_MEM(clgf, INT64_MAX, INT32_MAX, int32_t);
+}
+
+void
+signed_comparison_reg_imm(void)
+{
+ run_scomp_reg_imm(CLFI);
+
+ run_scomp_reg_imm(CLGFI);
+ /* Special cases for clgfi */
+ SCOMP_REG_IMM(CLGFI, INT64_MIN, INT32_MIN);
+ SCOMP_REG_IMM(CLGFI, INT64_MIN, INT32_MAX);
+ SCOMP_REG_IMM(CLGFI, INT64_MAX, INT32_MIN);
+ SCOMP_REG_IMM(CLGFI, INT64_MAX, INT32_MAX);
+}
+
+
+int main(void)
+{
+ signed_comparison_reg_reg();
+ signed_comparison_reg_mem();
+ signed_comparison_reg_imm();
+
+ return 0;
+}
Added: trunk/none/tests/s390x/comp-1.stdout.exp (+220 -0)
===================================================================
--- trunk/none/tests/s390x/comp-1.stdout.exp 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-1.stdout.exp 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1,220 @@
+cr (0, 0) --> cc = 0
+cr (0, 1) --> cc = 1
+cr (0, -1) --> cc = 2
+cr (1, 0) --> cc = 2
+cr (-1, 0) --> cc = 1
+cr (-2, -1) --> cc = 1
+cr (-2, -2) --> cc = 0
+cr (-2, -3) --> cc = 2
+cr (2, 1) --> cc = 2
+cr (2, 2) --> cc = 0
+cr (2, 3) --> cc = 1
+cr (-2, 1) --> cc = 1
+cr (2, -1) --> cc = 2
+cr (-128, -128) --> cc = 0
+cr (-128, 127) --> cc = 1
+cr (127, -128) --> cc = 2
+cr (127, 127) --> cc = 0
+cr (-32768, -32768) --> cc = 0
+cr (-32768, 32767) --> cc = 1
+cr (32767, -32768) --> cc = 2
+cr (32767, 32767) --> cc = 0
+cr (-2147483648, -2147483648) --> cc = 0
+cr (-2147483648, 2147483647) --> cc = 1
+cr (2147483647, -2147483648) --> cc = 2
+cr (2147483647, 2147483647) --> cc = 0
+cgr (0, 0) --> cc = 0
+cgr (0, 1) --> cc = 1
+cgr (0, -1) --> cc = 2
+cgr (1, 0) --> cc = 2
+cgr (-1, 0) --> cc = 1
+cgr (-2, -1) --> cc = 1
+cgr (-2, -2) --> cc = 0
+cgr (-2, -3) --> cc = 2
+cgr (2, 1) --> cc = 2
+cgr (2, 2) --> cc = 0
+cgr (2, 3) --> cc = 1
+cgr (-2, 1) --> cc = 1
+cgr (2, -1) --> cc = 2
+cgr (-128, -128) --> cc = 0
+cgr (-128, 127) --> cc = 1
+cgr (127, -128) --> cc = 2
+cgr (127, 127) --> cc = 0
+cgr (-32768, -32768) --> cc = 0
+cgr (-32768, 32767) --> cc = 1
+cgr (32767, -32768) --> cc = 2
+cgr (32767, 32767) --> cc = 0
+cgr (-2147483648, -2147483648) --> cc = 0
+cgr (-2147483648, 2147483647) --> cc = 1
+cgr (2147483647, -2147483648) --> cc = 2
+cgr (2147483647, 2147483647) --> cc = 0
+cgr (-9223372036854775808, -9223372036854775808) --> cc = 0
+cgr (-9223372036854775808, 9223372036854775807) --> cc = 1
+cgr (9223372036854775807, -9223372036854775808) --> cc = 2
+cgr (9223372036854775807, 9223372036854775807) --> cc = 0
+cgfr (0, 0) --> cc = 0
+cgfr (0, 1) --> cc = 1
+cgfr (0, -1) --> cc = 2
+cgfr (1, 0) --> cc = 2
+cgfr (-1, 0) --> cc = 1
+cgfr (-2, -1) --> cc = 1
+cgfr (-2, -2) --> cc = 0
+cgfr (-2, -3) --> cc = 2
+cgfr (2, 1) --> cc = 2
+cgfr (2, 2) --> cc = 0
+cgfr (2, 3) --> cc = 1
+cgfr (-2, 1) --> cc = 1
+cgfr (2, -1) --> cc = 2
+cgfr (-128, -128) --> cc = 0
+cgfr (-128, 127) --> cc = 1
+cgfr (127, -128) --> cc = 2
+cgfr (127, 127) --> cc = 0
+cgfr (-32768, -32768) --> cc = 0
+cgfr (-32768, 32767) --> cc = 1
+cgfr (32767, -32768) --> cc = 2
+cgfr (32767, 32767) --> cc = 0
+cgfr (-2147483648, -2147483648) --> cc = 0
+cgfr (-2147483648, 2147483647) --> cc = 1
+cgfr (2147483647, -2147483648) --> cc = 2
+cgfr (2147483647, 2147483647) --> cc = 0
+cgfr (-9223372036854775808, -2147483648) --> cc = 1
+cgfr (-9223372036854775808, 2147483647) --> cc = 1
+cgfr (9223372036854775807, -2147483648) --> cc = 2
+cgfr (9223372036854775807, 2147483647) --> cc = 2
+c (0, 0) --> cc = 0
+c (0, 1) --> cc = 1
+c (0, -1) --> cc = 2
+c (1, 0) --> cc = 2
+c (-1, 0) --> cc = 1
+c (-2, -1) --> cc = 1
+c (-2, -2) --> cc = 0
+c (-2, -3) --> cc = 2
+c (2, 1) --> cc = 2
+c (2, 2) --> cc = 0
+c (2, 3) --> cc = 1
+c (-2, 1) --> cc = 1
+c (2, -1) --> cc = 2
+c (-128, -128) --> cc = 0
+c (-128, 127) --> cc = 1
+c (127, -128) --> cc = 2
+c (127, 127) --> cc = 0
+c (-32768, -32768) --> cc = 0
+c (-32768, 32767) --> cc = 1
+c (32767, -32768) --> cc = 2
+c (32767, 32767) --> cc = 0
+c (-2147483648, -2147483648) --> cc = 0
+c (-2147483648, 2147483647) --> cc = 1
+c (2147483647, -2147483648) --> cc = 2
+c (2147483647, 2147483647) --> cc = 0
+cg (0, 0) --> cc = 0
+cg (0, 1) --> cc = 1
+cg (0, -1) --> cc = 2
+cg (1, 0) --> cc = 2
+cg (-1, 0) --> cc = 1
+cg (-2, -1) --> cc = 1
+cg (-2, -2) --> cc = 0
+cg (-2, -3) --> cc = 2
+cg (2, 1) --> cc = 2
+cg (2, 2) --> cc = 0
+cg (2, 3) --> cc = 1
+cg (-2, 1) --> cc = 1
+cg (2, -1) --> cc = 2
+cg (-128, -128) --> cc = 0
+cg (-128, 127) --> cc = 1
+cg (127, -128) --> cc = 2
+cg (127, 127) --> cc = 0
+cg (-32768, -32768) --> cc = 0
+cg (-32768, 32767) --> cc = 1
+cg (32767, -32768) --> cc = 2
+cg (32767, 32767) --> cc = 0
+cg (-2147483648, -2147483648) --> cc = 0
+cg (-2147483648, 2147483647) --> cc = 1
+cg (2147483647, -2147483648) --> cc = 2
+cg (2147483647, 2147483647) --> cc = 0
+cg (-9223372036854775808, -9223372036854775808) --> cc = 0
+cg (-9223372036854775808, 9223372036854775807) --> cc = 1
+cg (9223372036854775807, -9223372036854775808) --> cc = 2
+cg (9223372036854775807, 9223372036854775807) --> cc = 0
+cgf (0, 0) --> cc = 0
+cgf (0, 1) --> cc = 1
+cgf (0, -1) --> cc = 2
+cgf (1, 0) --> cc = 2
+cgf (-1, 0) --> cc = 1
+cgf (-2, -1) --> cc = 1
+cgf (-2, -2) --> cc = 0
+cgf (-2, -3) --> cc = 2
+cgf (2, 1) --> cc = 2
+cgf (2, 2) --> cc = 0
+cgf (2, 3) --> cc = 1
+cgf (-2, 1) --> cc = 1
+cgf (2, -1) --> cc = 2
+cgf (-128, -128) --> cc = 0
+cgf (-128, 127) --> cc = 1
+cgf (127, -128) --> cc = 2
+cgf (127, 127) --> cc = 0
+cgf (-32768, -32768) --> cc = 0
+cgf (-32768, 32767) --> cc = 1
+cgf (32767, -32768) --> cc = 2
+cgf (32767, 32767) --> cc = 0
+cgf (-2147483648, -2147483648) --> cc = 0
+cgf (-2147483648, 2147483647) --> cc = 1
+cgf (2147483647, -2147483648) --> cc = 2
+cgf (2147483647, 2147483647) --> cc = 0
+cgf (-9223372036854775808, -2147483648) --> cc = 1
+cgf (-9223372036854775808, 2147483647) --> cc = 1
+cgf (9223372036854775807, -2147483648) --> cc = 2
+cgf (9223372036854775807, 2147483647) --> cc = 2
+CFI (0, 0) --> cc = 0
+CFI (0, 1) --> cc = 1
+CFI (0, -1) --> cc = 2
+CFI (1, 0) --> cc = 2
+CFI (-1, 0) --> cc = 1
+CFI (-2, -1) --> cc = 1
+CFI (-2, -2) --> cc = 0
+CFI (-2, -3) --> cc = 2
+CFI (2, 1) --> cc = 2
+CFI (2, 2) --> cc = 0
+CFI (2, 3) --> cc = 1
+CFI (-2, 1) --> cc = 1
+CFI (2, -1) --> cc = 2
+CFI (-128, -128) --> cc = 0
+CFI (-128, 127) --> cc = 1
+CFI (127, -128) --> cc = 2
+CFI (127, 127) --> cc = 0
+CFI (-32768, -32768) --> cc = 0
+CFI (-32768, 32767) --> cc = 1
+CFI (32767, -32768) --> cc = 2
+CFI (32767, 32767) --> cc = 0
+CFI (-2147483648, -2147483648) --> cc = 0
+CFI (-2147483648, 2147483647) --> cc = 1
+CFI (2147483647, -2147483648) --> cc = 2
+CFI (2147483647, 2147483647) --> cc = 0
+CGFI (0, 0) --> cc = 0
+CGFI (0, 1) --> cc = 1
+CGFI (0, -1) --> cc = 2
+CGFI (1, 0) --> cc = 2
+CGFI (-1, 0) --> cc = 1
+CGFI (-2, -1) --> cc = 1
+CGFI (-2, -2) --> cc = 0
+CGFI (-2, -3) --> cc = 2
+CGFI (2, 1) --> cc = 2
+CGFI (2, 2) --> cc = 0
+CGFI (2, 3) --> cc = 1
+CGFI (-2, 1) --> cc = 1
+CGFI (2, -1) --> cc = 2
+CGFI (-128, -128) --> cc = 0
+CGFI (-128, 127) --> cc = 1
+CGFI (127, -128) --> cc = 2
+CGFI (127, 127) --> cc = 0
+CGFI (-32768, -32768) --> cc = 0
+CGFI (-32768, 32767) --> cc = 1
+CGFI (32767, -32768) --> cc = 2
+CGFI (32767, 32767) --> cc = 0
+CGFI (-2147483648, -2147483648) --> cc = 0
+CGFI (-2147483648, 2147483647) --> cc = 1
+CGFI (2147483647, -2147483648) --> cc = 2
+CGFI (2147483647, 2147483647) --> cc = 0
+CGFI (-9223372036854775808, -2147483648) --> cc = 1
+CGFI (-9223372036854775808, 2147483647) --> cc = 1
+CGFI (9223372036854775807, -2147483648) --> cc = 2
+CGFI (9223372036854775807, 2147483647) --> cc = 2
Added: trunk/none/tests/s390x/comp-1.c (+220 -0)
===================================================================
--- trunk/none/tests/s390x/comp-1.c 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-1.c 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1,220 @@
+/* Test signed integer comparison ops
+ cr, cgr, cgfr, c, cg, cgf, cfi, cgfi
+
+ missing: cy, crl, cgrl, cgfrl
+*/
+
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <limits.h>
+#include "opcodes.h"
+
+#undef RIL_RI
+#define RIL_RI(op1,r1,op2,i2) \
+ ".short 0x" #op1 #r1 #op2 "\n\t" \
+ ".long " #i2 "\n\t"
+
+
+/* Perform a single signed comparison
+ Both operands in register */
+#define SCOMP_REG_REG(insn, v1, v2) \
+({ \
+ int cc; \
+ int64_t op1 = v1; \
+ int64_t op2 = v2; \
+ asm volatile( #insn " %1, %2\n\t" \
+ "ipm %0\n\t" \
+ "srl %0,28\n\t" \
+ : "=d" (cc) \
+ : "d" (op1), "d" (op2) \
+ : "cc"); \
+ printf("%.6s (%"PRId64", %"PRId64") --> cc = %d\n", \
+ #insn, op1, op2, cc); \
+})
+
+/* Perform a single signed comparison
+ Left operand in register, right operand in memory */
+#define SCOMP_REG_MEM(insn, v1, v2, op2_t) \
+({ \
+ int cc; \
+ int64_t op1 = v1; \
+ op2_t op2 = v2; \
+ asm volatile( #insn " %1, %2\n\t" \
+ "ipm %0\n\t" \
+ "srl %0,28\n\t" \
+ : "=d" (cc) \
+ : "d" (op1), "Q" (op2) \
+ : "cc"); \
+ printf("%.6s (%"PRId64", %"PRId64") --> cc = %d\n", \
+ #insn, op1, (int64_t)op2, cc); \
+})
+
+/* Perform a single signed comparison
+ Left operand in register, right operand is an immediate constant */
+#define SCOMP_REG_IMM(insn, v1, v2) \
+({ \
+ int cc; \
+ register int64_t op1 asm("8") = v1; \
+ asm volatile( insn(8, v2) \
+ "ipm %0\n\t" \
+ "srl %0,28\n\t" \
+ : "=d" (cc) \
+ : "d" (op1) \
+ : "cc"); \
+ printf("%.6s (%"PRId64", %"PRId64") --> cc = %d\n", \
+ #insn, op1, (int64_t)v2, cc); \
+})
+
+/* Run a sequence of signed comparisons for a given insn */
+#define run_scomp_reg_reg(insn) \
+({ \
+ SCOMP_REG_REG(insn, 0, 0); \
+ SCOMP_REG_REG(insn, 0, 1); \
+ SCOMP_REG_REG(insn, 0, -1); \
+ SCOMP_REG_REG(insn, 1, 0); \
+ SCOMP_REG_REG(insn, -1, 0); \
+ SCOMP_REG_REG(insn, -2, -1); \
+ SCOMP_REG_REG(insn, -2, -2); \
+ SCOMP_REG_REG(insn, -2, -3); \
+ SCOMP_REG_REG(insn, 2, 1); \
+ SCOMP_REG_REG(insn, 2, 2); \
+ SCOMP_REG_REG(insn, 2, 3); \
+ SCOMP_REG_REG(insn, -2, 1); \
+ SCOMP_REG_REG(insn, 2, -1); \
+ SCOMP_REG_REG(insn, INT8_MIN, INT8_MIN); \
+ SCOMP_REG_REG(insn, INT8_MIN, INT8_MAX); \
+ SCOMP_REG_REG(insn, INT8_MAX, INT8_MIN); \
+ SCOMP_REG_REG(insn, INT8_MAX, INT8_MAX); \
+ SCOMP_REG_REG(insn, INT16_MIN, INT16_MIN); \
+ SCOMP_REG_REG(insn, INT16_MIN, INT16_MAX); \
+ SCOMP_REG_REG(insn, INT16_MAX, INT16_MIN); \
+ SCOMP_REG_REG(insn, INT16_MAX, INT16_MAX); \
+ SCOMP_REG_REG(insn, INT32_MIN, INT32_MIN); \
+ SCOMP_REG_REG(insn, INT32_MIN, INT32_MAX); \
+ SCOMP_REG_REG(insn, INT32_MAX, INT32_MIN); \
+ SCOMP_REG_REG(insn, INT32_MAX, INT32_MAX); \
+})
+
+/* Run a sequence of signed comparisons for a given insn */
+#define run_scomp_reg_mem(insn, op2_t) \
+({ \
+ SCOMP_REG_MEM(insn, 0, 0, op2_t); \
+ SCOMP_REG_MEM(insn, 0, 1, op2_t); \
+ SCOMP_REG_MEM(insn, 0, -1, op2_t); \
+ SCOMP_REG_MEM(insn, 1, 0, op2_t); \
+ SCOMP_REG_MEM(insn, -1, 0, op2_t); \
+ SCOMP_REG_MEM(insn, -2, -1, op2_t); \
+ SCOMP_REG_MEM(insn, -2, -2, op2_t); \
+ SCOMP_REG_MEM(insn, -2, -3, op2_t); \
+ SCOMP_REG_MEM(insn, 2, 1, op2_t); \
+ SCOMP_REG_MEM(insn, 2, 2, op2_t); \
+ SCOMP_REG_MEM(insn, 2, 3, op2_t); \
+ SCOMP_REG_MEM(insn, -2, 1, op2_t); \
+ SCOMP_REG_MEM(insn, 2, -1, op2_t); \
+ SCOMP_REG_MEM(insn, INT8_MIN, INT8_MIN, op2_t); \
+ SCOMP_REG_MEM(insn, INT8_MIN, INT8_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT8_MAX, INT8_MIN, op2_t); \
+ SCOMP_REG_MEM(insn, INT8_MAX, INT8_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT16_MIN, INT16_MIN, op2_t); \
+ SCOMP_REG_MEM(insn, INT16_MIN, INT16_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT16_MAX, INT16_MIN, op2_t); \
+ SCOMP_REG_MEM(insn, INT16_MAX, INT16_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT32_MIN, INT32_MIN, op2_t); \
+ SCOMP_REG_MEM(insn, INT32_MIN, INT32_MAX, op2_t); \
+ SCOMP_REG_MEM(insn, INT32_MAX, INT32_MIN, op2_t); \
+ SCOMP_REG_MEM(insn, INT32_MAX, INT32_MAX, op2_t); \
+})
+
+/* Run a sequence of signed comparisons for a given insn */
+#define run_scomp_reg_imm(insn) \
+({ \
+ SCOMP_REG_IMM(insn, 0, 0); \
+ SCOMP_REG_IMM(insn, 0, 1); \
+ SCOMP_REG_IMM(insn, 0, -1); \
+ SCOMP_REG_IMM(insn, 1, 0); \
+ SCOMP_REG_IMM(insn, -1, 0); \
+ SCOMP_REG_IMM(insn, -2, -1); \
+ SCOMP_REG_IMM(insn, -2, -2); \
+ SCOMP_REG_IMM(insn, -2, -3); \
+ SCOMP_REG_IMM(insn, 2, 1); \
+ SCOMP_REG_IMM(insn, 2, 2); \
+ SCOMP_REG_IMM(insn, 2, 3); \
+ SCOMP_REG_IMM(insn, -2, 1); \
+ SCOMP_REG_IMM(insn, 2, -1); \
+ SCOMP_REG_IMM(insn, INT8_MIN, INT8_MIN); \
+ SCOMP_REG_IMM(insn, INT8_MIN, INT8_MAX); \
+ SCOMP_REG_IMM(insn, INT8_MAX, INT8_MIN); \
+ SCOMP_REG_IMM(insn, INT8_MAX, INT8_MAX); \
+ SCOMP_REG_IMM(insn, INT16_MIN, INT16_MIN); \
+ SCOMP_REG_IMM(insn, INT16_MIN, INT16_MAX); \
+ SCOMP_REG_IMM(insn, INT16_MAX, INT16_MIN); \
+ SCOMP_REG_IMM(insn, INT16_MAX, INT16_MAX); \
+ SCOMP_REG_IMM(insn, INT32_MIN, INT32_MIN); \
+ SCOMP_REG_IMM(insn, INT32_MIN, INT32_MAX); \
+ SCOMP_REG_IMM(insn, INT32_MAX, INT32_MIN); \
+ SCOMP_REG_IMM(insn, INT32_MAX, INT32_MAX); \
+})
+
+void
+signed_comparison_reg_reg(void)
+{
+ run_scomp_reg_reg(cr);
+
+ run_scomp_reg_reg(cgr);
+ /* Special cases for cgr */
+ SCOMP_REG_REG(cgr, INT64_MIN, INT64_MIN);
+ SCOMP_REG_REG(cgr, INT64_MIN, INT64_MAX);
+ SCOMP_REG_REG(cgr, INT64_MAX, INT64_MIN);
+ SCOMP_REG_REG(cgr, INT64_MAX, INT64_MAX);
+
+ run_scomp_reg_reg(cgfr);
+ /* Special cases for cgfr */
+ SCOMP_REG_REG(cgfr, INT64_MIN, INT32_MIN);
+ SCOMP_REG_REG(cgfr, INT64_MIN, INT32_MAX);
+ SCOMP_REG_REG(cgfr, INT64_MAX, INT32_MIN);
+ SCOMP_REG_REG(cgfr, INT64_MAX, INT32_MAX);
+}
+
+void
+signed_comparison_reg_mem(void)
+{
+ run_scomp_reg_mem(c, int32_t);
+
+ run_scomp_reg_mem(cg, int64_t);
+ /* Special cases for cg */
+ SCOMP_REG_MEM(cg, INT64_MIN, INT64_MIN, int64_t);
+ SCOMP_REG_MEM(cg, INT64_MIN, INT64_MAX, int64_t);
+ SCOMP_REG_MEM(cg, INT64_MAX, INT64_MIN, int64_t);
+ SCOMP_REG_MEM(cg, INT64_MAX, INT64_MAX, int64_t);
+
+ run_scomp_reg_mem(cgf, int32_t);
+ /* Special cases for cgf */
+ SCOMP_REG_MEM(cgf, INT64_MIN, INT32_MIN, int32_t);
+ SCOMP_REG_MEM(cgf, INT64_MIN, INT32_MAX, int32_t);
+ SCOMP_REG_MEM(cgf, INT64_MAX, INT32_MIN, int32_t);
+ SCOMP_REG_MEM(cgf, INT64_MAX, INT32_MAX, int32_t);
+}
+
+void
+signed_comparison_reg_imm(void)
+{
+ run_scomp_reg_imm(CFI);
+
+ run_scomp_reg_imm(CGFI);
+ /* Special cases for cgfi */
+ SCOMP_REG_IMM(CGFI, INT64_MIN, INT32_MIN);
+ SCOMP_REG_IMM(CGFI, INT64_MIN, INT32_MAX);
+ SCOMP_REG_IMM(CGFI, INT64_MAX, INT32_MIN);
+ SCOMP_REG_IMM(CGFI, INT64_MAX, INT32_MAX);
+}
+
+
+int main(void)
+{
+ signed_comparison_reg_reg();
+ signed_comparison_reg_mem();
+ signed_comparison_reg_imm();
+
+ return 0;
+}
Added: trunk/none/tests/s390x/comp-2.stderr.exp (+2 -0)
===================================================================
--- trunk/none/tests/s390x/comp-2.stderr.exp 2012-09-21 23:44:45 +01:00 (rev 13011)
+++ trunk/none/tests/s390x/comp-2.stderr.exp 2012-09-23 01:42:49 +01:00 (rev 13012)
@@ -0,0 +1,2 @@
+
+
|