aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorThomas Huth <thuth@redhat.com>2022-03-01 10:24:31 +0100
committerThomas Huth <thuth@redhat.com>2022-03-07 09:06:32 +0100
commit2b4e8cf05035a31fd20639e3a88daa39e921bd07 (patch)
treef6ff5c18e680b8e6f9436444d3e48c13898d5cbe /tests
parentf530ba8f8d69738b7516432ab2eacd727b79c3ed (diff)
downloadqemu-2b4e8cf05035a31fd20639e3a88daa39e921bd07.zip
qemu-2b4e8cf05035a31fd20639e3a88daa39e921bd07.tar.gz
qemu-2b4e8cf05035a31fd20639e3a88daa39e921bd07.tar.bz2
tests/tcg/s390x: Fix the exrl-trt* tests with Clang
The exrl-trt* tests use two pre-initialized variables for the results of the assembly code: uint64_t r1 = 0xffffffffffffffffull; uint64_t r2 = 0xffffffffffffffffull; But then the assembly code copies over the full contents of the register into the output variable, without taking care of this pre-initialized values: " lgr %[r1],%%r1\n" " lgr %[r2],%%r2\n" The code then finally compares the register contents to a value that apparently depends on the pre-initialized values: if (r2 != 0xffffffffffffffaaull) { write(1, "bad r2\n", 7); return 1; } This all works with GCC, since the 0xffffffffffffffff got into the r2 register there by accident, but it fails completely with Clang. Let's fix this by declaring the r1 and r2 variables as proper register variables instead, so the pre-initialized values get correctly passed into the inline assembly code. Message-Id: <20220301092431.1448419-1-thuth@redhat.com> Reviewed-by: David Hildenbrand <david@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Thomas Huth <thuth@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/tcg/s390x/exrl-trt.c8
-rw-r--r--tests/tcg/s390x/exrl-trtr.c8
2 files changed, 6 insertions, 10 deletions
diff --git a/tests/tcg/s390x/exrl-trt.c b/tests/tcg/s390x/exrl-trt.c
index 16711a3..451f777 100644
--- a/tests/tcg/s390x/exrl-trt.c
+++ b/tests/tcg/s390x/exrl-trt.c
@@ -5,8 +5,8 @@ int main(void)
{
char op1[] = "hello";
char op2[256];
- uint64_t r1 = 0xffffffffffffffffull;
- uint64_t r2 = 0xffffffffffffffffull;
+ register uint64_t r1 asm("r1") = 0xffffffffffffffffull;
+ register uint64_t r2 asm("r2") = 0xffffffffffffffffull;
uint64_t cc;
int i;
@@ -21,8 +21,6 @@ int main(void)
" j 2f\n"
"1: trt 0(1,%[op1]),%[op2]\n"
"2: exrl %[op1_len],1b\n"
- " lgr %[r1],%%r1\n"
- " lgr %[r2],%%r2\n"
" ipm %[cc]\n"
: [r1] "+r" (r1),
[r2] "+r" (r2),
@@ -30,7 +28,7 @@ int main(void)
: [op1] "a" (&op1),
[op1_len] "a" (5),
[op2] "Q" (op2)
- : "r1", "r2", "cc");
+ : "cc");
cc = (cc >> 28) & 3;
if (cc != 2) {
write(1, "bad cc\n", 7);
diff --git a/tests/tcg/s390x/exrl-trtr.c b/tests/tcg/s390x/exrl-trtr.c
index 5f30cda..422f7f3 100644
--- a/tests/tcg/s390x/exrl-trtr.c
+++ b/tests/tcg/s390x/exrl-trtr.c
@@ -5,8 +5,8 @@ int main(void)
{
char op1[] = {0, 1, 2, 3};
char op2[256];
- uint64_t r1 = 0xffffffffffffffffull;
- uint64_t r2 = 0xffffffffffffffffull;
+ register uint64_t r1 asm("r1") = 0xffffffffffffffffull;
+ register uint64_t r2 asm("r2") = 0xffffffffffffffffull;
uint64_t cc;
int i;
@@ -21,8 +21,6 @@ int main(void)
" j 2f\n"
"1: trtr 3(1,%[op1]),%[op2]\n"
"2: exrl %[op1_len],1b\n"
- " lgr %[r1],%%r1\n"
- " lgr %[r2],%%r2\n"
" ipm %[cc]\n"
: [r1] "+r" (r1),
[r2] "+r" (r2),
@@ -30,7 +28,7 @@ int main(void)
: [op1] "a" (&op1),
[op1_len] "a" (3),
[op2] "Q" (op2)
- : "r1", "r2", "cc");
+ : "cc");
cc = (cc >> 28) & 3;
if (cc != 1) {
write(1, "bad cc\n", 7);