source: dev/BasicCompiler64/increment.cpp@ 48

Last change on this file since 48 was 11, checked in by dai_9181, 18 years ago

Const変数の書き込み規制を有効化(グローバル/ローカル変数のみ)
定数オブジェクトと定数メンバは未実装。

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