diff --git a/qemu/target/i386/unicorn.c b/qemu/target/i386/unicorn.c
index a3638ea9..9e6be590 100644
--- a/qemu/target/i386/unicorn.c
+++ b/qemu/target/i386/unicorn.c
@@ -44,7 +44,9 @@ const int X86_REGS_STORAGE_SIZE = offsetof(CPUX86State, tlb_table);
 
 static void x86_set_pc(struct uc_struct *uc, uint64_t address)
 {
-    ((CPUX86State *)uc->current_cpu->env_ptr)->eip = address;
+    CPUX86State *state = uc->cpu->env_ptr;
+
+    state->eip = address;
 }
 
 void x86_release(void *ctx);
@@ -207,6 +209,7 @@ static int x86_msr_write(struct uc_struct *uc, uc_x86_msr *msr)
 int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count)
 {
     CPUState *mycpu = uc->cpu;
+    CPUX86State *state = &X86_CPU(uc, mycpu)->env;
     int i;
 
     for (i = 0; i < count; i++) {
@@ -224,20 +227,20 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
             case UC_X86_REG_FP6:
             case UC_X86_REG_FP7:
                 {
-                    floatx80 reg = X86_CPU(uc, mycpu)->env.fpregs[regid - UC_X86_REG_FP0].d;
+                    floatx80 reg = state->fpregs[regid - UC_X86_REG_FP0].d;
                     cpu_get_fp80(value, (uint16_t*)((char*)value+sizeof(uint64_t)), reg);
                 }
                 continue;
             case UC_X86_REG_FPSW:
                 {
-                    uint16_t fpus = X86_CPU(uc, mycpu)->env.fpus;
+                    uint16_t fpus = state->fpus;
                     fpus  = fpus & ~0x3800;
-                    fpus |= ( X86_CPU(uc, mycpu)->env.fpstt & 0x7 ) << 11;
+                    fpus |= (state->fpstt & 0x7) << 11;
                     *(uint16_t*) value = fpus;
                 }
                 continue;
             case UC_X86_REG_FPCW:
-                *(uint16_t*) value = X86_CPU(uc, mycpu)->env.fpuc;
+                *(uint16_t*) value = state->fpuc;
                 continue;
             case UC_X86_REG_FPTAG:
                 {
@@ -250,10 +253,10 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
                     fptag = 0;
                     for (i = 7; i >= 0; i--) {
                         fptag <<= 2;
-                        if (X86_CPU(uc, mycpu)->env.fptags[i]) {
+                        if (state->fptags[i]) {
                             fptag |= 3;
                         } else {
-                            tmp.d = X86_CPU(uc, mycpu)->env.fpregs[i].d;
+                            tmp.d = state->fpregs[i].d;
                             exp = EXPD(tmp);
                             mant = MANTD(tmp);
                             if (exp == 0 && mant == 0) {
@@ -279,7 +282,7 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
             case UC_X86_REG_XMM7:
                 {
                     float64 *dst = (float64*)value;
-                    ZMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0];
+                    ZMMReg *reg = &state->xmm_regs[regid - UC_X86_REG_XMM0];
                     dst[0] = reg->ZMM_D(0);
                     dst[1] = reg->ZMM_D(1);
                     continue;
@@ -294,7 +297,7 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
             case UC_X86_REG_YMM7:
                 {
                     float64 *dst = (float64*)value;
-                    ZMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0];
+                    ZMMReg *reg = &state->xmm_regs[regid - UC_X86_REG_XMM0];
                     dst[0] = reg->ZMM_D(0);
                     dst[1] = reg->ZMM_D(1);
                     dst[2] = reg->ZMM_D(2);
@@ -310,19 +313,19 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
                 switch(regid) {
                     default: break;
                     case UC_X86_REG_ES:
-                        *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_ES].selector;
+                        *(int16_t *)value = state->segs[R_ES].selector;
                         continue;
                     case UC_X86_REG_SS:
-                        *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_SS].selector;
+                        *(int16_t *)value = state->segs[R_SS].selector;
                         continue;
                     case UC_X86_REG_DS:
-                        *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_DS].selector;
+                        *(int16_t *)value = state->segs[R_DS].selector;
                         continue;
                     case UC_X86_REG_FS:
-                        *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_FS].selector;
+                        *(int16_t *)value = state->segs[R_FS].selector;
                         continue;
                     case UC_X86_REG_GS:
-                        *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_GS].selector;
+                        *(int16_t *)value = state->segs[R_GS].selector;
                         continue;
                 }
                 // fall-thru
@@ -335,7 +338,7 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
                     case UC_X86_REG_CR2:
                     case UC_X86_REG_CR3:
                     case UC_X86_REG_CR4:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0];
+                        *(int32_t *)value = state->cr[regid - UC_X86_REG_CR0];
                         break;
                     case UC_X86_REG_DR0:
                     case UC_X86_REG_DR1:
@@ -345,126 +348,126 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
                     case UC_X86_REG_DR5:
                     case UC_X86_REG_DR6:
                     case UC_X86_REG_DR7:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0];
