[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] tests/tcg/s390x: Fix the exrl-trt* tests with Clang
From: |
David Hildenbrand |
Subject: |
Re: [PATCH] tests/tcg/s390x: Fix the exrl-trt* tests with Clang |
Date: |
Tue, 1 Mar 2022 10:44:32 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 |
On 01.03.22 10:24, Thomas Huth wrote:
> 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.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> tests/tcg/s390x/exrl-trt.c | 8 +++-----
> tests/tcg/s390x/exrl-trtr.c | 8 +++-----
> 2 files changed, 6 insertions(+), 10 deletions(-)
>
> diff --git a/tests/tcg/s390x/exrl-trt.c b/tests/tcg/s390x/exrl-trt.c
> index 16711a3181..451f777b9d 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 5f30cda6bd..422f7f385a 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);
Reviewed-by: David Hildenbrand <david@redhat.com>
--
Thanks,
David / dhildenb