source: dev/BasicCompiler64/increment.cpp@ 3

Last change on this file since 3 was 3, checked in by dai_9181, 17 years ago
File size: 3.7 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(!GetVarOffset(
15 1,
16 lpszLeft,
17 &VarType,
18 &VarRelativeVar,
19 &lpVarIndex)) return;
20
21 //変数オフセットを一時退避
22 if(IsUse_r11(&VarRelativeVar)){
23 //mov qword ptr[rsp+offset],r11 ※スタックフレームを利用
24 pobj_sf->push(REG_R11);
25 }
26
27
28 ///////////////////////////////////
29 // レジスタへ変数の内容をコピー
30 ///////////////////////////////////
31
32 int reg;
33 if(VarType==DEF_DOUBLE){
34 reg=REG_XMM0;
35 SetXmmReg_DoubleVariable(&VarRelativeVar,reg);
36 }
37 else if(VarType==DEF_SINGLE){
38 reg=REG_XMM0;
39 SetXmmReg_SingleVariable(&VarRelativeVar,reg);
40 }
41 else{
42 reg=REG_RAX;
43 SetReg_WholeVariable(VarType,&VarRelativeVar,reg);
44 }
45
46
47 if(IsWholeNumberType(VarType)&&lstrcmp(lpszRight,"1")==0&&
48 (idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
49 if(idCalc==CALC_ADDITION){
50 //インクリメント
51 op_inc(REG_RAX);
52 }
53 else if(idCalc==CALC_SUBTRACTION){
54 //デクリメント
55 op_dec(REG_RAX);
56 }
57 }
58 else{
59 //結果を格納しているレジスタをブロッキング
60 pobj_BlockReg->lock(reg);
61
62 //右辺を計算
63 int CalcType;
64 LONG_PTR lpCalcIndex;
65 if(reg==REG_RAX) reg=REG_RCX;
66 else reg=REG_RAX;
67 CalcType=NumOpe(&reg,lpszRight,VarType,lpVarIndex,&lpCalcIndex);
68
69 //レジスタのブロッキングを解除
70 pobj_BlockReg->clear();
71
72
73 if(IsPtrType(VarType)&&IsWholeNumberType(CalcType)&&(!IsPtrType(CalcType))){
74 //左辺がポインタ型、右辺が整数型の場合は、エラーをださないようにする
75 CalcType=VarType;
76 lpCalcIndex=lpVarIndex;
77 }
78
79
80 /////////////////////////////////
81 // 右辺、左辺の型チェックを行う
82 /////////////////////////////////
83
84 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
85
86
87 //レジスタ管理オブジェクトを生成
88 pobj_reg=new CRegister(REG_RAX);
89
90 //左辺用レジスタ
91 if(IsRealNumberType(VarType))
92 pobj_reg->LockXmmReg();
93 else
94 pobj_reg->LockReg();
95
96 //右辺値レジスタ
97 if(VarType==DEF_DOUBLE)
98 ChangeTypeToXmm_Double(CalcType,
99 pobj_reg->LockXmmReg(),
100 pobj_reg->GetNextReg());
101 else if(VarType==DEF_SINGLE)
102 ChangeTypeToXmm_Single(CalcType,
103 pobj_reg->LockXmmReg(),
104 pobj_reg->GetNextReg());
105 else
106 ChangeTypeToWhole(CalcType,VarType,
107 pobj_reg->LockReg(),
108 pobj_reg->GetNextXmmReg());
109
110 int type[255],sp;
111 LONG_PTR index_stack[255];
112 type[0]=VarType;
113 type[1]=VarType;
114 index_stack[0]=lpVarIndex;
115 index_stack[1]=lpVarIndex;
116 sp=2;
117
118 switch(idCalc){
119 case CALC_XOR:
120 case CALC_OR:
121 case CALC_AND:
122 CalcTwoTerm_Logical(idCalc,type,index_stack,&sp);
123 break;
124 case CALC_SHL:
125 case CALC_SHR:
126 Calc_Shift(idCalc,type,&sp);
127 break;
128 case CALC_ADDITION:
129 case CALC_SUBTRACTION:
130 case CALC_PRODUCT:
131 CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp);
132 break;
133 case CALC_MOD:
134 Calc_Mod(type,index_stack,&sp);
135 break;
136 case CALC_QUOTIENT:
137 Calc_Divide(type,&sp,VarType);
138 break;
139 case CALC_INTQUOTIENT:
140 Calc_IntDivide(type,index_stack,&sp);
141 break;
142 case CALC_POWER:
143 Calc_Power(type,&sp);
144 break;
145 }
146
147 //レジスタ管理オブジェクトを解放
148 delete pobj_reg;
149 pobj_reg=0;
150 }
151
152
153 /////////////////////////////////////////////////
154 // rax(実数はxmm0)の内容を変数にコピー
155 /////////////////////////////////////////////////
156
157 //変数オフセットを復元
158 if(IsUse_r11(&VarRelativeVar)){
159 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
160 pobj_sf->pop(REG_R11);
161 }
162
163 SetVariableFromRax(VarType,VarType,&VarRelativeVar);
164}
Note: See TracBrowser for help on using the repository browser.