source: dev/BasicCompiler64/NumOpe_Relation.cpp@ 36

Last change on this file since 36 was 36, checked in by dai_9181, 17 years ago

Boolean型に対応。

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