Changeset 39422 in webkit for trunk/JavaScriptCore/assembler/MacroAssembler.h
- Timestamp:
- Dec 20, 2008, 2:11:31 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/MacroAssembler.h
r39389 r39422 120 120 // Describes a complex addressing mode. 121 121 struct BaseIndex { 122 BaseIndex(RegisterID base, RegisterID index, int32_t offset = 0)123 : base(base)124 , index(index)125 , scale(TimesOne)126 , offset(offset)127 {128 }129 130 122 BaseIndex(RegisterID base, RegisterID index, Scale scale, int32_t offset = 0) 131 123 : base(base) … … 142 134 }; 143 135 136 // AbsoluteAddress: 137 // 138 // Describes an memory operand given by a pointer. For regular load & store 139 // operations an unwrapped void* will be used, rather than using this. 140 struct AbsoluteAddress { 141 explicit AbsoluteAddress(void* ptr) 142 : m_ptr(ptr) 143 { 144 } 145 146 void* m_ptr; 147 }; 148 144 149 145 150 class Jump; … … 163 168 { 164 169 } 170 171 #if !PLATFORM(X86_64) 172 static void repatch(void* address, void* value) 173 { 174 X86Assembler::repatchImmediate(reinterpret_cast<intptr_t>(address), reinterpret_cast<uint32_t>(value)); 175 } 176 #endif 177 178 private: 179 X86Assembler::JmpDst m_label; 180 }; 181 182 // DataLabel32: 183 // 184 // A DataLabelPtr is used to refer to a location in the code containing a pointer to be 185 // repatched after the code has been generated. 186 class DataLabel32 { 187 friend class MacroAssembler; 188 friend class RepatchBuffer; 189 190 public: 191 DataLabel32() 192 { 193 } 194 195 DataLabel32(MacroAssembler* masm) 196 : m_label(masm->m_assembler.label()) 197 { 198 } 199 200 #if !PLATFORM(X86_64) 201 static void repatch(void* address, int32_t value) 202 { 203 X86Assembler::repatchImmediate(reinterpret_cast<intptr_t>(address), value); 204 } 205 #endif 165 206 166 207 private: … … 186 227 { 187 228 } 229 230 // FIXME: transitionary method, while we replace JmpSrces with Jumps. 231 operator X86Assembler::JmpDst() 232 { 233 return m_label; 234 } 188 235 189 236 private: … … 238 285 } 239 286 287 static void repatch(void* address, void* destination) 288 { 289 X86Assembler::repatchBranchOffset(reinterpret_cast<intptr_t>(address), destination); 290 } 291 240 292 private: 241 293 X86Assembler::JmpSrc m_jmp; … … 247 299 // All jumps in the set will be linked to the same destination. 248 300 class JumpList { 301 friend class RepatchBuffer; 302 249 303 public: 250 304 void link(MacroAssembler* masm) … … 274 328 } 275 329 330 bool empty() 331 { 332 return !m_jumps.size(); 333 } 334 276 335 private: 277 Vector<Jump > m_jumps;336 Vector<Jump, 16> m_jumps; 278 337 }; 279 338 … … 307 366 X86Assembler::link(m_code, jump.m_jmp, target); 308 367 } 309 368 369 void link(JumpList list, void* target) 370 { 371 for (unsigned i = 0; i < list.m_jumps.size(); ++i) 372 X86Assembler::link(m_code, list.m_jumps[i], target); 373 } 374 310 375 void* addressOf(Jump jump) 311 376 { 312 377 return X86Assembler::getRelocatedAddress(m_code, jump.m_jmp); 313 378 } 314 379 315 380 void* addressOf(Label label) 316 381 { … … 389 454 } 390 455 456 #if !PLATFORM(X86_64) 457 void add32(Imm32 imm, AbsoluteAddress address) 458 { 459 m_assembler.addl_im(imm.m_value, address.m_ptr); 460 } 461 #endif 462 391 463 void add32(Address src, RegisterID dest) 392 464 { … … 394 466 } 395 467 468 void andPtr(RegisterID src, RegisterID dest) 469 { 470 #if PLATFORM(X86_64) 471 m_assembler.andq_rr(src, dest); 472 #else 473 and32(src, dest); 474 #endif 475 } 476 477 void andPtr(Imm32 imm, RegisterID srcDest) 478 { 479 #if PLATFORM(X86_64) 480 m_assembler.andq_ir(imm.m_value, srcDest); 481 #else 482 and32(imm, srcDest); 483 #endif 484 } 485 396 486 void and32(RegisterID src, RegisterID dest) 397 487 { … … 402 492 { 403 493 m_assembler.andl_ir(imm.m_value, dest); 404 }405 406 void andPtr(RegisterID src, RegisterID dest)407 {408 #if PLATFORM(X86_64)409 m_assembler.andq_rr(src, dest);410 #else411 and32(src, dest);412 #endif413 }414 415 void andPtr(Imm32 imm, RegisterID srcDest)416 {417 #if PLATFORM(X86_64)418 m_assembler.andq_ir(imm.m_value, srcDest);419 #else420 and32(imm, srcDest);421 #endif422 494 } 423 495 … … 524 596 } 525 597 598 #if !PLATFORM(X86_64) 599 void sub32(Imm32 imm, AbsoluteAddress address) 600 { 601 m_assembler.subl_im(imm.m_value, address.m_ptr); 602 } 603 #endif 604 526 605 void sub32(Address src, RegisterID dest) 527 606 { … … 564 643 #endif 565 644 } 645 646 #if !PLATFORM(X86_64) 647 DataLabel32 loadPtrWithAddressRepatch(Address address, RegisterID dest) 648 { 649 m_assembler.movl_mr_disp32(address.offset, address.base, dest); 650 return DataLabel32(this); 651 } 652 #endif 566 653 567 654 void loadPtr(BaseIndex address, RegisterID dest) … … 628 715 } 629 716 717 #if !PLATFORM(X86_64) 718 DataLabel32 storePtrWithAddressRepatch(RegisterID src, Address address) 719 { 720 m_assembler.movl_rm_disp32(src, address.offset, address.base); 721 return DataLabel32(this); 722 } 723 #endif 724 630 725 void storePtr(RegisterID src, BaseIndex address) 631 726 { … … 704 799 { 705 800 m_assembler.push_r(src); 801 } 802 803 void push(Address address) 804 { 805 m_assembler.push_m(address.offset, address.base); 806 } 807 808 void push(Imm32 imm) 809 { 810 m_assembler.push_i32(imm.m_value); 706 811 } 707 812 … … 880 985 881 986 public: 987 Jump ja32(RegisterID left, Imm32 right) 988 { 989 compareImm32ForBranch(left, right.m_value); 990 return Jump(m_assembler.ja()); 991 } 992 882 993 Jump jae32(RegisterID left, Imm32 right) 883 994 { … … 914 1025 } 915 1026 1027 Jump jePtr(RegisterID reg, ImmPtr imm) 1028 { 1029 #if PLATFORM(X86_64) 1030 move(imm, scratchRegister); 1031 return jePtr(scratchRegister, reg); 1032 #else 1033 return je32(reg, Imm32(reinterpret_cast<int32_t>(imm.m_value))); 1034 #endif 1035 } 1036 916 1037 Jump je32(RegisterID op1, RegisterID op2) 917 1038 { … … 1031 1152 #endif 1032 1153 } 1154 1155 #if !PLATFORM(X86_64) 1156 Jump jnePtr(AbsoluteAddress address, ImmPtr imm) 1157 { 1158 m_assembler.cmpl_im(reinterpret_cast<uint32_t>(imm.m_value), address.m_ptr); 1159 return Jump(m_assembler.jne()); 1160 } 1161 #endif 1162 1163 #if !PLATFORM(X86_64) 1164 Jump jnePtrWithRepatch(Address address, DataLabelPtr& dataLabel, ImmPtr initialValue = ImmPtr(0)) 1165 { 1166 m_assembler.cmpl_im_force32(reinterpret_cast<int32_t>(initialValue.m_value), address.offset, address.base); 1167 dataLabel = DataLabelPtr(this); 1168 return Jump(m_assembler.jne()); 1169 } 1170 #endif 1033 1171 1034 1172 Jump jne32(RegisterID op1, RegisterID op2) … … 1297 1435 return Label(this); 1298 1436 } 1437 1438 Label align() 1439 { 1440 m_assembler.align(16); 1441 return Label(this); 1442 } 1443 1444 ptrdiff_t differenceBetween(Label from, Jump to) 1445 { 1446 return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_jmp); 1447 } 1448 1449 ptrdiff_t differenceBetween(Label from, Label to) 1450 { 1451 return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_label); 1452 } 1453 1454 ptrdiff_t differenceBetween(Label from, DataLabelPtr to) 1455 { 1456 return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_label); 1457 } 1458 1459 ptrdiff_t differenceBetween(Label from, DataLabel32 to) 1460 { 1461 return X86Assembler::getDifferenceBetweenLabels(from.m_label, to.m_label); 1462 } 1299 1463 1300 1464 void ret()
Note:
See TracChangeset
for help on using the changeset viewer.