source: dev/BasicCompiler32/increment.cpp@ 64

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

すべてのオブジェクトを参照型に切り替えた。

File size: 3.9 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2#include "Opcode.h"
3
4void IncDec(int idCalc, char *lpszLeft, char *lpszRight){
5 int VarType;
6 LONG_PTR lpVarIndex;
7 RELATIVE_VAR VarRelativeVar;
8
9
10 ///////////////////////////
11 // 変数アドレスを取得
12 ///////////////////////////
13
14 if(!GetVarOffsetReadWrite(
15 lpszLeft,
16 &VarType,
17 &VarRelativeVar,
18 &lpVarIndex)) return;
19
20 if(IsUse_ecx(&VarRelativeVar)){
21 //push ecx
22 op_push(REG_ECX);
23 }
24
25
26 ///////////////////////////////////
27 // レジスタへ変数の内容をコピー
28 ///////////////////////////////////
29
30 if(IsRealNumberType(VarType)){
31 //実数
32 SetReg_RealVariable(VarType,&VarRelativeVar);
33 }
34 else{
35 //整数
36 SetReg_WholeVariable(VarType,&VarRelativeVar,REG_EAX);
37 }
38
39
40 if(IsWholeNumberType(VarType)&&lstrcmp(lpszRight,"1")==0&&
41 (idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
42 ////////////////////////////////////////////
43 // 整数型のインクリメント・デクリメント
44 ////////////////////////////////////////////
45
46 if(Is64Type(VarType)){
47 if(idCalc==CALC_ADDITION){
48 //64ビット インクリメント
49
50 //add eax,1
51 op_add_RV8(REG_EAX,1);
52
53 //adc edx,0
54 op_adc_RV8(REG_EDX,0);
55 }
56 else if(idCalc==CALC_SUBTRACTION){
57 //64ビット デクリメント
58
59 //sub eax,1
60 op_sub_RV8(REG_EAX,1);
61
62 //sbb edx,0
63 op_sbb_RV8(REG_EDX,0);
64 }
65 }
66 else{
67 if(idCalc==CALC_ADDITION){
68 //インクリメント
69 op_inc(REG_EAX);
70 }
71 else if(idCalc==CALC_SUBTRACTION){
72 //デクリメント
73 op_dec(REG_EAX);
74 }
75 }
76 }
77 else{
78 //変数オフセットを一時退避
79 //push ecx
80 op_push(REG_ECX);
81
82
83 if(VarType==DEF_DOUBLE){
84 //sub esp,8
85 op_sub_esp(8);
86
87 //fstp qword ptr[esp]
88 op_fstp_basereg(VarType,REG_ESP);
89 }
90 else if(VarType==DEF_SINGLE){
91 //sub esp,4
92 op_sub_esp(4);
93
94 //fstp dword ptr[esp]
95 op_fstp_basereg(VarType,REG_ESP);
96 }
97 else if(Is64Type(VarType)){
98 //push edx
99 op_push(REG_EDX);
100
101 //push eax
102 op_push(REG_EAX);
103 }
104 else{
105 //push eax
106 op_push(REG_EAX);
107 }
108
109 int CalcType;
110 CalcType=NumOpe(lpszRight,VarType,lpVarIndex,0);
111
112 if(VarType==DEF_DOUBLE) ChangeTypeToDouble(CalcType);
113 else if(VarType==DEF_SINGLE) ChangeTypeToSingle(CalcType);
114 else ChangeTypeToWhole(CalcType,VarType);
115
116 int type[255],sp;
117 LONG_PTR index_stack[255];
118 type[0]=VarType;
119 type[1]=VarType;
120 index_stack[0]=lpVarIndex;
121 index_stack[1]=lpVarIndex;
122 sp=2;
123
124 switch(idCalc){
125 case CALC_XOR:
126 Calc_Xor(type,index_stack,&sp);
127 break;
128 case CALC_OR:
129 Calc_Or(type,index_stack,&sp);
130 break;
131 case CALC_AND:
132 Calc_And(type,index_stack,&sp);
133 break;
134 case CALC_SHL:
135 Calc_SHL(type,&sp);
136 break;
137 case CALC_SHR:
138 Calc_SHR(type,&sp);
139 break;
140 case CALC_ADDITION:
141 case CALC_SUBTRACTION:
142 case CALC_PRODUCT:
143 CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp);
144 break;
145 case CALC_MOD:
146 Calc_Mod(type,&sp);
147 break;
148 case CALC_QUOTIENT:
149 Calc_Divide(type,&sp,VarType);
150 break;
151 case CALC_INTQUOTIENT:
152 Calc_IntDivide(type,index_stack,&sp);
153 break;
154 case CALC_POWER:
155 Calc_Power(type,&sp);
156 break;
157 }
158
159
160 if(VarType==DEF_DOUBLE){
161 //fld qword ptr[esp]
162 op_fld_basereg(VarType,REG_ESP);
163
164 //add esp,8
165 op_add_esp(8);
166 }
167 else if(VarType==DEF_SINGLE){
168 //fld dword ptr[esp]
169 op_fld_basereg(VarType,REG_ESP);
170
171 //add esp,4
172 op_add_esp(4);
173 }
174 else if(Is64Type(VarType)){
175 //pop eax
176 op_pop(REG_EAX);
177
178 //pop edx
179 op_pop(REG_EDX);
180 }
181 else{
182 //pop eax
183 op_pop(REG_EAX);
184 }
185
186
187 //変数オフセットを復元
188 //pop ecx
189 op_pop(REG_ECX);
190 }
191
192
193 /////////////////////////////////////////////////
194 // レジスタの内容を変数にコピー
195 /////////////////////////////////////////////////
196
197 if(IsUse_ecx(&VarRelativeVar)){
198 //pop ecx
199 op_pop(REG_ECX);
200 }
201
202 SetVariableFromEax(VarType,VarType,&VarRelativeVar);
203}
Note: See TracBrowser for help on using the repository browser.