Revision 1b9d9ebb target-i386/translate.c

b/target-i386/translate.c
4333 4333
        mod = (modrm >> 6) & 3;
4334 4334
        if ((mod == 3) || ((modrm & 0x38) != 0x8))
4335 4335
            goto illegal_op;
4336
        gen_jmp_im(pc_start - s->cs_base);
4337
        if (s->cc_op != CC_OP_DYNAMIC)
4338
            gen_op_set_cc_op(s->cc_op);
4339
        gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
4340
        tcg_gen_helper_0_1(helper_cmpxchg8b, cpu_A0);
4336
#ifdef TARGET_X86_64
4337
        if (dflag == 2) {
4338
            if (!(s->cpuid_ext_features & CPUID_EXT_CX16))
4339
                goto illegal_op;
4340
            gen_jmp_im(pc_start - s->cs_base);
4341
            if (s->cc_op != CC_OP_DYNAMIC)
4342
                gen_op_set_cc_op(s->cc_op);
4343
            gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
4344
            tcg_gen_helper_0_1(helper_cmpxchg16b, cpu_A0);
4345
        } else
4346
#endif        
4347
        {
4348
            if (!(s->cpuid_features & CPUID_CX8))
4349
                goto illegal_op;
4350
            gen_jmp_im(pc_start - s->cs_base);
4351
            if (s->cc_op != CC_OP_DYNAMIC)
4352
                gen_op_set_cc_op(s->cc_op);
4353
            gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
4354
            tcg_gen_helper_0_1(helper_cmpxchg8b, cpu_A0);
4355
        }
4341 4356
        s->cc_op = CC_OP_EFLAGS;
4342 4357
        break;
4343 4358

  

Also available in: Unified diff