+                        *(int32_t *)value = state->dr[regid - UC_X86_REG_DR0];
                         break;
                     case UC_X86_REG_EFLAGS:
-                        *(int32_t *)value = cpu_compute_eflags(&X86_CPU(uc, mycpu)->env);
+                        *(int32_t *)value = cpu_compute_eflags(state);
                         break;
                     case UC_X86_REG_EAX:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EAX];
+                        *(int32_t *)value = state->regs[R_EAX];
                         break;
                     case UC_X86_REG_AX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EAX]);
                         break;
                     case UC_X86_REG_AH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_EAX]);
                         break;
                     case UC_X86_REG_AL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EAX]);
                         break;
                     case UC_X86_REG_EBX:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBX];
+                        *(int32_t *)value = state->regs[R_EBX];
                         break;
                     case UC_X86_REG_BX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EBX]);
                         break;
                     case UC_X86_REG_BH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_EBX]);
                         break;
                     case UC_X86_REG_BL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EBX]);
                         break;
                     case UC_X86_REG_ECX:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ECX];
+                        *(int32_t *)value = state->regs[R_ECX];
                         break;
                     case UC_X86_REG_CX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_ECX]);
                         break;
                     case UC_X86_REG_CH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_ECX]);
                         break;
                     case UC_X86_REG_CL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_ECX]);
                         break;
                     case UC_X86_REG_EDX:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDX];
+                        *(int32_t *)value = state->regs[R_EDX];
                         break;
                     case UC_X86_REG_DX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EDX]);
                         break;
                     case UC_X86_REG_DH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_EDX]);
                         break;
                     case UC_X86_REG_DL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EDX]);
                         break;
                     case UC_X86_REG_ESP:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESP];
+                        *(int32_t *)value = state->regs[R_ESP];
                         break;
                     case UC_X86_REG_SP:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_ESP]);
                         break;
                     case UC_X86_REG_EBP:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBP];
+                        *(int32_t *)value = state->regs[R_EBP];
                         break;
                     case UC_X86_REG_BP:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EBP]);
                         break;
                     case UC_X86_REG_ESI:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESI];
+                        *(int32_t *)value = state->regs[R_ESI];
                         break;
                     case UC_X86_REG_SI:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_ESI]);
                         break;
                     case UC_X86_REG_EDI:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDI];
+                        *(int32_t *)value = state->regs[R_EDI];
                         break;
                     case UC_X86_REG_DI:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EDI]);
                         break;
                     case UC_X86_REG_EIP:
-                        *(int32_t *)value = X86_CPU(uc, mycpu)->env.eip;
+                        *(int32_t *)value = state->eip;
                         break;
                     case UC_X86_REG_IP:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.eip);
+                        *(int16_t *)value = READ_WORD(state->eip);
                         break;
                     case UC_X86_REG_CS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_CS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_CS].selector;
                         break;
                     case UC_X86_REG_DS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_DS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_DS].selector;
                         break;
                     case UC_X86_REG_SS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_SS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_SS].selector;
                         break;
                     case UC_X86_REG_ES:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_ES].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_ES].selector;
                         break;
                     case UC_X86_REG_FS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_FS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_FS].selector;
                         break;
                     case UC_X86_REG_GS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_GS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_GS].selector;
                         break;
                     case UC_X86_REG_IDTR:
-                        ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.idt.limit;
-                        ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.idt.base;
+                        ((uc_x86_mmr *)value)->limit = (uint16_t)state->idt.limit;
+                        ((uc_x86_mmr *)value)->base = (uint32_t)state->idt.base;
                         break;
                     case UC_X86_REG_GDTR:
-                        ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.gdt.limit;
-                        ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.gdt.base;
+                        ((uc_x86_mmr *)value)->limit = (uint16_t)state->gdt.limit;
+                        ((uc_x86_mmr *)value)->base = (uint32_t)state->gdt.base;
                         break;
                     case UC_X86_REG_LDTR:
-                        ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.ldt.limit;
-                        ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.ldt.base;
-                        ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.ldt.selector;
-                        ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.ldt.flags;
+                        ((uc_x86_mmr *)value)->limit = state->ldt.limit;
+                        ((uc_x86_mmr *)value)->base = (uint32_t)state->ldt.base;
+                        ((uc_x86_mmr *)value)->selector = (uint16_t)state->ldt.selector;
+                        ((uc_x86_mmr *)value)->flags = state->ldt.flags;
                         break;
                     case UC_X86_REG_TR:
-                        ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.tr.limit;
-                        ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.tr.base;
-                        ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.tr.selector;
-                        ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.tr.flags;
+                        ((uc_x86_mmr *)value)->limit = state->tr.limit;
+                        ((uc_x86_mmr *)value)->base = (uint32_t)state->tr.base;
+                        ((uc_x86_mmr *)value)->selector = (uint16_t)state->tr.selector;
+                        ((uc_x86_mmr *)value)->flags = state->tr.flags;
                         break;
                     case UC_X86_REG_MSR:
                         x86_msr_read(uc, (uc_x86_msr *)value);
@@ -482,7 +485,7 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
                     case UC_X86_REG_CR2:
                     case UC_X86_REG_CR3:
                     case UC_X86_REG_CR4:
