oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2010 Apple Inc. All rights reserved. |
| 3 | * |
| 4 | * Redistribution and use in source and binary forms, with or without |
| 5 | * modification, are permitted provided that the following conditions |
| 6 | * are met: |
| 7 | * 1. Redistributions of source code must retain the above copyright |
| 8 | * notice, this list of conditions and the following disclaimer. |
| 9 | * 2. Redistributions in binary form must reproduce the above copyright |
| 10 | * notice, this list of conditions and the following disclaimer in the |
| 11 | * documentation and/or other materials provided with the distribution. |
| 12 | * |
| 13 | * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| 14 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| 15 | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 16 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| 17 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 18 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 19 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 20 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 21 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 22 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| 23 | * THE POSSIBILITY OF SUCH DAMAGE. |
| 24 | */ |
| 25 | |
| 26 | #ifndef JSInterfaceJIT_h |
| 27 | #define JSInterfaceJIT_h |
| 28 | |
fpizlo@apple.com | 7bbcaab | 2012-02-22 05:23:19 +0000 | [diff] [blame] | 29 | #include "BytecodeConventions.h" |
fpizlo@apple.com | cd8eb2c | 2013-09-20 18:42:41 +0000 | [diff] [blame] | 30 | #include "CCallHelpers.h" |
mark.lam@apple.com | ab6b5eb | 2013-11-08 04:05:27 +0000 | [diff] [blame] | 31 | #include "FPRInfo.h" |
| 32 | #include "GPRInfo.h" |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 33 | #include "JITCode.h" |
msaboff@apple.com | a482c54 | 2013-10-04 18:20:40 +0000 | [diff] [blame] | 34 | #include "JITOperations.h" |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 35 | #include "JITStubs.h" |
mhahnenberg@apple.com | c1bc9d3 | 2013-01-24 21:39:55 +0000 | [diff] [blame] | 36 | #include "JSCJSValue.h" |
mark.lam@apple.com | 4fbb9c3 | 2012-10-09 07:12:56 +0000 | [diff] [blame] | 37 | #include "JSStack.h" |
fpizlo@apple.com | 7bbcaab | 2012-02-22 05:23:19 +0000 | [diff] [blame] | 38 | #include "JSString.h" |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 39 | #include "MacroAssembler.h" |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 40 | #include <wtf/Vector.h> |
| 41 | |
commit-queue@webkit.org | b841948 | 2012-08-30 22:21:48 +0000 | [diff] [blame] | 42 | #if ENABLE(JIT) |
| 43 | |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 44 | namespace JSC { |
mark.lam@apple.com | ab6b5eb | 2013-11-08 04:05:27 +0000 | [diff] [blame] | 45 | class JSInterfaceJIT : public CCallHelpers, public GPRInfo, public FPRInfo { |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 46 | public: |
fpizlo@apple.com | cd8eb2c | 2013-09-20 18:42:41 +0000 | [diff] [blame] | 47 | JSInterfaceJIT(VM* vm, CodeBlock* codeBlock = 0) |
| 48 | : CCallHelpers(vm, codeBlock) |
| 49 | { |
| 50 | } |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 51 | |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 52 | #if USE(JSVALUE32_64) |
| 53 | // Can't just propogate JSValue::Int32Tag as visual studio doesn't like it |
barraclough@apple.com | 11bb59c | 2011-09-15 19:32:12 +0000 | [diff] [blame] | 54 | static const unsigned Int32Tag = 0xffffffff; |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 55 | COMPILE_ASSERT(Int32Tag == JSValue::Int32Tag, Int32Tag_out_of_sync); |
| 56 | #else |
bfulgham@apple.com | c7f0225 | 2013-10-05 00:40:09 +0000 | [diff] [blame] | 57 | static const unsigned Int32Tag = static_cast<unsigned>(TagTypeNumber >> 32); |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 58 | #endif |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 59 | inline Jump emitLoadJSCell(unsigned virtualRegisterIndex, RegisterID payload); |
| 60 | inline Jump emitLoadInt32(unsigned virtualRegisterIndex, RegisterID dst); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 61 | inline Jump emitLoadDouble(unsigned virtualRegisterIndex, FPRegisterID dst, RegisterID scratch); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 62 | |
| 63 | #if USE(JSVALUE32_64) |
| 64 | inline Jump emitJumpIfNotJSCell(unsigned virtualRegisterIndex); |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 65 | inline Address tagFor(int index, RegisterID base = callFrameRegister); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 66 | #endif |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 67 | |
oliver@apple.com | 0cc25c3 | 2010-10-19 23:55:08 +0000 | [diff] [blame] | 68 | #if USE(JSVALUE64) |
fpizlo@apple.com | 2ac511c | 2012-12-27 23:12:27 +0000 | [diff] [blame] | 69 | Jump emitJumpIfNotJSCell(RegisterID); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 70 | Jump emitJumpIfImmediateNumber(RegisterID reg); |
| 71 | Jump emitJumpIfNotImmediateNumber(RegisterID reg); |
oliver@apple.com | 26340b4 | 2010-05-09 11:42:22 +0000 | [diff] [blame] | 72 | void emitFastArithImmToInt(RegisterID reg); |
fpizlo@apple.com | 2ac511c | 2012-12-27 23:12:27 +0000 | [diff] [blame] | 73 | void emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 74 | #endif |
| 75 | |
mhahnenberg@apple.com | b6f8519 | 2014-02-27 01:27:18 +0000 | [diff] [blame] | 76 | Jump emitJumpIfNotType(RegisterID baseReg, JSType); |
fpizlo@apple.com | 2ac511c | 2012-12-27 23:12:27 +0000 | [diff] [blame] | 77 | |
| 78 | void emitGetFromCallFrameHeaderPtr(JSStack::CallFrameHeaderEntry, RegisterID to, RegisterID from = callFrameRegister); |
| 79 | void emitPutToCallFrameHeader(RegisterID from, JSStack::CallFrameHeaderEntry); |
| 80 | void emitPutImmediateToCallFrameHeader(void* value, JSStack::CallFrameHeaderEntry); |
| 81 | void emitPutCellToCallFrameHeader(RegisterID from, JSStack::CallFrameHeaderEntry); |
| 82 | |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 83 | inline Address payloadFor(int index, RegisterID base = callFrameRegister); |
| 84 | inline Address intPayloadFor(int index, RegisterID base = callFrameRegister); |
| 85 | inline Address intTagFor(int index, RegisterID base = callFrameRegister); |
| 86 | inline Address addressFor(int index, RegisterID base = callFrameRegister); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 87 | }; |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 88 | |
oliver@apple.com | 5230bd3 | 2010-05-06 19:39:54 +0000 | [diff] [blame] | 89 | struct ThunkHelpers { |
oliver@apple.com | 5230bd3 | 2010-05-06 19:39:54 +0000 | [diff] [blame] | 90 | static unsigned jsStringLengthOffset() { return OBJECT_OFFSETOF(JSString, m_length); } |
| 91 | static unsigned jsStringValueOffset() { return OBJECT_OFFSETOF(JSString, m_value); } |
| 92 | }; |
| 93 | |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 94 | #if USE(JSVALUE32_64) |
| 95 | inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadJSCell(unsigned virtualRegisterIndex, RegisterID payload) |
| 96 | { |
| 97 | loadPtr(payloadFor(virtualRegisterIndex), payload); |
| 98 | return emitJumpIfNotJSCell(virtualRegisterIndex); |
| 99 | } |
| 100 | |
| 101 | inline JSInterfaceJIT::Jump JSInterfaceJIT::emitJumpIfNotJSCell(unsigned virtualRegisterIndex) |
| 102 | { |
oliver@apple.com | fc502ee | 2010-05-20 00:30:35 +0000 | [diff] [blame] | 103 | ASSERT(static_cast<int>(virtualRegisterIndex) < FirstConstantRegisterIndex); |
oliver@apple.com | be4e067 | 2011-03-28 17:14:57 +0000 | [diff] [blame] | 104 | return branch32(NotEqual, tagFor(virtualRegisterIndex), TrustedImm32(JSValue::CellTag)); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 105 | } |
| 106 | |
| 107 | inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadInt32(unsigned virtualRegisterIndex, RegisterID dst) |
| 108 | { |
oliver@apple.com | fc502ee | 2010-05-20 00:30:35 +0000 | [diff] [blame] | 109 | ASSERT(static_cast<int>(virtualRegisterIndex) < FirstConstantRegisterIndex); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 110 | loadPtr(payloadFor(virtualRegisterIndex), dst); |
oliver@apple.com | be4e067 | 2011-03-28 17:14:57 +0000 | [diff] [blame] | 111 | return branch32(NotEqual, tagFor(static_cast<int>(virtualRegisterIndex)), TrustedImm32(JSValue::Int32Tag)); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 112 | } |
| 113 | |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 114 | inline JSInterfaceJIT::Address JSInterfaceJIT::tagFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 115 | { |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 116 | ASSERT(virtualRegisterIndex < FirstConstantRegisterIndex); |
| 117 | return Address(base, (static_cast<unsigned>(virtualRegisterIndex) * sizeof(Register)) + OBJECT_OFFSETOF(JSValue, u.asBits.tag)); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 118 | } |
| 119 | |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 120 | inline JSInterfaceJIT::Address JSInterfaceJIT::payloadFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 121 | { |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 122 | ASSERT(virtualRegisterIndex < FirstConstantRegisterIndex); |
| 123 | return Address(base, (static_cast<unsigned>(virtualRegisterIndex) * sizeof(Register)) + OBJECT_OFFSETOF(JSValue, u.asBits.payload)); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 124 | } |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 125 | |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 126 | inline JSInterfaceJIT::Address JSInterfaceJIT::intPayloadFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 127 | { |
| 128 | return payloadFor(virtualRegisterIndex, base); |
| 129 | } |
| 130 | |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 131 | inline JSInterfaceJIT::Address JSInterfaceJIT::intTagFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 132 | { |
| 133 | return tagFor(virtualRegisterIndex, base); |
| 134 | } |
| 135 | |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 136 | inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadDouble(unsigned virtualRegisterIndex, FPRegisterID dst, RegisterID scratch) |
| 137 | { |
oliver@apple.com | fc502ee | 2010-05-20 00:30:35 +0000 | [diff] [blame] | 138 | ASSERT(static_cast<int>(virtualRegisterIndex) < FirstConstantRegisterIndex); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 139 | loadPtr(tagFor(virtualRegisterIndex), scratch); |
oliver@apple.com | be4e067 | 2011-03-28 17:14:57 +0000 | [diff] [blame] | 140 | Jump isDouble = branch32(Below, scratch, TrustedImm32(JSValue::LowestTag)); |
| 141 | Jump notInt = branch32(NotEqual, scratch, TrustedImm32(JSValue::Int32Tag)); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 142 | loadPtr(payloadFor(virtualRegisterIndex), scratch); |
| 143 | convertInt32ToDouble(scratch, dst); |
| 144 | Jump done = jump(); |
| 145 | isDouble.link(this); |
| 146 | loadDouble(addressFor(virtualRegisterIndex), dst); |
| 147 | done.link(this); |
| 148 | return notInt; |
oliver@apple.com | 5b6a0d3 | 2011-07-01 16:33:46 +0000 | [diff] [blame] | 149 | } |
| 150 | |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 151 | #endif |
| 152 | |
| 153 | #if USE(JSVALUE64) |
fpizlo@apple.com | 2ac511c | 2012-12-27 23:12:27 +0000 | [diff] [blame] | 154 | ALWAYS_INLINE JSInterfaceJIT::Jump JSInterfaceJIT::emitJumpIfNotJSCell(RegisterID reg) |
| 155 | { |
| 156 | return branchTest64(NonZero, reg, tagMaskRegister); |
| 157 | } |
| 158 | |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 159 | ALWAYS_INLINE JSInterfaceJIT::Jump JSInterfaceJIT::emitJumpIfImmediateNumber(RegisterID reg) |
| 160 | { |
yuqiang.xian@intel.com | 5b1cb73 | 2012-10-19 05:46:10 +0000 | [diff] [blame] | 161 | return branchTest64(NonZero, reg, tagTypeNumberRegister); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 162 | } |
| 163 | ALWAYS_INLINE JSInterfaceJIT::Jump JSInterfaceJIT::emitJumpIfNotImmediateNumber(RegisterID reg) |
| 164 | { |
yuqiang.xian@intel.com | 5b1cb73 | 2012-10-19 05:46:10 +0000 | [diff] [blame] | 165 | return branchTest64(Zero, reg, tagTypeNumberRegister); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 166 | } |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 167 | inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadJSCell(unsigned virtualRegisterIndex, RegisterID dst) |
| 168 | { |
yuqiang.xian@intel.com | 5b1cb73 | 2012-10-19 05:46:10 +0000 | [diff] [blame] | 169 | load64(addressFor(virtualRegisterIndex), dst); |
| 170 | return branchTest64(NonZero, dst, tagMaskRegister); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 171 | } |
| 172 | |
| 173 | inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadInt32(unsigned virtualRegisterIndex, RegisterID dst) |
| 174 | { |
yuqiang.xian@intel.com | 5b1cb73 | 2012-10-19 05:46:10 +0000 | [diff] [blame] | 175 | load64(addressFor(virtualRegisterIndex), dst); |
| 176 | Jump result = branch64(Below, dst, tagTypeNumberRegister); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 177 | zeroExtend32ToPtr(dst, dst); |
| 178 | return result; |
| 179 | } |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 180 | |
| 181 | inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadDouble(unsigned virtualRegisterIndex, FPRegisterID dst, RegisterID scratch) |
| 182 | { |
yuqiang.xian@intel.com | 5b1cb73 | 2012-10-19 05:46:10 +0000 | [diff] [blame] | 183 | load64(addressFor(virtualRegisterIndex), scratch); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 184 | Jump notNumber = emitJumpIfNotImmediateNumber(scratch); |
yuqiang.xian@intel.com | 5b1cb73 | 2012-10-19 05:46:10 +0000 | [diff] [blame] | 185 | Jump notInt = branch64(Below, scratch, tagTypeNumberRegister); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 186 | convertInt32ToDouble(scratch, dst); |
| 187 | Jump done = jump(); |
| 188 | notInt.link(this); |
yuqiang.xian@intel.com | 5b1cb73 | 2012-10-19 05:46:10 +0000 | [diff] [blame] | 189 | add64(tagTypeNumberRegister, scratch); |
| 190 | move64ToDouble(scratch, dst); |
oliver@apple.com | 2bd947e | 2010-04-29 03:57:16 +0000 | [diff] [blame] | 191 | done.link(this); |
| 192 | return notNumber; |
| 193 | } |
oliver@apple.com | 5b6a0d3 | 2011-07-01 16:33:46 +0000 | [diff] [blame] | 194 | |
oliver@apple.com | 26340b4 | 2010-05-09 11:42:22 +0000 | [diff] [blame] | 195 | ALWAYS_INLINE void JSInterfaceJIT::emitFastArithImmToInt(RegisterID) |
| 196 | { |
| 197 | } |
| 198 | |
fpizlo@apple.com | 2ac511c | 2012-12-27 23:12:27 +0000 | [diff] [blame] | 199 | // operand is int32_t, must have been zero-extended if register is 64-bit. |
| 200 | ALWAYS_INLINE void JSInterfaceJIT::emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest) |
| 201 | { |
| 202 | if (src != dest) |
| 203 | move(src, dest); |
| 204 | or64(tagTypeNumberRegister, dest); |
| 205 | } |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 206 | #endif |
| 207 | |
oliver@apple.com | 0cc25c3 | 2010-10-19 23:55:08 +0000 | [diff] [blame] | 208 | #if USE(JSVALUE64) |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 209 | inline JSInterfaceJIT::Address JSInterfaceJIT::payloadFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 210 | { |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 211 | ASSERT(virtualRegisterIndex < FirstConstantRegisterIndex); |
oliver@apple.com | fc502ee | 2010-05-20 00:30:35 +0000 | [diff] [blame] | 212 | return addressFor(virtualRegisterIndex, base); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 213 | } |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 214 | |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 215 | inline JSInterfaceJIT::Address JSInterfaceJIT::intPayloadFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 216 | { |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 217 | ASSERT(virtualRegisterIndex < FirstConstantRegisterIndex); |
| 218 | return Address(base, (static_cast<unsigned>(virtualRegisterIndex) * sizeof(Register)) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)); |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 219 | } |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 220 | inline JSInterfaceJIT::Address JSInterfaceJIT::intTagFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 221 | { |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 222 | ASSERT(virtualRegisterIndex < FirstConstantRegisterIndex); |
| 223 | return Address(base, (static_cast<unsigned>(virtualRegisterIndex) * sizeof(Register)) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)); |
oliver@apple.com | 9d4f0ec | 2011-03-14 18:16:36 +0000 | [diff] [blame] | 224 | } |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 225 | #endif |
| 226 | |
mhahnenberg@apple.com | b6f8519 | 2014-02-27 01:27:18 +0000 | [diff] [blame] | 227 | ALWAYS_INLINE JSInterfaceJIT::Jump JSInterfaceJIT::emitJumpIfNotType(RegisterID baseReg, JSType type) |
fpizlo@apple.com | 2ac511c | 2012-12-27 23:12:27 +0000 | [diff] [blame] | 228 | { |
mhahnenberg@apple.com | b6f8519 | 2014-02-27 01:27:18 +0000 | [diff] [blame] | 229 | return branch8(NotEqual, Address(baseReg, JSCell::typeInfoTypeOffset()), TrustedImm32(type)); |
fpizlo@apple.com | 2ac511c | 2012-12-27 23:12:27 +0000 | [diff] [blame] | 230 | } |
| 231 | |
| 232 | ALWAYS_INLINE void JSInterfaceJIT::emitGetFromCallFrameHeaderPtr(JSStack::CallFrameHeaderEntry entry, RegisterID to, RegisterID from) |
| 233 | { |
| 234 | loadPtr(Address(from, entry * sizeof(Register)), to); |
| 235 | } |
| 236 | |
| 237 | ALWAYS_INLINE void JSInterfaceJIT::emitPutToCallFrameHeader(RegisterID from, JSStack::CallFrameHeaderEntry entry) |
| 238 | { |
| 239 | #if USE(JSVALUE32_64) |
| 240 | storePtr(from, payloadFor(entry, callFrameRegister)); |
| 241 | #else |
| 242 | store64(from, addressFor(entry, callFrameRegister)); |
| 243 | #endif |
| 244 | } |
| 245 | |
| 246 | ALWAYS_INLINE void JSInterfaceJIT::emitPutImmediateToCallFrameHeader(void* value, JSStack::CallFrameHeaderEntry entry) |
| 247 | { |
| 248 | storePtr(TrustedImmPtr(value), Address(callFrameRegister, entry * sizeof(Register))); |
| 249 | } |
| 250 | |
| 251 | ALWAYS_INLINE void JSInterfaceJIT::emitPutCellToCallFrameHeader(RegisterID from, JSStack::CallFrameHeaderEntry entry) |
| 252 | { |
| 253 | #if USE(JSVALUE32_64) |
| 254 | store32(TrustedImm32(JSValue::CellTag), tagFor(entry, callFrameRegister)); |
| 255 | store32(from, payloadFor(entry, callFrameRegister)); |
| 256 | #else |
| 257 | store64(from, addressFor(entry, callFrameRegister)); |
| 258 | #endif |
| 259 | } |
| 260 | |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 261 | inline JSInterfaceJIT::Address JSInterfaceJIT::addressFor(int virtualRegisterIndex, RegisterID base) |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 262 | { |
oliver@apple.com | 88663ea | 2011-03-14 18:39:40 +0000 | [diff] [blame] | 263 | ASSERT(virtualRegisterIndex < FirstConstantRegisterIndex); |
| 264 | return Address(base, (static_cast<unsigned>(virtualRegisterIndex) * sizeof(Register))); |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 265 | } |
| 266 | |
commit-queue@webkit.org | b841948 | 2012-08-30 22:21:48 +0000 | [diff] [blame] | 267 | } // namespace JSC |
| 268 | |
| 269 | #endif // ENABLE(JIT) |
oliver@apple.com | ec0e400 | 2010-04-27 03:45:47 +0000 | [diff] [blame] | 270 | |
| 271 | #endif // JSInterfaceJIT_h |