qemu-s390x
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]