#include "../BasicCompiler_Common/common.h" #include "Opcode.h" BOOL Calc_Xor(int *type,LONG_PTR *index_stack,int *pStackPointer){ //value[sp-2] xor= value[sp-1] //xor演算 int sp; sp=*pStackPointer; if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){ //いずれかの項が実数のとき SetError(45,"xor",cp); return 0; } if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD|| type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //////////////////// // 64ビット整数演算 //////////////////// //第2項を64ビットに対応させる if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //第2項が64ビット整数値のとき //pop ebx op_pop(REG_EBX); //pop ecx op_pop(REG_ECX); } else{ //第2項がその他整数値のとき //pop eax op_pop(REG_EAX); if(IsSignedType(type[sp-1])){ //符号拡張 //edx:eax ← eax //cdq op_cdq(); } else{ //ビット拡張 //edx:eax ← eax //xor edx,edx op_zero_reg(REG_EDX); } //mov ebx,eax OpBuffer[obp++]=(char)0x8B; OpBuffer[obp++]=(char)0xD8; //mov ecx,edx OpBuffer[obp++]=(char)0x8B; OpBuffer[obp++]=(char)0xCA; } if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ //第1項が64ビット整数値のとき //xor dword ptr[esp],ebx OpBuffer[obp++]=(char)0x31; OpBuffer[obp++]=(char)0x1C; OpBuffer[obp++]=(char)0x24; //xor dword ptr[esp+sizeof(long)],ecx OpBuffer[obp++]=(char)0x31; OpBuffer[obp++]=(char)0x4C; OpBuffer[obp++]=(char)0x24; OpBuffer[obp++]=(char)0x04; } else{ //第1項がその他整数値のとき if(IsSignedType(type[sp-2])){ //pop eax op_pop(REG_EAX); //符号拡張 //edx:eax ← eax //cdq op_cdq(); } else{ //pop eax op_pop(REG_EAX); //ビット拡張 //edx:eax ← eax //xor edx,edx op_zero_reg(REG_EDX); } //xor ebx,eax OpBuffer[obp++]=(char)0x33; OpBuffer[obp++]=(char)0xD8; //xor ecx,edx OpBuffer[obp++]=(char)0x33; OpBuffer[obp++]=(char)0xCA; //push ecx op_push(REG_ECX); //push ebx op_push(REG_EBX); } sp--; if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD; else type[sp-1]=DEF_INT64; } else{ //////////////////// // 整数演算 //////////////////// //pop ebx op_pop(REG_EBX); //pop eax op_pop(REG_EAX); //sub esp,4 op_sub_esp(4); //xor eax,ebx OpBuffer[obp++]=(char)0x33; OpBuffer[obp++]=(char)0xC3; //mov dword ptr[esp],eax OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x04; OpBuffer[obp++]=(char)0x24; sp--; type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]); } *pStackPointer=sp; return 1; } BOOL Calc_Or(int *type,LONG_PTR *index_stack,int *pStackPointer){ //value[sp-2] or= value[sp-1] //or演算 int sp; sp=*pStackPointer; if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){ //いずれかの項が実数のとき SetError(45,"or",cp); return 0; } if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD|| type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //////////////////// // 64ビット整数演算 //////////////////// //第2項を64ビットに対応させる if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //第2項が64ビット整数値のとき //pop ebx op_pop(REG_EBX); //pop ecx op_pop(REG_ECX); } else{ //第2項が32ビット整数値のとき //pop eax op_pop(REG_EAX); if(IsSignedType(type[sp-1])){ //符号拡張 //edx:eax ← eax //cdq op_cdq(); } else{ //ビット拡張 //edx:eax ← eax //xor edx,edx op_zero_reg(REG_EDX); } //mov ebx,eax OpBuffer[obp++]=(char)0x8B; OpBuffer[obp++]=(char)0xD8; //mov ecx,edx OpBuffer[obp++]=(char)0x8B; OpBuffer[obp++]=(char)0xCA; } if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ //第1項が64ビット整数値のとき //or dword ptr[esp],ebx OpBuffer[obp++]=(char)0x09; OpBuffer[obp++]=(char)0x1C; OpBuffer[obp++]=(char)0x24; //or dword ptr[esp+sizeof(long)],ecx OpBuffer[obp++]=(char)0x09; OpBuffer[obp++]=(char)0x4C; OpBuffer[obp++]=(char)0x24; OpBuffer[obp++]=(char)0x04; } else{ //第1項が32ビット整数値のとき if(IsSignedType(type[sp-2])){ //pop eax op_pop(REG_EAX); //符号拡張 //edx:eax ← eax //cdq op_cdq(); } else{ //pop eax op_pop(REG_EAX); //ビット拡張 //edx:eax ← eax //xor edx,edx op_zero_reg(REG_EDX); } //or ebx,eax OpBuffer[obp++]=(char)0x0B; OpBuffer[obp++]=(char)0xD8; //or ecx,edx OpBuffer[obp++]=(char)0x0B; OpBuffer[obp++]=(char)0xCA; //push ecx op_push(REG_ECX); //push ebx op_push(REG_EBX); } sp--; if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD; else type[sp-1]=DEF_INT64; } else{ //////////////////// // 32ビット整数演算 //////////////////// //pop ebx op_pop(REG_EBX); //pop eax op_pop(REG_EAX); //sub esp,4 op_sub_esp(4); //or eax,ebx OpBuffer[obp++]=(char)0x0B; OpBuffer[obp++]=(char)0xC3; //mov dword ptr[esp],eax OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x04; OpBuffer[obp++]=(char)0x24; sp--; type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]); } *pStackPointer=sp; return 1; } BOOL Calc_And(int *type,LONG_PTR *index_stack,int *pStackPointer){ //value[sp-2] and= value[sp-1] //and演算 int sp; sp=*pStackPointer; if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){ //いずれかの項が実数のとき SetError(45,"and",cp); return 0; } if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD|| type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //////////////////// // 64ビット整数演算 //////////////////// //第2項を64ビットに対応させる if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //第2項が64ビット整数値のとき //pop ebx op_pop(REG_EBX); //pop ecx op_pop(REG_ECX); } else{ //第2項が32ビット整数値のとき //pop eax op_pop(REG_EAX); if(IsSignedType(type[sp-1])){ //符号拡張 //edx:eax ← eax //cdq op_cdq(); } else{ //ビット拡張 //edx:eax ← eax //xor edx,edx op_zero_reg(REG_EDX); } //mov ebx,eax OpBuffer[obp++]=(char)0x8B; OpBuffer[obp++]=(char)0xD8; //mov ecx,edx OpBuffer[obp++]=(char)0x8B; OpBuffer[obp++]=(char)0xCA; } if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ //第1項が64ビット整数値のとき //and dword ptr[esp],ebx OpBuffer[obp++]=(char)0x21; OpBuffer[obp++]=(char)0x1C; OpBuffer[obp++]=(char)0x24; //and dword ptr[esp+sizeof(long)],ecx OpBuffer[obp++]=(char)0x21; OpBuffer[obp++]=(char)0x4C; OpBuffer[obp++]=(char)0x24; OpBuffer[obp++]=(char)0x04; } else{ //第1項が32ビット整数値のとき if(IsSignedType(type[sp-2])){ //pop eax op_pop(REG_EAX); //符号拡張 //edx:eax ← eax //cdq op_cdq(); } else{ //pop eax op_pop(REG_EAX); //ビット拡張 //edx:eax ← eax //xor edx,edx op_zero_reg(REG_EDX); } //and ebx,eax OpBuffer[obp++]=(char)0x23; OpBuffer[obp++]=(char)0xD8; //and ecx,edx OpBuffer[obp++]=(char)0x23; OpBuffer[obp++]=(char)0xCA; //push ecx op_push(REG_ECX); //push ebx op_push(REG_EBX); } sp--; if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD; else type[sp-1]=DEF_INT64; } else{ //////////////////// // 32ビット整数演算 //////////////////// //pop ebx op_pop(REG_EBX); //pop eax op_pop(REG_EAX); //sub esp,4 op_sub_esp(4); //and eax,ebx OpBuffer[obp++]=(char)0x23; OpBuffer[obp++]=(char)0xC3; //mov dword ptr[esp],eax OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x04; OpBuffer[obp++]=(char)0x24; sp--; type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]); } *pStackPointer=sp; return 1; } BOOL Calc_Not(int *type,int sp){ //value[sp-1]=Not value[sp-1] //NOT演算子 if(IsRealNumberType(type[sp-1])){ //実数のとき SetError(45,"Not",cp); return 0; } if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //////////////////// // 64ビット整数演算 //////////////////// //not dword ptr[esp] OpBuffer[obp++]=(char)0xF7; OpBuffer[obp++]=(char)0x14; OpBuffer[obp++]=(char)0x24; //not dword ptr[esp+4] OpBuffer[obp++]=(char)0xF7; OpBuffer[obp++]=(char)0x54; OpBuffer[obp++]=(char)0x24; OpBuffer[obp++]=(char)0x04; } else{ //////////////////// // 32ビット整数演算 //////////////////// //not dword ptr[esp] OpBuffer[obp++]=(char)0xF7; OpBuffer[obp++]=(char)0x14; OpBuffer[obp++]=(char)0x24; } return 1; }