Patchwork target-xtensa: fix search_pc for the last TB opcode

login
register
mail settings
Submitter Max Filippov
Date Dec. 18, 2012, 7:21 a.m.
Message ID <1355815285-18550-1-git-send-email-jcmvbkbc@gmail.com>
Download mbox | patch
Permalink /patch/207035/
State New
Headers show

Comments

Max Filippov - Dec. 18, 2012, 7:21 a.m.
Zero out tcg_ctx.gen_opc_instr_start for instructions representing the
last guest opcode in the TB.

Cc: qemu-stable@nongnu.org
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 target-xtensa/translate.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)
Blue Swirl - Dec. 19, 2012, 7:45 p.m.
On Tue, Dec 18, 2012 at 7:21 AM, Max Filippov <jcmvbkbc@gmail.com> wrote:
> Zero out tcg_ctx.gen_opc_instr_start for instructions representing the
> last guest opcode in the TB.
>
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> ---
>  target-xtensa/translate.c |    8 +++++++-
>  1 files changed, 7 insertions(+), 1 deletions(-)
>
> diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
> index 5d8762c..d109a08 100644
> --- a/target-xtensa/translate.c
> +++ b/target-xtensa/translate.c
> @@ -3005,7 +3005,13 @@ static void gen_intermediate_code_internal(
>      gen_icount_end(tb, insn_count);
>      *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>
> -    if (!search_pc) {
> +    if (search_pc) {
> +        j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
> +        lj++;
> +        while (lj <= j) {
> +            tcg_ctx.gen_opc_instr_start[lj++] = 0;
> +        }

Instead of the loop, how about something like
memset(&tcg_ctx.gen_opc_instr_start[lj], 0, j - lj)?

> +    } else {
>          tb->size = dc.pc - pc_start;
>          tb->icount = insn_count;
>      }
> --
> 1.7.7.6
>
Max Filippov - Dec. 19, 2012, 7:49 p.m.
On Wed, Dec 19, 2012 at 11:45 PM, Blue Swirl <blauwirbel@gmail.com> wrote:
> On Tue, Dec 18, 2012 at 7:21 AM, Max Filippov <jcmvbkbc@gmail.com> wrote:
>> Zero out tcg_ctx.gen_opc_instr_start for instructions representing the
>> last guest opcode in the TB.
>>
>> Cc: qemu-stable@nongnu.org
>> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
>> ---
>>  target-xtensa/translate.c |    8 +++++++-
>>  1 files changed, 7 insertions(+), 1 deletions(-)
>>
>> diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
>> index 5d8762c..d109a08 100644
>> --- a/target-xtensa/translate.c
>> +++ b/target-xtensa/translate.c
>> @@ -3005,7 +3005,13 @@ static void gen_intermediate_code_internal(
>>      gen_icount_end(tb, insn_count);
>>      *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>>
>> -    if (!search_pc) {
>> +    if (search_pc) {
>> +        j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
>> +        lj++;
>> +        while (lj <= j) {
>> +            tcg_ctx.gen_opc_instr_start[lj++] = 0;
>> +        }
>
> Instead of the loop, how about something like
> memset(&tcg_ctx.gen_opc_instr_start[lj], 0, j - lj)?

Off by one, j - lj + 1.
Wanted to keep it looking as other instances, but can do it this way too.

>> +    } else {
>>          tb->size = dc.pc - pc_start;
>>          tb->icount = insn_count;
>>      }
>> --
>> 1.7.7.6
>>

Patch

diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
index 5d8762c..d109a08 100644
--- a/target-xtensa/translate.c
+++ b/target-xtensa/translate.c
@@ -3005,7 +3005,13 @@  static void gen_intermediate_code_internal(
     gen_icount_end(tb, insn_count);
     *tcg_ctx.gen_opc_ptr = INDEX_op_end;
 
-    if (!search_pc) {
+    if (search_pc) {
+        j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
+        lj++;
+        while (lj <= j) {
+            tcg_ctx.gen_opc_instr_start[lj++] = 0;
+        }
+    } else {
         tb->size = dc.pc - pc_start;
         tb->icount = insn_count;
     }