source: dev/trunk/abdev/BasicCompiler32/increment.cpp@ 235

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

CodeGeneratorクラスのベースを実装

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