Changeset 339 in dev for trunk/abdev/BasicCompiler64/NumOpe.cpp
- Timestamp:
- Oct 3, 2007, 3:42:05 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/NumOpe.cpp
r331 r339 135 135 const CClass &objClass = leftType.GetClass(); 136 136 137 int UseReg=pobj_reg->GetNextReg(); 138 int XmmReg=pobj_reg->GetNextXmmReg(); 139 140 137 const int useReg=pobj_reg->GetNextReg(); 138 const int xmmReg=pobj_reg->GetNextXmmReg(); 139 140 141 //////////////////////////////// 142 // インデクサ(getアクセサ) 143 //////////////////////////////// 144 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 145 GetArrayElement(member,VarName,ArrayElements); 146 if(ArrayElements[0]){ 147 Type classType; 148 GetMemberType( leftType, VarName, classType, 0, false ); 149 if( classType.IsObject() ) 150 { 151 //オブジェクトポインタをr11にコピー 152 compiler.codeGenerator.op_mov_RR( REG_R11, useReg ); 153 154 RELATIVE_VAR relativeVar; 155 relativeVar.dwKind=VAR_DIRECTMEM; 156 157 if( !_member_offset( 158 true, //エラー表示あり 159 false, //読み込み専用 160 leftType, 161 VarName,&relativeVar,classType,0)) 162 { 163 return false; 164 } 165 166 // オブジェクトメンバのポインタをraxにコピー 167 if( !VarToReg( relativeVar, baseType, resultType ) ){ 168 SetError(11,termFull,cp); 169 } 170 171 ////////////////////////////////////////////////////// 172 ///// レジスタ資源のバックアップ 173 { BACKUP_REGISTER_RESOURCE 174 ////////////////////////////////////////////////////// 175 176 //オブジェクトポインタをスタックに入れておく 177 //mov qword ptr[rsp+offset],reg ※スタックフレームを利用 178 pobj_sf->push( useReg ); 179 180 char objectFullName[VN_SIZE], dummyArrayElements[VN_SIZE]; 181 GetArrayElement(termFull,objectFullName,dummyArrayElements); 182 183 CallIndexerGetterProc(useReg,classType,objectFullName, ArrayElements,resultType, PROCFLAG_NEW ); 184 185 pobj_sf->pop(); 186 187 ///////////////////////////////////////////// 188 ////// レジスタ資源を復元 189 RESTORE_REGISTER_RESOURCE 190 }//////////////////////////////////////////// 191 192 return true; 193 } 194 } 195 196 197 /////////////////////////////////////////////////////////////////// 198 // メンバを検索 199 /////////////////////////////////////////////////////////////////// 141 200 if( GetMemberType( leftType, member, resultType, 0, false ) ){ 142 201 // メンバが見つかったとき 143 202 144 203 //オブジェクトポインタをr11にコピー 145 compiler.codeGenerator.op_mov_RR( REG_R11, UseReg );204 compiler.codeGenerator.op_mov_RR( REG_R11, useReg ); 146 205 147 206 RELATIVE_VAR relativeVar; … … 191 250 //オブジェクトポインタをスタックに入れておく 192 251 //mov qword ptr[rsp+offset],reg ※スタックフレームを利用 193 pobj_sf->push( UseReg );252 pobj_sf->push( useReg ); 194 253 195 254 if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft ) ){ … … 217 276 } 218 277 219 SetUseRegFromRax(resultType.GetBasicType(), UseReg,XmmReg);278 SetUseRegFromRax(resultType.GetBasicType(),useReg,xmmReg); 220 279 221 280 // 型パラメータを解決
Note:
See TracChangeset
for help on using the changeset viewer.