#include "stdafx.h" #include #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 compiler.codeGenerator.op_comisd(xmm_reg1,xmm_reg2); } else if(AnswerType==DEF_SINGLE){ //comiss xmm_reg1,xmm_reg2 compiler.codeGenerator.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 compiler.codeGenerator.op_cmp_reg(sizeof(_int64),reg1,reg2); } else{ ////////////////////// // 32ビット整数演算 ////////////////////// //2つの項を適切なレジスタにセット SetTowTermToReg_Whole32Calc(type,sp,®1,®2); //cmp reg1,reg2 compiler.codeGenerator.op_cmp_reg(sizeof(long),reg1,reg2); } //////////////////// // 条件分岐 //////////////////// int jmpOffset = 5; if(idCalc==CALC_PE){ // reg1 <= reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jle compiler.codeGenerator.op_jle( jmpOffset ); } else{ //符号なし演算 //jbe compiler.codeGenerator.op_jbe( jmpOffset ); } } else if(idCalc==CALC_QE){ // reg1 >= reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jge compiler.codeGenerator.op_jge( jmpOffset ); } else{ //符号なし演算 //jae compiler.codeGenerator.op_jae( jmpOffset ); } } else if(idCalc==CALC_P){ // reg1 < reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jl compiler.codeGenerator.op_jl( jmpOffset ); } else{ //符号なし演算 //jb compiler.codeGenerator.op_jb( jmpOffset ); } } else if(idCalc==CALC_Q){ // reg1 > reg2 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){ //符号あり演算 //jg compiler.codeGenerator.op_jg( jmpOffset ); } else{ //符号なし演算 //ja compiler.codeGenerator.op_ja( jmpOffset ); } } else if(idCalc==CALC_NOTEQUAL){ // reg1 <> reg2 //jne compiler.codeGenerator.op_jne( jmpOffset ); } else if(idCalc==CALC_EQUAL){ // reg1 = reg2 //je compiler.codeGenerator.op_je( jmpOffset ); } ////////////////////// // FALSEをセット ////////////////////// //xor reg1,reg1 compiler.codeGenerator.op_zero_reg(reg1); //jmp 7(次のmovを飛び越す) compiler.codeGenerator.op_jge( 7 ); /////////////////// // Trueをセット /////////////////// //mov reg1,1 compiler.codeGenerator.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_BOOLEAN; return 1; }