source: dev/trunk/ab5.0/abdev/compiler_x64/NumOpe_Relation.cpp@ 673

Last change on this file since 673 was 228, checked in by dai_9181, 17 years ago
File size: 3.4 KB
Line 
1#include "stdafx.h"
2
3#include <Compiler.h>
4
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
28 compiler.codeGenerator.op_comisd(xmm_reg1,xmm_reg2);
29 }
30 else if(AnswerType==DEF_SINGLE){
31 //comiss xmm_reg1,xmm_reg2
32 compiler.codeGenerator.op_comiss(xmm_reg1,xmm_reg2);
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
50 compiler.codeGenerator.op_cmp_reg(sizeof(_int64),reg1,reg2);
51 }
52 else{
53 //////////////////////
54 // 32ビット整数演算
55 //////////////////////
56
57 //2つの項を適切なレジスタにセット
58 SetTowTermToReg_Whole32Calc(type,sp,&reg1,&reg2);
59
60 //cmp reg1,reg2
61 compiler.codeGenerator.op_cmp_reg(sizeof(long),reg1,reg2);
62 }
63
64
65 ////////////////////
66 // 条件分岐
67 ////////////////////
68
69 int jmpOffset = 5;
70
71 if(idCalc==CALC_PE){
72 // reg1 <= reg2
73 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
74 //符号あり演算
75 //jle
76 compiler.codeGenerator.op_jle( jmpOffset );
77 }
78 else{
79 //符号なし演算
80 //jbe
81 compiler.codeGenerator.op_jbe( jmpOffset );
82 }
83 }
84 else if(idCalc==CALC_QE){
85 // reg1 >= reg2
86 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
87 //符号あり演算
88 //jge
89 compiler.codeGenerator.op_jge( jmpOffset );
90 }
91 else{
92 //符号なし演算
93 //jae
94 compiler.codeGenerator.op_jae( jmpOffset );
95 }
96 }
97 else if(idCalc==CALC_P){
98 // reg1 < reg2
99 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
100 //符号あり演算
101 //jl
102 compiler.codeGenerator.op_jl( jmpOffset );
103 }
104 else{
105 //符号なし演算
106 //jb
107 compiler.codeGenerator.op_jb( jmpOffset );
108 }
109 }
110 else if(idCalc==CALC_Q){
111 // reg1 > reg2
112 if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
113 //符号あり演算
114 //jg
115 compiler.codeGenerator.op_jg( jmpOffset );
116 }
117 else{
118 //符号なし演算
119 //ja
120 compiler.codeGenerator.op_ja( jmpOffset );
121 }
122 }
123 else if(idCalc==CALC_NOTEQUAL){
124 // reg1 <> reg2
125
126 //jne
127 compiler.codeGenerator.op_jne( jmpOffset );
128 }
129 else if(idCalc==CALC_EQUAL){
130 // reg1 = reg2
131
132 //je
133 compiler.codeGenerator.op_je( jmpOffset );
134 }
135
136
137 //////////////////////
138 // FALSEをセット
139 //////////////////////
140
141 //xor reg1,reg1
142 compiler.codeGenerator.op_zero_reg(reg1);
143
144 //jmp 7(次のmovを飛び越す)
145 compiler.codeGenerator.op_jge( 7 );
146
147
148 ///////////////////
149 // Trueをセット
150 ///////////////////
151
152 //mov reg1,1
153 compiler.codeGenerator.op_mov_RV(sizeof(_int64),reg1,1);
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
165 type[sp-1]=DEF_BOOLEAN;
166
167 return 1;
168}
Note: See TracBrowser for help on using the repository browser.