qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3 6/6] tcg/mips: Support r6 SEL{NE, EQ}Z instea


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH v3 6/6] tcg/mips: Support r6 SEL{NE, EQ}Z instead of MOVN/MOVZ
Date: Wed, 7 Oct 2015 20:46:30 +1100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0

On 10/02/2015 10:24 PM, James Hogan wrote:
Extend MIPS movcond implementation to support the SELNEZ/SELEQZ
instructions introduced in MIPS r6 (where MOVN/MOVZ have been removed).

Whereas the "MOVN/MOVZ rd, rs, rt" instructions have the following
semantics:
  rd = [!]rt ? rs : rd

The "SELNEZ/SELEQZ rd, rs, rt" instructions are slightly different:
  rd = [!]rt ? rs : 0

First we ensure that if one of the movcond input values is zero that it
comes last (we can swap the input arguments if we invert the condition).
This is so that it can exactly match one of the SELNEZ/SELEQZ
instructions and avoid the need to emit the other one.

Otherwise we emit the opposite instruction first into a temporary
register, and OR that into the result:
  SELNEZ/SELEQZ  TMP1, v2, c1
  SELEQZ/SELNEZ  ret, v1, c1
  OR             ret, ret, TMP1

Which does the following:
  ret = cond ? v1 : v2

Signed-off-by: James Hogan<address@hidden>
Cc: Richard Henderson<address@hidden>
Cc: Aurelien Jarno<address@hidden>

Reviewed-by: Richard Henderson <address@hidden>


     { INDEX_op_brcond_i32, { "rZ", "rZ" } },
+#if !use_mips32r6_instructions
     { INDEX_op_movcond_i32, { "r", "rZ", "rZ", "rZ", "0" } },
+#else
+    { INDEX_op_movcond_i32, { "r", "rZ", "rZ", "rZ", "rZ" } },
+#endif


The only thing I'd change is preferring positive tests to negative ones. So swap the order of these lines, and the sense of the #if.

Leon, do you want to take this as a mips maintainer, or shall I as tcg 
maintainer?


r~



reply via email to

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