Changeset 226 in dev for trunk/abdev/BasicCompiler64/Compile_Object.cpp
- Timestamp:
- Jul 22, 2007, 4:58:47 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_Object.cpp
r206 r226 1 1 #include "stdafx.h" 2 3 #include <Compiler.h> 2 4 3 5 #include "../BasicCompiler_Common/common.h" … … 113 115 //※添え字上限値であることを考慮 114 116 //add rax,1 115 op_add_RV(REG_RAX,1);117 compiler.codeGenerator.op_add_RV(REG_RAX,1); 116 118 117 119 //オブジェクトの個数をrbxに一時保持 118 120 //※rbxは関数が呼ばれても不変 119 121 //mov rbx,rax 120 op_mov_RR(REG_RBX,REG_RAX);122 compiler.codeGenerator.op_mov_RR(REG_RBX,REG_RAX); 121 123 122 124 //imul rax,size 123 op_imul_RV(sizeof(_int64),REG_RAX,typeSize);125 compiler.codeGenerator.op_imul_RV(sizeof(_int64),REG_RAX,typeSize); 124 126 125 127 //add rax,OBJECT_HEAD_SIZE 126 op_add_RV(REG_RAX,OBJECT_HEAD_SIZE);128 compiler.codeGenerator.op_add_RV(REG_RAX,OBJECT_HEAD_SIZE); 127 129 128 130 //mov rcx,rax 129 op_mov_RR(REG_RCX,REG_RAX);131 compiler.codeGenerator.op_mov_RR(REG_RCX,REG_RAX); 130 132 } 131 133 else{ … … 133 135 //※rbxは関数が呼ばれても不変 134 136 //mov rbx,1 135 op_mov_RV(sizeof(_int64),REG_RBX,1);137 compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RBX,1); 136 138 137 139 //mov rcx,typeSize+OBJECT_HEAD_SIZE 138 op_mov_RV(sizeof(_int64),REG_RCX,typeSize+OBJECT_HEAD_SIZE);140 compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,typeSize+OBJECT_HEAD_SIZE); 139 141 } 140 142 … … 145 147 //call _System_GC_malloc_ForObject 146 148 extern const UserProc *pSub_System_GC_malloc_ForObject; 147 op_call(pSub_System_GC_malloc_ForObject);149 compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObject); 148 150 } 149 151 else{ … … 153 155 //call _System_GC_malloc_ForObjectPtr 154 156 extern const UserProc *pSub_System_GC_malloc_ForObjectPtr; 155 op_call(pSub_System_GC_malloc_ForObjectPtr);157 compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObjectPtr); 156 158 } 157 159 … … 168 170 169 171 //mov qword ptr[rax],rbx(オブジェクトの個数) 170 op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);171 172 //add rax,PTR_SIZE 173 op_add_RV(REG_RAX,PTR_SIZE);172 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 173 174 //add rax,PTR_SIZE 175 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 174 176 175 177 176 178 //mov qword ptr[rax],typeSize(オブジェクトのサイズ) 177 op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,typeSize);178 179 //add rax,PTR_SIZE 180 op_add_RV(REG_RAX,PTR_SIZE);179 compiler.codeGenerator.op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,typeSize); 180 181 //add rax,PTR_SIZE 182 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 181 183 182 184 … … 185 187 186 188 //mov rcx,DestructorProcAddr(デストラクタの関数ポインタ) 187 op_mov_RV(sizeof(_int64),REG_RCX,0);189 compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,0); 188 190 obp-=sizeof(long); 189 191 pobj_SubAddrSchedule->add(&method->GetUserProc(),0); … … 192 194 193 195 //mov qword ptr[rax],rcx 194 op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);195 196 //add rax,PTR_SIZE 197 op_add_RV(REG_RAX,PTR_SIZE);196 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 197 198 //add rax,PTR_SIZE 199 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 198 200 199 201 200 202 // リザーブ領域 201 203 //add rax,PTR_SIZE 202 op_add_RV(REG_RAX,PTR_SIZE);204 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 203 205 204 206 … … 229 231 230 232 //sub rax,OBJECT_HEAD_SIZE 231 op_sub_RV(sizeof(_int64),REG_RAX,OBJECT_HEAD_SIZE);233 compiler.codeGenerator.op_sub_RV(sizeof(_int64),REG_RAX,OBJECT_HEAD_SIZE); 232 234 233 235 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 … … 236 238 237 239 //mov rbx,qword ptr[rax](オブジェクトの個数) 238 op_mov_RM(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);239 240 //add rax,PTR_SIZE 241 op_add_RV(REG_RAX,PTR_SIZE);240 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 241 242 //add rax,PTR_SIZE 243 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 242 244 243 245 244 246 //mov rsi,qword ptr[rax](オブジェクトのサイズ) 245 op_mov_RM(sizeof(_int64),REG_RSI,REG_RAX,0,MOD_BASE);246 247 //add rax,PTR_SIZE 248 op_add_RV(REG_RAX,PTR_SIZE);247 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RSI,REG_RAX,0,MOD_BASE); 248 249 //add rax,PTR_SIZE 250 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 249 251 250 252 251 253 //mov rdi,qword ptr[rax](デストラクタの関数ポインタ) 252 op_mov_RM(sizeof(_int64),REG_RDI,REG_RAX,0,MOD_BASE);253 254 //add rax,PTR_SIZE 255 op_add_RV(REG_RAX,PTR_SIZE);254 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RDI,REG_RAX,0,MOD_BASE); 255 256 //add rax,PTR_SIZE 257 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 256 258 257 259 258 260 // リザーブ領域 259 261 //add rax,PTR_SIZE 260 op_add_RV(REG_RAX,PTR_SIZE);262 compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE); 261 263 262 264 263 265 //mov rcx,rax 264 op_mov_RR(REG_RCX,REG_RAX);266 compiler.codeGenerator.op_mov_RR(REG_RCX,REG_RAX); 265 267 266 268 … … 280 282 281 283 //add rcx,rsi 282 op_add64_reg(REG_RCX,REG_RSI);284 compiler.codeGenerator.op_add64_reg(REG_RCX,REG_RSI); 283 285 284 286 //sub rbx,1 285 op_sub_RV(sizeof(_int64),REG_RBX,1);287 compiler.codeGenerator.op_sub_RV(sizeof(_int64),REG_RBX,1); 286 288 287 289 //jnz ↑ … … 302 304 //call _System_GC_free_for_SweepingDelete 303 305 extern const UserProc *pSub_System_GC_free_for_SweepingDelete; 304 op_call(pSub_System_GC_free_for_SweepingDelete);306 compiler.codeGenerator.op_call(pSub_System_GC_free_for_SweepingDelete); 305 307 } 306 308 else{ 307 309 //call free 308 310 extern const UserProc *pSub_free; 309 op_call(pSub_free);311 compiler.codeGenerator.op_call(pSub_free); 310 312 } 311 313 }
Note:
See TracChangeset
for help on using the changeset viewer.