target/i386: Move rex_w into DisasContext
Treat this flag exactly like we treat the other rex bits. The -1 initialization is unused; the two tests are > 0 and == 1, so the value can be reduced to a bool. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20210514151342.384376-19-richard.henderson@linaro.org>
This commit is contained in:
		
							parent
							
								
									bbdb4237c5
								
							
						
					
					
						commit
						8ab1e4860b
					
				@ -95,6 +95,7 @@ typedef struct DisasContext {
 | 
			
		||||
    uint8_t rex_r;
 | 
			
		||||
    uint8_t rex_x;
 | 
			
		||||
    uint8_t rex_b;
 | 
			
		||||
    bool rex_w;
 | 
			
		||||
#endif
 | 
			
		||||
    int vex_l;  /* vex vector length */
 | 
			
		||||
    int vex_v;  /* vex vvvv register, without 1's complement.  */
 | 
			
		||||
@ -167,11 +168,13 @@ typedef struct DisasContext {
 | 
			
		||||
 | 
			
		||||
#ifdef TARGET_X86_64
 | 
			
		||||
#define REX_PREFIX(S)  (((S)->prefix & PREFIX_REX) != 0)
 | 
			
		||||
#define REX_W(S)       ((S)->rex_w)
 | 
			
		||||
#define REX_R(S)       ((S)->rex_r + 0)
 | 
			
		||||
#define REX_X(S)       ((S)->rex_x + 0)
 | 
			
		||||
#define REX_B(S)       ((S)->rex_b + 0)
 | 
			
		||||
#else
 | 
			
		||||
#define REX_PREFIX(S)  false
 | 
			
		||||
#define REX_W(S)       false
 | 
			
		||||
#define REX_R(S)       0
 | 
			
		||||
#define REX_X(S)       0
 | 
			
		||||
#define REX_B(S)       0
 | 
			
		||||
@ -4552,12 +4555,12 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
 | 
			
		||||
    MemOp ot, aflag, dflag;
 | 
			
		||||
    int modrm, reg, rm, mod, op, opreg, val;
 | 
			
		||||
    target_ulong next_eip, tval;
 | 
			
		||||
    int rex_w;
 | 
			
		||||
    target_ulong pc_start = s->base.pc_next;
 | 
			
		||||
 | 
			
		||||
    s->pc_start = s->pc = pc_start;
 | 
			
		||||
    s->override = -1;
 | 
			
		||||
#ifdef TARGET_X86_64
 | 
			
		||||
    s->rex_w = false;
 | 
			
		||||
    s->rex_r = 0;
 | 
			
		||||
    s->rex_x = 0;
 | 
			
		||||
    s->rex_b = 0;
 | 
			
		||||
@ -4571,7 +4574,6 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    prefixes = 0;
 | 
			
		||||
    rex_w = -1;
 | 
			
		||||
 | 
			
		||||
 next_byte:
 | 
			
		||||
    b = x86_ldub_code(env, s);
 | 
			
		||||
@ -4615,7 +4617,7 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
 | 
			
		||||
        if (CODE64(s)) {
 | 
			
		||||
            /* REX prefix */
 | 
			
		||||
            prefixes |= PREFIX_REX;
 | 
			
		||||
            rex_w = (b >> 3) & 1;
 | 
			
		||||
            s->rex_w = (b >> 3) & 1;
 | 
			
		||||
            s->rex_r = (b & 0x4) << 1;
 | 
			
		||||
            s->rex_x = (b & 0x2) << 2;
 | 
			
		||||
            s->rex_b = (b & 0x1) << 3;
 | 
			
		||||
@ -4654,12 +4656,12 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
 | 
			
		||||
                b = x86_ldub_code(env, s) | 0x100;
 | 
			
		||||
            } else {
 | 
			
		||||
                /* 3-byte VEX prefix: RXBmmmmm wVVVVlpp */
 | 
			
		||||
                vex3 = x86_ldub_code(env, s);
 | 
			
		||||
#ifdef TARGET_X86_64
 | 
			
		||||
                s->rex_x = (~vex2 >> 3) & 8;
 | 
			
		||||
                s->rex_b = (~vex2 >> 2) & 8;
 | 
			
		||||
                s->rex_w = (vex3 >> 7) & 1;
 | 
			
		||||
#endif
 | 
			
		||||
                vex3 = x86_ldub_code(env, s);
 | 
			
		||||
                rex_w = (vex3 >> 7) & 1;
 | 
			
		||||
                switch (vex2 & 0x1f) {
 | 
			
		||||
                case 0x01: /* Implied 0f leading opcode bytes.  */
 | 
			
		||||
                    b = x86_ldub_code(env, s) | 0x100;
 | 
			
		||||
@ -4686,7 +4688,7 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
 | 
			
		||||
        /* In 64-bit mode, the default data size is 32-bit.  Select 64-bit
 | 
			
		||||
           data with rex_w, and 16-bit data with 0x66; rex_w takes precedence
 | 
			
		||||
           over 0x66 if both are present.  */
 | 
			
		||||
        dflag = (rex_w > 0 ? MO_64 : prefixes & PREFIX_DATA ? MO_16 : MO_32);
 | 
			
		||||
        dflag = (REX_W(s) ? MO_64 : prefixes & PREFIX_DATA ? MO_16 : MO_32);
 | 
			
		||||
        /* In 64-bit mode, 0x67 selects 32-bit addressing.  */
 | 
			
		||||
        aflag = (prefixes & PREFIX_ADR ? MO_32 : MO_64);
 | 
			
		||||
    } else {
 | 
			
		||||
@ -5082,7 +5084,7 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
 | 
			
		||||
                /* operand size for jumps is 64 bit */
 | 
			
		||||
                ot = MO_64;
 | 
			
		||||
            } else if (op == 3 || op == 5) {
 | 
			
		||||
                ot = dflag != MO_16 ? MO_32 + (rex_w == 1) : MO_16;
 | 
			
		||||
                ot = dflag != MO_16 ? MO_32 + REX_W(s) : MO_16;
 | 
			
		||||
            } else if (op == 6) {
 | 
			
		||||
                /* default push size is 64 bit */
 | 
			
		||||
                ot = mo_pushpop(s, dflag);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user