diff mbox

[for-2.5,20/30] m68k: add exg

Message ID 1439151229-27747-21-git-send-email-laurent@vivier.eu
State New
Headers show

Commit Message

Laurent Vivier Aug. 9, 2015, 8:13 p.m. UTC
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
 target-m68k/translate.c | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

Comments

Richard Henderson Aug. 12, 2015, 5:05 p.m. UTC | #1
On 08/09/2015 01:13 PM, Laurent Vivier wrote:
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
> ---
>  target-m68k/translate.c | 34 +++++++++++++++++++++++++++++++++-
>  1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/target-m68k/translate.c b/target-m68k/translate.c
> index adf4521..b7d15e9 100644
> --- a/target-m68k/translate.c
> +++ b/target-m68k/translate.c
> @@ -2035,10 +2035,42 @@ DISAS_INSN(and)
>      TCGv dest;
>      TCGv addr;
>      int opsize;
> +    int exg_mode;
>  
> +    dest = tcg_temp_new();
> +
> +    /* exg */
> +
> +    exg_mode = insn & 0x1f8;

Likewise, surely we can decode EXG separately from AND, and avoid doing so for
coldfire.


r~
Laurent Vivier Aug. 12, 2015, 10:43 p.m. UTC | #2
Le 12/08/2015 19:05, Richard Henderson a écrit :
> On 08/09/2015 01:13 PM, Laurent Vivier wrote:
>> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
>> ---
>>  target-m68k/translate.c | 34 +++++++++++++++++++++++++++++++++-
>>  1 file changed, 33 insertions(+), 1 deletion(-)
>>
>> diff --git a/target-m68k/translate.c b/target-m68k/translate.c
>> index adf4521..b7d15e9 100644
>> --- a/target-m68k/translate.c
>> +++ b/target-m68k/translate.c
>> @@ -2035,10 +2035,42 @@ DISAS_INSN(and)
>>      TCGv dest;
>>      TCGv addr;
>>      int opsize;
>> +    int exg_mode;
>>  
>> +    dest = tcg_temp_new();
>> +
>> +    /* exg */
>> +
>> +    exg_mode = insn & 0x1f8;
> 
> Likewise, surely we can decode EXG separately from AND, and avoid doing so for
> coldfire.

I agree for CMPM, not for EXG.

Let's have a look to instructions encoding :)

AND       1100dddooommmrrr

  ddd       data register number
  ooo       opmode,  invalid: 011, 111
  mmmrrr    ea mode, if ooo = { 000, 001, 010} invalid: 001000 .. 001111
                     if ooo = { 100, 101, 110} invalid; 000000 .. 001111

EXG       1100xxx1oooooyyy

  xxx       register
  ooooo     valid: 01000, 01001, 10001
  yyy       register

So, EXG is an AND with

  ooo 101, 110
  mmm 000, 001

which are invalid combinations for AND.

IMHO, EXG looks like a wart on the AND and should be decoded like that...

I don't know how to add this easily in the table... except by adding 3
entries to decode 1 instruction. Is it acceptable ?

Laurent
Richard Henderson Aug. 12, 2015, 11:09 p.m. UTC | #3
On 08/12/2015 03:43 PM, Laurent Vivier wrote:
>
>
> Le 12/08/2015 19:05, Richard Henderson a écrit :
>> On 08/09/2015 01:13 PM, Laurent Vivier wrote:
>>> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
>>> ---
>>>   target-m68k/translate.c | 34 +++++++++++++++++++++++++++++++++-
>>>   1 file changed, 33 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/target-m68k/translate.c b/target-m68k/translate.c
>>> index adf4521..b7d15e9 100644
>>> --- a/target-m68k/translate.c
>>> +++ b/target-m68k/translate.c
>>> @@ -2035,10 +2035,42 @@ DISAS_INSN(and)
>>>       TCGv dest;
>>>       TCGv addr;
>>>       int opsize;
>>> +    int exg_mode;
>>>
>>> +    dest = tcg_temp_new();
>>> +
>>> +    /* exg */
>>> +
>>> +    exg_mode = insn & 0x1f8;
>>
>> Likewise, surely we can decode EXG separately from AND, and avoid doing so for
>> coldfire.
>
> I agree for CMPM, not for EXG.
>
> Let's have a look to instructions encoding :)
>
> AND       1100dddooommmrrr
>
>    ddd       data register number
>    ooo       opmode,  invalid: 011, 111
>    mmmrrr    ea mode, if ooo = { 000, 001, 010} invalid: 001000 .. 001111
>                       if ooo = { 100, 101, 110} invalid; 000000 .. 001111
>
> EXG       1100xxx1oooooyyy
>
>    xxx       register
>    ooooo     valid: 01000, 01001, 10001
>    yyy       register
>
> So, EXG is an AND with
>
>    ooo 101, 110
>    mmm 000, 001
>
> which are invalid combinations for AND.
>
> IMHO, EXG looks like a wart on the AND and should be decoded like that...