-                        *(int64_t *)value = X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0];
+                        *(int64_t *)value = state->cr[regid - UC_X86_REG_CR0];
                         break;
                     case UC_X86_REG_DR0:
                     case UC_X86_REG_DR1:
@@ -492,261 +495,261 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
                     case UC_X86_REG_DR5:
                     case UC_X86_REG_DR6:
                     case UC_X86_REG_DR7:
-                        *(int64_t *)value = X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0];
+                        *(int64_t *)value = state->dr[regid - UC_X86_REG_DR0];
                         break;
                     case UC_X86_REG_EFLAGS:
-                        *(int64_t *)value = cpu_compute_eflags(&X86_CPU(uc, mycpu)->env);
+                        *(int64_t *)value = cpu_compute_eflags(state);
                         break;
                     case UC_X86_REG_RAX:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EAX];
+                        *(uint64_t *)value = state->regs[R_EAX];
                         break;
                     case UC_X86_REG_EAX:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EAX]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_EAX]);
                         break;
                     case UC_X86_REG_AX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EAX]);
                         break;
                     case UC_X86_REG_AH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_EAX]);
                         break;
                     case UC_X86_REG_AL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EAX]);
                         break;
                     case UC_X86_REG_RBX:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBX];
+                        *(uint64_t *)value = state->regs[R_EBX];
                         break;
                     case UC_X86_REG_EBX:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBX]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_EBX]);
                         break;
                     case UC_X86_REG_BX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EBX]);
                         break;
                     case UC_X86_REG_BH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_EBX]);
                         break;
                     case UC_X86_REG_BL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EBX]);
                         break;
                     case UC_X86_REG_RCX:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ECX];
+                        *(uint64_t *)value = state->regs[R_ECX];
                         break;
                     case UC_X86_REG_ECX:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ECX]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_ECX]);
                         break;
                     case UC_X86_REG_CX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_ECX]);
                         break;
                     case UC_X86_REG_CH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_ECX]);
                         break;
                     case UC_X86_REG_CL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_ECX]);
                         break;
                     case UC_X86_REG_RDX:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDX];
+                        *(uint64_t *)value = state->regs[R_EDX];
                         break;
                     case UC_X86_REG_EDX:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDX]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_EDX]);
                         break;
                     case UC_X86_REG_DX:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EDX]);
                         break;
                     case UC_X86_REG_DH:
-                        *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX]);
+                        *(int8_t *)value = READ_BYTE_H(state->regs[R_EDX]);
                         break;
                     case UC_X86_REG_DL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EDX]);
                         break;
                     case UC_X86_REG_RSP:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESP];
+                        *(uint64_t *)value = state->regs[R_ESP];
                         break;
                     case UC_X86_REG_ESP:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESP]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_ESP]);
                         break;
                     case UC_X86_REG_SP:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_ESP]);
                         break;
                     case UC_X86_REG_SPL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESP]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_ESP]);
                         break;
                     case UC_X86_REG_RBP:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBP];
+                        *(uint64_t *)value = state->regs[R_EBP];
                         break;
                     case UC_X86_REG_EBP:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBP]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_EBP]);
                         break;
                     case UC_X86_REG_BP:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EBP]);
                         break;
                     case UC_X86_REG_BPL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBP]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EBP]);
                         break;
                     case UC_X86_REG_RSI:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESI];
+                        *(uint64_t *)value = state->regs[R_ESI];
                         break;
                     case UC_X86_REG_ESI:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESI]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_ESI]);
                         break;
                     case UC_X86_REG_SI:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_ESI]);
                         break;
                     case UC_X86_REG_SIL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESI]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_ESI]);
                         break;
                     case UC_X86_REG_RDI:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDI];
+                        *(uint64_t *)value = state->regs[R_EDI];
                         break;
                     case UC_X86_REG_EDI:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDI]);
+                        *(int32_t *)value = READ_DWORD(state->regs[R_EDI]);
                         break;
                     case UC_X86_REG_DI:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI]);
+                        *(int16_t *)value = READ_WORD(state->regs[R_EDI]);
                         break;
                     case UC_X86_REG_DIL:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDI]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[R_EDI]);
                         break;
                     case UC_X86_REG_RIP:
-                        *(uint64_t *)value = X86_CPU(uc, mycpu)->env.eip;
+                        *(uint64_t *)value = state->eip;
                         break;
                     case UC_X86_REG_EIP:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.eip);
+                        *(int32_t *)value = READ_DWORD(state->eip);
                         break;
                     case UC_X86_REG_IP:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.eip);
+                        *(int16_t *)value = READ_WORD(state->eip);
                         break;
                     case UC_X86_REG_CS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_CS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_CS].selector;
                         break;
                     case UC_X86_REG_DS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_DS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_DS].selector;
                         break;
                     case UC_X86_REG_SS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_SS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_SS].selector;
                         break;
                     case UC_X86_REG_ES:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_ES].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_ES].selector;
                         break;
                     case UC_X86_REG_FS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_FS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_FS].selector;
                         break;
                     case UC_X86_REG_GS:
