TempleOSTS_130707.ISO
This commit is contained in:
1 parent
17b71f1a2d
commit
1343005a29
617 files changed
+14399
-25130
No files matched your search
+130
-224
@@ -30,8 +30,8 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
dbg=NULL;
|
||||
|
||||
if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) &&
|
||||
Bt(&lx->pass_trace_mask,lx->pass))
|
||||
"$$BK,1$$$$FG,LTRED$$$$IV,1$$This code gets merged together and patched.\n$$FG$$$$IV,0$$$$BK,0$$";
|
||||
Bt(&lx->pass_trace_mask,lx->pass))
|
||||
"$$BK,1$$$$FG,LTRED$$$$IV,1$$This code gets merged together and patched.\n$$FG$$$$IV,0$$$$BK,0$$";
|
||||
|
||||
lx->last_float_op_ic=NULL;
|
||||
|
||||
@@ -58,11 +58,9 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
lx->dont_push_float=Btr(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0);
|
||||
}
|
||||
MemCpy(saved_p123,&tempi->p1,3*sizeof(CICArg));
|
||||
if (cmp_arg_cnt[code]==2) {
|
||||
if (tempi->p1.type&TY_MASK==TY_REG &&
|
||||
if (cmp_arg_cnt[code]==2 && tempi->p1.type&TY_MASK==TY_REG &&
|
||||
tempi->p1.reg==CREG_RAX)
|
||||
tempi->ic_flags|=ICF_P1_FIRST;
|
||||
}
|
||||
tempi->ic_flags|=ICF_P1_FIRST;
|
||||
tempi->ic_cnt=0;
|
||||
tempi->ic_last_cnt=-1;
|
||||
if (tempi->ic_flags & ICF_P1_FIRST) {
|
||||
@@ -85,7 +83,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
if (tempi->ic_flags & ICF_P2_TO_F64) {
|
||||
if (tempi->ic_flags&ICF_P1_FIRST) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
@@ -98,7 +96,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
} else if (tempi->ic_flags & ICF_P2_TO_INT) {
|
||||
if (tempi->ic_flags&ICF_P1_FIRST) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
@@ -111,90 +109,30 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (tempi->p3.type&TY_MASK) {
|
||||
if (tempi->ic_flags & ICF_P3_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->p3.type,tempi->p3.reg,tempi->p3.disp,FALSE,CN_P3,ip2);
|
||||
tempi->p3.type=TY_REG+IT_I64;
|
||||
tempi->p3.reg=CREG_RAX;
|
||||
tempi->p3.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P3_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->p3.type,tempi->p3.reg,tempi->p3.disp,TRUE,CN_P3,ip2);
|
||||
tempi->p3.type=TY_REG+IT_I64;
|
||||
tempi->p3.reg=CREG_RAX;
|
||||
tempi->p3.disp=0;
|
||||
if (tempi->p2.type&TY_MASK) {
|
||||
if (tempi->ic_flags & ICF_P2_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,FALSE,CN_P2,ip2);
|
||||
tempi->p2.type=TY_REG+IT_I64;
|
||||
tempi->p2.reg=CREG_RAX;
|
||||
tempi->p2.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P2_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,TRUE,CN_P2,ip2);
|
||||
tempi->p2.type=TY_REG+IT_I64;
|
||||
tempi->p2.reg=CREG_RAX;
|
||||
tempi->p2.disp=0;
|
||||
}
|
||||
if (tempi->ic_flags & (ICF_P3_TO_F64 | ICF_P3_TO_INT)) {
|
||||
if (tempi->p2.type&TY_MASK) {
|
||||
if (tempi->ic_flags & ICF_P2_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,FALSE,CN_P2,ip2);
|
||||
tempi->p2.type=TY_REG+IT_I64;
|
||||
tempi->p2.reg=CREG_RDX;
|
||||
tempi->p2.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P2_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,TRUE,CN_P2,ip2);
|
||||
tempi->p2.type=TY_REG+IT_I64;
|
||||
tempi->p2.reg=CREG_RDX;
|
||||
tempi->p2.disp=0;
|
||||
}
|
||||
}
|
||||
if (tempi->ic_flags & (ICF_P2_TO_F64 | ICF_P2_TO_INT)) {
|
||||
if (tempi->p1.type&TY_MASK) { //TODO: RCX might cause problems
|
||||
if (tempi->ic_flags & ICF_P1_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RCX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RCX;
|
||||
tempi->p1.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P1_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RCX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RCX;
|
||||
tempi->p1.disp=0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (tempi->p1.type&TY_MASK) {
|
||||
if (tempi->ic_flags & ICF_P1_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P1_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
goto p2_RAX_p1_RDX;
|
||||
} else {
|
||||
p2_RAX_p1_RDX:
|
||||
if (tempi->p2.type&TY_MASK) {
|
||||
if (tempi->ic_flags & ICF_P2_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,FALSE,CN_P2,ip2);
|
||||
tempi->p2.type=TY_REG+IT_I64;
|
||||
tempi->p2.reg=CREG_RAX;
|
||||
tempi->p2.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P2_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,TRUE,CN_P2,ip2);
|
||||
tempi->p2.type=TY_REG+IT_I64;
|
||||
tempi->p2.reg=CREG_RAX;
|
||||
tempi->p2.disp=0;
|
||||
}
|
||||
}
|
||||
if (tempi->p1.type&TY_MASK) {
|
||||
if (tempi->ic_flags & ICF_P1_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P1_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
}
|
||||
}
|
||||
if (tempi->p1.type&TY_MASK) {
|
||||
if (tempi->ic_flags & ICF_P1_TO_F64) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
} else if (tempi->ic_flags & ICF_P1_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2);
|
||||
tempi->p1.type=TY_REG+IT_I64;
|
||||
tempi->p1.reg=CREG_RDX;
|
||||
tempi->p1.disp=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -203,7 +141,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
ICU16(tempi,0xB848);
|
||||
ICU64(tempi,tempi->ic_data);
|
||||
if (buf && lx->flags&LF_AOT_COMPILE &&
|
||||
!(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) {
|
||||
!(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) {
|
||||
tempa=CAlloc(sizeof(CExeAbsAddr));
|
||||
tempa->next=a->abss;
|
||||
tempa->type=EAA_ADD_U64;
|
||||
@@ -211,7 +149,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
tempa->ip=ip2+tempi->ic_cnt-8;
|
||||
}
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
tempi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
case IC_HEAP_GLBL:
|
||||
@@ -219,14 +157,14 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
ICU64(tempi,0);
|
||||
temphg=tempi->ic_data;
|
||||
if (buf && lx->flags&LF_AOT_COMPILE &&
|
||||
!(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) { //is this necessary--flags?
|
||||
!(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) { //is this necessary--flags?
|
||||
temphgr=CAlloc(sizeof(CExeHeapGlblRef));
|
||||
temphgr->next=temphg->references;
|
||||
temphg->references=temphgr;
|
||||
temphgr->ip=ip2+tempi->ic_cnt-8;
|
||||
}
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
tempi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
case IC_ADDR_IMPORT:
|
||||
@@ -242,7 +180,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
ICU24(tempi,0xC06348);
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
tempi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
case IC_STR_CONST:
|
||||
@@ -253,7 +191,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
else
|
||||
i=lb->addr+buf;
|
||||
ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_RIP_DISP32+IT_PTR,0,i,lx,buf,ip2);
|
||||
TY_RIP_DISP32+IT_PTR,0,i,lx,buf,ip2);
|
||||
tempi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
case IC_ASM:
|
||||
@@ -283,16 +221,16 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
case IC_MOV_FS:
|
||||
ICZero(tempi,CREG_RAX);
|
||||
ICU8(tempi,0x64);
|
||||
//It's ugly to use ic_class here
|
||||
//It's ugly to use ic_class here
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2);
|
||||
TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2);
|
||||
break;
|
||||
case IC_MOV_GS:
|
||||
ICZero(tempi,CREG_RAX);
|
||||
ICU8(tempi,0x65);
|
||||
//It's ugly to use ic_class here
|
||||
//It's ugly to use ic_class here
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2);
|
||||
TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2);
|
||||
break;
|
||||
case IC_RIP:
|
||||
ICU16(tempi,0xB848);
|
||||
@@ -305,12 +243,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
tempa->ip=ip2+tempi->ic_cnt-8;
|
||||
}
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
tempi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
case IC_NATIVE_TYPECAST:
|
||||
case IC_HOLYC_TYPECAST:
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
break;
|
||||
case IC_COM:
|
||||
ICUnaries(tempi,SLASH_OP_NOT,ip2);
|
||||
@@ -327,7 +265,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
case IC_ADDR:
|
||||
case IC_MOV:
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
break;
|
||||
case IC_DEREF:
|
||||
ICDeref(tempi,ip2);
|
||||
@@ -364,20 +302,20 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
break;
|
||||
case IC_LEA:
|
||||
ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,lx,buf,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,lx,buf,ip2);
|
||||
break;
|
||||
case IC_POWER:
|
||||
ICFPow(lx,tempi,buf,ip2);
|
||||
break;
|
||||
case IC_SHL:
|
||||
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
|
||||
break;
|
||||
case IC_SHR:
|
||||
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
|
||||
break;
|
||||
case IC_MUL:
|
||||
if (tempi->ic_flags&ICF_USE_INT)
|
||||
@@ -399,32 +337,32 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
break;
|
||||
case IC_AND:
|
||||
ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x23,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x23,ip2);
|
||||
break;
|
||||
case IC_OR:
|
||||
ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x0B,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x0B,ip2);
|
||||
break;
|
||||
case IC_XOR:
|
||||
ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x33,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x33,ip2);
|
||||
break;
|
||||
case IC_ADD:
|
||||
if (tempi->ic_flags&ICF_USE_INT)
|
||||
ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x03,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x03,ip2);
|
||||
else
|
||||
ICFAdd(lx,tempi,buf,ip2);
|
||||
break;
|
||||
case IC_SUB:
|
||||
if (tempi->ic_flags&ICF_USE_INT)
|
||||
ICSub(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
else
|
||||
ICFSub(lx,tempi,buf,ip2);
|
||||
break;
|
||||
@@ -467,9 +405,6 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
case IC_XOR_XOR:
|
||||
ICXorXor(tempi,ip2);
|
||||
break;
|
||||
case IC_COLON:
|
||||
ICColon(tempi,ip2);
|
||||
break;
|
||||
case IC_ASSIGN:
|
||||
ICAssign(tempi,ip2);
|
||||
break;
|
||||
@@ -481,15 +416,15 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
break;
|
||||
case IC_SHL_EQUAL:
|
||||
ICShiftEqual(tempi,tempi->p1.ptype,
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
|
||||
break;
|
||||
case IC_SHR_EQUAL:
|
||||
ICShiftEqual(tempi,tempi->p1.ptype,
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
|
||||
break;
|
||||
case IC_MUL_EQUAL:
|
||||
if (tempi->ic_flags&ICF_USE_INT)
|
||||
@@ -521,38 +456,38 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
case IC_ADD_EQUAL:
|
||||
if (tempi->ic_flags&ICF_USE_INT)
|
||||
ICAddSubEctEqual(tempi,tempi->p1.ptype,
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x010000000003,ip2);
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x010000000003,ip2);
|
||||
else
|
||||
ICFOpEqual(lx,tempi,SLASH_OP_FADD,buf,ip2);
|
||||
break;
|
||||
case IC_SUB_EQUAL:
|
||||
if (tempi->ic_flags&ICF_USE_INT)
|
||||
ICAddSubEctEqual(tempi,tempi->p1.ptype,
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x29000000052B,ip2);
|
||||
tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x29000000052B,ip2);
|
||||
else
|
||||
ICFOpEqual(lx,tempi,SLASH_OP_FSUB,buf,ip2);
|
||||
break;
|
||||
case IC_SHL_CONST:
|
||||
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
TY_IMM+IT_I64,0,tempi->ic_data,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
TY_IMM+IT_I64,0,tempi->ic_data,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2);
|
||||
break;
|
||||
case IC_SHR_CONST:
|
||||
ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
TY_IMM+IT_I64,0,tempi->ic_data,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,
|
||||
TY_IMM+IT_I64,0,tempi->ic_data,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2);
|
||||
break;
|
||||
case IC_ADD_CONST:
|
||||
ICAddConst(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x0003,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x0003,ip2);
|
||||
break;
|
||||
case IC_SUB_CONST:
|
||||
ICAddConst(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x052B,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x052B,ip2);
|
||||
break;
|
||||
case IC_ENTER:
|
||||
if (tempi->ic_data<=MAX_I16)
|
||||
@@ -560,7 +495,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
else {
|
||||
ICPush(tempi,TY_REG+IT_I64,CREG_RBP,0,ip2);
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RBP,0,
|
||||
TY_REG+IT_I64,CREG_RSP,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RSP,0,ip2);
|
||||
ICAddRSP(tempi,-tempi->ic_data);
|
||||
}
|
||||
if (fun_class) {
|
||||
@@ -573,11 +508,9 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
for (i=0;i<NUM_REGS;i++)
|
||||
if (register_offsets[i]>0 && register_offsets[i].offset!=MAX_I64) {
|
||||
tempc=register_offsets[i].m->member_class;
|
||||
while (tempc->fwd_class)
|
||||
tempc=tempc->fwd_class;
|
||||
tempc=OptClassFwd(register_offsets[i].m->member_class);
|
||||
ICMov(tempi,TY_REG+IT_I64,i,0,
|
||||
TY_DISP+tempc->sub_type,CREG_RBP,register_offsets[i].offset,ip2);
|
||||
TY_DISP+tempc->sub_type,CREG_RBP,register_offsets[i].offset,ip2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -688,12 +621,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
break;
|
||||
case IC_INVLPG:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU24(tempi,0x38010F);
|
||||
break;
|
||||
case IC_CLFLUSH:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU24(tempi,0x38AE0F);
|
||||
break;
|
||||
case IC_PAUSE:
|
||||
@@ -719,69 +652,65 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
break;
|
||||
case IC_GET_BASE_PTR:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
TY_REG+IT_I64,CREG_RBP,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RBP,0,ip2);
|
||||
break;
|
||||
case IC_SET_BASE_PTR:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RBP,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
break;
|
||||
case IC_GET_STK_PTR:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
TY_REG+IT_I64,CREG_RSP,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RSP,0,ip2);
|
||||
break;
|
||||
case IC_SET_STK_PTR:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RSP,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
break;
|
||||
case IC_RETURN_VAL2:
|
||||
break;
|
||||
case IC_RETURN_VAL:
|
||||
case IC_SET_RAX:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
break;
|
||||
case IC_GET_RAX:
|
||||
break;
|
||||
case IC_BT:
|
||||
ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1,
|
||||
0xA30F,0x20BA0F,ip2);
|
||||
0xA30F,0x20BA0F,ip2);
|
||||
break;
|
||||
case IC_BTS:
|
||||
case IC_LBTS:
|
||||
ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1,
|
||||
0xAB0F,0x28BA0F,ip2);
|
||||
0xAB0F,0x28BA0F,ip2);
|
||||
break;
|
||||
case IC_BTR:
|
||||
case IC_LBTR:
|
||||
ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1,
|
||||
0xB30F,0x30BA0F,ip2);
|
||||
0xB30F,0x30BA0F,ip2);
|
||||
break;
|
||||
case IC_BTC:
|
||||
case IC_LBTC:
|
||||
ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1,
|
||||
0xBB0F,0x38BA0F,ip2);
|
||||
break;
|
||||
case IC_BEQU:
|
||||
case IC_LBEQU:
|
||||
ICBEqu(tempi,tempi+1,ip2);
|
||||
0xBB0F,0x38BA0F,ip2);
|
||||
break;
|
||||
case IC_BSF:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU32(tempi,0xC0BC0F48);
|
||||
ICU16(tempi,0x0375);
|
||||
ICU24(tempi,0xD0F748);
|
||||
break;
|
||||
case IC_BSR:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU32(tempi,0xC0BD0F48);
|
||||
ICU16(tempi,0x0375);
|
||||
ICU24(tempi,0xD0F748);
|
||||
break;
|
||||
case IC_SIGN_I64:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_SIGN_I64,TRUE,FALSE,FALSE,CN_MAIN);
|
||||
break;
|
||||
case IC_PREEMPT:
|
||||
@@ -822,17 +751,11 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
break;
|
||||
case IC_ABS_I64:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU24(tempi,0xC00B48);
|
||||
ICU16(tempi,0x0379);
|
||||
ICU24(tempi,0xD8F748);
|
||||
break;
|
||||
case IC_LIMIT_I64:
|
||||
ICLimit(tempi,0x4F4C,ip2);
|
||||
break;
|
||||
case IC_LIMIT_U64:
|
||||
ICLimit(tempi,0x4742,ip2);
|
||||
break;
|
||||
case IC_MIN_I64:
|
||||
ICMinMax(tempi,0x4F,ip2);
|
||||
break;
|
||||
@@ -872,21 +795,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
case IC_QUE_REM:
|
||||
ICQueRem(tempi,ip2);
|
||||
break;
|
||||
case IC_MEMCPY:
|
||||
ICMemCpy(tempi,ip2);
|
||||
break;
|
||||
case IC_MEMSET:
|
||||
case IC_MEMSET_U16:
|
||||
case IC_MEMSET_U32:
|
||||
case IC_MEMSET_U64:
|
||||
ICMemSet(tempi,code-IC_MEMSET,ip2);
|
||||
break;
|
||||
case IC_STRLEN:
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICCopyTemplate(lx,tempi,CMP_TEMPLATE_STRLEN,TRUE,FALSE,FALSE,CN_MAIN);
|
||||
break;
|
||||
case IC_INU32:
|
||||
case IC_IN_U32:
|
||||
if (tempi->p1.type&TY_MASK==TY_IMM) {
|
||||
ICU16(tempi,0xC033);
|
||||
if (tempi->p1.disp<=MAX_U8)
|
||||
@@ -897,12 +811,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
} else {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU16(tempi,0xC033);
|
||||
ICU8(tempi,0xED);
|
||||
}
|
||||
break;
|
||||
case IC_INU16:
|
||||
case IC_IN_U16:
|
||||
if (tempi->p1.type&TY_MASK==TY_IMM) {
|
||||
ICU16(tempi,0xC033);
|
||||
if (tempi->p1.disp<=MAX_U8)
|
||||
@@ -913,12 +827,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
} else {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU16(tempi,0xC033);
|
||||
ICU16(tempi,0xED00+OC_OP_SIZE_PREFIX);
|
||||
}
|
||||
break;
|
||||
case IC_INU8:
|
||||
case IC_IN_U8:
|
||||
if (tempi->p1.type&TY_MASK==TY_IMM) {
|
||||
ICU16(tempi,0xC033);
|
||||
if (tempi->p1.disp<=MAX_U8)
|
||||
@@ -929,15 +843,15 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
} else {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICU16(tempi,0xC033);
|
||||
ICU8(tempi,0xEC);
|
||||
}
|
||||
break;
|
||||
case IC_OUTU32:
|
||||
case IC_OUT_U32:
|
||||
if (tempi->p2.type&TY_MASK==TY_IMM) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
if (tempi->p2.disp<=MAX_U8)
|
||||
ICU16(tempi,0xE7+tempi->p2.disp<<8);
|
||||
else {
|
||||
@@ -947,22 +861,22 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
} else {
|
||||
if (tempi->ic_flags & ICF_P1_FIRST) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
} else {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
}
|
||||
ICU8(tempi,0xEF);
|
||||
}
|
||||
break;
|
||||
case IC_OUTU16:
|
||||
case IC_OUT_U16:
|
||||
if (tempi->p2.type&TY_MASK==TY_IMM) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
if (tempi->p2.disp<=MAX_U8)
|
||||
ICU24(tempi,0xE700+OC_OP_SIZE_PREFIX+tempi->p2.disp<<16);
|
||||
else {
|
||||
@@ -972,22 +886,22 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
} else {
|
||||
if (tempi->ic_flags & ICF_P1_FIRST) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
} else {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
}
|
||||
ICU16(tempi,0xEF00+OC_OP_SIZE_PREFIX);
|
||||
}
|
||||
break;
|
||||
case IC_OUTU8:
|
||||
case IC_OUT_U8:
|
||||
if (tempi->p2.type&TY_MASK==TY_IMM) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
if (tempi->p2.disp<=MAX_U8)
|
||||
ICU16(tempi,0xE6+tempi->p2.disp<<8);
|
||||
else {
|
||||
@@ -997,14 +911,14 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
} else {
|
||||
if (tempi->ic_flags & ICF_P1_FIRST) {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
} else {
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2);
|
||||
ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2);
|
||||
}
|
||||
ICU8(tempi,0xEE);
|
||||
}
|
||||
@@ -1166,17 +1080,11 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
ICU8(tempi,0xC3);
|
||||
break;
|
||||
case IC_JMP:
|
||||
lb=OptLabelFwd(tempi->ic_data);
|
||||
short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP);
|
||||
lb=tempi->ic_data;
|
||||
while (lb1=lb->fwd)
|
||||
lb=lb1;
|
||||
if (!buf) {
|
||||
if (lb->addr!=INVALID_PTR) {
|
||||
i=lb->addr-ip;
|
||||
if (MIN_I8+5<i<MAX_I8-5)
|
||||
short_jmp=TRUE;
|
||||
}
|
||||
}
|
||||
if (!buf && lb->addr!=INVALID_PTR &&
|
||||
MIN_I8+5<lb->addr-ip<MAX_I8-5)
|
||||
short_jmp=TRUE;
|
||||
if (short_jmp) {
|
||||
tempi->ic_flags|=ICF_SHORT_JMP;
|
||||
i=lb->addr-(ip+2);
|
||||
@@ -1188,8 +1096,6 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
tempi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
case IC_END:
|
||||
break;
|
||||
case IC_LABEL:
|
||||
lb=tempi->ic_data;
|
||||
lb->addr=ip;
|
||||
@@ -1199,14 +1105,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
}
|
||||
tempi->ic_flags&=~ICF_CODE_FINAL;
|
||||
break;
|
||||
case IC_QUESTION:
|
||||
break;
|
||||
case IC_IRQ:
|
||||
ICU8(tempi,0xCD);
|
||||
ICU8(tempi,tempi->ic_data);
|
||||
break;
|
||||
case IC_NOP:
|
||||
case IC_NOP1:
|
||||
case IC_NOP2:
|
||||
case IC_PUSH_CMP:
|
||||
break;
|
||||
case IC_CALL_START:
|
||||
@@ -1219,13 +1123,15 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
ICPopRegs(tempi,tempi->ic_data);
|
||||
if (tempi->r.type&TY_MASK)
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
break;
|
||||
case IC_POP_REGS:
|
||||
ICPopRegs(tempi,tempi->ic_data);
|
||||
break;
|
||||
case IC_END_EXP:
|
||||
break;
|
||||
case IC_END:
|
||||
break;
|
||||
|
||||
default:
|
||||
OptMissing(lx,tempi);
|
||||
@@ -1240,12 +1146,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
} else {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,FALSE,CN_R,ip2);
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
}
|
||||
} else if (tempi->ic_flags & ICF_R_TO_INT) {
|
||||
ICFCvt(lx,tempi,CREG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,TRUE,CN_R,ip2);
|
||||
ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
TY_REG+IT_I64,CREG_RAX,0,ip2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1264,7 +1170,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class,
|
||||
MemCpy(buf+ip,tempi->ic_body,cnt);
|
||||
}
|
||||
|
||||
skip_copy:
|
||||
skip_copy:
|
||||
if (dbg && lx->min_line<=tempi->ic_line<=lx->max_line) {
|
||||
i=tempi->ic_line-lx->min_line;
|
||||
if (!dbg->body[i])
|
||||
|
||||
Reference in new issue
Block a user