* [PATCH 0/1] target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9
@ 2020-05-01 19:09 Daniele Buono
2020-05-01 19:09 ` [PATCH 1/1] " Daniele Buono
0 siblings, 1 reply; 5+ messages in thread
From: Daniele Buono @ 2020-05-01 19:09 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-ppc, dbuono, Daniele Buono, David Gibson
Until Clang v8, -Wtype-limits was kept for GCC compatibility but had no
effect. With Clang v9, the flag is now implemented ( see
https://tinyurl.com/clang8-manual vs https://tinyurl.com/clang9-manual )
Starting with Clang v9, compiling with -Wtype-limits (default for QEMU)
triggers the following errors on the ppc-softmmu and ppc-linux-user
targets:
/root/qemu/target/ppc/translate.c:1894:18: error: result of comparison
'target_ulong' (aka 'unsigned int') <= 4294967295 is always true
[-Werror,-Wtautological-type-limit-compare]
if (mask <= 0xffffffffu) {
~~~~ ^ ~~~~~~~~~~~
/root/qemu/target/ppc/translate.c:1941:18: error: result of comparison
'target_ulong' (aka 'unsigned int') <= 4294967295 is always true
[-Werror,-Wtautological-type-limit-compare]
if (mask <= 0xffffffffu) {
~~~~ ^ ~~~~~~~~~~~
/root/qemu/target/ppc/translate.c:1983:14: error: result of comparison
'target_ulong' (aka 'unsigned int') <= 4294967295 is always true
[-Werror,-Wtautological-type-limit-compare]
if (mask <= 0xffffffffu) {
~~~~ ^ ~~~~~~~~~~~
The same error can be triggered with this small repro:
int main() {
unsigned int x = 1;
if ( x <= 0xffffffffu) return 1;
return 0;
}
$ gcc test.c -Wtype-limits
[nothing]
$ clang-9 test.c -Wtype-limits
test.c:3:12: warning: result of comparison 'unsigned int' <= 4294967295
is always true [-Wtautological-type-limit-compare]
if ( x <= 0xffffffffu)
~ ^ ~~~~~~~~~~~
1 warning generated.
$ clang-9 test.c -Wtype-limits -Wno-tautological-type-limit-compare
[nothing]
We could get away with the compilation error by adding the flag
"-Wno-tautological-type-limit-compare", but I think we should avoid that
to make sure the checks are applied to the rest of the code and warn us
for logical errors in the future.
Looking at the code, the comparison is only needed for PPC64, since
the else branch in PPC32 only has a "g_assert_not_reached();"
This patch restructures the code so that PPC32 always runs the "true"
branch.
I tried to keep the changes to a minimum, to make sure to not affect the
semantics of the instructions. However, considering the target
architecture, my testing has been limited. check-acceptance seems to be
able to properly start a few linux kernels succesfully, and make check
didn't complain on both ppc-softmmu and ppc64-softmmu.
Daniele Buono (1):
target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9
target/ppc/translate.c | 34 +++++++++++++++++++---------------
1 file changed, 19 insertions(+), 15 deletions(-)
--
2.26.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/1] target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9
2020-05-01 19:09 [PATCH 0/1] target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9 Daniele Buono
@ 2020-05-01 19:09 ` Daniele Buono
2020-05-05 5:08 ` David Gibson
0 siblings, 1 reply; 5+ messages in thread
From: Daniele Buono @ 2020-05-01 19:09 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-ppc, dbuono, Daniele Buono, David Gibson
Starting with Clang v9, -Wtype-limits is implemented and triggers a
few "result of comparison is always true" errors when compiling PPC32
targets.
The comparisons seem to be necessary only on PPC64, since the
else branch in PPC32 only has a "g_assert_not_reached();" in all cases.
This patch restructures the code so that PPC32 does not execute the
check, while PPC64 works like before
Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
---
target/ppc/translate.c | 34 +++++++++++++++++++---------------
1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index 807d14faaa..9400fa2c7c 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -1882,6 +1882,7 @@ static void gen_rlwimi(DisasContext *ctx)
tcg_gen_deposit_tl(t_ra, t_ra, t_rs, sh, me - mb + 1);
} else {
target_ulong mask;
+ TCGv_i32 t0;
TCGv t1;
#if defined(TARGET_PPC64)
@@ -1891,20 +1892,20 @@ static void gen_rlwimi(DisasContext *ctx)
mask = MASK(mb, me);
t1 = tcg_temp_new();
+#if defined(TARGET_PPC64)
if (mask <= 0xffffffffu) {
- TCGv_i32 t0 = tcg_temp_new_i32();
+#endif
+ t0 = tcg_temp_new_i32();
tcg_gen_trunc_tl_i32(t0, t_rs);
tcg_gen_rotli_i32(t0, t0, sh);
tcg_gen_extu_i32_tl(t1, t0);
tcg_temp_free_i32(t0);
- } else {
#if defined(TARGET_PPC64)
+ } else {
tcg_gen_deposit_i64(t1, t_rs, t_rs, 32, 32);
tcg_gen_rotli_i64(t1, t1, sh);
-#else
- g_assert_not_reached();
-#endif
}
+#endif
tcg_gen_andi_tl(t1, t1, mask);
tcg_gen_andi_tl(t_ra, t_ra, ~mask);
@@ -1938,7 +1939,9 @@ static void gen_rlwinm(DisasContext *ctx)
me += 32;
#endif
mask = MASK(mb, me);
+#if defined(TARGET_PPC64)
if (mask <= 0xffffffffu) {
+#endif
if (sh == 0) {
tcg_gen_andi_tl(t_ra, t_rs, mask);
} else {
@@ -1949,15 +1952,13 @@ static void gen_rlwinm(DisasContext *ctx)
tcg_gen_extu_i32_tl(t_ra, t0);
tcg_temp_free_i32(t0);
}
- } else {
#if defined(TARGET_PPC64)
+ } else {
tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
tcg_gen_rotli_i64(t_ra, t_ra, sh);
tcg_gen_andi_i64(t_ra, t_ra, mask);
-#else
- g_assert_not_reached();
-#endif
}
+#endif
}
if (unlikely(Rc(ctx->opcode) != 0)) {
gen_set_Rc0(ctx, t_ra);
@@ -1972,6 +1973,9 @@ static void gen_rlwnm(DisasContext *ctx)
TCGv t_rb = cpu_gpr[rB(ctx->opcode)];
uint32_t mb = MB(ctx->opcode);
uint32_t me = ME(ctx->opcode);
+ TCGv_i32 t0;
+ TCGv_i32 t1;
+
target_ulong mask;
#if defined(TARGET_PPC64)
@@ -1980,9 +1984,11 @@ static void gen_rlwnm(DisasContext *ctx)
#endif
mask = MASK(mb, me);
+#if defined(TARGET_PPC64)
if (mask <= 0xffffffffu) {
- TCGv_i32 t0 = tcg_temp_new_i32();
- TCGv_i32 t1 = tcg_temp_new_i32();
+#endif
+ t0 = tcg_temp_new_i32();
+ t1 = tcg_temp_new_i32();
tcg_gen_trunc_tl_i32(t0, t_rb);
tcg_gen_trunc_tl_i32(t1, t_rs);
tcg_gen_andi_i32(t0, t0, 0x1f);
@@ -1990,17 +1996,15 @@ static void gen_rlwnm(DisasContext *ctx)
tcg_gen_extu_i32_tl(t_ra, t1);
tcg_temp_free_i32(t0);
tcg_temp_free_i32(t1);
- } else {
#if defined(TARGET_PPC64)
+ } else {
TCGv_i64 t0 = tcg_temp_new_i64();
tcg_gen_andi_i64(t0, t_rb, 0x1f);
tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
tcg_gen_rotl_i64(t_ra, t_ra, t0);
tcg_temp_free_i64(t0);
-#else
- g_assert_not_reached();
-#endif
}
+#endif
tcg_gen_andi_tl(t_ra, t_ra, mask);
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9
2020-05-01 19:09 ` [PATCH 1/1] " Daniele Buono
@ 2020-05-05 5:08 ` David Gibson
2020-05-05 12:26 ` Daniele Buono
0 siblings, 1 reply; 5+ messages in thread
From: David Gibson @ 2020-05-05 5:08 UTC (permalink / raw)
To: Daniele Buono; +Cc: qemu-ppc, qemu-devel, dbuono
[-- Attachment #1: Type: text/plain, Size: 4589 bytes --]
On Fri, May 01, 2020 at 03:09:13PM -0400, Daniele Buono wrote:
> Starting with Clang v9, -Wtype-limits is implemented and triggers a
> few "result of comparison is always true" errors when compiling PPC32
> targets.
>
> The comparisons seem to be necessary only on PPC64, since the
> else branch in PPC32 only has a "g_assert_not_reached();" in all cases.
>
> This patch restructures the code so that PPC32 does not execute the
> check, while PPC64 works like before
>
> Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
Urgh. #ifdefs intertangled with if statements gets pretty ugly. But,
then, it's already pretty ugly, so, applied.
> ---
> target/ppc/translate.c | 34 +++++++++++++++++++---------------
> 1 file changed, 19 insertions(+), 15 deletions(-)
>
> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> index 807d14faaa..9400fa2c7c 100644
> --- a/target/ppc/translate.c
> +++ b/target/ppc/translate.c
> @@ -1882,6 +1882,7 @@ static void gen_rlwimi(DisasContext *ctx)
> tcg_gen_deposit_tl(t_ra, t_ra, t_rs, sh, me - mb + 1);
> } else {
> target_ulong mask;
> + TCGv_i32 t0;
> TCGv t1;
>
> #if defined(TARGET_PPC64)
> @@ -1891,20 +1892,20 @@ static void gen_rlwimi(DisasContext *ctx)
> mask = MASK(mb, me);
>
> t1 = tcg_temp_new();
> +#if defined(TARGET_PPC64)
> if (mask <= 0xffffffffu) {
> - TCGv_i32 t0 = tcg_temp_new_i32();
> +#endif
> + t0 = tcg_temp_new_i32();
> tcg_gen_trunc_tl_i32(t0, t_rs);
> tcg_gen_rotli_i32(t0, t0, sh);
> tcg_gen_extu_i32_tl(t1, t0);
> tcg_temp_free_i32(t0);
> - } else {
> #if defined(TARGET_PPC64)
> + } else {
> tcg_gen_deposit_i64(t1, t_rs, t_rs, 32, 32);
> tcg_gen_rotli_i64(t1, t1, sh);
> -#else
> - g_assert_not_reached();
> -#endif
> }
> +#endif
>
> tcg_gen_andi_tl(t1, t1, mask);
> tcg_gen_andi_tl(t_ra, t_ra, ~mask);
> @@ -1938,7 +1939,9 @@ static void gen_rlwinm(DisasContext *ctx)
> me += 32;
> #endif
> mask = MASK(mb, me);
> +#if defined(TARGET_PPC64)
> if (mask <= 0xffffffffu) {
> +#endif
> if (sh == 0) {
> tcg_gen_andi_tl(t_ra, t_rs, mask);
> } else {
> @@ -1949,15 +1952,13 @@ static void gen_rlwinm(DisasContext *ctx)
> tcg_gen_extu_i32_tl(t_ra, t0);
> tcg_temp_free_i32(t0);
> }
> - } else {
> #if defined(TARGET_PPC64)
> + } else {
> tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
> tcg_gen_rotli_i64(t_ra, t_ra, sh);
> tcg_gen_andi_i64(t_ra, t_ra, mask);
> -#else
> - g_assert_not_reached();
> -#endif
> }
> +#endif
> }
> if (unlikely(Rc(ctx->opcode) != 0)) {
> gen_set_Rc0(ctx, t_ra);
> @@ -1972,6 +1973,9 @@ static void gen_rlwnm(DisasContext *ctx)
> TCGv t_rb = cpu_gpr[rB(ctx->opcode)];
> uint32_t mb = MB(ctx->opcode);
> uint32_t me = ME(ctx->opcode);
> + TCGv_i32 t0;
> + TCGv_i32 t1;
> +
> target_ulong mask;
>
> #if defined(TARGET_PPC64)
> @@ -1980,9 +1984,11 @@ static void gen_rlwnm(DisasContext *ctx)
> #endif
> mask = MASK(mb, me);
>
> +#if defined(TARGET_PPC64)
> if (mask <= 0xffffffffu) {
> - TCGv_i32 t0 = tcg_temp_new_i32();
> - TCGv_i32 t1 = tcg_temp_new_i32();
> +#endif
> + t0 = tcg_temp_new_i32();
> + t1 = tcg_temp_new_i32();
> tcg_gen_trunc_tl_i32(t0, t_rb);
> tcg_gen_trunc_tl_i32(t1, t_rs);
> tcg_gen_andi_i32(t0, t0, 0x1f);
> @@ -1990,17 +1996,15 @@ static void gen_rlwnm(DisasContext *ctx)
> tcg_gen_extu_i32_tl(t_ra, t1);
> tcg_temp_free_i32(t0);
> tcg_temp_free_i32(t1);
> - } else {
> #if defined(TARGET_PPC64)
> + } else {
> TCGv_i64 t0 = tcg_temp_new_i64();
> tcg_gen_andi_i64(t0, t_rb, 0x1f);
> tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
> tcg_gen_rotl_i64(t_ra, t_ra, t0);
> tcg_temp_free_i64(t0);
> -#else
> - g_assert_not_reached();
> -#endif
> }
> +#endif
>
> tcg_gen_andi_tl(t_ra, t_ra, mask);
>
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9
2020-05-05 5:08 ` David Gibson
@ 2020-05-05 12:26 ` Daniele Buono
2020-05-05 12:37 ` David Gibson
0 siblings, 1 reply; 5+ messages in thread
From: Daniele Buono @ 2020-05-05 12:26 UTC (permalink / raw)
To: David Gibson; +Cc: qemu-ppc, qemu-devel, dbuono
On 5/5/2020 1:08 AM, David Gibson wrote:
> On Fri, May 01, 2020 at 03:09:13PM -0400, Daniele Buono wrote:
>> Starting with Clang v9, -Wtype-limits is implemented and triggers a
>> few "result of comparison is always true" errors when compiling PPC32
>> targets.
>>
>> The comparisons seem to be necessary only on PPC64, since the
>> else branch in PPC32 only has a "g_assert_not_reached();" in all cases.
>>
>> This patch restructures the code so that PPC32 does not execute the
>> check, while PPC64 works like before
>>
>> Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
>
> Urgh. #ifdefs intertangled with if statements gets pretty ugly. But,
> then, it's already pretty ugly, so, applied.
>
Agreed, it's very ugly. After I sent the patch I thought of an
alternative that looks like this:
bool mask_in_32b = true;
#if defined(TARGET_PPC64)
if (mask > 0xffffffffu)
mask_in_32b = false;
#endif
if (mask_in_32b) {
/* Original if-else untouched using mask_in_32b instead of mask*/
It does have an additional if, but with a bit of luck the compiler may
optimize it out (at least for the 32bit case).
If you think the final outcome may be better, let me know and I'll send
a patch v2 like that.
>> ---
>> target/ppc/translate.c | 34 +++++++++++++++++++---------------
>> 1 file changed, 19 insertions(+), 15 deletions(-)
>>
>> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
>> index 807d14faaa..9400fa2c7c 100644
>> --- a/target/ppc/translate.c
>> +++ b/target/ppc/translate.c
>> @@ -1882,6 +1882,7 @@ static void gen_rlwimi(DisasContext *ctx)
>> tcg_gen_deposit_tl(t_ra, t_ra, t_rs, sh, me - mb + 1);
>> } else {
>> target_ulong mask;
>> + TCGv_i32 t0;
>> TCGv t1;
>>
>> #if defined(TARGET_PPC64)
>> @@ -1891,20 +1892,20 @@ static void gen_rlwimi(DisasContext *ctx)
>> mask = MASK(mb, me);
>>
>> t1 = tcg_temp_new();
>> +#if defined(TARGET_PPC64)
>> if (mask <= 0xffffffffu) {
>> - TCGv_i32 t0 = tcg_temp_new_i32();
>> +#endif
>> + t0 = tcg_temp_new_i32();
>> tcg_gen_trunc_tl_i32(t0, t_rs);
>> tcg_gen_rotli_i32(t0, t0, sh);
>> tcg_gen_extu_i32_tl(t1, t0);
>> tcg_temp_free_i32(t0);
>> - } else {
>> #if defined(TARGET_PPC64)
>> + } else {
>> tcg_gen_deposit_i64(t1, t_rs, t_rs, 32, 32);
>> tcg_gen_rotli_i64(t1, t1, sh);
>> -#else
>> - g_assert_not_reached();
>> -#endif
>> }
>> +#endif
>>
>> tcg_gen_andi_tl(t1, t1, mask);
>> tcg_gen_andi_tl(t_ra, t_ra, ~mask);
>> @@ -1938,7 +1939,9 @@ static void gen_rlwinm(DisasContext *ctx)
>> me += 32;
>> #endif
>> mask = MASK(mb, me);
>> +#if defined(TARGET_PPC64)
>> if (mask <= 0xffffffffu) {
>> +#endif
>> if (sh == 0) {
>> tcg_gen_andi_tl(t_ra, t_rs, mask);
>> } else {
>> @@ -1949,15 +1952,13 @@ static void gen_rlwinm(DisasContext *ctx)
>> tcg_gen_extu_i32_tl(t_ra, t0);
>> tcg_temp_free_i32(t0);
>> }
>> - } else {
>> #if defined(TARGET_PPC64)
>> + } else {
>> tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
>> tcg_gen_rotli_i64(t_ra, t_ra, sh);
>> tcg_gen_andi_i64(t_ra, t_ra, mask);
>> -#else
>> - g_assert_not_reached();
>> -#endif
>> }
>> +#endif
>> }
>> if (unlikely(Rc(ctx->opcode) != 0)) {
>> gen_set_Rc0(ctx, t_ra);
>> @@ -1972,6 +1973,9 @@ static void gen_rlwnm(DisasContext *ctx)
>> TCGv t_rb = cpu_gpr[rB(ctx->opcode)];
>> uint32_t mb = MB(ctx->opcode);
>> uint32_t me = ME(ctx->opcode);
>> + TCGv_i32 t0;
>> + TCGv_i32 t1;
>> +
>> target_ulong mask;
>>
>> #if defined(TARGET_PPC64)
>> @@ -1980,9 +1984,11 @@ static void gen_rlwnm(DisasContext *ctx)
>> #endif
>> mask = MASK(mb, me);
>>
>> +#if defined(TARGET_PPC64)
>> if (mask <= 0xffffffffu) {
>> - TCGv_i32 t0 = tcg_temp_new_i32();
>> - TCGv_i32 t1 = tcg_temp_new_i32();
>> +#endif
>> + t0 = tcg_temp_new_i32();
>> + t1 = tcg_temp_new_i32();
>> tcg_gen_trunc_tl_i32(t0, t_rb);
>> tcg_gen_trunc_tl_i32(t1, t_rs);
>> tcg_gen_andi_i32(t0, t0, 0x1f);
>> @@ -1990,17 +1996,15 @@ static void gen_rlwnm(DisasContext *ctx)
>> tcg_gen_extu_i32_tl(t_ra, t1);
>> tcg_temp_free_i32(t0);
>> tcg_temp_free_i32(t1);
>> - } else {
>> #if defined(TARGET_PPC64)
>> + } else {
>> TCGv_i64 t0 = tcg_temp_new_i64();
>> tcg_gen_andi_i64(t0, t_rb, 0x1f);
>> tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
>> tcg_gen_rotl_i64(t_ra, t_ra, t0);
>> tcg_temp_free_i64(t0);
>> -#else
>> - g_assert_not_reached();
>> -#endif
>> }
>> +#endif
>>
>> tcg_gen_andi_tl(t_ra, t_ra, mask);
>>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9
2020-05-05 12:26 ` Daniele Buono
@ 2020-05-05 12:37 ` David Gibson
0 siblings, 0 replies; 5+ messages in thread
From: David Gibson @ 2020-05-05 12:37 UTC (permalink / raw)
To: Daniele Buono; +Cc: qemu-ppc, qemu-devel, dbuono
[-- Attachment #1: Type: text/plain, Size: 5841 bytes --]
On Tue, May 05, 2020 at 08:26:48AM -0400, Daniele Buono wrote:
> On 5/5/2020 1:08 AM, David Gibson wrote:
> > On Fri, May 01, 2020 at 03:09:13PM -0400, Daniele Buono wrote:
> > > Starting with Clang v9, -Wtype-limits is implemented and triggers a
> > > few "result of comparison is always true" errors when compiling PPC32
> > > targets.
> > >
> > > The comparisons seem to be necessary only on PPC64, since the
> > > else branch in PPC32 only has a "g_assert_not_reached();" in all cases.
> > >
> > > This patch restructures the code so that PPC32 does not execute the
> > > check, while PPC64 works like before
> > >
> > > Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
> >
> > Urgh. #ifdefs intertangled with if statements gets pretty ugly. But,
> > then, it's already pretty ugly, so, applied.
> >
> Agreed, it's very ugly. After I sent the patch I thought of an alternative
> that looks like this:
>
> bool mask_in_32b = true;
>
> #if defined(TARGET_PPC64)
> if (mask > 0xffffffffu)
> mask_in_32b = false;
> #endif
>
> if (mask_in_32b) {
> /* Original if-else untouched using mask_in_32b instead of mask*/
>
> It does have an additional if, but with a bit of luck the compiler may
> optimize it out (at least for the 32bit case).
> If you think the final outcome may be better, let me know and I'll send a
> patch v2 like that.
Yeah, that would be a bit nicer. Please send the v2.
>
> > > ---
> > > target/ppc/translate.c | 34 +++++++++++++++++++---------------
> > > 1 file changed, 19 insertions(+), 15 deletions(-)
> > >
> > > diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> > > index 807d14faaa..9400fa2c7c 100644
> > > --- a/target/ppc/translate.c
> > > +++ b/target/ppc/translate.c
> > > @@ -1882,6 +1882,7 @@ static void gen_rlwimi(DisasContext *ctx)
> > > tcg_gen_deposit_tl(t_ra, t_ra, t_rs, sh, me - mb + 1);
> > > } else {
> > > target_ulong mask;
> > > + TCGv_i32 t0;
> > > TCGv t1;
> > > #if defined(TARGET_PPC64)
> > > @@ -1891,20 +1892,20 @@ static void gen_rlwimi(DisasContext *ctx)
> > > mask = MASK(mb, me);
> > > t1 = tcg_temp_new();
> > > +#if defined(TARGET_PPC64)
> > > if (mask <= 0xffffffffu) {
> > > - TCGv_i32 t0 = tcg_temp_new_i32();
> > > +#endif
> > > + t0 = tcg_temp_new_i32();
> > > tcg_gen_trunc_tl_i32(t0, t_rs);
> > > tcg_gen_rotli_i32(t0, t0, sh);
> > > tcg_gen_extu_i32_tl(t1, t0);
> > > tcg_temp_free_i32(t0);
> > > - } else {
> > > #if defined(TARGET_PPC64)
> > > + } else {
> > > tcg_gen_deposit_i64(t1, t_rs, t_rs, 32, 32);
> > > tcg_gen_rotli_i64(t1, t1, sh);
> > > -#else
> > > - g_assert_not_reached();
> > > -#endif
> > > }
> > > +#endif
> > > tcg_gen_andi_tl(t1, t1, mask);
> > > tcg_gen_andi_tl(t_ra, t_ra, ~mask);
> > > @@ -1938,7 +1939,9 @@ static void gen_rlwinm(DisasContext *ctx)
> > > me += 32;
> > > #endif
> > > mask = MASK(mb, me);
> > > +#if defined(TARGET_PPC64)
> > > if (mask <= 0xffffffffu) {
> > > +#endif
> > > if (sh == 0) {
> > > tcg_gen_andi_tl(t_ra, t_rs, mask);
> > > } else {
> > > @@ -1949,15 +1952,13 @@ static void gen_rlwinm(DisasContext *ctx)
> > > tcg_gen_extu_i32_tl(t_ra, t0);
> > > tcg_temp_free_i32(t0);
> > > }
> > > - } else {
> > > #if defined(TARGET_PPC64)
> > > + } else {
> > > tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
> > > tcg_gen_rotli_i64(t_ra, t_ra, sh);
> > > tcg_gen_andi_i64(t_ra, t_ra, mask);
> > > -#else
> > > - g_assert_not_reached();
> > > -#endif
> > > }
> > > +#endif
> > > }
> > > if (unlikely(Rc(ctx->opcode) != 0)) {
> > > gen_set_Rc0(ctx, t_ra);
> > > @@ -1972,6 +1973,9 @@ static void gen_rlwnm(DisasContext *ctx)
> > > TCGv t_rb = cpu_gpr[rB(ctx->opcode)];
> > > uint32_t mb = MB(ctx->opcode);
> > > uint32_t me = ME(ctx->opcode);
> > > + TCGv_i32 t0;
> > > + TCGv_i32 t1;
> > > +
> > > target_ulong mask;
> > > #if defined(TARGET_PPC64)
> > > @@ -1980,9 +1984,11 @@ static void gen_rlwnm(DisasContext *ctx)
> > > #endif
> > > mask = MASK(mb, me);
> > > +#if defined(TARGET_PPC64)
> > > if (mask <= 0xffffffffu) {
> > > - TCGv_i32 t0 = tcg_temp_new_i32();
> > > - TCGv_i32 t1 = tcg_temp_new_i32();
> > > +#endif
> > > + t0 = tcg_temp_new_i32();
> > > + t1 = tcg_temp_new_i32();
> > > tcg_gen_trunc_tl_i32(t0, t_rb);
> > > tcg_gen_trunc_tl_i32(t1, t_rs);
> > > tcg_gen_andi_i32(t0, t0, 0x1f);
> > > @@ -1990,17 +1996,15 @@ static void gen_rlwnm(DisasContext *ctx)
> > > tcg_gen_extu_i32_tl(t_ra, t1);
> > > tcg_temp_free_i32(t0);
> > > tcg_temp_free_i32(t1);
> > > - } else {
> > > #if defined(TARGET_PPC64)
> > > + } else {
> > > TCGv_i64 t0 = tcg_temp_new_i64();
> > > tcg_gen_andi_i64(t0, t_rb, 0x1f);
> > > tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32);
> > > tcg_gen_rotl_i64(t_ra, t_ra, t0);
> > > tcg_temp_free_i64(t0);
> > > -#else
> > > - g_assert_not_reached();
> > > -#endif
> > > }
> > > +#endif
> > > tcg_gen_andi_tl(t_ra, t_ra, mask);
> >
>
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-05-05 13:23 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-05-01 19:09 [PATCH 0/1] target-ppc: fix rlwimi, rlwinm, rlwnm for Clang-9 Daniele Buono
2020-05-01 19:09 ` [PATCH 1/1] " Daniele Buono
2020-05-05 5:08 ` David Gibson
2020-05-05 12:26 ` Daniele Buono
2020-05-05 12:37 ` David Gibson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).