Hmm, perhaps you're right.  On the other hand, maybe we should rename the 
function and_exg, and also properly check for M68000 before accepting exg?


r~
Laurent Vivier Aug. 12, 2015, 11:10 p.m. UTC | #4
Le 13/08/2015 01:09, Richard Henderson a écrit :
> On 08/12/2015 03:43 PM, Laurent Vivier wrote:
>>
>>
>> Le 12/08/2015 19:05, Richard Henderson a écrit :
>>> On 08/09/2015 01:13 PM, Laurent Vivier wrote:
>>>> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
>>>> ---
>>>>   target-m68k/translate.c | 34 +++++++++++++++++++++++++++++++++-
>>>>   1 file changed, 33 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/target-m68k/translate.c b/target-m68k/translate.c
>>>> index adf4521..b7d15e9 100644
>>>> --- a/target-m68k/translate.c
>>>> +++ b/target-m68k/translate.c
>>>> @@ -2035,10 +2035,42 @@ DISAS_INSN(and)
>>>>       TCGv dest;
>>>>       TCGv addr;
>>>>       int opsize;
>>>> +    int exg_mode;
>>>>
>>>> +    dest = tcg_temp_new();
>>>> +
>>>> +    /* exg */
>>>> +
>>>> +    exg_mode = insn & 0x1f8;
>>>
>>> Likewise, surely we can decode EXG separately from AND, and avoid
>>> doing so for
>>> coldfire.
>>
>> I agree for CMPM, not for EXG.
>>
>> Let's have a look to instructions encoding :)
>>
>> AND       1100dddooommmrrr
>>
>>    ddd       data register number
>>    ooo       opmode,  invalid: 011, 111
>>    mmmrrr    ea mode, if ooo = { 000, 001, 010} invalid: 001000 .. 001111
>>                       if ooo = { 100, 101, 110} invalid; 000000 .. 001111
>>
>> EXG       1100xxx1oooooyyy
>>
>>    xxx       register
>>    ooooo     valid: 01000, 01001, 10001
>>    yyy       register
>>
>> So, EXG is an AND with
>>
>>    ooo 101, 110
>>    mmm 000, 001
>>
>> which are invalid combinations for AND.
>>
>> IMHO, EXG looks like a wart on the AND and should be decoded like that...
> 
> Hmm, perhaps you're right.  On the other hand, maybe we should rename
> the function and_exg, and also properly check for M68000 before
> accepting exg?

I agree.

Thank you for all your comments.
Laurent
diff mbox

Patch

diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index adf4521..b7d15e9 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -2035,10 +2035,42 @@  DISAS_INSN(and)
     TCGv dest;
     TCGv addr;
     int opsize;
+    int exg_mode;
 
+    dest = tcg_temp_new();
+
+    /* exg */
+
+    exg_mode = insn & 0x1f8;
+    if (exg_mode == 0x140) {
+        /* exchange Dx and Dy */
+        src = DREG(insn, 9);
+        reg = DREG(insn, 0);
+        tcg_gen_mov_i32(dest, src);
+        tcg_gen_mov_i32(src, reg);
+        tcg_gen_mov_i32(reg, dest);
+        return;
+    } else if (exg_mode == 0x148) {
+        /* exchange Ax and Ay */
+        src = AREG(insn, 9);
+        reg = AREG(insn, 0);
+        tcg_gen_mov_i32(dest, src);
+        tcg_gen_mov_i32(src, reg);
+        tcg_gen_mov_i32(reg, dest);
+        return;
+    } else if (exg_mode == 0x188) {
+        /* exchange Dx and Ay */
+        src = DREG(insn, 9);
+        reg = AREG(insn, 0);
+        tcg_gen_mov_i32(dest, src);
+        tcg_gen_mov_i32(src, reg);
+        tcg_gen_mov_i32(reg, dest);
+        return;
+    }
+    /* and */
     opsize = insn_opsize(insn, 6);
     reg = DREG(insn, 9);
-    dest = tcg_temp_new();
+
     if (insn & 0x100) {
         SRC_EA(env, src, opsize, -1, &addr);
         tcg_gen_and_i32(dest, src, reg);