Re: [Qemu-devel] [PATCH 10/67] target/arm: Move test for AL into arm_skip_unless

2019-07-30 Thread Peter Maydell
On Tue, 30 Jul 2019 at 01:57, Richard Henderson
 wrote:
>
> On 7/29/19 7:32 AM, Peter Maydell wrote:
> > On Fri, 26 Jul 2019 at 18:50, Richard Henderson
> >  wrote:
> >>
> >> We will shortly be calling this function much more often.
> >>
> >> Signed-off-by: Richard Henderson 
> >> ---

> >
> > In the other callsites for arm_skip_unless() the cond argument
> > can never be 0xe or 0xf.
> >
> > Reviewed-by: Peter Maydell 
>
> In my original version I included cond in the fields collected by decodetree,
> and so every single trans_* function called arm_skip_unless, so that would not
> be the case there.

That remark was more a note about why the change is ok and doesn't
change behaviour for the other callsites that the patch doesn't touch.
(It's the kind of thing it's helpful to note in a commit message to
show that you've thought about it.)

> I discarded that in the version posted here, but I still think it might be a
> cleaner design overall.
>
> In the short term, maybe I should just discard this patch?

I don't have a strong opinion either way. Putting the cond check
inside the function seems cleaner even if we're only calling it in
a few places, I think.

thanks
-- PMM



Re: [Qemu-devel] [PATCH 10/67] target/arm: Move test for AL into arm_skip_unless

2019-07-29 Thread Richard Henderson
On 7/29/19 7:32 AM, Peter Maydell wrote:
> On Fri, 26 Jul 2019 at 18:50, Richard Henderson
>  wrote:
>>
>> We will shortly be calling this function much more often.
>>
>> Signed-off-by: Richard Henderson 
>> ---
>>  target/arm/translate.c | 28 
>>  1 file changed, 12 insertions(+), 16 deletions(-)
>>
>> diff --git a/target/arm/translate.c b/target/arm/translate.c
>> index 53c46fcdc4..36419025db 100644
>> --- a/target/arm/translate.c
>> +++ b/target/arm/translate.c
>> @@ -7705,8 +7705,14 @@ static void arm_gen_condlabel(DisasContext *s)
>>  /* Skip this instruction if the ARM condition is false */
>>  static void arm_skip_unless(DisasContext *s, uint32_t cond)
>>  {
>> -arm_gen_condlabel(s);
>> -arm_gen_test_cc(cond ^ 1, s->condlabel);
>> +/*
>> + * Conditionally skip the insn. Note that both 0xe and 0xf mean
>> + * "always"; 0xf is not "never".
>> + */
>> +if (cond < 0xe) {
>> +arm_gen_condlabel(s);
>> +arm_gen_test_cc(cond ^ 1, s->condlabel);
>> +}
>>  }
>>
>>  static void disas_arm_insn(DisasContext *s, unsigned int insn)
>> @@ -7944,11 +7950,9 @@ static void disas_arm_insn(DisasContext *s, unsigned 
>> int insn)
>>  }
>>  goto illegal_op;
>>  }
>> -if (cond != 0xe) {
>> -/* if not always execute, we generate a conditional jump to
>> -   next instruction */
>> -arm_skip_unless(s, cond);
>> -}
>> +
>> +arm_skip_unless(s, cond);
>> +
>>  if ((insn & 0x0f90) == 0x0300) {
>>  if ((insn & (1 << 21)) == 0) {
>>  ARCH(6T2);
>> @@ -12095,15 +12099,7 @@ static void 
>> thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
>>  dc->insn = insn;
>>
>>  if (dc->condexec_mask && !thumb_insn_is_unconditional(dc, insn)) {
>> -uint32_t cond = dc->condexec_cond;
>> -
>> -/*
>> - * Conditionally skip the insn. Note that both 0xe and 0xf mean
>> - * "always"; 0xf is not "never".
>> - */
>> -if (cond < 0x0e) {
>> -arm_skip_unless(dc, cond);
>> -}
>> +arm_skip_unless(dc, dc->condexec_cond);
>>  }
> 
> In the other callsites for arm_skip_unless() the cond argument
> can never be 0xe or 0xf.
> 
> Reviewed-by: Peter Maydell 

In my original version I included cond in the fields collected by decodetree,
and so every single trans_* function called arm_skip_unless, so that would not
be the case there.

I discarded that in the version posted here, but I still think it might be a
cleaner design overall.

In the short term, maybe I should just discard this patch?


r~



Re: [Qemu-devel] [PATCH 10/67] target/arm: Move test for AL into arm_skip_unless

2019-07-29 Thread Peter Maydell
On Fri, 26 Jul 2019 at 18:50, Richard Henderson
 wrote:
>
> We will shortly be calling this function much more often.
>
> Signed-off-by: Richard Henderson 
> ---
>  target/arm/translate.c | 28 
>  1 file changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/target/arm/translate.c b/target/arm/translate.c
> index 53c46fcdc4..36419025db 100644
> --- a/target/arm/translate.c
> +++ b/target/arm/translate.c
> @@ -7705,8 +7705,14 @@ static void arm_gen_condlabel(DisasContext *s)
>  /* Skip this instruction if the ARM condition is false */
>  static void arm_skip_unless(DisasContext *s, uint32_t cond)
>  {
> -arm_gen_condlabel(s);
> -arm_gen_test_cc(cond ^ 1, s->condlabel);
> +/*
> + * Conditionally skip the insn. Note that both 0xe and 0xf mean
> + * "always"; 0xf is not "never".
> + */
> +if (cond < 0xe) {
> +arm_gen_condlabel(s);
> +arm_gen_test_cc(cond ^ 1, s->condlabel);
> +}
>  }
>
>  static void disas_arm_insn(DisasContext *s, unsigned int insn)
> @@ -7944,11 +7950,9 @@ static void disas_arm_insn(DisasContext *s, unsigned 
> int insn)
>  }
>  goto illegal_op;
>  }
> -if (cond != 0xe) {
> -/* if not always execute, we generate a conditional jump to
> -   next instruction */
> -arm_skip_unless(s, cond);
> -}
> +
> +arm_skip_unless(s, cond);
> +
>  if ((insn & 0x0f90) == 0x0300) {
>  if ((insn & (1 << 21)) == 0) {
>  ARCH(6T2);
> @@ -12095,15 +12099,7 @@ static void thumb_tr_translate_insn(DisasContextBase 
> *dcbase, CPUState *cpu)
>  dc->insn = insn;
>
>  if (dc->condexec_mask && !thumb_insn_is_unconditional(dc, insn)) {
> -uint32_t cond = dc->condexec_cond;
> -
> -/*
> - * Conditionally skip the insn. Note that both 0xe and 0xf mean
> - * "always"; 0xf is not "never".
> - */
> -if (cond < 0x0e) {
> -arm_skip_unless(dc, cond);
> -}
> +arm_skip_unless(dc, dc->condexec_cond);
>  }

In the other callsites for arm_skip_unless() the cond argument
can never be 0xe or 0xf.

Reviewed-by: Peter Maydell 

thanks
-- PMM



[Qemu-devel] [PATCH 10/67] target/arm: Move test for AL into arm_skip_unless

2019-07-26 Thread Richard Henderson
We will shortly be calling this function much more often.

Signed-off-by: Richard Henderson 
---
 target/arm/translate.c | 28 
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/target/arm/translate.c b/target/arm/translate.c
index 53c46fcdc4..36419025db 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -7705,8 +7705,14 @@ static void arm_gen_condlabel(DisasContext *s)
 /* Skip this instruction if the ARM condition is false */
 static void arm_skip_unless(DisasContext *s, uint32_t cond)
 {
-arm_gen_condlabel(s);
-arm_gen_test_cc(cond ^ 1, s->condlabel);
+/*
+ * Conditionally skip the insn. Note that both 0xe and 0xf mean
+ * "always"; 0xf is not "never".
+ */
+if (cond < 0xe) {
+arm_gen_condlabel(s);
+arm_gen_test_cc(cond ^ 1, s->condlabel);
+}
 }
 
 static void disas_arm_insn(DisasContext *s, unsigned int insn)
@@ -7944,11 +7950,9 @@ static void disas_arm_insn(DisasContext *s, unsigned int 
insn)
 }
 goto illegal_op;
 }
-if (cond != 0xe) {
-/* if not always execute, we generate a conditional jump to
-   next instruction */
-arm_skip_unless(s, cond);
-}
+
+arm_skip_unless(s, cond);
+
 if ((insn & 0x0f90) == 0x0300) {
 if ((insn & (1 << 21)) == 0) {
 ARCH(6T2);
@@ -12095,15 +12099,7 @@ static void thumb_tr_translate_insn(DisasContextBase 
*dcbase, CPUState *cpu)
 dc->insn = insn;
 
 if (dc->condexec_mask && !thumb_insn_is_unconditional(dc, insn)) {
-uint32_t cond = dc->condexec_cond;
-
-/*
- * Conditionally skip the insn. Note that both 0xe and 0xf mean
- * "always"; 0xf is not "never".
- */
-if (cond < 0x0e) {
-arm_skip_unless(dc, cond);
-}
+arm_skip_unless(dc, dc->condexec_cond);
 }
 
 if (is_16bit) {
-- 
2.17.1