-                        *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_GS].selector;
+                        *(int16_t *)value = (uint16_t)state->segs[R_GS].selector;
                         break;
                     case UC_X86_REG_R8:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[8]);
+                        *(int64_t *)value = READ_QWORD(state->regs[8]);
                         break;
                     case UC_X86_REG_R8D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[8]);
+                        *(int32_t *)value = READ_DWORD(state->regs[8]);
                         break;
                     case UC_X86_REG_R8W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[8]);
+                        *(int16_t *)value = READ_WORD(state->regs[8]);
                         break;
                     case UC_X86_REG_R8B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[8]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[8]);
                         break;
                     case UC_X86_REG_R9:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[9]);
+                        *(int64_t *)value = READ_QWORD(state->regs[9]);
                         break;
                     case UC_X86_REG_R9D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[9]);
+                        *(int32_t *)value = READ_DWORD(state->regs[9]);
                         break;
                     case UC_X86_REG_R9W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[9]);
+                        *(int16_t *)value = READ_WORD(state->regs[9]);
                         break;
                     case UC_X86_REG_R9B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[9]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[9]);
                         break;
                     case UC_X86_REG_R10:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[10]);
+                        *(int64_t *)value = READ_QWORD(state->regs[10]);
                         break;
                     case UC_X86_REG_R10D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[10]);
+                        *(int32_t *)value = READ_DWORD(state->regs[10]);
                         break;
                     case UC_X86_REG_R10W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[10]);
+                        *(int16_t *)value = READ_WORD(state->regs[10]);
                         break;
                     case UC_X86_REG_R10B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[10]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[10]);
                         break;
                     case UC_X86_REG_R11:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[11]);
+                        *(int64_t *)value = READ_QWORD(state->regs[11]);
                         break;
                     case UC_X86_REG_R11D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[11]);
+                        *(int32_t *)value = READ_DWORD(state->regs[11]);
                         break;
                     case UC_X86_REG_R11W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[11]);
+                        *(int16_t *)value = READ_WORD(state->regs[11]);
                         break;
                     case UC_X86_REG_R11B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[11]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[11]);
                         break;
                     case UC_X86_REG_R12:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[12]);
+                        *(int64_t *)value = READ_QWORD(state->regs[12]);
                         break;
                     case UC_X86_REG_R12D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[12]);
+                        *(int32_t *)value = READ_DWORD(state->regs[12]);
                         break;
                     case UC_X86_REG_R12W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[12]);
+                        *(int16_t *)value = READ_WORD(state->regs[12]);
                         break;
                     case UC_X86_REG_R12B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[12]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[12]);
                         break;
                     case UC_X86_REG_R13:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[13]);
+                        *(int64_t *)value = READ_QWORD(state->regs[13]);
                         break;
                     case UC_X86_REG_R13D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[13]);
+                        *(int32_t *)value = READ_DWORD(state->regs[13]);
                         break;
                     case UC_X86_REG_R13W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[13]);
+                        *(int16_t *)value = READ_WORD(state->regs[13]);
                         break;
                     case UC_X86_REG_R13B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[13]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[13]);
                         break;
                     case UC_X86_REG_R14:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[14]);
+                        *(int64_t *)value = READ_QWORD(state->regs[14]);
                         break;
                     case UC_X86_REG_R14D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[14]);
+                        *(int32_t *)value = READ_DWORD(state->regs[14]);
                         break;
                     case UC_X86_REG_R14W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[14]);
+                        *(int16_t *)value = READ_WORD(state->regs[14]);
                         break;
                     case UC_X86_REG_R14B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[14]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[14]);
                         break;
                     case UC_X86_REG_R15:
-                        *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[15]);
+                        *(int64_t *)value = READ_QWORD(state->regs[15]);
                         break;
                     case UC_X86_REG_R15D:
-                        *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[15]);
+                        *(int32_t *)value = READ_DWORD(state->regs[15]);
                         break;
                     case UC_X86_REG_R15W:
-                        *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[15]);
+                        *(int16_t *)value = READ_WORD(state->regs[15]);
                         break;
                     case UC_X86_REG_R15B:
-                        *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[15]);
+                        *(int8_t *)value = READ_BYTE_L(state->regs[15]);
                         break;
                     case UC_X86_REG_IDTR:
-                        ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.idt.limit;
-                        ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.idt.base;
+                        ((uc_x86_mmr *)value)->limit = (uint16_t)state->idt.limit;
+                        ((uc_x86_mmr *)value)->base = state->idt.base;
                         break;
                     case UC_X86_REG_GDTR:
-                        ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.gdt.limit;
-                        ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.gdt.base;
+                        ((uc_x86_mmr *)value)->limit = (uint16_t)state->gdt.limit;
+                        ((uc_x86_mmr *)value)->base = state->gdt.base;
                         break;
                     case UC_X86_REG_LDTR:
-                        ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.ldt.limit;
-                        ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.ldt.base;
-                        ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.ldt.selector;
-                        ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.ldt.flags;
+                        ((uc_x86_mmr *)value)->limit = state->ldt.limit;
+                        ((uc_x86_mmr *)value)->base = state->ldt.base;
+                        ((uc_x86_mmr *)value)->selector = (uint16_t)state->ldt.selector;
+                        ((uc_x86_mmr *)value)->flags = state->ldt.flags;
                         break;
                     case UC_X86_REG_TR:
-                        ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.tr.limit;
-                        ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.tr.base;
-                        ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.tr.selector;
-                        ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.tr.flags;
+                        ((uc_x86_mmr *)value)->limit = state->tr.limit;
+                        ((uc_x86_mmr *)value)->base = state->tr.base;
+                        ((uc_x86_mmr *)value)->selector = (uint16_t)state->tr.selector;
+                        ((uc_x86_mmr *)value)->flags = state->tr.flags;
                         break;
                     case UC_X86_REG_MSR:
                         x86_msr_read(uc, (uc_x86_msr *)value);
@@ -763,6 +766,7 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
 int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count)
 {
     CPUState *mycpu = uc->cpu;
+    CPUX86State *state = &X86_CPU(uc, mycpu)->env;
     int i;
 
     for (i = 0; i < count; i++) {
@@ -782,25 +786,25 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
                 {
                     uint64_t mant = *(uint64_t*) value;
                     uint16_t upper = *(uint16_t*) ((char*)value + sizeof(uint64_t));
-                    X86_CPU(uc, mycpu)->env.fpregs[regid - UC_X86_REG_FP0].d = cpu_set_fp80(mant, upper);
+                    state->fpregs[regid - UC_X86_REG_FP0].d = cpu_set_fp80(mant, upper);
                 }
                 continue;
             case UC_X86_REG_FPSW:
                 {
                     uint16_t fpus = *(uint16_t*) value;
-                    X86_CPU(uc, mycpu)->env.fpus = fpus & ~0x3800;
-                    X86_CPU(uc, mycpu)->env.fpstt = (fpus >> 11) & 0x7;
+                    state->fpus = fpus & ~0x3800;
+                    state->fpstt = (fpus >> 11) & 0x7;
                 }
                 continue;
             case UC_X86_REG_FPCW:
-                X86_CPU(uc, mycpu)->env.fpuc = *(uint16_t *)value;
+                state->fpuc = *(uint16_t *)value;
                 continue;
             case UC_X86_REG_FPTAG:
                 {
                     int i;
                     uint16_t fptag = *(uint16_t*) value;
                     for (i = 0; i < 8; i++) {
-                        X86_CPU(uc, mycpu)->env.fptags[i] = ((fptag & 3) == 3);
+                        state->fptags[i] = ((fptag & 3) == 3);
                         fptag >>= 2;
                     }
 
@@ -817,7 +821,7 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
             case UC_X86_REG_XMM7:
                 {
                     float64 *src = (float64*)value;
-                    ZMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0];
+                    ZMMReg *reg = &state->xmm_regs[regid - UC_X86_REG_XMM0];
                     reg->ZMM_D(0) = src[0];
                     reg->ZMM_D(1) = src[1];
                     continue;
@@ -832,7 +836,7 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
             case UC_X86_REG_YMM7:
                 {
                     float64 *src = (float64*)value;
-                    ZMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0];
+                    ZMMReg *reg = &state->xmm_regs[regid - UC_X86_REG_XMM0];
                     reg->ZMM_D(4) = src[0];
                     reg->ZMM_D(5) = src[1];
                     reg->ZMM_D(6) = src[2];
@@ -849,19 +853,19 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
                 switch(regid) {
                     default: break;
                     case UC_X86_REG_ES:
-                        load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_ES, *(uint16_t *)value);
+                        load_seg_16_helper(state, R_ES, *(uint16_t *)value);
                         continue;
                     case UC_X86_REG_SS:
-                        load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_SS, *(uint16_t *)value);
+                        load_seg_16_helper(state, R_SS, *(uint16_t *)value);
                         continue;
                     case UC_X86_REG_DS:
-                        load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_DS, *(uint16_t *)value);
+                        load_seg_16_helper(state, R_DS, *(uint16_t *)value);
                         continue;
                     case UC_X86_REG_FS:
-                        load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value);
+                        load_seg_16_helper(state, R_FS, *(uint16_t *)value);
                         continue;
                     case UC_X86_REG_GS:
-                        load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value);
+                        load_seg_16_helper(state, R_GS, *(uint16_t *)value);
                         continue;
                 }
                 // fall-thru
@@ -874,7 +878,7 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
                     case UC_X86_REG_CR2:
                     case UC_X86_REG_CR3:
                     case UC_X86_REG_CR4:
-                        X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0] = *(uint32_t *)value;
+                        state->cr[regid - UC_X86_REG_CR0] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_DR0:
                     case UC_X86_REG_DR1:
@@ -884,133 +888,133 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
                     case UC_X86_REG_DR5:
                     case UC_X86_REG_DR6:
                     case UC_X86_REG_DR7:
-                        X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0] = *(uint32_t *)value;
+                        state->dr[regid - UC_X86_REG_DR0] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_EFLAGS:
-                        cpu_load_eflags(&X86_CPU(uc, mycpu)->env, *(uint32_t *)value, -1);
-                        X86_CPU(uc, mycpu)->env.eflags0 = *(uint32_t *)value;
+                        cpu_load_eflags(state, *(uint32_t *)value, -1);
+                        state->eflags0 = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_EAX:
-                        X86_CPU(uc, mycpu)->env.regs[R_EAX] = *(uint32_t *)value;
+                        state->regs[R_EAX] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_AX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EAX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_AH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_EAX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_AL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EAX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_EBX:
-                        X86_CPU(uc, mycpu)->env.regs[R_EBX] = *(uint32_t *)value;
+                        state->regs[R_EBX] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_BX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EBX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_BH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_EBX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_BL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EBX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_ECX:
-                        X86_CPU(uc, mycpu)->env.regs[R_ECX] = *(uint32_t *)value;
+                        state->regs[R_ECX] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_CX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_ECX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_CH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_ECX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_CL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_ECX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_EDX:
-                        X86_CPU(uc, mycpu)->env.regs[R_EDX] = *(uint32_t *)value;
+                        state->regs[R_EDX] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_DX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EDX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_DH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_EDX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_DL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EDX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_ESP:
-                        X86_CPU(uc, mycpu)->env.regs[R_ESP] = *(uint32_t *)value;
+                        state->regs[R_ESP] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_SP:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_ESP], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_EBP:
-                        X86_CPU(uc, mycpu)->env.regs[R_EBP] = *(uint32_t *)value;
+                        state->regs[R_EBP] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_BP:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EBP], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_ESI:
-                        X86_CPU(uc, mycpu)->env.regs[R_ESI] = *(uint32_t *)value;
+                        state->regs[R_ESI] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_SI:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_ESI], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_EDI:
-                        X86_CPU(uc, mycpu)->env.regs[R_EDI] = *(uint32_t *)value;
+                        state->regs[R_EDI] = *(uint32_t *)value;
                         break;
                     case UC_X86_REG_DI:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EDI], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_EIP:
-                        X86_CPU(uc, mycpu)->env.eip = *(uint32_t *)value;
+                        state->eip = *(uint32_t *)value;
                         // force to quit execution and flush TB
                         uc->quit_request = true;
                         uc_emu_stop(uc);
                         break;
                     case UC_X86_REG_IP:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.eip, *(uint16_t *)value);
+                        WRITE_WORD(state->eip, *(uint16_t *)value);
                         // force to quit execution and flush TB
                         uc->quit_request = true;
                         uc_emu_stop(uc);
                         break;
                     case UC_X86_REG_CS:
-                        cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_CS, *(uint16_t *)value);
+                        cpu_x86_load_seg(state, R_CS, *(uint16_t *)value);
                         break;
                     case UC_X86_REG_DS:
-                        cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_DS, *(uint16_t *)value);
+                        cpu_x86_load_seg(state, R_DS, *(uint16_t *)value);
                         break;
                     case UC_X86_REG_SS:
-                        cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_SS, *(uint16_t *)value);
+                        cpu_x86_load_seg(state, R_SS, *(uint16_t *)value);
                         break;
                     case UC_X86_REG_ES:
-                        cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_ES, *(uint16_t *)value);
+                        cpu_x86_load_seg(state, R_ES, *(uint16_t *)value);
                         break;
                     case UC_X86_REG_FS:
-                        cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value);
+                        cpu_x86_load_seg(state, R_FS, *(uint16_t *)value);
                         break;
                     case UC_X86_REG_GS:
-                        cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value);
+                        cpu_x86_load_seg(state, R_GS, *(uint16_t *)value);
                         break;
                     case UC_X86_REG_IDTR:
-                        X86_CPU(uc, mycpu)->env.idt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.idt.base = (uint32_t)((uc_x86_mmr *)value)->base;
+                        state->idt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
+                        state->idt.base = (uint32_t)((uc_x86_mmr *)value)->base;
                         break;
                     case UC_X86_REG_GDTR:
-                        X86_CPU(uc, mycpu)->env.gdt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.gdt.base = (uint32_t)((uc_x86_mmr *)value)->base;
+                        state->gdt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
+                        state->gdt.base = (uint32_t)((uc_x86_mmr *)value)->base;
                         break;
                     case UC_X86_REG_LDTR:
-                        X86_CPU(uc, mycpu)->env.ldt.limit = ((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.ldt.base = (uint32_t)((uc_x86_mmr *)value)->base;
-                        X86_CPU(uc, mycpu)->env.ldt.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
-                        X86_CPU(uc, mycpu)->env.ldt.flags = ((uc_x86_mmr *)value)->flags;
+                        state->ldt.limit = ((uc_x86_mmr *)value)->limit;
+                        state->ldt.base = (uint32_t)((uc_x86_mmr *)value)->base;
+                        state->ldt.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
+                        state->ldt.flags = ((uc_x86_mmr *)value)->flags;
                         break;
                     case UC_X86_REG_TR:
-                        X86_CPU(uc, mycpu)->env.tr.limit = ((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.tr.base = (uint32_t)((uc_x86_mmr *)value)->base;
-                        X86_CPU(uc, mycpu)->env.tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
-                        X86_CPU(uc, mycpu)->env.tr.flags = ((uc_x86_mmr *)value)->flags;
+                        state->tr.limit = ((uc_x86_mmr *)value)->limit;
+                        state->tr.base = (uint32_t)((uc_x86_mmr *)value)->base;
+                        state->tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
+                        state->tr.flags = ((uc_x86_mmr *)value)->flags;
                         break;
                     case UC_X86_REG_MSR:
                         x86_msr_write(uc, (uc_x86_msr *)value);
@@ -1028,7 +1032,7 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
                     case UC_X86_REG_CR2:
                     case UC_X86_REG_CR3:
                     case UC_X86_REG_CR4:
-                        X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0] = *(uint64_t *)value;
+                        state->cr[regid - UC_X86_REG_CR0] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_DR0:
                     case UC_X86_REG_DR1:
@@ -1038,271 +1042,271 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
                     case UC_X86_REG_DR5:
                     case UC_X86_REG_DR6:
                     case UC_X86_REG_DR7:
-                        X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0] = *(uint64_t *)value;
+                        state->dr[regid - UC_X86_REG_DR0] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_EFLAGS:
-                        cpu_load_eflags(&X86_CPU(uc, mycpu)->env, *(uint64_t *)value, -1);
-                        X86_CPU(uc, mycpu)->env.eflags0 = *(uint64_t *)value;
+                        cpu_load_eflags(state, *(uint64_t *)value, -1);
+                        state->eflags0 = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_RAX:
-                        X86_CPU(uc, mycpu)->env.regs[R_EAX] = *(uint64_t *)value;
+                        state->regs[R_EAX] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_EAX:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_EAX], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_AX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EAX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_AH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_EAX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_AL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EAX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RBX:
-                        X86_CPU(uc, mycpu)->env.regs[R_EBX] = *(uint64_t *)value;
+                        state->regs[R_EBX] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_EBX:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_EBX], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_BX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EBX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_BH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_EBX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_BL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EBX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RCX:
-                        X86_CPU(uc, mycpu)->env.regs[R_ECX] = *(uint64_t *)value;
+                        state->regs[R_ECX] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_ECX:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_ECX], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_CX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_ECX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_CH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_ECX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_CL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_ECX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RDX:
-                        X86_CPU(uc, mycpu)->env.regs[R_EDX] = *(uint64_t *)value;
+                        state->regs[R_EDX] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_EDX:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_EDX], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_DX:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EDX], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_DH:
-                        WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value);
+                        WRITE_BYTE_H(state->regs[R_EDX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_DL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EDX], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RSP:
-                        X86_CPU(uc, mycpu)->env.regs[R_ESP] = *(uint64_t *)value;
+                        state->regs[R_ESP] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_ESP:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_ESP], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_SP:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_ESP], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_SPL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_ESP], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RBP:
-                        X86_CPU(uc, mycpu)->env.regs[R_EBP] = *(uint64_t *)value;
+                        state->regs[R_EBP] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_EBP:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_EBP], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_BP:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EBP], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_BPL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EBP], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RSI:
-                        X86_CPU(uc, mycpu)->env.regs[R_ESI] = *(uint64_t *)value;
+                        state->regs[R_ESI] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_ESI:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_ESI], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_SI:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_ESI], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_SIL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_ESI], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RDI:
-                        X86_CPU(uc, mycpu)->env.regs[R_EDI] = *(uint64_t *)value;
+                        state->regs[R_EDI] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_EDI:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[R_EDI], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_DI:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[R_EDI], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_DIL:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[R_EDI], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_RIP:
-                        X86_CPU(uc, mycpu)->env.eip = *(uint64_t *)value;
+                        state->eip = *(uint64_t *)value;
                         // force to quit execution and flush TB
                         uc->quit_request = true;
                         uc_emu_stop(uc);
                         break;
                     case UC_X86_REG_EIP:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.eip, *(uint32_t *)value);
+                        WRITE_DWORD(state->eip, *(uint32_t *)value);
                         // force to quit execution and flush TB
                         uc->quit_request = true;
                         uc_emu_stop(uc);
                         break;
                     case UC_X86_REG_IP:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.eip, *(uint16_t *)value);
+                        WRITE_WORD(state->eip, *(uint16_t *)value);
                         // force to quit execution and flush TB
                         uc->quit_request = true;
                         uc_emu_stop(uc);
                         break;
                     case UC_X86_REG_CS:
-                        X86_CPU(uc, mycpu)->env.segs[R_CS].selector = *(uint16_t *)value;
+                        state->segs[R_CS].selector = *(uint16_t *)value;
                         break;
                     case UC_X86_REG_DS:
-                        X86_CPU(uc, mycpu)->env.segs[R_DS].selector = *(uint16_t *)value;
+                        state->segs[R_DS].selector = *(uint16_t *)value;
                         break;
                     case UC_X86_REG_SS:
-                        X86_CPU(uc, mycpu)->env.segs[R_SS].selector = *(uint16_t *)value;
+                        state->segs[R_SS].selector = *(uint16_t *)value;
                         break;
                     case UC_X86_REG_ES:
-                        X86_CPU(uc, mycpu)->env.segs[R_ES].selector = *(uint16_t *)value;
+                        state->segs[R_ES].selector = *(uint16_t *)value;
                         break;
                     case UC_X86_REG_FS:
-                        X86_CPU(uc, mycpu)->env.segs[R_FS].selector = *(uint16_t *)value;
+                        state->segs[R_FS].selector = *(uint16_t *)value;
                         break;
                     case UC_X86_REG_GS:
-                        X86_CPU(uc, mycpu)->env.segs[R_GS].selector = *(uint16_t *)value;
+                        state->segs[R_GS].selector = *(uint16_t *)value;
                         break;
                     case UC_X86_REG_R8:
-                        X86_CPU(uc, mycpu)->env.regs[8] = *(uint64_t *)value;
+                        state->regs[8] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R8D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[8], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[8], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R8W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[8], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[8], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R8B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[8], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[8], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_R9:
-                        X86_CPU(uc, mycpu)->env.regs[9] = *(uint64_t *)value;
+                        state->regs[9] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R9D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[9], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[9], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R9W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[9], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[9], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R9B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[9], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[9], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_R10:
-                        X86_CPU(uc, mycpu)->env.regs[10] = *(uint64_t *)value;
+                        state->regs[10] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R10D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[10], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[10], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R10W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[10], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[10], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R10B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[10], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[10], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_R11:
-                        X86_CPU(uc, mycpu)->env.regs[11] = *(uint64_t *)value;
+                        state->regs[11] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R11D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[11], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[11], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R11W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[11], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[11], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R11B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[11], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[11], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_R12:
-                        X86_CPU(uc, mycpu)->env.regs[12] = *(uint64_t *)value;
+                        state->regs[12] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R12D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[12], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[12], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R12W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[12], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[12], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R12B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[12], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[12], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_R13:
-                        X86_CPU(uc, mycpu)->env.regs[13] = *(uint64_t *)value;
+                        state->regs[13] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R13D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[13], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[13], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R13W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[13], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[13], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R13B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[13], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[13], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_R14:
-                        X86_CPU(uc, mycpu)->env.regs[14] = *(uint64_t *)value;
+                        state->regs[14] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R14D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[14], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[14], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R14W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[14], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[14], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R14B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[14], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[14], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_R15:
-                        X86_CPU(uc, mycpu)->env.regs[15] = *(uint64_t *)value;
+                        state->regs[15] = *(uint64_t *)value;
                         break;
                     case UC_X86_REG_R15D:
-                        WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[15], *(uint32_t *)value);
+                        WRITE_DWORD(state->regs[15], *(uint32_t *)value);
                         break;
                     case UC_X86_REG_R15W:
-                        WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[15], *(uint16_t *)value);
+                        WRITE_WORD(state->regs[15], *(uint16_t *)value);
                         break;
                     case UC_X86_REG_R15B:
-                        WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[15], *(uint8_t *)value);
+                        WRITE_BYTE_L(state->regs[15], *(uint8_t *)value);
                         break;
                     case UC_X86_REG_IDTR:
-                        X86_CPU(uc, mycpu)->env.idt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.idt.base = ((uc_x86_mmr *)value)->base;
+                        state->idt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
+                        state->idt.base = ((uc_x86_mmr *)value)->base;
                         break;
                     case UC_X86_REG_GDTR:
-                        X86_CPU(uc, mycpu)->env.gdt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.gdt.base = ((uc_x86_mmr *)value)->base;
+                        state->gdt.limit = (uint16_t)((uc_x86_mmr *)value)->limit;
+                        state->gdt.base = ((uc_x86_mmr *)value)->base;
                         break;
                     case UC_X86_REG_LDTR:
-                        X86_CPU(uc, mycpu)->env.ldt.limit = ((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.ldt.base = ((uc_x86_mmr *)value)->base;
-                        X86_CPU(uc, mycpu)->env.ldt.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
-                        X86_CPU(uc, mycpu)->env.ldt.flags = ((uc_x86_mmr *)value)->flags;
+                        state->ldt.limit = ((uc_x86_mmr *)value)->limit;
+                        state->ldt.base = ((uc_x86_mmr *)value)->base;
+                        state->ldt.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
+                        state->ldt.flags = ((uc_x86_mmr *)value)->flags;
                         break;
                     case UC_X86_REG_TR:
-                        X86_CPU(uc, mycpu)->env.tr.limit = ((uc_x86_mmr *)value)->limit;
-                        X86_CPU(uc, mycpu)->env.tr.base = ((uc_x86_mmr *)value)->base;
-                        X86_CPU(uc, mycpu)->env.tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
-                        X86_CPU(uc, mycpu)->env.tr.flags = ((uc_x86_mmr *)value)->flags;
+                        state->tr.limit = ((uc_x86_mmr *)value)->limit;
+                        state->tr.base = ((uc_x86_mmr *)value)->base;
+                        state->tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
+                        state->tr.flags = ((uc_x86_mmr *)value)->flags;
                         break;
                     case UC_X86_REG_MSR:
                         x86_msr_write(uc, (uc_x86_msr *)value);