source: dev/trunk/abdev/BasicCompiler64/NumOpe_Relation.cpp@ 436

Last change on this file since 436 was 228, checked in by dai_9181, 17 years ago
File size: 3.4 KB
RevLine 
[206]1#include "stdafx.h"
2
[226]3#include <Compiler.h>
4
[3]5#include "../BasicCompiler_Common/common.h"
6#include "Opcode.h"
7
8BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
9 int reg1,reg2;
10 int AnswerType;
11
12 int sp;
13 sp=*pStackPointer;
14
15 AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
16
17 if(IsRealNumberType(AnswerType)){
18 ////////////////
19 // 実数演算
20 ////////////////
21 int xmm_reg1,xmm_reg2;
22
23 //2つの項を適切なレジスタにセット
24 SetTowTermToReg_RealCalc(AnswerType,type,sp,&xmm_reg1,&xmm_reg2);
25
26 if(AnswerType==DEF_DOUBLE){
27 //comisd xmm_reg1,xmm_reg2
[226]28 compiler.codeGenerator.op_comisd(xmm_reg1,xmm_reg2);
[3]29 }
30 else if(AnswerType==DEF_SINGLE){
31 //comiss xmm_reg1,xmm_reg2
[226]32 compiler.codeGenerator.op_comiss(xmm_reg1,xmm_reg2);
[3]33 }
34
35 //Xmmレジスタを解放
36 pobj_reg->UnlockXmmReg();
37
38 //汎用レジスタを確保
39 reg1=pobj_reg->LockReg();
40 }
41 else if(Is64Type(AnswerType)){
42 //////////////////////
43 // 64ビット整数演算
44 //////////////////////
45
46 //2つの項を適切なレジスタにセット
47 SetTowTermToReg_Whole64Calc(type,sp,&reg1,&reg2);
48
49 //cmp reg1,reg2
[226]50 compiler.codeGenerator.op_cmp_reg(sizeof(_int64),reg1,reg2);
[3]51 }
52 else{
53 //////////////////////
54 // 32ビット整数演算
55 //////////////////////
56
57 //2つの項を適切なレジスタにセット
58 SetTowTermToReg_Whole32Calc(type,sp,&reg1,&reg2);
59
60 //cmp reg1,reg2
[226]61 compiler.codeGenerator.op_cmp_reg(sizeof(long),reg1,reg2);
[3]62 }
63
64
65 ////////////////////
66 // 条件分岐
67 ////////////////////
68
[228]69 int jmpOffset = 5;
70
[3]71 if(idCalc==CALC_PE){
72 // reg1 <= reg2
73 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
74 //符号あり演算
75 //jle
[228]76 compiler.codeGenerator.op_jle( jmpOffset );
[3]77 }
78 else{
79 //符号なし演算
80 //jbe
[228]81 compiler.codeGenerator.op_jbe( jmpOffset );
[3]82 }
83 }
84 else if(idCalc==CALC_QE){
85 // reg1 >= reg2
86 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
87 //符号あり演算
88 //jge
[228]89 compiler.codeGenerator.op_jge( jmpOffset );
[3]90 }
91 else{
92 //符号なし演算
93 //jae
[228]94 compiler.codeGenerator.op_jae( jmpOffset );
[3]95 }
96 }
97 else if(idCalc==CALC_P){
98 // reg1 < reg2
99 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
100 //符号あり演算
101 //jl
[228]102 compiler.codeGenerator.op_jl( jmpOffset );
[3]103 }
104 else{
105 //符号なし演算
106 //jb
[228]107 compiler.codeGenerator.op_jb( jmpOffset );
[3]108 }
109 }
110 else if(idCalc==CALC_Q){
111 // reg1 > reg2
112 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
113 //符号あり演算
114 //jg
[228]115 compiler.codeGenerator.op_jg( jmpOffset );
[3]116 }
117 else{
118 //符号なし演算
119 //ja
[228]120 compiler.codeGenerator.op_ja( jmpOffset );
[3]121 }
122 }
123 else if(idCalc==CALC_NOTEQUAL){
124 // reg1 <> reg2
125
126 //jne
[228]127 compiler.codeGenerator.op_jne( jmpOffset );
[3]128 }
129 else if(idCalc==CALC_EQUAL){
130 // reg1 = reg2
131
132 //je
[228]133 compiler.codeGenerator.op_je( jmpOffset );
[3]134 }
135
136
137 //////////////////////
138 // FALSEをセット
139 //////////////////////
140
141 //xor reg1,reg1
[226]142 compiler.codeGenerator.op_zero_reg(reg1);
[3]143
[36]144 //jmp 7(次のmovを飛び越す)
[228]145 compiler.codeGenerator.op_jge( 7 );
[3]146
147
148 ///////////////////
[36]149 // Trueをセット
[3]150 ///////////////////
151
[36]152 //mov reg1,1
[226]153 compiler.codeGenerator.op_mov_RV(sizeof(_int64),reg1,1);
[3]154
155
156 if(reg1==REG_R14){
157 //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
158 pobj_sf->push(REG_R14);
159 }
160
161 sp--;
162
163 *pStackPointer=sp;
164
[36]165 type[sp-1]=DEF_BOOLEAN;
[3]166
167 return 1;
168}
Note: See TracBrowser for help on using the repository browser.