source: dev/BasicCompiler64/increment.cpp@ 129

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

_System_StartupProgramの呼び出し順序を変更。

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