[webkit-dev] ARM JIT for WinCE
Patrick Roland Gansterer
paroga at paroga.com
Thu Jan 7 06:20:48 PST 2010
Hi,
many thanks! It works already when I disable OPTIMIZE_NATIVE_CALL (other 3
OPTIMIZE are turned on). I think you're right with the ABI problem. Maybe you
can help me with it too: Here are the instruction dumps with and without the
OPTIMIZE_NATIVE_CALL:
==============================================================================
====================== #define OPTIMIZE_NATIVE_CALL = 1 ======================
==============================================================================
003E0100 ldr r8, [r2, #8]
003E0104 cmp r8, #0
003E0108 bgt 003E012C
003E010C mov r7, lr
003E0110 mov r0, sp
003E0114 str r4, [sp, #0x40]
003E0118 mov lr, pc
003E011C ldr pc, [pc, #0x128]
003E0120 ldr r1, [sp, #0xC]
003E0124 mov lr, r7
003E0128 ldr r2, [r0, #0x18]
003E012C ldr r8, [r2, #8]
003E0130 cmp r8, r1
003E0134 beq 003E0160
003E0138 mov r7, lr
003E013C str r7, [sp, #8]
003E0140 mov r0, sp
003E0144 str r4, [sp, #0x40]
003E0148 mov lr, pc
003E014C ldr pc, [pc, #0x100]
003E0150 mov r4, r1
003E0154 ldr r1, [sp, #0xC]
003E0158 mov lr, r7
003E015C ldr r2, [r0, #0x18]
003E0160 str r1, [r4, #-0xC]
003E0164 ldr r1, [r0, #0x1C]
003E0168 ldr r8, [pc, #0xE8]
003E016C str r8, [r4, #-4]
003E0170 str r0, [r4, #-8]
003E0174 str r1, [r4, #-0x1C]
003E0178 ldr r0, [r2, #0xC]
003E017C mov pc, r0
003E0180 mov r0, lr
003E0184 str r0, [r4, #-0x14]
003E0188 ldr r1, [r4, #-0x18]
003E018C ldr r1, [r1, #-0x1C]
003E0190 str r1, [r4, #-0x1C]
003E0194 ldr r0, [r4, #-0xC]
003E0198 subs sp, sp, #8
003E019C subs r0, r0, #1
003E01A0 str r0, [sp, #4]
003E01A4 mov r1, r4
003E01A8 subs r1, r1, #0x20
003E01AC mov r3, #4
003E01B0 muls r0, r3, r0
003E01B4 subs r1, r1, r0
003E01B8 str r1, [sp]
003E01BC ldr r2, [r1, #-4]
003E01C0 ldr r1, [r4, #-8]
003E01C4 mov r0, r4
003E01C8 mov r3, sp
003E01CC mov lr, pc
003E01D0 ldr pc, [r1, #0x1C]
// R0 = 0x003f8080 R1 = 0x00601780 R2 = 0x00601760 R3 = 0x182af984
// R4 = 0x003f8080 R5 = 0x00000200 R6 = 0x00600000 R7 = 0x003e07b8
// R8 = 0x00000000 R9 = 0x182afbfc R10 = 0x00000000 R11 = 0x002b0370
// R12 = 0x182af8f0 Sp = 0x182af984 Lr = 0x003e01d4
// Pc = 0x00073468 Psr = 0x2000001f
003E01D4 adds sp, sp, #8
003E01D8 ldr r3, [pc, #0x7C]
003E01DC ldr r2, [r3]
003E01E0 bics r3, r2, #0
003E01E4 bne 003E01F8
003E01E8 ldr r1, [r4, #-0x14]
003E01EC ldr r4, [r4, #-0x18]
003E01F0 mov lr, r1
003E01F4 mov pc, lr
003E01F8 ldr r1, [r4, #-0x14]
003E01FC ldr r2, [pc, #0x60]
003E0200 str r1, [r2]
003E0204 ldr r2, [pc, #0x5C]
003E0208 ldr r4, [r4, #-0x18]
003E020C str r4, [sp, #0x40]
003E0210 mov lr, r2
003E0214 mov pc, lr
==============================================================================
JSValue JSC_HOST_CALL dateProtoFuncGetTimezoneOffset(ExecState* exec,
JSObject*, JSValue thisValue, const ArgList&)
{
00073468 mov r12, sp
0007346C stmdb sp!, {r0 - r3}
00073470 stmdb sp!, {r4, r12, lr}
00073474 sub sp, sp, #0x1C
if (!thisValue.inherits(&DateInstance::info))
00073478 ldr r1, [pc, #0x100]
// R0 = 0x003f8080 R1 = 0x00601780 R2 = 0x00601760 R3 = 0x182af984
// R4 = 0x003f8080 R5 = 0x00000200 R6 = 0x00600000 R7 = 0x003e07b8
// R8 = 0x00000000 R9 = 0x182afbfc R10 = 0x00000000 R11 = 0x002b0370
// R12 = 0x182af984 Sp = 0x182af94c Lr = 0x003e01d4
// Pc = 0x00073478 Psr = 0x2000001f
0007347C add r0, sp, #0x34
00073480 bl |JSC::JSValue::inherits ( 6997ch )|
00073484 strb r0, [sp, #0xC]
00073488 ldrb r3, [sp, #0xC]
0007348C cmp r3, #0
00073490 bne |JSC::dateProtoFuncGetTimezoneOffset + 0x54 ( 734bch )|
return throwError(exec, TypeError);
00073494 mov r1, #5
00073498 ldr r0, exec
0007349C bl |JSC::throwError ( 5dd78h )|
000734A0 str r0, [sp, #0x10]
000734A4 ldr r1, [sp, #0x10]
000734A8 ldr r0, [sp, #0x28]
000734AC bl |
WTF::OwnArrayPtr<JSC::Register>::OwnArrayPtr<JSC::Register> ( 110e8h )|
000734B0 ldr r3, [sp, #0x28]
000734B4 str r3, [sp, #8]
000734B8 b |JSC::dateProtoFuncGetTimezoneOffset + 0x100 ( 73568h )|
DateInstance* thisDateObj = asDateInstance(thisValue);
000734BC ldr r0, thisValue
000734C0 bl |JSC::asRegExpConstructor ( 697b8h )|
000734C4 str r0, [sp, #0x14]
000734C8 ldr r3, [sp, #0x14]
000734CC str r3, thisDateObj
const GregorianDateTime* gregorianDateTime = thisDateObj-
>gregorianDateTime(exec);
000734D0 ldr r1, exec
000734D4 ldr r0, thisDateObj
000734D8 bl |JSC::DateInstance::gregorianDateTime ( 74e14h )|
000734DC str r0, [sp, #0x18]
000734E0 ldr r3, [sp, #0x18]
000734E4 str r3, [sp]
if (!gregorianDateTime)
000734E8 ldr r3, [sp]
000734EC cmp r3, #0
000734F0 bne |JSC::dateProtoFuncGetTimezoneOffset + 0xa4 ( 7350ch )|
return jsNaN(exec);
000734F4 ldr r1, exec
000734F8 ldr r0, [sp, #0x28]
000734FC bl |JSC::jsNaN ( 1be1ch )|
00073500 ldr r3, [sp, #0x28]
00073504 str r3, [sp, #8]
00073508 b |JSC::dateProtoFuncGetTimezoneOffset + 0x100 ( 73568h )|
return jsNumber(exec, -gregorianDateTime->utcOffset / minutesPerHour);
0007350C ldr r3, [sp]
00073510 add r3, r3, #0x24
00073514 ldr r3, [r3]
00073518 rsb r0, r3, #0
0007351C ldr r3, [pc, #0x58]
00073520 ldr r3, [r3]
00073524 mov lr, pc
00073528 mov pc, r3
0007352C ldr r3, [pc, #0x44]
00073530 ldr r2, [r3]
00073534 ldr r3, [pc, #0x3C]
00073538 ldr r3, thisDateObj
0007353C ldr lr, __formal
00073540 ldr r4, [lr]
00073544 mov lr, pc
00073548 mov pc, r4
0007354C mov r2, r0
00073550 mov r3, r1
00073554 ldr r1, exec
00073558 ldr r0, [sp, #0x28]
0007355C bl |JSC::jsNumber ( 1bb40h )|
00073560 ldr r3, [sp, #0x28]
00073564 str r3, [sp, #8]
}
00073568 ldr r0, [sp, #8]
0007356C add sp, sp, #0x1C
00073570 ldmia sp, {r4, sp, pc}
00073574 andeqs r9, r8, r4, ror #1
00073578 andeqs lr, r4, r8, asr #10
0007357C andeqs r9, r8, r4, asr #32
00073580 andeqs r9, r8, r8, lsl r8
==============================================================================
====================== #define OPTIMIZE_NATIVE_CALL = 0 ======================
==============================================================================
cti_op_call_NotJSFunction:
0014A224 str lr, [sp, #0x20]
0014A228 bl |JITStubThunked_op_call_NotJSFunction ( b1598h )|
0014A22C ldr lr, [sp, #0x20]
0014A230 bx lr
================================================================================
DEFINE_STUB_FUNCTION(EncodedJSValue, op_call_NotJSFunction)
{
000B1598 mov r12, sp
000B159C stmdb sp!, {r0}
000B15A0 stmdb sp!, {r4, r12, lr}
000B15A4 sub sp, sp, #0xF4
STUB_INIT_STACK_FRAME(stackFrame);
000B15A8 ldr r3, args
000B15AC str r3, stackFrame
JSValue funcVal = stackFrame.args[0].jsValue();
000B15B0 add r1, sp, #0x20
000B15B4 ldr r3, stackFrame
000B15B8 add r0, r3, #4
000B15BC bl |JSC::JITStubArg::jsValue ( b87b8h )|
CallData callData;
CallType callType = funcVal.getCallData(callData);
000B15C0 add r1, sp, #0x28
000B15C4 add r0, sp, #0x20
000B15C8 bl |JSC::JSValue::getCallData ( 5465ch )|
000B15CC str r0, [sp, #0x84]
000B15D0 ldr r3, [sp, #0x84]
000B15D4 str r3, callType
ASSERT(callType != CallTypeJS);
if (callType == CallTypeHost) {
000B15D8 ldr r3, callType
000B15DC cmp r3, #1
000B15E0 bne |JITStubThunked_op_call_NotJSFunction + 0x2c4 ( b185ch
)|
int registerOffset = stackFrame.args[1].int32();
000B15E4 ldr r3, stackFrame
000B15E8 add r0, r3, #8
000B15EC bl |WTF::VectorBufferBase<JSC::PropertyMapEntry *>::buffer
( 5a2c8h )|
000B15F0 str r0, [sp, #0x88]
000B15F4 ldr r3, [sp, #0x88]
000B15F8 str r3, [sp, #0x40]
int argCount = stackFrame.args[2].int32();
000B15FC ldr r3, stackFrame
000B1600 add r0, r3, #0xC
000B1604 bl |WTF::VectorBufferBase<JSC::PropertyMapEntry *>::buffer
( 5a2c8h )|
000B1608 str r0, [sp, #0x8C]
000B160C ldr r3, [sp, #0x8C]
000B1610 str r3, [sp, #0x38]
CallFrame* previousCallFrame = stackFrame.callFrame;
000B1614 ldr r3, stackFrame
000B1618 add r3, r3, #0x40
000B161C ldr r3, [r3]
000B1620 str r3, [sp, #0x3C]
CallFrame* callFrame = CallFrame::create(previousCallFrame-
>registers() + registerOffset);
000B1624 ldr r0, [sp, #0x3C]
000B1628 bl |JSC::SourceProvider::asID ( 6bd0ch )|
000B162C str r0, [sp, #0x90]
000B1630 ldr r1, [sp, #0x40]
000B1634 mov r3, #4
000B1638 mul r2, r1, r3
000B163C ldr r3, [sp, #0x90]
000B1640 add r0, r3, r2
000B1644 bl |JSC::SourceProvider::asID ( 6bd0ch )|
000B1648 str r0, [sp, #0x94]
000B164C ldr r3, [sp, #0x94]
000B1650 str r3, [sp, #0x30]
callFrame->init(0,
static_cast<Instruction*>((STUB_RETURN_ADDRESS).value()), previousCallFrame-
>scopeChain(), previousCallFrame, 0, argCount, 0);
000B1654 ldr r0, [sp, #0x3C]
000B1658 bl |JSC::ExecState::scopeChain ( 115d0h )|
000B165C str r0, [sp, #0x98]
000B1660 ldr r0, stackFrame
000B1664 bl |JSC::JITStackFrame::returnAddressSlot ( b87ech )|
000B1668 str r0, [sp, #0x9C]
000B166C ldr r0, [sp, #0x9C]
000B1670 bl |WTF::VectorBufferBase<JSC::PropertyMapEntry *>::buffer
( 5a2c8h )|
000B1674 str r0, [sp, #0xA0]
000B1678 mov r3, #0
000B167C str r3, [sp, #0xC]
000B1680 ldr r3, [sp, #0x38]
000B1684 str r3, [sp, #8]
000B1688 mov r3, #0
000B168C str r3, [sp, #4]
000B1690 ldr r3, [sp, #0x3C]
000B1694 str r3, [sp]
000B1698 ldr r3, [sp, #0x98]
000B169C ldr r2, [sp, #0xA0]
000B16A0 mov r1, #0
000B16A4 ldr r0, [sp, #0x30]
000B16A8 bl |JSC::ExecState::init ( 1b4d4h )|
stackFrame.callFrame = callFrame;
000B16AC ldr r3, stackFrame
000B16B0 add r2, r3, #0x40
000B16B4 ldr r3, [sp, #0x30]
000B16B8 str r3, [r2]
Register* argv = stackFrame.callFrame->registers() -
RegisterFile::CallFrameHeaderSize - argCount;
000B16BC ldr r3, stackFrame
000B16C0 add r3, r3, #0x40
000B16C4 ldr r0, [r3]
000B16C8 bl |JSC::SourceProvider::asID ( 6bd0ch )|
000B16CC str r0, [sp, #0xA4]
000B16D0 ldr r3, [sp, #0xA4]
000B16D4 sub r1, r3, #0x20
000B16D8 ldr r2, [sp, #0x38]
000B16DC mov r3, #4
000B16E0 mul r3, r2, r3
000B16E4 sub r3, r1, r3
000B16E8 str r3, [sp, #0x34]
ArgList argList(argv + 1, argCount - 1);
000B16EC ldr r3, [sp, #0x38]
000B16F0 sub r2, r3, #1
000B16F4 ldr r3, [sp, #0x34]
000B16F8 add r1, r3, #4
000B16FC add r0, sp, #0x44
000B1700 bl |
JSC::CallReturnOffsetToBytecodeIndex::CallReturnOffsetToBytecodeIndex ( e56c4h
)|
JSValue returnValue;
000B1704 add r0, sp, #0x4C
000B1708 bl |WTF::GenericHashTraits<WTF::RefPtr<JSC::UStringImpl>
>::emptyValue ( 15260h )|
{
SamplingTool::HostCallRecord callRecord(CTI_SAMPLER);
000B170C mov r1, #0
000B1710 add r0, sp, #0x54
000B1714 bl |JSC::SamplingTool::HostCallRecord::HostCallRecord (
a754ch )|
000B1718 str r0, [sp, #0xA8]
// FIXME: All host methods should be calling toThisObject, but
this is not presently the case.
JSValue thisValue = argv[0].jsValue();
000B171C add r1, sp, #0x50
000B1720 ldr r0, [sp, #0x34]
000B1724 bl |JSC::JITStubArg::jsValue ( b87b8h )|
if (thisValue == jsNull())
000B1728 add r0, sp, #0x58
000B172C bl |JSC::jsNull ( 110d8h )|
000B1730 str r0, [sp, #0xAC]
000B1734 ldr r1, [sp, #0xAC]
000B1738 add r0, sp, #0x50
000B173C bl |JSC::operator== ( 11690h )|
000B1740 strb r0, [sp, #0xB0]
000B1744 ldrb r3, [sp, #0xB0]
000B1748 cmp r3, #0
000B174C beq |JITStubThunked_op_call_NotJSFunction + 0x1e0 ( b1778h
)|
thisValue = callFrame->globalThisValue();
000B1750 ldr r0, [sp, #0x30]
000B1754 bl |JSC::ExecState::globalThisValue ( 22c54h )|
000B1758 str r0, [sp, #0xB4]
000B175C ldr r1, [sp, #0xB4]
000B1760 add r0, sp, #0x5C
000B1764 bl |JSC::JSValue::JSValue ( 151ach )|
000B1768 add r0, sp, #0x50
000B176C add r1, sp, #0x5C
000B1770 mov r2, #4
000B1774 bl 001489A8
returnValue = callData.native.function(callFrame,
asObject(funcVal), thisValue, argList);
000B1778 ldr r0, funcVal
000B177C bl |JSC::asArray ( 84d80h )|
000B1780 str r0, [sp, #0xB8]
000B1784 add r3, sp, #0x44
000B1788 str r3, [sp]
000B178C ldr r3, [sp, #0x50]
000B1790 ldr r2, [sp, #0xB8]
000B1794 ldr r1, [sp, #0x30]
000B1798 add r0, sp, #0x60
000B179C ldr r4, callData
000B17A0 mov lr, pc
000B17A4 mov pc, r4
000B17A8 str r0, [sp, #0xBC]
000B17AC ldr r1, [sp, #0xBC]
000B17B0 add r0, sp, #0x4C
000B17B4 mov r2, #4
000B17B8 bl 001489A8
}
000B17BC add r0, sp, #0x54
000B17C0 bl |
WTF::ThreadSafeShared<OpaqueJSString>::~ThreadSafeShared<OpaqueJSString> (
c8734h )|
stackFrame.callFrame = previousCallFrame;
000B17C4 ldr r3, stackFrame
000B17C8 add r2, r3, #0x40
000B17CC ldr r3, [sp, #0x3C]
000B17D0 str r3, [r2]
CHECK_FOR_EXCEPTION();
000B17D4 ldr r3, stackFrame
000B17D8 add r3, r3, #0x4C
000B17DC ldr r3, [r3]
000B17E0 add r3, r3, #0xB, 24
000B17E4 add r0, r3, #0xF8
000B17E8 bl |JSC::JSValue::operator bool ( 110f0h )|
000B17EC strb r0, [sp, #0xC0]
000B17F0 ldrb r3, [sp, #0xC0]
000B17F4 cmp r3, #0
000B17F8 beq |JITStubThunked_op_call_NotJSFunction + 0x2ac ( b1844h
)|
000B17FC ldr r0, stackFrame
000B1800 bl |JSC::JITStackFrame::returnAddressSlot ( b87ech )|
000B1804 str r0, [sp, #0xC4]
000B1808 ldr r0, stackFrame
000B180C bl |JSC::JITStackFrame::returnAddressSlot ( b87ech )|
000B1810 str r0, [sp, #0xC8]
000B1814 ldr r2, [sp, #0xC4]
000B1818 ldr r3, [sp, #0xC8]
000B181C str r3, [sp, #0xCC]
000B1820 ldr r3, [sp, #0xCC]
000B1824 ldr r1, [r3]
000B1828 ldr r3, stackFrame
000B182C add r3, r3, #0x4C
000B1830 ldr r0, [r3]
000B1834 bl |JSC::returnToThrowTrampoline ( ae4fch )|
000B1838 mov r3, #0
000B183C str r3, [sp, #0x7C]
000B1840 b |JITStubThunked_op_call_NotJSFunction + 0x3a8 ( b1940h
)|
return JSValue::encode(returnValue);
000B1844 ldr r0, [sp, #0x4C]
000B1848 bl |
WTF::HashTable<WTF::RefPtr<JSC::UStringImpl>,WTF::RefPtr<JSC::UStringImpl>,WTF::Identit
000B184C str r0, [sp, #0xD0]
000B1850 ldr r3, [sp, #0xD0]
000B1854 str r3, [sp, #0x7C]
000B1858 b |JITStubThunked_op_call_NotJSFunction + 0x3a8 ( b1940h
)|
}
ASSERT(callType == CallTypeNone);
CallFrame* callFrame = stackFrame.callFrame;
000B185C ldr r3, stackFrame
000B1860 add r3, r3, #0x40
000B1864 ldr r3, [r3]
000B1868 str r3, callFrame
CodeBlock* codeBlock = callFrame->codeBlock();
000B186C ldr r0, callFrame
000B1870 bl |JSC::ExecState::codeBlock ( a4bcch )|
000B1874 str r0, [sp, #0xD4]
000B1878 ldr r3, [sp, #0xD4]
000B187C str r3, codeBlock
unsigned vPCIndex = codeBlock->getBytecodeIndex(callFrame,
STUB_RETURN_ADDRESS);
000B1880 ldr r0, stackFrame
000B1884 bl |JSC::JITStackFrame::returnAddressSlot ( b87ech )|
000B1888 str r0, [sp, #0xD8]
000B188C ldr r3, [sp, #0xD8]
000B1890 str r3, [sp, #0xDC]
000B1894 ldr r3, [sp, #0xDC]
000B1898 ldr r2, [r3]
000B189C ldr r1, callFrame
000B18A0 ldr r0, codeBlock
000B18A4 bl |JSC::CodeBlock::getBytecodeIndex ( a5a48h )|
000B18A8 str r0, [sp, #0xE0]
000B18AC ldr r3, [sp, #0xE0]
000B18B0 str r3, vPCIndex
stackFrame.globalData->exception =
createNotAFunctionError(stackFrame.callFrame, funcVal, vPCIndex, codeBlock);
000B18B4 ldr r3, codeBlock
000B18B8 str r3, [sp]
000B18BC ldr r3, vPCIndex
000B18C0 ldr r2, funcVal
000B18C4 ldr r1, stackFrame
000B18C8 add r1, r1, #0x40
000B18CC ldr r1, [r1]
000B18D0 add r0, sp, #0x64
000B18D4 bl |JSC::createNotAFunctionError ( de324h )|
000B18D8 str r0, [sp, #0xE4]
000B18DC ldr r1, [sp, #0xE4]
000B18E0 ldr r3, stackFrame
000B18E4 add r3, r3, #0x4C
000B18E8 ldr r3, [r3]
000B18EC add r3, r3, #0xB, 24
000B18F0 add r0, r3, #0xF8
000B18F4 mov r2, #4
000B18F8 bl 001489A8
VM_THROW_EXCEPTION();
000B18FC ldr r0, stackFrame
000B1900 bl |JSC::JITStackFrame::returnAddressSlot ( b87ech )|
000B1904 str r0, [sp, #0xE8]
000B1908 ldr r0, stackFrame
000B190C bl |JSC::JITStackFrame::returnAddressSlot ( b87ech )|
000B1910 str r0, [sp, #0xEC]
000B1914 ldr r2, [sp, #0xE8]
000B1918 ldr r3, [sp, #0xEC]
000B191C str r3, [sp, #0xF0]
000B1920 ldr r3, [sp, #0xF0]
000B1924 ldr r1, [r3]
000B1928 ldr r3, stackFrame
000B192C add r3, r3, #0x4C
000B1930 ldr r0, [r3]
000B1934 bl |JSC::returnToThrowTrampoline ( ae4fch )|
000B1938 mov r3, #0
000B193C str r3, [sp, #0x7C]
}
000B1940 ldr r0, [sp, #0x7C]
000B1944 add sp, sp, #0xF4
000B1948 ldmia sp, {r4, sp, pc}
================================================================================
JSValue JSC_HOST_CALL dateProtoFuncGetTimezoneOffset(ExecState* exec,
JSObject*, JSValue thisValue, const ArgList&)
{
00071600 mov r12, sp
00071604 stmdb sp!, {r0 - r3}
00071608 stmdb sp!, {r4, r12, lr}
0007160C sub sp, sp, #0x1C
if (!thisValue.inherits(&DateInstance::info))
00071610 ldr r1, [pc, #0x100]
// R0 = 0x182af8e8 R1 = 0x003f8080 R2 = 0x00601780 R3 = 0x00601760
// R4 = 0x00071600 R5 = 0x00000200 R6 = 0x00600000 R7 = 0x003e03a8
// R8 = 0x0014b538 R9 = 0x182afbfc R10 = 0x00000000 R11 = 0x002b0370
// R12 = 0x182af888 Sp = 0x182af850 Lr = 0x000b17a8
// Pc = 0x00071610 Psr = 0x6000001f
00071614 add r0, sp, #0x34
00071618 bl |JSC::JSValue::inherits ( 67f58h )|
0007161C strb r0, [sp, #0xC]
00071620 ldrb r3, [sp, #0xC]
00071624 cmp r3, #0
00071628 bne |JSC::dateProtoFuncGetTimezoneOffset + 0x54 ( 71654h )|
return throwError(exec, TypeError);
0007162C mov r1, #5
00071630 ldr r0, exec
00071634 bl |JSC::throwError ( 5db04h )|
00071638 str r0, [sp, #0x10]
0007163C ldr r1, [sp, #0x10]
00071640 ldr r0, [sp, #0x28]
00071644 bl |JSC::JSValue::JSValue ( 151ach )|
00071648 ldr r3, [sp, #0x28]
0007164C str r3, [sp, #8]
00071650 b |JSC::dateProtoFuncGetTimezoneOffset + 0x100 ( 71700h )|
DateInstance* thisDateObj = asDateInstance(thisValue);
00071654 ldr r0, thisValue
00071658 bl |JSC::asInternalFunction ( 88934h )|
0007165C str r0, [sp, #0x14]
00071660 ldr r3, [sp, #0x14]
00071664 str r3, thisDateObj
const GregorianDateTime* gregorianDateTime = thisDateObj-
>gregorianDateTime(exec);
00071668 ldr r1, exec
0007166C ldr r0, thisDateObj
00071670 bl |JSC::DateInstance::gregorianDateTime ( 72fach )|
00071674 str r0, [sp, #0x18]
00071678 ldr r3, [sp, #0x18]
0007167C str r3, [sp]
if (!gregorianDateTime)
00071680 ldr r3, [sp]
00071684 cmp r3, #0
00071688 bne |JSC::dateProtoFuncGetTimezoneOffset + 0xa4 ( 716a4h )|
return jsNaN(exec);
0007168C ldr r1, exec
00071690 ldr r0, [sp, #0x28]
00071694 bl |JSC::jsNaN ( 1bd84h )|
00071698 ldr r3, [sp, #0x28]
0007169C str r3, [sp, #8]
000716A0 b |JSC::dateProtoFuncGetTimezoneOffset + 0x100 ( 71700h )|
return jsNumber(exec, -gregorianDateTime->utcOffset / minutesPerHour);
000716A4 ldr r3, [sp]
000716A8 add r3, r3, #0x24
000716AC ldr r3, [r3]
000716B0 rsb r0, r3, #0
000716B4 ldr r3, [pc, #0x58]
000716B8 ldr r3, [r3]
000716BC mov lr, pc
000716C0 mov pc, r3
000716C4 ldr r3, [pc, #0x44]
000716C8 ldr r2, [r3]
000716CC ldr r3, [pc, #0x3C]
000716D0 ldr r3, thisDateObj
000716D4 ldr lr, __formal
000716D8 ldr r4, [lr]
000716DC mov lr, pc
000716E0 mov pc, r4
000716E4 mov r2, r0
000716E8 mov r3, r1
000716EC ldr r1, exec
000716F0 ldr r0, [sp, #0x28]
000716F4 bl |JSC::jsNumber ( 1baa8h )|
000716F8 ldr r3, [sp, #0x28]
000716FC str r3, [sp, #8]
}
00071700 ldr r0, [sp, #8]
00071704 add sp, sp, #0x1C
00071708 ldmia sp, {r4, sp, pc}
0007170C andeqs r9, r8, r4, ror #1
00071710 andeqs lr, r4, r8, ror r4
00071714 andeqs r9, r8, r4, asr #32
00071718 andeqs r9, r8, r8, lsl r8
- Patrick
More information about the webkit-dev
mailing list