qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 25/26] target/s390x: implement TRANSLATE ONE/TWO


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH 25/26] target/s390x: implement TRANSLATE ONE/TWO TO ONE/TWO
Date: Tue, 30 May 2017 12:42:27 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0

On 05/30/2017 12:25 PM, Aurelien Jarno wrote:
On 2017-05-30 09:45, Richard Henderson wrote:
On 05/29/2017 04:17 AM, Aurelien Jarno wrote:
On 2017-05-26 10:10, Richard Henderson wrote:
On 05/25/2017 02:05 PM, Aurelien Jarno wrote:
+uint32_t HELPER(trXX)(CPUS390XState *env, uint32_t r1, uint32_t r2,
+                      uint32_t sizes)
+{
+    uintptr_t ra = GETPC();
+    int dsize = (sizes & 1) ? 1 : 2;
+    int ssize = (sizes & 2) ? 1 : 2;
+    uint16_t tst = env->regs[0] & ((1 << (8 * dsize)) - 1);

I think you should pass in tst as an argument.  That way you can pass in an
out-of-band value when we implement ETF2 and test field M3 bit 3.

I don't mind passing r0 as an argument. That said if we want to pass tst
or bundle the M3 field, it means we need to use TCG instructions to do
so. I am not sure it brings a lot compare to doing so in the helper
side.

Not at all -- the M3 bit test would be a translation-time check.

I still don't really see the point. On the TCG side it means we need
something like that:

     if (m3 & 1) {
        tcg_gen_movi_tl(r0, -1);
     } else if (dsize == 1) {
        tcg_gen_ext8u(r0, regs[0]);
     } else if (dsize == 2)
        tcg_gen_ext16u(r0, regs[0]);
     }

Yes, exactly.

On the helper side we then need to check if the value passed equals -1
or not to get m3 instead of directly accessing the value in register 0.

How's that? Why would you need to check for -1 at all? The existing helper test works fine, with -1 not matching any value loaded.


r~



reply via email to

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