Changeset 38857 in webkit for trunk/JavaScriptCore
- Timestamp:
- Dec 1, 2008, 1:18:36 AM (16 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r38856 r38857 1 2008-11-29 Gavin Barraclough <[email protected]> 2 3 Reviewed by Camron Zwarich. 4 5 Enable WREC on PLATFORM(X86_64). This change predominantly requires changes to the 6 WREC::Generator::generateEnter method to support the x86-64 ABI, and addition of 7 support for a limited number of quadword operations in the X86Assembler. 8 9 This patch will cause the JS heap to be allocated with RWX permissions on 64-bit Mac 10 platforms. This is a regression with respect to previous 64-bit behaviour, but is no 11 more permissive than on 32-bit builds. This issue should be addressed at some point. 12 (This is tracked by bug #21783.) 13 14 https://bugs.webkit.org/show_bug.cgi?id=22554 15 Greater than 4x speedup on regexp-dna, on x86-64. 16 17 * assembler/MacroAssembler.h: 18 (JSC::MacroAssembler::addPtr): 19 (JSC::MacroAssembler::loadPtr): 20 (JSC::MacroAssembler::storePtr): 21 (JSC::MacroAssembler::pop): 22 (JSC::MacroAssembler::push): 23 (JSC::MacroAssembler::move): 24 * assembler/X86Assembler.h: 25 (JSC::X86Assembler::): 26 (JSC::X86Assembler::movq_rr): 27 (JSC::X86Assembler::addl_i8m): 28 (JSC::X86Assembler::addl_i32r): 29 (JSC::X86Assembler::addq_i8r): 30 (JSC::X86Assembler::addq_i32r): 31 (JSC::X86Assembler::movq_mr): 32 (JSC::X86Assembler::movq_rm): 33 * wrec/WREC.h: 34 * wrec/WRECGenerator.cpp: 35 (JSC::WREC::Generator::generateEnter): 36 (JSC::WREC::Generator::generateReturnSuccess): 37 (JSC::WREC::Generator::generateReturnFailure): 38 * wtf/Platform.h: 39 * wtf/TCSystemAlloc.cpp: 40 1 41 2008-12-01 Cameron Zwarich <[email protected]> 2 42 -
trunk/JavaScriptCore/assembler/MacroAssembler.h
r38854 r38857 255 255 // object). 256 256 257 void addPtr(Imm32 imm, RegisterID dest) 258 { 259 #if PLATFORM(X86_64) 260 if (CAN_SIGN_EXTEND_8_32(imm.m_value)) 261 m_assembler.addq_i8r(imm.m_value, dest); 262 else 263 m_assembler.addq_i32r(imm.m_value, dest); 264 #else 265 if (CAN_SIGN_EXTEND_8_32(imm.m_value)) 266 m_assembler.addl_i8r(imm.m_value, dest); 267 else 268 m_assembler.addl_i32r(imm.m_value, dest); 269 #endif 270 } 271 257 272 void add32(Imm32 imm, RegisterID dest) 258 273 { … … 296 311 void loadPtr(ImplicitAddress address, RegisterID dest) 297 312 { 313 #if PLATFORM(X86_64) 314 if (address.offset) 315 m_assembler.movq_mr(address.offset, address.base, dest); 316 else 317 m_assembler.movq_mr(address.base, dest); 318 #else 298 319 if (address.offset) 299 320 m_assembler.movl_mr(address.offset, address.base, dest); 300 321 else 301 322 m_assembler.movl_mr(address.base, dest); 323 #endif 302 324 } 303 325 … … 320 342 void storePtr(RegisterID src, ImplicitAddress address) 321 343 { 344 #if PLATFORM(X86_64) 345 if (address.offset) 346 m_assembler.movq_rm(src, address.offset, address.base); 347 else 348 m_assembler.movq_rm(src, address.base); 349 #else 322 350 if (address.offset) 323 351 m_assembler.movl_rm(src, address.offset, address.base); 324 352 else 325 353 m_assembler.movl_rm(src, address.base); 354 #endif 326 355 } 327 356 … … 351 380 void pop(RegisterID dest) 352 381 { 382 #if PLATFORM(X86_64) 383 m_assembler.popq_r(dest); 384 #else 353 385 m_assembler.popl_r(dest); 386 #endif 354 387 } 355 388 356 389 void push(RegisterID src) 357 390 { 391 #if PLATFORM(X86_64) 392 m_assembler.pushq_r(src); 393 #else 358 394 m_assembler.pushl_r(src); 395 #endif 359 396 } 360 397 361 398 void pop() 362 399 { 363 m_assembler.addl_i8r(sizeof(void*), X86::esp);400 addPtr(Imm32(sizeof(void*)), X86::esp); 364 401 } 365 402 … … 381 418 void move(Imm32 imm, RegisterID dest) 382 419 { 420 // Note: on 64-bit the Imm32 value is zero extended into the register, it 421 // may be useful to have a separate version that sign extends the value? 383 422 if (!imm.m_value) 384 423 m_assembler.xorl_rr(dest, dest); 385 424 else 386 425 m_assembler.movl_i32r(imm.m_value, dest); 426 } 427 428 void move(RegisterID src, RegisterID dest) 429 { 430 // Note: on 64-bit this is is a full register move; perhaps it would be 431 // useful to have separate move32 & movePtr, with move32 zero extending? 432 #if PLATFORM(X86_64) 433 m_assembler.movq_rr(src, dest); 434 #else 435 m_assembler.movl_rr(src, dest); 436 #endif 387 437 } 388 438 -
trunk/JavaScriptCore/assembler/X86Assembler.h
r38839 r38857 29 29 #include <wtf/Platform.h> 30 30 31 #if ENABLE(ASSEMBLER) && PLATFORM(X86)31 #if ENABLE(ASSEMBLER) && (PLATFORM(X86) || PLATFORM(X86_64)) 32 32 33 33 #include "AssemblerBuffer.h" … … 88 88 OP_CMP_EvGv = 0x39, 89 89 OP_CMP_GvEv = 0x3B, 90 REX_W = 0x48, 90 91 OP_PUSH_EAX = 0x50, 91 92 OP_POP_EAX = 0x58, … … 218 219 } 219 220 221 #if PLATFORM(X86_64) 222 void pushq_r(RegisterID reg) 223 { 224 m_buffer->putByte(OP_PUSH_EAX + reg); 225 } 226 227 void popq_r(RegisterID reg) 228 { 229 m_buffer->putByte(OP_POP_EAX + reg); 230 } 231 #else 220 232 void pushl_r(RegisterID reg) 221 233 { … … 245 257 modRm_opm(GROUP1A_OP_POP, base, offset); 246 258 } 259 #endif 247 260 248 261 void movl_rr(RegisterID src, RegisterID dst) … … 252 265 } 253 266 267 #if PLATFORM(X86_64) 268 void movq_rr(RegisterID src, RegisterID dst) 269 { 270 m_buffer->putByte(REX_W); 271 m_buffer->putByte(OP_MOV_EvGv); 272 modRm_rr(src, dst); 273 } 274 #endif 275 254 276 void addl_rr(RegisterID src, RegisterID dst) 255 277 { … … 257 279 modRm_rr(src, dst); 258 280 } 281 282 #if !PLATFORM(X86_64) 283 void addl_i8m(int imm, void* addr) 284 { 285 m_buffer->putByte(OP_GROUP1_EvIb); 286 modRm_opm(GROUP1_OP_ADD, addr); 287 m_buffer->putByte(imm); 288 } 289 #endif 259 290 260 291 void addl_i8r(int imm, RegisterID dst) … … 265 296 } 266 297 267 void addl_i8m(int imm, void* addr)268 {269 m_buffer->putByte(OP_GROUP1_EvIb);270 modRm_opm(GROUP1_OP_ADD, addr);271 m_buffer->putByte(imm);272 }273 274 298 void addl_i32r(int imm, RegisterID dst) 275 299 { … … 279 303 } 280 304 305 #if PLATFORM(X86_64) 306 void addq_i8r(int imm, RegisterID dst) 307 { 308 m_buffer->putByte(REX_W); 309 m_buffer->putByte(OP_GROUP1_EvIb); 310 modRm_opr(GROUP1_OP_ADD, dst); 311 m_buffer->putByte(imm); 312 } 313 314 void addq_i32r(int imm, RegisterID dst) 315 { 316 m_buffer->putByte(REX_W); 317 m_buffer->putByte(OP_GROUP1_EvIz); 318 modRm_opr(GROUP1_OP_ADD, dst); 319 m_buffer->putInt(imm); 320 } 321 #endif 322 281 323 void addl_mr(int offset, RegisterID base, RegisterID dst) 282 324 { … … 344 386 } 345 387 388 #if !PLATFORM(X86_64) 346 389 void cmpl_i32m(int imm, void* addr) 347 390 { … … 350 393 m_buffer->putInt(imm); 351 394 } 395 #endif 352 396 353 397 void cmpl_i8m(int imm, int offset, RegisterID base, RegisterID index, int scale) … … 428 472 } 429 473 474 #if !PLATFORM(X86_64) 430 475 void subl_i8m(int imm, void* addr) 431 476 { … … 434 479 m_buffer->putByte(imm); 435 480 } 481 #endif 436 482 437 483 void subl_i32r(int imm, RegisterID dst) … … 569 615 } 570 616 617 #if PLATFORM(X86_64) 618 void movq_mr(RegisterID base, RegisterID dst) 619 { 620 m_buffer->putByte(REX_W); 621 m_buffer->putByte(OP_MOV_GvEv); 622 modRm_rm(dst, base); 623 } 624 625 void movq_mr(int offset, RegisterID base, RegisterID dst) 626 { 627 m_buffer->ensureSpace(maxInstructionSize); 628 m_buffer->putByteUnchecked(REX_W); 629 m_buffer->putByteUnchecked(OP_MOV_GvEv); 630 modRm_rm_Unchecked(dst, base, offset); 631 } 632 #endif 633 634 #if !PLATFORM(X86_64) 571 635 void movl_mr(void* addr, RegisterID dst) 572 636 { … … 574 638 modRm_rm(dst, addr); 575 639 } 640 #endif 576 641 577 642 void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst) … … 621 686 modRm_rm_Unchecked(src, base, offset); 622 687 } 623 688 689 #if PLATFORM(X86_64) 690 void movq_rm(RegisterID src, RegisterID base) 691 { 692 m_buffer->putByte(REX_W); 693 m_buffer->putByte(OP_MOV_EvGv); 694 modRm_rm(src, base); 695 } 696 697 void movq_rm(RegisterID src, int offset, RegisterID base) 698 { 699 m_buffer->ensureSpace(maxInstructionSize); 700 m_buffer->putByteUnchecked(REX_W); 701 m_buffer->putByteUnchecked(OP_MOV_EvGv); 702 modRm_rm_Unchecked(src, base, offset); 703 } 704 #endif 705 624 706 void movl_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale) 625 707 { … … 643 725 } 644 726 727 #if !PLATFORM(X86_64) 645 728 void movl_i32m(int imm, void* addr) 646 729 { … … 649 732 m_buffer->putInt(imm); 650 733 } 734 #endif 651 735 652 736 void leal_mr(int offset, RegisterID base, RegisterID dst) … … 687 771 } 688 772 773 #if !PLATFORM(X86_64) 689 774 void xorpd_mr(void* addr, XMMRegisterID dst) 690 775 { … … 694 779 modRm_rm((RegisterID)dst, addr); 695 780 } 781 #endif 696 782 697 783 void movsd_rm(XMMRegisterID src, int offset, RegisterID base) … … 1045 1131 } 1046 1132 1133 #if !PLATFORM(X86_64) 1047 1134 void modRm_rm(RegisterID reg, void* addr) 1048 1135 { … … 1050 1137 m_buffer->putInt((int)addr); 1051 1138 } 1139 #endif 1052 1140 1053 1141 void modRm_rm(RegisterID reg, RegisterID base) … … 1142 1230 } 1143 1231 1232 #if !PLATFORM(X86_64) 1144 1233 void modRm_opm(OpcodeID opcodeID, void* addr) 1145 1234 { 1146 1235 modRm_rm(static_cast<RegisterID>(opcodeID), addr); 1147 1236 } 1237 #endif 1148 1238 1149 1239 void modRm_opmsib(OpcodeID opcodeID, RegisterID base, RegisterID index, int scale, int offset) -
trunk/JavaScriptCore/wrec/WREC.h
r38839 r38857 33 33 #include <wtf/unicode/Unicode.h> 34 34 35 #if COMPILER(GCC) 35 #if COMPILER(GCC) && PLATFORM(X86) 36 36 #define WREC_CALL __attribute__ ((regparm (3))) 37 37 #else … … 47 47 48 48 typedef int (*CompiledRegExp)(const UChar* input, unsigned start, unsigned length, int* output) WREC_CALL; 49 // CompiledRegExp compileRegExp(Interpreter*, const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, bool ignoreCase = false, bool multiline = false);50 49 51 50 } } // namespace JSC::WREC -
trunk/JavaScriptCore/wrec/WRECGenerator.cpp
r38839 r38857 41 41 void Generator::generateEnter() 42 42 { 43 // Save callee save registers. 44 push(output); 45 push(character); 43 #if PLATFORM(X86_64) 44 // On x86-64 edi and esi are caller preserved, so nothing to do here. 45 // The four arguments have been passed in the registers %rdi, %rsi, 46 // %rdx, %rcx - shuffle these into the expected locations. 47 move(X86::edi, input); // (arg 1) edi -> eax 48 move(X86::ecx, output); // (arg 4) ecx -> edi 49 move(X86::edx, length); // (arg 3) edx -> ecx 50 move(X86::esi, index); // (arg 2) esi -> edx 51 52 #else 53 // On x86 edi & esi are callee preserved registers. 54 push(X86::edi); 55 push(X86::esi); 46 56 47 57 #if COMPILER(MSVC) … … 52 62 peek(output, 6); 53 63 #else 54 // Initialize the output register. 64 // On gcc the function is regparm(3), so the input, index, and length registers 65 // (eax, edx, and ecx respectively) already contain the appropriate values. 66 // Just load the fourth argument (output) into edi 55 67 peek(output, 3); 68 #endif 56 69 #endif 57 70 … … 72 85 73 86 // Restore callee save registers. 74 pop(character); 75 pop(output); 87 #if !PLATFORM(X86_64) 88 pop(X86::esi); 89 pop(X86::edi); 90 #endif 76 91 ret(); 77 92 } … … 113 128 pop(); 114 129 move(Imm32(-1), X86::eax); 115 pop(character); 116 pop(output); 130 #if !PLATFORM(X86_64) 131 pop(X86::esi); 132 pop(X86::edi); 133 #endif 117 134 ret(); 118 135 } -
trunk/JavaScriptCore/wtf/Platform.h
r38839 r38857 428 428 429 429 /* WREC only supports x86 at the moment, and has only been tested on Mac and Windows. */ 430 #if !defined(ENABLE_WREC) && PLATFORM(X86) && (PLATFORM(MAC) || PLATFORM(WIN)) 430 #if !defined(ENABLE_WREC) \ 431 && ( (PLATFORM(X86) && PLATFORM(MAC)) \ 432 || (PLATFORM(X86_64) && PLATFORM(MAC)) \ 433 || (PLATFORM(X86) && PLATFORM(WIN)) ) 431 434 #define ENABLE_WREC 1 432 435 #endif -
trunk/JavaScriptCore/wtf/TCSystemAlloc.cpp
r38477 r38857 54 54 #if HAVE(MMAP) 55 55 static const int cProtFlags = PROT_READ | PROT_WRITE 56 #if ENABLE( JIT) && PLATFORM(GTK)56 #if ENABLE(ASSEMBLER) && (PLATFORM(GTK) || (PLATFORM(MAC) && PLATFORM(X86_64))) 57 57 | PROT_EXEC 58 58 #endif
Note:
See TracChangeset
for help on using the changeset viewer.