source: dev/trunk/abdev/BasicCompiler64/increment.cpp@ 308

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

静的リンクライブラリにより、複数のグローバル領域が存在することになったのでそれぞれを関数ベースに分けた

File size: 3.9 KB
Line 
1#include "stdafx.h"
2
3#include <Compiler.h>
4
5#include "../BasicCompiler_Common/common.h"
6#include "Opcode.h"
7
8void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight){
9
10 ///////////////////////////
11 // 変数アドレスを取得
12 ///////////////////////////
13
14 RELATIVE_VAR VarRelativeVar;
15 Type varType;
16 if(!GetVarOffsetReadWrite(
17 lpszLeft,
18 &VarRelativeVar,
19 varType)) 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.IsDouble() ){
34 reg=REG_XMM0;
35 SetXmmReg_DoubleVariable(&VarRelativeVar,reg);
36 }
37 else if( varType.IsSingle() ){
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(varType.IsWhole()&&lstrcmp(lpszRight,"1")==0&&
48 (idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
49 if(idCalc==CALC_ADDITION){
50 //インクリメント
51 compiler.codeGenerator.op_inc(REG_RAX);
52 }
53 else if(idCalc==CALC_SUBTRACTION){
54 //デクリメント
55 compiler.codeGenerator.op_dec(REG_RAX);
56 }
57 }
58 else{
59 //結果を格納しているレジスタをブロッキング
60 pobj_BlockReg->lock(reg);
61
62 //右辺を計算
63 Type calcType;
64 if(reg==REG_RAX) reg=REG_RCX;
65 else reg=REG_RAX;
66 NumOpe(&reg,lpszRight,varType,calcType);
67
68 //レジスタのブロッキングを解除
69 pobj_BlockReg->clear();
70
71
72 if(varType.IsPointer()&&calcType.IsWhole()&&(!calcType.IsPointer())){
73 //左辺がポインタ型、右辺が整数型の場合は、エラーをださないようにする
74 calcType = varType;
75 }
76
77
78 /////////////////////////////////
79 // 右辺、左辺の型チェックを行う
80 /////////////////////////////////
81
82 CheckDifferentType(varType,calcType,0,0);
83
84
85 //レジスタ管理オブジェクトを生成
86 pobj_reg=new CRegister(REG_RAX);
87
88 //左辺用レジスタ
89 if(varType.IsReal())
90 pobj_reg->LockXmmReg();
91 else
92 pobj_reg->LockReg();
93
94 //右辺値レジスタ
95 if(varType.IsDouble())
96 {
97 ChangeTypeToXmm_Double(
98 calcType.GetBasicType(),
99 pobj_reg->LockXmmReg(),
100 pobj_reg->GetNextReg()
101 );
102 }
103 else if(varType.IsSingle())
104 {
105 ChangeTypeToXmm_Single(
106 calcType.GetBasicType(),
107 pobj_reg->LockXmmReg(),
108 pobj_reg->GetNextReg()
109 );
110 }
111 else
112 {
113 ChangeTypeToWhole(
114 calcType,
115 varType,
116 pobj_reg->LockReg(),
117 pobj_reg->GetNextXmmReg()
118 );
119 }
120
121 int type_stack[255],sp;
122 LONG_PTR index_stack[255];
123 type_stack[0]=varType.GetBasicType();
124 type_stack[1]=varType.GetBasicType();
125 index_stack[0]=varType.GetIndex();
126 index_stack[1]=varType.GetIndex();
127 sp=2;
128
129 switch(idCalc){
130 case CALC_XOR:
131 case CALC_OR:
132 case CALC_AND:
133 CalcTwoTerm_Logical(idCalc,type_stack,index_stack,&sp);
134 break;
135 case CALC_SHL:
136 case CALC_SHR:
137 Calc_Shift(idCalc,type_stack,&sp);
138 break;
139 case CALC_ADDITION:
140 case CALC_SUBTRACTION:
141 case CALC_PRODUCT:
142 CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp);
143 break;
144 case CALC_MOD:
145 Calc_Mod(type_stack,index_stack,&sp);
146 break;
147 case CALC_QUOTIENT:
148 Calc_Divide(type_stack,&sp,varType.GetBasicType());
149 break;
150 case CALC_INTQUOTIENT:
151 Calc_IntDivide(type_stack,index_stack,&sp);
152 break;
153 case CALC_POWER:
154 Calc_Power(type_stack,&sp);
155 break;
156 }
157
158 //レジスタ管理オブジェクトを解放
159 delete pobj_reg;
160 pobj_reg=0;
161 }
162
163
164 /////////////////////////////////////////////////
165 // rax(実数はxmm0)の内容を変数にコピー
166 /////////////////////////////////////////////////
167
168 //変数オフセットを復元
169 if(IsUse_r11(&VarRelativeVar)){
170 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
171 pobj_sf->pop(REG_R11);
172 }
173
174 SetVariableFromRax(varType,varType.GetBasicType(),&VarRelativeVar);
175}
Note: See TracBrowser for help on using the repository browser.