#include "../BasicCompiler_Common/common.h" #include "Opcode.h" BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){ int reg1,reg2; int AnswerType; int sp; sp=*pStackPointer; AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]); if(IsRealNumberType(AnswerType)){ //////////////// // 実数演算 //////////////// int xmm_reg1,xmm_reg2; //2つの項を適切なレジスタにセット SetTowTermToReg_RealCalc(AnswerType,type,sp,&xmm_reg1,&xmm_reg2); if(AnswerType==DEF_DOUBLE){ //comisd xmm_reg1,xmm_reg2 op_comisd(xmm_reg1,xmm_reg2); } else if(AnswerType==DEF_SINGLE){ //comiss xmm_reg1,xmm_reg2 op_comiss(xmm_reg1,xmm_reg2); } //Xmmレジスタを解放 pobj_reg->UnlockXmmReg(); //汎用レジスタを確保 reg1=pobj_reg->LockReg(); } else if(Is64Type(AnswerType)){ ////////////////////// // 64ビット整数演算 ////////////////////// //2つの項を適切なレジスタにセット SetTowTermToReg_Whole64Calc(type,sp,®1,®2); //cmp reg1,reg2 op_cmp_reg(sizeof(_int64),reg1,reg2); } else{ ////////////////////// // 32ビット整数演算 ////////////////////// //2つの項を適切なレジスタにセット SetTowTermToReg_Whole32Calc(type,sp,®1,®2); //cmp reg1,reg2 op_cmp_reg(sizeof(long),reg1,reg2); } //////////////////// // 条件分岐 //////////////////// if(idCalc==CALC_PE){ // reg1 <= reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jle OpBuffer[obp++]=(char)0x7E; } else{ //符号なし演算 //jbe OpBuffer[obp++]=(char)0x76; } } else if(idCalc==CALC_QE){ // reg1 >= reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jge OpBuffer[obp++]=(char)0x7D; } else{ //符号なし演算 //jae OpBuffer[obp++]=(char)0x73; } } else if(idCalc==CALC_P){ // reg1 < reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jl OpBuffer[obp++]=(char)0x7C; } else{ //符号なし演算 //jb OpBuffer[obp++]=(char)0x72; } } else if(idCalc==CALC_Q){ // reg1 > reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jg OpBuffer[obp++]=(char)0x7F; } else{ //符号なし演算 //ja OpBuffer[obp++]=(char)0x77; } } else if(idCalc==CALC_NOTEQUAL){ // reg1 <> reg2 //jne OpBuffer[obp++]=(char)0x75; } else if(idCalc==CALC_EQUAL){ // reg1 = reg2 //je OpBuffer[obp++]=(char)0x74; } OpBuffer[obp++]=(char)0x05; ////////////////////// // FALSEをセット ////////////////////// //xor reg1,reg1 op_zero_reg(reg1); //jmp 7(xorを飛び越す) OpBuffer[obp++]=(char)0xEB; OpBuffer[obp++]=(char)0x07; /////////////////// // TRUEをセット /////////////////// //mov reg1,-1 op_mov_RV(sizeof(_int64),reg1,-1); if(reg1==REG_R14){ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用 pobj_sf->push(REG_R14); } sp--; *pStackPointer=sp; type[sp-1]=DEF_LONG; return 1; }