From: Andreas Arnez Date: Fri, 1 Oct 2021 18:10:54 +0000 (+0200) Subject: s390x: Add missing "cc" clobbers in test case inline asms X-Git-Tag: VALGRIND_3_18_0~44 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc78771b8b7b981dd8dfc9909fefed2d7f77d5a9;p=thirdparty%2Fvalgrind.git s390x: Add missing "cc" clobbers in test case inline asms Some inline assemblies in various s390x test cases miss specifying the condition code "cc" in the clobber list. Although this has not actually been seen to cause wrong code generation, it certainly might, so fix this. --- diff --git a/none/tests/s390x/bfp-2.c b/none/tests/s390x/bfp-2.c index a4295daa9c..73349eddd2 100644 --- a/none/tests/s390x/bfp-2.c +++ b/none/tests/s390x/bfp-2.c @@ -27,7 +27,7 @@ void lnebr(float in) { float out; - __asm__ volatile("lnebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); + __asm__ volatile("lnebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in) : "cc"); printf("lnebr %f -> %f\n", in, out); } @@ -35,7 +35,7 @@ void lndbr(double in) { double out; - __asm__ volatile("lndbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); + __asm__ volatile("lndbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in) : "cc"); printf("lndbr %f -> %f\n", in, out); } @@ -43,7 +43,7 @@ void lpebr(float in) { float out; - __asm__ volatile("lpebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); + __asm__ volatile("lpebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in) : "cc"); printf("lpebr %f -> %f\n", in, out); } @@ -51,7 +51,7 @@ void lpdbr(double in) { double out; - __asm__ volatile("lpdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); + __asm__ volatile("lpdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in) : "cc"); printf("lpdbr %f -> %f\n", in, out); } @@ -59,7 +59,7 @@ void lcebr(float in) { float out; - __asm__ volatile("lcebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); + __asm__ volatile("lcebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in) : "cc"); printf("lcebr %f -> %f\n", in, out); } @@ -67,7 +67,7 @@ void lcdbr(double in) { double out; - __asm__ volatile("lcdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); + __asm__ volatile("lcdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in) : "cc"); printf("lcdbr %f -> %f\n", in, out); } diff --git a/none/tests/s390x/cgij.c b/none/tests/s390x/cgij.c index 799e4240b2..6b69565bc2 100644 --- a/none/tests/s390x/cgij.c +++ b/none/tests/s390x/cgij.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/cgrj.c b/none/tests/s390x/cgrj.c index 3a5abd336b..d11a63242c 100644 --- a/none/tests/s390x/cgrj.c +++ b/none/tests/s390x/cgrj.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/cij.c b/none/tests/s390x/cij.c index 34e24d0ce9..10f0a988cc 100644 --- a/none/tests/s390x/cij.c +++ b/none/tests/s390x/cij.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/clgij.c b/none/tests/s390x/clgij.c index 7cfd509852..d993deadca 100644 --- a/none/tests/s390x/clgij.c +++ b/none/tests/s390x/clgij.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/clgrj.c b/none/tests/s390x/clgrj.c index c7917df505..9ffd1114a2 100644 --- a/none/tests/s390x/clgrj.c +++ b/none/tests/s390x/clgrj.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/clij.c b/none/tests/s390x/clij.c index dc627cdcc9..01636cf7df 100644 --- a/none/tests/s390x/clij.c +++ b/none/tests/s390x/clij.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/clrj.c b/none/tests/s390x/clrj.c index ba42b948db..b88232134f 100644 --- a/none/tests/s390x/clrj.c +++ b/none/tests/s390x/clrj.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/crj.c b/none/tests/s390x/crj.c index df3bd2009a..65d9d0d9ad 100644 --- a/none/tests/s390x/crj.c +++ b/none/tests/s390x/crj.c @@ -2,7 +2,7 @@ #include #include "opcodes.h" -#define BRASLCLOBBER "0","1","2","3","4","5","14", \ +#define BRASLCLOBBER "cc", "0","1","2","3","4","5","14", \ "f0","f1","f2","f3","f4","f5","f6","f7" void if_eq(void) { printf("equal\n"); } diff --git a/none/tests/s390x/dfp-1.c b/none/tests/s390x/dfp-1.c index 1b7d51b9e3..b9be89963f 100644 --- a/none/tests/s390x/dfp-1.c +++ b/none/tests/s390x/dfp-1.c @@ -15,6 +15,7 @@ volatile _Decimal128 d128_1, d128_2, result_128; "srl %1,28\n\t" \ :"+f" (d1), "=d" (cc) \ :"f"(d2) \ + :"cc" \ ); \ d1; \ }) diff --git a/none/tests/s390x/dfp-2.c b/none/tests/s390x/dfp-2.c index bec51be3df..061fff4c7a 100644 --- a/none/tests/s390x/dfp-2.c +++ b/none/tests/s390x/dfp-2.c @@ -89,7 +89,8 @@ void ltdtr(_Decimal64 in) "ipm %1\n\t" "srl %1,28\n\t" :[out] "=d" (out), "=d" (cc) - :[in] "f" (in)); + :[in] "f" (in) + :"cc"); printf("LTDTR "); DFP_VAL_PRINT(in, _Decimal64); printf(" -> %d\n", cc); @@ -103,7 +104,8 @@ void ltxtr(_Decimal128 in) "ipm %1\n\t" "srl %1,28\n\t" :[out] "=f" (out), "=d" (cc) - :[in] "f" (in)); + :[in] "f" (in) + :"cc"); printf("LTXTR "); DFP_VAL_PRINT(in, _Decimal128); printf(" -> %d\n", cc); diff --git a/none/tests/s390x/dfp-3.c b/none/tests/s390x/dfp-3.c index ed0177c69f..5120ed6b4e 100644 --- a/none/tests/s390x/dfp-3.c +++ b/none/tests/s390x/dfp-3.c @@ -19,6 +19,7 @@ "srl %0,28\n\t" \ :"=d" (cc) \ :"f"(d1), "f"(d2) \ + :"cc" \ ); \ cc; \ }) diff --git a/none/tests/s390x/lsc2.c b/none/tests/s390x/lsc2.c index ecfc5a9816..c026dcbd62 100644 --- a/none/tests/s390x/lsc2.c +++ b/none/tests/s390x/lsc2.c @@ -163,7 +163,8 @@ static bool test_llzrgf(const uint32_t testedValue) : [testedValue] "r"(testedValue), \ [invertedValue] "r"(invertedValue), \ [overrideValue] #ARGUMENT_ASM_TYPE(overrideValue), \ - "[after]"(after)); \ + "[after]"(after) \ + : "cc"); \ \ SMART_RETURN_R64(TESTED_INSTRUCTION); \ } @@ -199,7 +200,8 @@ declare_load_high_on_condition(locfhl, <, m) : [after] "=" #ARGUMENT_ASM_TYPE(after) \ : [testedValue] "r"(testedValue), \ [invertedValue] "r"(invertedValue), \ - [overrideValue] "r"(overrideValue)); \ + [overrideValue] "r"(overrideValue) \ + : "cc"); \ \ SMART_RETURN_R64(TESTED_INSTRUCTION); \ } @@ -235,7 +237,8 @@ declare_store_high_on_condition(stocfhl, <, m) : [after] "=r"(after) \ : [testedValue] "r"(testedValue), \ [invertedValue] "r"(invertedValue), \ - "[after]"(after)); \ + "[after]"(after) \ + : "cc"); \ \ SMART_RETURN_R64(TESTED_INSTRUCTION); \ } @@ -273,7 +276,8 @@ declare_load_halfword_immediate_on_condition(locghil, uint64_t, <, r) : [after] "=r"(after) \ : [testedValue] "r"(testedValue), \ [invertedValue] "r"(invertedValue), \ - "[after]"(after)); \ + "[after]"(after) \ + : "cc"); \ \ SMART_RETURN_R64(TESTED_INSTRUCTION); \ } @@ -314,7 +318,8 @@ static void test_all_locfh() __asm__ volatile("lcbb %[after], %[testedPointer], " #M_FIELD \ "\n" \ : [after] "=r"(after) \ - : [testedPointer] "m"(*testedPointer)); \ + : [testedPointer] "m"(*testedPointer) \ + : "cc"); \ \ SMART_RETURN_R64(lcbb##M_FIELD); \ } diff --git a/none/tests/s390x/misc3.c b/none/tests/s390x/misc3.c index ae6e8d4c2b..fbf4cae682 100644 --- a/none/tests/s390x/misc3.c +++ b/none/tests/s390x/misc3.c @@ -106,7 +106,7 @@ static int test_all_popcnt() [out1] "+d" (out1) \ : [a] "d" (a), \ [b] "d" (b) \ - : ); \ + : "cc"); \ \ printf("\t%016lx %016lx -> %016lx %016lx\n", \ a, b, out0, out1); \ diff --git a/none/tests/s390x/pfpo.c b/none/tests/s390x/pfpo.c index dd4fcec7d1..1bfd8896c7 100644 --- a/none/tests/s390x/pfpo.c +++ b/none/tests/s390x/pfpo.c @@ -36,7 +36,8 @@ "ipm %2\n\t" \ "srl %2,28\n\t" \ :"=f"(dst_reg), "=d"(ret), "=d" (cc) \ - : "f"(src_reg), "d"(fn)); \ + : "f"(src_reg), "d"(fn) \ + : "cc"); \ ret_code = ret; \ dst_reg; \ }) diff --git a/none/tests/s390x/tre.c b/none/tests/s390x/tre.c index dd2e1efce8..da0e38d3e0 100644 --- a/none/tests/s390x/tre.c +++ b/none/tests/s390x/tre.c @@ -31,7 +31,7 @@ tre_regs tre(uint8_t *codepage, uint8_t *addr, uint64_t len, uint8_t test_byte) " ipm %0\n" " srl %0,28\n" :"=d"(cc),"+&d"(a1) - :"d"(a2),"d"(param),"d"(l1),"d"(test_byte): "memory" ); + :"d"(a2),"d"(param),"d"(l1),"d"(test_byte): "cc", "memory" ); regs.addr = a1; regs.len = l1; diff --git a/none/tests/s390x/troo.c b/none/tests/s390x/troo.c index 374f3cd20c..f62ad0d057 100644 --- a/none/tests/s390x/troo.c +++ b/none/tests/s390x/troo.c @@ -41,7 +41,7 @@ troo_regs tr(uint8_t *addr, uint8_t *codepage, uint8_t *dest, uint64_t len, " srl %0,28\n" : "=d"(cc),"+&d"(desaddr) : "d" (srcaddr),"d"(test_byte),"d" (codepage2),"d"(length) - : "memory" ); + : "cc", "memory" ); regs.srcaddr = srcaddr; regs.len = length; diff --git a/none/tests/s390x/trot.c b/none/tests/s390x/trot.c index b4b44c86ae..76072c0277 100644 --- a/none/tests/s390x/trot.c +++ b/none/tests/s390x/trot.c @@ -42,7 +42,7 @@ trot_regs tr(uint8_t *addr, uint16_t *codepage, uint16_t *dest, uint64_t len, " srl %0,28\n" : "=d"(cc),"+&d"(desaddr) : "d" (srcaddr),"d"(test_byte),"d" (codepage2),"d"(length) - : "memory" ); + : "cc", "memory" ); regs.srcaddr = srcaddr; regs.len = length; diff --git a/none/tests/s390x/trto.c b/none/tests/s390x/trto.c index b79721d771..f8ff97645a 100644 --- a/none/tests/s390x/trto.c +++ b/none/tests/s390x/trto.c @@ -41,7 +41,7 @@ trto_regs tr(uint16_t *addr, uint16_t *codepage, uint8_t *dest, uint64_t len, " srl %0,28\n" : "=d"(cc),"+&d"(desaddr) : "d" (srcaddr),"d"(test_byte),"d" (codepage2),"d"(length) - : "memory" ); + : "cc", "memory" ); regs.srcaddr = srcaddr; regs.len = length; diff --git a/none/tests/s390x/trtt.c b/none/tests/s390x/trtt.c index e9cb89902c..c59c6416e6 100644 --- a/none/tests/s390x/trtt.c +++ b/none/tests/s390x/trtt.c @@ -42,7 +42,7 @@ trtt_regs tr(uint16_t *addr, uint16_t *codepage, uint16_t *dest, uint64_t len, " srl %0,28\n" : "=d"(cc),"+d"(desaddr),"+d"(srcaddr) : "d"(test_byte),"d" (codepage2),"d"(length) - : "memory" ); + : "cc", "memory" ); regs.srcaddr = srcaddr; regs.len = length; diff --git a/none/tests/s390x/xc.c b/none/tests/s390x/xc.c index 9c81b59f2c..86dda352d6 100644 --- a/none/tests/s390x/xc.c +++ b/none/tests/s390x/xc.c @@ -10,7 +10,7 @@ void test_oc(void) printf("\nOC:\n"); asm volatile ("oc %O0(1,%R0),%0\n"::"Q" (*zero), - "Q"(*zero):"memory"); + "Q"(*zero):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(zero, 2); @@ -28,12 +28,12 @@ void test_nc(void) printf("\nNC:\n"); asm volatile ("nc %O0(1,%R0),%0\n"::"Q" (*zero), - "Q"(*zero):"memory"); + "Q"(*zero):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(zero, 2); asm volatile ("nc %O0(19,%R0),%1\n"::"Q" (*buf1), - "Q"(*buf2):"memory"); + "Q"(*buf2):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(buf1, 20); } @@ -54,22 +54,22 @@ void test_xc(void) printf("\nXC:\n"); asm volatile ("xc %O0(1,%R0),%0\n"::"Q" (*zero), - "Q"(*zero):"memory"); + "Q"(*zero):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(zero, 4); asm volatile ("xc %O0(10,%R0),%0\n"::"Q" (*zero), - "Q"(*zero):"memory"); + "Q"(*zero):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(zero, 12); asm volatile ("xc %O0(100,%R0),%0\n"::"Q" (*zero), - "Q"(*zero):"memory"); + "Q"(*zero):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(zero, 102); asm volatile ("xc %O0(256,%R0),%0\n"::"Q" (*zero), - "Q"(*zero):"memory"); + "Q"(*zero):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(zero, 257); @@ -78,15 +78,15 @@ void test_xc(void) "ex 1,0(2)\n" "j 2f\n" "1: xc 260(1,%0),260(%0)\n" - "2:\n"::"a" (zero), "a"(zero):"memory", "1", "2"); + "2:\n"::"a" (zero), "a"(zero):"cc","memory", "1", "2"); printf("CC:%d\n", get_cc()); dump_field(zero + 260, 30); asm volatile ("xc 0(19,%0),0(%1)\n"::"a" (buf1), - "a"(buf2):"memory"); + "a"(buf2):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(buf1, 20); - asm volatile ("xc 0(10,%0),0(%0)\n"::"a" (buf3):"memory"); + asm volatile ("xc 0(10,%0),0(%0)\n"::"a" (buf3):"cc","memory"); printf("CC:%d\n", get_cc()); dump_field(buf3, 20);