Changeset 158901 in webkit
- Timestamp:
- Nov 7, 2013, 8:05:27 PM (12 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r158891 r158901 1 2013-11-07 Mark Lam <mark.lam@apple.com> 2 3 Get rid of the regT* definitions in JSInterfaceJIT.h. 4 https://bugs.webkit.org/show_bug.cgi?id=123806. 5 6 Reviewed by Geoffrey Garen. 7 8 JSInterfaceJIT now inherits from GPRInfo and FPRInfo, and relies on them 9 to provide all the register definitions. 10 11 * jit/GPRInfo.h: 12 (JSC::GPRInfo::toArgumentRegister): 13 * jit/JIT.cpp: 14 (JSC::JIT::emitEnterOptimizationCheck): 15 (JSC::JIT::privateCompile): 16 * jit/JITArithmetic.cpp: 17 (JSC::JIT::emit_compareAndJumpSlow): 18 * jit/JITArithmetic32_64.cpp: 19 (JSC::JIT::emit_compareAndJumpSlow): 20 * jit/JITCall.cpp: 21 (JSC::JIT::compileLoadVarargs): 22 * jit/JITCall32_64.cpp: 23 (JSC::JIT::compileLoadVarargs): 24 * jit/JITInlines.h: 25 (JSC::JIT::appendCallWithExceptionCheckSetJSValueResult): 26 (JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile): 27 * jit/JITOpcodes.cpp: 28 (JSC::JIT::emit_op_end): 29 (JSC::JIT::emitSlow_op_new_object): 30 (JSC::JIT::emit_op_ret): 31 (JSC::JIT::emit_op_ret_object_or_this): 32 (JSC::JIT::emit_op_throw): 33 (JSC::JIT::emit_op_get_pnames): 34 (JSC::JIT::emit_op_switch_imm): 35 (JSC::JIT::emit_op_switch_char): 36 (JSC::JIT::emit_op_switch_string): 37 (JSC::JIT::emit_op_create_activation): 38 (JSC::JIT::emit_op_create_arguments): 39 (JSC::JIT::emitSlow_op_jfalse): 40 (JSC::JIT::emitSlow_op_jtrue): 41 (JSC::JIT::emitSlow_op_eq): 42 (JSC::JIT::emitSlow_op_neq): 43 (JSC::JIT::emitSlow_op_get_argument_by_val): 44 (JSC::JIT::emitSlow_op_loop_hint): 45 * jit/JITOpcodes32_64.cpp: 46 (JSC::JIT::privateCompileCTINativeCall): 47 (JSC::JIT::emit_op_end): 48 (JSC::JIT::emitSlow_op_new_object): 49 (JSC::JIT::emitSlow_op_jfalse): 50 (JSC::JIT::emitSlow_op_jtrue): 51 (JSC::JIT::emitSlow_op_eq): 52 (JSC::JIT::emitSlow_op_neq): 53 (JSC::JIT::emit_op_throw): 54 (JSC::JIT::emit_op_get_pnames): 55 (JSC::JIT::emit_op_switch_imm): 56 (JSC::JIT::emit_op_switch_char): 57 (JSC::JIT::emit_op_switch_string): 58 (JSC::JIT::emit_op_create_activation): 59 (JSC::JIT::emit_op_create_arguments): 60 (JSC::JIT::emitSlow_op_get_argument_by_val): 61 * jit/JSInterfaceJIT.h: 62 (JSC::JSInterfaceJIT::JSInterfaceJIT): 63 * jit/SlowPathCall.h: 64 (JSC::JITSlowPathCall::call): 65 * jit/ThunkGenerators.cpp: 66 1 67 2013-11-07 Filip Pizlo <fpizlo@apple.com> 2 68 -
trunk/Source/JavaScriptCore/jit/GPRInfo.h
r158883 r158901 279 279 #endif 280 280 281 // The baseline JIT requires that regT3 be callee-preserved. 282 281 283 #if CPU(X86) 282 284 #define NUMBER_OF_ARGUMENT_REGISTERS 0u … … 287 289 static const unsigned numberOfRegisters = 6; 288 290 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 291 292 // Note: regT3 is required to be callee-preserved. 289 293 290 294 // Temporary registers. … … 344 348 345 349 #if CPU(X86_64) 350 #if !OS(WINDOWS) 346 351 #define NUMBER_OF_ARGUMENT_REGISTERS 6u 352 #else 353 #define NUMBER_OF_ARGUMENT_REGISTERS 4u 354 #endif 347 355 348 356 class GPRInfo { … … 351 359 static const unsigned numberOfRegisters = 10; 352 360 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 361 362 // Note: regT3 is required to be callee-preserved. 353 363 354 364 // These registers match the baseline JIT. … … 369 379 static const GPRReg regT9 = X86Registers::r13; 370 380 // These constants provide the names for the general purpose argument & return value registers. 381 #if !OS(WINDOWS) 371 382 static const GPRReg argumentGPR0 = X86Registers::edi; // regT4 372 383 static const GPRReg argumentGPR1 = X86Registers::esi; // regT5 … … 375 386 static const GPRReg argumentGPR4 = X86Registers::r8; // regT6 376 387 static const GPRReg argumentGPR5 = X86Registers::r9; // regT7 388 #else 389 static const GPRReg argumentGPR0 = X86Registers::ecx; 390 static const GPRReg argumentGPR1 = X86Registers::edx; 391 static const GPRReg argumentGPR2 = X86Registers::r8; // regT6 392 static const GPRReg argumentGPR3 = X86Registers::r9; // regT7 393 #endif 377 394 static const GPRReg nonArgGPR0 = X86Registers::eax; // regT0 378 395 static const GPRReg nonArgGPR1 = X86Registers::ebx; // regT3 … … 392 409 { 393 410 ASSERT(index < numberOfArgumentRegisters); 411 #if !OS(WINDOWS) 394 412 static const GPRReg registerForIndex[numberOfArgumentRegisters] = { argumentGPR0, argumentGPR1, argumentGPR2, argumentGPR3, argumentGPR4, argumentGPR5 }; 413 #else 414 static const GPRReg registerForIndex[numberOfArgumentRegisters] = { argumentGPR0, argumentGPR1, argumentGPR2, argumentGPR3 }; 415 #endif 395 416 return registerForIndex[index]; 396 417 } … … 433 454 static const unsigned numberOfRegisters = 10; 434 455 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 456 457 // Note: regT3 is required to be callee-preserved. 435 458 436 459 // Temporary registers. … … 461 484 static const GPRReg nonPreservedNonReturnGPR = ARMRegisters::r2; 462 485 486 #if ENABLE(VALUE_PROFILER) 487 static const GPRReg bucketCounterRegister = ARMRegisters::r7; 488 #endif 489 463 490 static GPRReg toRegister(unsigned index) 464 491 { … … 504 531 typedef GPRReg RegisterType; 505 532 static const unsigned numberOfRegisters = 16; 533 534 // Note: regT3 is required to be callee-preserved. 506 535 507 536 // These registers match the baseline JIT. … … 515 544 static const GPRReg regT1 = ARM64Registers::x1; 516 545 static const GPRReg regT2 = ARM64Registers::x2; 517 static const GPRReg regT3 = ARM64Registers::x 3;518 static const GPRReg regT4 = ARM64Registers::x 4;546 static const GPRReg regT3 = ARM64Registers::x23; 547 static const GPRReg regT4 = ARM64Registers::x24; 519 548 static const GPRReg regT5 = ARM64Registers::x5; 520 549 static const GPRReg regT6 = ARM64Registers::x6; … … 544 573 static const GPRReg nonPreservedNonReturnGPR = ARM64Registers::x2; 545 574 575 #if ENABLE(VALUE_PROFILER) 576 static const GPRReg bucketCounterRegister = ARM64Registers::x7; 577 #endif 578 546 579 // GPRReg mapping is direct, the machine regsiter numbers can 547 580 // be used directly as indices into the GPR RegisterBank. … … 598 631 static const unsigned numberOfRegisters = 7; 599 632 static const unsigned numberOfArgumentRegisters = NUMBER_OF_ARGUMENT_REGISTERS; 633 634 // regT0 must be v0 for returning a 32-bit value. 635 // regT1 must be v1 for returning a pair of 32-bit value. 636 // regT3 must be saved in the callee, so use an S register. 600 637 601 638 // Temporary registers. … … 670 707 typedef GPRReg RegisterType; 671 708 static const unsigned numberOfRegisters = 10; 709 710 // Note: regT3 is required to be callee-preserved. 672 711 673 712 // Temporary registers. … … 732 771 #endif 733 772 773 // The baseline JIT uses "accumulator" style execution with regT0 (for 64-bit) 774 // and regT0 + regT1 (for 32-bit) serving as the accumulator register(s) for 775 // passing results of one opcode to the next. Hence: 776 COMPILE_ASSERT(GPRInfo::regT0 == GPRInfo::returnValueGPR, regT0_must_equal_returnValueGPR); 777 #if USE(JSVALUE32_64) 778 COMPILE_ASSERT(GPRInfo::regT1 == GPRInfo::returnValueGPR2, regT1_must_equal_returnValueGPR2); 779 #endif 780 734 781 } // namespace JSC 735 782 -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r158586 r158901 110 110 ASSERT(!m_bytecodeOffset); 111 111 callOperation(operationOptimize, m_bytecodeOffset); 112 skipOptimize.append(branchTestPtr(Zero, returnValue Register));113 jump(returnValue Register);112 skipOptimize.append(branchTestPtr(Zero, returnValueGPR)); 113 jump(returnValueGPR); 114 114 skipOptimize.link(this); 115 115 } … … 622 622 623 623 callOperationWithCallFrameRollbackOnException(m_codeBlock->m_isConstructor ? operationConstructArityCheck : operationCallArityCheck); 624 if (returnValue Register!= regT0)625 move(returnValue Register, regT0);624 if (returnValueGPR != regT0) 625 move(returnValueGPR, regT0); 626 626 branchTest32(Zero, regT0).linkTo(beginLabel, this); 627 627 emitNakedCall(m_vm->getCTIStub(arityFixup).code()); -
trunk/Source/JavaScriptCore/jit/JITArithmetic.cpp
r157603 r158901 478 478 linkSlowCase(iter); 479 479 480 emitGetVirtualRegister(op1, firstArgumentRegister);481 emitGetVirtualRegister(op2, secondArgumentRegister);482 callOperation(operation, firstArgumentRegister, secondArgumentRegister);483 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValue Register), target);480 emitGetVirtualRegister(op1, argumentGPR0); 481 emitGetVirtualRegister(op2, argumentGPR1); 482 callOperation(operation, argumentGPR0, argumentGPR1); 483 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target); 484 484 return; 485 485 } … … 507 507 emitGetVirtualRegister(op2, regT1); 508 508 callOperation(operation, regT0, regT1); 509 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValue Register), target);509 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target); 510 510 } else if (isOperandConstantImmediateInt(op1)) { 511 511 linkSlowCase(iter); … … 530 530 emitGetVirtualRegister(op1, regT2); 531 531 callOperation(operation, regT2, regT1); 532 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValue Register), target);532 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target); 533 533 } else { 534 534 linkSlowCase(iter); … … 554 554 linkSlowCase(iter); 555 555 callOperation(operation, regT0, regT1); 556 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValue Register), target);556 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target); 557 557 } 558 558 } -
trunk/Source/JavaScriptCore/jit/JITArithmetic32_64.cpp
r157603 r158901 161 161 emitLoad(op2, regT3, regT2); 162 162 callOperation(operation, regT1, regT0, regT3, regT2); 163 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValue Register), target);163 emitJumpSlowToHot(branchTest32(invert ? Zero : NonZero, returnValueGPR), target); 164 164 } 165 165 -
trunk/Source/JavaScriptCore/jit/JITCall.cpp
r158315 r158901 122 122 emitGetVirtualRegister(arguments, regT1); 123 123 callOperation(operationLoadVarargs, regT0, regT1, firstFreeRegister); 124 move(returnValue Register, regT1);124 move(returnValueGPR, regT1); 125 125 126 126 if (canOptimize) -
trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp
r158672 r158901 193 193 emitLoad(arguments, regT3, regT2); 194 194 callOperation(operationLoadVarargs, regT1, regT0, regT3, regT2, firstFreeRegister); 195 move(returnValue Register, regT3);195 move(returnValueGPR, regT3); 196 196 197 197 if (canOptimize) -
trunk/Source/JavaScriptCore/jit/JITInlines.h
r158315 r158901 150 150 MacroAssembler::Call call = appendCallWithExceptionCheck(function); 151 151 #if USE(JSVALUE64) 152 emitPutVirtualRegister(dst, returnValue Register);153 #else 154 emitStore(dst, returnValue 2Register, returnValueRegister);152 emitPutVirtualRegister(dst, returnValueGPR); 153 #else 154 emitStore(dst, returnValueGPR2, returnValueGPR); 155 155 #endif 156 156 return call; … … 162 162 emitValueProfilingSite(regT4); 163 163 #if USE(JSVALUE64) 164 emitPutVirtualRegister(dst, returnValue Register);165 #else 166 emitStore(dst, returnValue 2Register, returnValueRegister);164 emitPutVirtualRegister(dst, returnValueGPR); 165 #else 166 emitStore(dst, returnValueGPR2, returnValueGPR); 167 167 #endif 168 168 return call; -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r158315 r158901 84 84 void JIT::emit_op_end(Instruction* currentInstruction) 85 85 { 86 RELEASE_ASSERT(returnValue Register!= callFrameRegister);87 emitGetVirtualRegister(currentInstruction[1].u.operand, returnValue Register);86 RELEASE_ASSERT(returnValueGPR != callFrameRegister); 87 emitGetVirtualRegister(currentInstruction[1].u.operand, returnValueGPR); 88 88 restoreReturnAddressBeforeReturn(Address(callFrameRegister, CallFrame::returnPCOffset())); 89 89 ret(); … … 117 117 Structure* structure = currentInstruction[3].u.objectAllocationProfile->structure(); 118 118 callOperation(operationNewObject, structure); 119 emitStoreCell(dst, returnValue Register);119 emitStoreCell(dst, returnValueGPR); 120 120 } 121 121 … … 269 269 { 270 270 ASSERT(callFrameRegister != regT1); 271 ASSERT(regT1 != returnValue Register);272 ASSERT(returnValue Register!= callFrameRegister);271 ASSERT(regT1 != returnValueGPR); 272 ASSERT(returnValueGPR != callFrameRegister); 273 273 274 274 // Return the result in %eax. 275 emitGetVirtualRegister(currentInstruction[1].u.operand, returnValue Register);275 emitGetVirtualRegister(currentInstruction[1].u.operand, returnValueGPR); 276 276 277 277 // Grab the return address. … … 289 289 { 290 290 ASSERT(callFrameRegister != regT1); 291 ASSERT(regT1 != returnValue Register);292 ASSERT(returnValue Register!= callFrameRegister);291 ASSERT(regT1 != returnValueGPR); 292 ASSERT(returnValueGPR != callFrameRegister); 293 293 294 294 // Return the result in %eax. 295 emitGetVirtualRegister(currentInstruction[1].u.operand, returnValue Register);296 Jump notJSCell = emitJumpIfNotJSCell(returnValue Register);297 loadPtr(Address(returnValue Register, JSCell::structureOffset()), regT2);295 emitGetVirtualRegister(currentInstruction[1].u.operand, returnValueGPR); 296 Jump notJSCell = emitJumpIfNotJSCell(returnValueGPR); 297 loadPtr(Address(returnValueGPR, JSCell::structureOffset()), regT2); 298 298 Jump notObject = emitJumpIfNotObject(regT2); 299 299 … … 311 311 notJSCell.link(this); 312 312 notObject.link(this); 313 emitGetVirtualRegister(currentInstruction[2].u.operand, returnValue Register);313 emitGetVirtualRegister(currentInstruction[2].u.operand, returnValueGPR); 314 314 315 315 // Grab the return address. … … 484 484 void JIT::emit_op_throw(Instruction* currentInstruction) 485 485 { 486 ASSERT(regT0 == returnValue Register);486 ASSERT(regT0 == returnValueGPR); 487 487 emitGetVirtualRegister(currentInstruction[1].u.operand, regT0); 488 488 callOperationNoExceptionCheck(operationThrow, regT0); … … 512 512 Label isObject(this); 513 513 callOperation(operationGetPNames, regT0); 514 emitStoreCell(dst, returnValue Register);514 emitStoreCell(dst, returnValueGPR); 515 515 load32(Address(regT0, OBJECT_OFFSETOF(JSPropertyNameIterator, m_jsStringsSize)), regT3); 516 516 store64(tagTypeNumberRegister, addressFor(i)); … … 683 683 emitGetVirtualRegister(scrutinee, regT0); 684 684 callOperation(operationSwitchImmWithUnknownKeyType, regT0, tableIndex); 685 jump(returnValue Register);685 jump(returnValueGPR); 686 686 } 687 687 … … 699 699 emitGetVirtualRegister(scrutinee, regT0); 700 700 callOperation(operationSwitchCharWithUnknownKeyType, regT0, tableIndex); 701 jump(returnValue Register);701 jump(returnValueGPR); 702 702 } 703 703 … … 714 714 emitGetVirtualRegister(scrutinee, regT0); 715 715 callOperation(operationSwitchStringWithUnknownKeyType, regT0, tableIndex); 716 jump(returnValue Register);716 jump(returnValueGPR); 717 717 } 718 718 … … 822 822 Jump activationCreated = branchTest64(NonZero, Address(callFrameRegister, sizeof(Register) * dst)); 823 823 callOperation(operationCreateActivation, 0); 824 emitStoreCell(dst, returnValue Register);824 emitStoreCell(dst, returnValueGPR); 825 825 activationCreated.link(this); 826 826 } … … 833 833 834 834 callOperation(operationCreateArguments); 835 emitStoreCell(dst, returnValue Register);836 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(dst)), returnValue Register);835 emitStoreCell(dst, returnValueGPR); 836 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(dst)), returnValueGPR); 837 837 838 838 argsCreated.link(this); … … 956 956 linkSlowCase(iter); 957 957 callOperation(operationConvertJSValueToBoolean, regT0); 958 emitJumpSlowToHot(branchTest32(Zero, returnValue Register), currentInstruction[2].u.operand); // inverted!958 emitJumpSlowToHot(branchTest32(Zero, returnValueGPR), currentInstruction[2].u.operand); // inverted! 959 959 } 960 960 … … 963 963 linkSlowCase(iter); 964 964 callOperation(operationConvertJSValueToBoolean, regT0); 965 emitJumpSlowToHot(branchTest32(NonZero, returnValue Register), currentInstruction[2].u.operand);965 emitJumpSlowToHot(branchTest32(NonZero, returnValueGPR), currentInstruction[2].u.operand); 966 966 } 967 967 … … 986 986 linkSlowCase(iter); 987 987 callOperation(operationCompareEq, regT0, regT1); 988 emitTagAsBoolImmediate(returnValue Register);989 emitPutVirtualRegister(currentInstruction[1].u.operand, returnValue Register);988 emitTagAsBoolImmediate(returnValueGPR); 989 emitPutVirtualRegister(currentInstruction[1].u.operand, returnValueGPR); 990 990 } 991 991 … … 995 995 callOperation(operationCompareEq, regT0, regT1); 996 996 xor32(TrustedImm32(0x1), regT0); 997 emitTagAsBoolImmediate(returnValue Register);998 emitPutVirtualRegister(currentInstruction[1].u.operand, returnValue Register);997 emitTagAsBoolImmediate(returnValueGPR); 998 emitPutVirtualRegister(currentInstruction[1].u.operand, returnValueGPR); 999 999 } 1000 1000 … … 1107 1107 linkSlowCase(iter); 1108 1108 callOperation(operationCreateArguments); 1109 emitStoreCell(arguments, returnValue Register);1110 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(arguments)), returnValue Register);1109 emitStoreCell(arguments, returnValueGPR); 1110 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(arguments)), returnValueGPR); 1111 1111 1112 1112 skipArgumentsCreation.link(this); … … 1151 1151 1152 1152 callOperation(operationOptimize, m_bytecodeOffset); 1153 Jump noOptimizedEntry = branchTestPtr(Zero, returnValue Register);1154 jump(returnValue Register);1153 Jump noOptimizedEntry = branchTestPtr(Zero, returnValueGPR); 1154 jump(returnValueGPR); 1155 1155 noOptimizedEntry.link(this); 1156 1156 -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r158315 r158901 177 177 push(callFrameRegister); 178 178 #else 179 move(callFrameRegister, firstArgumentRegister);179 move(callFrameRegister, argumentGPR0); 180 180 #endif 181 181 move(TrustedImmPtr(FunctionPtr(operationVMHandleException).value()), regT3); … … 211 211 void JIT::emit_op_end(Instruction* currentInstruction) 212 212 { 213 ASSERT(returnValue Register!= callFrameRegister);213 ASSERT(returnValueGPR != callFrameRegister); 214 214 emitLoad(currentInstruction[1].u.operand, regT1, regT0); 215 215 restoreReturnAddressBeforeReturn(Address(callFrameRegister, CallFrame::returnPCOffset())); … … 244 244 Structure* structure = currentInstruction[3].u.objectAllocationProfile->structure(); 245 245 callOperation(operationNewObject, structure); 246 emitStoreCell(dst, returnValue Register);246 emitStoreCell(dst, returnValueGPR); 247 247 } 248 248 … … 509 509 510 510 callOperation(operationConvertJSValueToBoolean, regT1, regT0); 511 emitJumpSlowToHot(branchTest32(Zero, returnValue Register), target); // Inverted.511 emitJumpSlowToHot(branchTest32(Zero, returnValueGPR), target); // Inverted. 512 512 } 513 513 … … 543 543 544 544 callOperation(operationConvertJSValueToBoolean, regT1, regT0); 545 emitJumpSlowToHot(branchTest32(NonZero, returnValue Register), target);545 emitJumpSlowToHot(branchTest32(NonZero, returnValueGPR), target); 546 546 } 547 547 … … 652 652 653 653 storeResult.link(this); 654 emitStoreBool(dst, returnValue Register);654 emitStoreBool(dst, returnValueGPR); 655 655 } 656 656 … … 694 694 695 695 storeResult.link(this); 696 xor32(TrustedImm32(0x1), returnValue Register);697 emitStoreBool(dst, returnValue Register);696 xor32(TrustedImm32(0x1), returnValueGPR); 697 emitStoreBool(dst, returnValueGPR); 698 698 } 699 699 … … 826 826 void JIT::emit_op_throw(Instruction* currentInstruction) 827 827 { 828 ASSERT(regT0 == returnValue Register);828 ASSERT(regT0 == returnValueGPR); 829 829 emitLoad(currentInstruction[1].u.operand, regT1, regT0); 830 830 callOperationNoExceptionCheck(operationThrow, regT1, regT0); … … 854 854 Label isObject(this); 855 855 callOperation(operationGetPNames, regT0); 856 emitStoreCell(dst, returnValue Register);856 emitStoreCell(dst, returnValueGPR); 857 857 load32(Address(regT0, OBJECT_OFFSETOF(JSPropertyNameIterator, m_jsStringsSize)), regT3); 858 858 store32(TrustedImm32(Int32Tag), intTagFor(i)); … … 1007 1007 emitLoad(scrutinee, regT1, regT0); 1008 1008 callOperation(operationSwitchImmWithUnknownKeyType, regT1, regT0, tableIndex); 1009 jump(returnValue Register);1009 jump(returnValueGPR); 1010 1010 } 1011 1011 … … 1023 1023 emitLoad(scrutinee, regT1, regT0); 1024 1024 callOperation(operationSwitchCharWithUnknownKeyType, regT1, regT0, tableIndex); 1025 jump(returnValue Register);1025 jump(returnValueGPR); 1026 1026 } 1027 1027 … … 1038 1038 emitLoad(scrutinee, regT1, regT0); 1039 1039 callOperation(operationSwitchStringWithUnknownKeyType, regT1, regT0, tableIndex); 1040 jump(returnValue Register);1040 jump(returnValueGPR); 1041 1041 } 1042 1042 … … 1084 1084 Jump activationCreated = branch32(NotEqual, tagFor(activation), TrustedImm32(JSValue::EmptyValueTag)); 1085 1085 callOperation(operationCreateActivation, 0); 1086 emitStoreCell(activation, returnValue Register);1086 emitStoreCell(activation, returnValueGPR); 1087 1087 activationCreated.link(this); 1088 1088 } … … 1094 1094 Jump argsCreated = branch32(NotEqual, tagFor(dst), TrustedImm32(JSValue::EmptyValueTag)); 1095 1095 callOperation(operationCreateArguments); 1096 emitStoreCell(dst, returnValue Register);1097 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(dst)).offset(), returnValue Register);1096 emitStoreCell(dst, returnValueGPR); 1097 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(dst)).offset(), returnValueGPR); 1098 1098 argsCreated.link(this); 1099 1099 } … … 1244 1244 1245 1245 callOperation(operationCreateArguments); 1246 emitStoreCell(arguments, returnValue Register);1247 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(arguments)).offset(), returnValue Register);1246 emitStoreCell(arguments, returnValueGPR); 1247 emitStoreCell(unmodifiedArgumentsRegister(VirtualRegister(arguments)).offset(), returnValueGPR); 1248 1248 1249 1249 skipArgumentsCreation.link(this); -
trunk/Source/JavaScriptCore/jit/JSInterfaceJIT.h
r158883 r158901 29 29 #include "BytecodeConventions.h" 30 30 #include "CCallHelpers.h" 31 #include "FPRInfo.h" 32 #include "GPRInfo.h" 31 33 #include "JITCode.h" 32 34 #include "JITOperations.h" … … 41 43 42 44 namespace JSC { 43 class JSInterfaceJIT : public CCallHelpers {45 class JSInterfaceJIT : public CCallHelpers, public GPRInfo, public FPRInfo { 44 46 public: 45 47 JSInterfaceJIT(VM* vm, CodeBlock* codeBlock = 0) … … 47 49 { 48 50 } 49 50 // NOTES:51 //52 // regT0 has two special meanings. The return value from a stub53 // call will always be in regT0, and by default (unless54 // a register is specified) emitPutVirtualRegister() will store55 // the value from regT0.56 //57 // regT3 is required to be callee-preserved.58 //59 // tempRegister2 is has no such dependencies. It is important that60 // on x86/x86-64 it is ecx for performance reasons, since the61 // MacroAssembler will need to plant register swaps if it is not -62 // however the code will still function correctly.63 #if CPU(X86_64)64 static const RegisterID returnValueRegister = X86Registers::eax;65 static const RegisterID returnValue2Register = X86Registers::edx;66 static const RegisterID cachedResultRegister = X86Registers::eax;67 #if !OS(WINDOWS)68 static const RegisterID firstArgumentRegister = X86Registers::edi;69 static const RegisterID secondArgumentRegister = X86Registers::esi;70 #else71 static const RegisterID firstArgumentRegister = X86Registers::ecx;72 static const RegisterID secondArgumentRegister = X86Registers::edx;73 static const RegisterID thirdArgumentRegister = X86Registers::r8;74 #endif75 76 static const RegisterID callFrameRegister = X86Registers::ebp;77 static const RegisterID tagTypeNumberRegister = X86Registers::r14;78 static const RegisterID tagMaskRegister = X86Registers::r15;79 80 static const RegisterID regT0 = X86Registers::eax;81 static const RegisterID regT1 = X86Registers::edx;82 static const RegisterID regT2 = X86Registers::ecx;83 static const RegisterID regT3 = X86Registers::ebx;84 static const RegisterID regT4 = X86Registers::r10;85 86 static const FPRegisterID fpRegT0 = X86Registers::xmm0;87 static const FPRegisterID fpRegT1 = X86Registers::xmm1;88 static const FPRegisterID fpRegT2 = X86Registers::xmm2;89 static const FPRegisterID fpRegT3 = X86Registers::xmm3;90 91 static const RegisterID nonArgGPR1 = X86Registers::eax; // regT092 #elif CPU(X86)93 static const RegisterID returnValueRegister = X86Registers::eax;94 static const RegisterID returnValue2Register = X86Registers::edx;95 static const RegisterID cachedResultRegister = X86Registers::eax;96 // On x86 we always use fastcall conventions = but on97 // OS X if might make more sense to just use regparm.98 static const RegisterID firstArgumentRegister = X86Registers::ecx;99 static const RegisterID secondArgumentRegister = X86Registers::edx;100 101 static const RegisterID callFrameRegister = X86Registers::ebp;102 103 static const RegisterID regT0 = X86Registers::eax;104 static const RegisterID regT1 = X86Registers::edx;105 static const RegisterID regT2 = X86Registers::ecx;106 static const RegisterID regT3 = X86Registers::ebx;107 static const RegisterID regT4 = X86Registers::esi;108 109 static const FPRegisterID fpRegT0 = X86Registers::xmm0;110 static const FPRegisterID fpRegT1 = X86Registers::xmm1;111 static const FPRegisterID fpRegT2 = X86Registers::xmm2;112 static const FPRegisterID fpRegT3 = X86Registers::xmm3;113 #elif CPU(ARM)114 static const RegisterID returnValueRegister = ARMRegisters::r0;115 static const RegisterID returnValue2Register = ARMRegisters::r1;116 static const RegisterID cachedResultRegister = ARMRegisters::r0;117 static const RegisterID firstArgumentRegister = ARMRegisters::r0;118 static const RegisterID secondArgumentRegister = ARMRegisters::r1;119 120 static const RegisterID regT0 = ARMRegisters::r0;121 static const RegisterID regT1 = ARMRegisters::r1;122 static const RegisterID regT2 = ARMRegisters::r2;123 static const RegisterID regT3 = ARMRegisters::r4;124 static const RegisterID regT4 = ARMRegisters::r7;125 static const RegisterID regT5 = ARMRegisters::r8;126 127 static const RegisterID callFrameRegister = ARMRegisters::fp;128 129 static const FPRegisterID fpRegT0 = ARMRegisters::d0;130 static const FPRegisterID fpRegT1 = ARMRegisters::d1;131 static const FPRegisterID fpRegT2 = ARMRegisters::d2;132 static const FPRegisterID fpRegT3 = ARMRegisters::d3;133 #elif CPU(ARM64)134 static const RegisterID returnValueRegister = ARM64Registers::x0;135 static const RegisterID cachedResultRegister = ARM64Registers::x0;136 static const RegisterID firstArgumentRegister = ARM64Registers::x0;137 static const RegisterID secondArgumentRegister = ARM64Registers::x1;138 139 #if ENABLE(VALUE_PROFILER)140 static const RegisterID bucketCounterRegister = ARM64Registers::x7;141 #endif142 143 static const RegisterID regT0 = ARM64Registers::x0;144 static const RegisterID regT1 = ARM64Registers::x1;145 static const RegisterID regT2 = ARM64Registers::x2;146 static const RegisterID regT3 = ARM64Registers::x23;147 static const RegisterID regT4 = ARM64Registers::x24;148 149 static const RegisterID callFrameRegister = ARM64Registers::fp;150 static const RegisterID timeoutCheckRegister = ARM64Registers::x26;151 static const RegisterID tagTypeNumberRegister = ARM64Registers::x27;152 static const RegisterID tagMaskRegister = ARM64Registers::x28;153 154 static const FPRegisterID fpRegT0 = ARM64Registers::q0;155 static const FPRegisterID fpRegT1 = ARM64Registers::q1;156 static const FPRegisterID fpRegT2 = ARM64Registers::q2;157 static const FPRegisterID fpRegT3 = ARM64Registers::q3;158 159 static const RegisterID nonArgGPR1 = ARM64Registers::x9;160 #elif CPU(MIPS)161 static const RegisterID returnValueRegister = MIPSRegisters::v0;162 static const RegisterID returnValue2Register = MIPSRegisters::v1;163 static const RegisterID cachedResultRegister = MIPSRegisters::v0;164 static const RegisterID firstArgumentRegister = MIPSRegisters::a0;165 static const RegisterID secondArgumentRegister = MIPSRegisters::a1;166 167 // regT0 must be v0 for returning a 32-bit value.168 static const RegisterID regT0 = MIPSRegisters::v0;169 170 // regT1 must be v1 for returning a pair of 32-bit value.171 static const RegisterID regT1 = MIPSRegisters::v1;172 173 static const RegisterID regT2 = MIPSRegisters::t4;174 175 // regT3 must be saved in the callee, so use an S register.176 static const RegisterID regT3 = MIPSRegisters::s2;177 178 static const RegisterID regT4 = MIPSRegisters::t5;179 static const RegisterID regT5 = MIPSRegisters::t6;180 181 static const RegisterID callFrameRegister = MIPSRegisters::fp;182 183 static const FPRegisterID fpRegT0 = MIPSRegisters::f4;184 static const FPRegisterID fpRegT1 = MIPSRegisters::f6;185 static const FPRegisterID fpRegT2 = MIPSRegisters::f8;186 static const FPRegisterID fpRegT3 = MIPSRegisters::f10;187 #elif CPU(SH4)188 static const RegisterID callFrameRegister = SH4Registers::fp;189 190 static const RegisterID regT0 = SH4Registers::r0;191 static const RegisterID regT1 = SH4Registers::r1;192 static const RegisterID regT2 = SH4Registers::r2;193 static const RegisterID regT3 = SH4Registers::r10;194 static const RegisterID regT4 = SH4Registers::r4;195 static const RegisterID regT5 = SH4Registers::r5;196 static const RegisterID regT6 = SH4Registers::r6;197 static const RegisterID regT7 = SH4Registers::r7;198 static const RegisterID firstArgumentRegister = regT4;199 static const RegisterID secondArgumentRegister = regT5;200 201 static const RegisterID returnValueRegister = SH4Registers::r0;202 static const RegisterID returnValue2Register = SH4Registers::r1;203 static const RegisterID cachedResultRegister = SH4Registers::r0;204 205 static const FPRegisterID fpRegT0 = SH4Registers::dr0;206 static const FPRegisterID fpRegT1 = SH4Registers::dr2;207 static const FPRegisterID fpRegT2 = SH4Registers::dr4;208 static const FPRegisterID fpRegT3 = SH4Registers::dr6;209 static const FPRegisterID fpRegT4 = SH4Registers::dr8;210 static const FPRegisterID fpRegT5 = SH4Registers::dr10;211 #else212 #error "JIT not supported on this platform."213 #endif214 51 215 52 #if USE(JSVALUE32_64) -
trunk/Source/JavaScriptCore/jit/SlowPathCall.h
r157636 r158901 56 56 #elif CPU(X86_64) && OS(WINDOWS) 57 57 m_jit->addPtr(MacroAssembler::TrustedImm32(-16), MacroAssembler::stackPointerRegister); 58 m_jit->move(MacroAssembler::stackPointerRegister, JIT:: firstArgumentRegister);59 m_jit->move(JIT::callFrameRegister, JIT:: secondArgumentRegister);60 m_jit->move(JIT::TrustedImmPtr(m_pc), JIT:: thirdArgumentRegister);58 m_jit->move(MacroAssembler::stackPointerRegister, JIT::argumentGPR0); 59 m_jit->move(JIT::callFrameRegister, JIT::argumentGPR1); 60 m_jit->move(JIT::TrustedImmPtr(m_pc), JIT::argumentGPR2); 61 61 #else 62 m_jit->move(JIT::callFrameRegister, JIT:: firstArgumentRegister);63 m_jit->move(JIT::TrustedImmPtr(m_pc), JIT:: secondArgumentRegister);62 m_jit->move(JIT::callFrameRegister, JIT::argumentGPR0); 63 m_jit->move(JIT::TrustedImmPtr(m_pc), JIT::argumentGPR1); 64 64 #endif 65 65 JIT::Call call = m_jit->call(); -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r158883 r158901 718 718 jit.push(JSInterfaceJIT::callFrameRegister); 719 719 #else 720 jit.move(JSInterfaceJIT::callFrameRegister, JSInterfaceJIT:: firstArgumentRegister);720 jit.move(JSInterfaceJIT::callFrameRegister, JSInterfaceJIT::argumentGPR0); 721 721 #endif 722 722 jit.move(JSInterfaceJIT::TrustedImmPtr(FunctionPtr(operationVMHandleException).value()), JSInterfaceJIT::regT3);
Note:
See TracChangeset
for help on using the changeset viewer.