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

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

コード全体のリファクタリングを実施

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