OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/interface-descriptors.h" | 5 #include "src/interface-descriptors.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 | 9 |
10 | 10 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 machine_types); | 130 machine_types); |
131 } | 131 } |
132 | 132 |
133 void StoreDescriptor::InitializePlatformSpecific( | 133 void StoreDescriptor::InitializePlatformSpecific( |
134 CallInterfaceDescriptorData* data) { | 134 CallInterfaceDescriptorData* data) { |
135 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), | 135 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), |
136 SlotRegister()}; | 136 SlotRegister()}; |
137 data->InitializePlatformSpecific(arraysize(registers), registers); | 137 data->InitializePlatformSpecific(arraysize(registers), registers); |
138 } | 138 } |
139 | 139 |
| 140 bool StoreTransitionDescriptor::PassVectorAndSlotOnStack() { |
| 141 #if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 |
| 142 return true; |
| 143 #else |
| 144 return false; |
| 145 #endif |
| 146 } |
140 | 147 |
141 void StoreTransitionDescriptor::InitializePlatformSpecific( | 148 void StoreTransitionDescriptor::InitializePlatformSpecific( |
142 CallInterfaceDescriptorData* data) { | 149 CallInterfaceDescriptorData* data) { |
143 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), | 150 Register registers[] = { |
144 MapRegister()}; | 151 ReceiverRegister(), NameRegister(), MapRegister(), |
145 | 152 ValueRegister(), SlotRegister(), VectorRegister(), |
146 data->InitializePlatformSpecific(arraysize(registers), registers); | 153 }; |
147 } | 154 int len = arraysize(registers); |
148 | 155 if (PassVectorAndSlotOnStack()) { |
149 | 156 // Pass slot and vector on the stack. |
150 void VectorStoreTransitionDescriptor::InitializePlatformSpecific( | 157 len -= 2; |
151 CallInterfaceDescriptorData* data) { | |
152 if (SlotRegister().is(no_reg)) { | |
153 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), | |
154 MapRegister(), VectorRegister()}; | |
155 data->InitializePlatformSpecific(arraysize(registers), registers); | |
156 } else { | |
157 Register registers[] = {ReceiverRegister(), NameRegister(), | |
158 ValueRegister(), MapRegister(), | |
159 SlotRegister(), VectorRegister()}; | |
160 data->InitializePlatformSpecific(arraysize(registers), registers); | |
161 } | 158 } |
| 159 data->InitializePlatformSpecific(len, registers); |
162 } | 160 } |
163 | 161 |
164 void StoreTransitionDescriptor::InitializePlatformIndependent( | 162 void StoreTransitionDescriptor::InitializePlatformIndependent( |
165 CallInterfaceDescriptorData* data) { | 163 CallInterfaceDescriptorData* data) { |
166 // kReceiver, kName, kValue, kMap | 164 // kReceiver, kName, kMap, kValue, kSlot, kVector |
167 MachineType machine_types[] = { | 165 MachineType machine_types[] = { |
168 MachineType::AnyTagged(), MachineType::AnyTagged(), | 166 MachineType::AnyTagged(), MachineType::AnyTagged(), |
169 MachineType::AnyTagged(), MachineType::AnyTagged()}; | 167 MachineType::AnyTagged(), MachineType::AnyTagged(), |
| 168 MachineType::TaggedSigned(), MachineType::AnyTagged()}; |
170 data->InitializePlatformIndependent(arraysize(machine_types), 0, | 169 data->InitializePlatformIndependent(arraysize(machine_types), 0, |
171 machine_types); | 170 machine_types); |
172 } | 171 } |
173 | 172 |
174 void StoreGlobalViaContextDescriptor::InitializePlatformIndependent( | 173 void StoreGlobalViaContextDescriptor::InitializePlatformIndependent( |
175 CallInterfaceDescriptorData* data) { | 174 CallInterfaceDescriptorData* data) { |
176 // kSlot, kValue | 175 // kSlot, kValue |
177 MachineType machine_types[] = {MachineType::Int32(), | 176 MachineType machine_types[] = {MachineType::Int32(), |
178 MachineType::AnyTagged()}; | 177 MachineType::AnyTagged()}; |
179 data->InitializePlatformIndependent(arraysize(machine_types), 0, | 178 data->InitializePlatformIndependent(arraysize(machine_types), 0, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 } | 221 } |
223 | 222 |
224 | 223 |
225 void LoadWithVectorDescriptor::InitializePlatformSpecific( | 224 void LoadWithVectorDescriptor::InitializePlatformSpecific( |
226 CallInterfaceDescriptorData* data) { | 225 CallInterfaceDescriptorData* data) { |
227 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(), | 226 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(), |
228 VectorRegister()}; | 227 VectorRegister()}; |
229 data->InitializePlatformSpecific(arraysize(registers), registers); | 228 data->InitializePlatformSpecific(arraysize(registers), registers); |
230 } | 229 } |
231 | 230 |
232 void VectorStoreTransitionDescriptor::InitializePlatformIndependent( | |
233 CallInterfaceDescriptorData* data) { | |
234 bool has_slot = !VectorStoreTransitionDescriptor::SlotRegister().is(no_reg); | |
235 | |
236 if (has_slot) { | |
237 // kReceiver, kName, kValue, kMap, kSlot, kVector | |
238 MachineType machine_types[] = { | |
239 MachineType::AnyTagged(), MachineType::AnyTagged(), | |
240 MachineType::AnyTagged(), MachineType::AnyTagged(), | |
241 MachineType::TaggedSigned(), MachineType::AnyTagged()}; | |
242 data->InitializePlatformIndependent(arraysize(machine_types), 0, | |
243 machine_types); | |
244 } else { | |
245 // kReceiver, kName, kValue, kMap, kVector | |
246 MachineType machine_types[] = { | |
247 MachineType::AnyTagged(), MachineType::AnyTagged(), | |
248 MachineType::AnyTagged(), MachineType::AnyTagged(), | |
249 MachineType::AnyTagged()}; | |
250 data->InitializePlatformIndependent(arraysize(machine_types), 0, | |
251 machine_types); | |
252 } | |
253 } | |
254 | |
255 void StoreWithVectorDescriptor::InitializePlatformIndependent( | 231 void StoreWithVectorDescriptor::InitializePlatformIndependent( |
256 CallInterfaceDescriptorData* data) { | 232 CallInterfaceDescriptorData* data) { |
257 // kReceiver, kName, kValue, kSlot, kVector | 233 // kReceiver, kName, kValue, kSlot, kVector |
258 MachineType machine_types[] = { | 234 MachineType machine_types[] = { |
259 MachineType::AnyTagged(), MachineType::AnyTagged(), | 235 MachineType::AnyTagged(), MachineType::AnyTagged(), |
260 MachineType::AnyTagged(), MachineType::TaggedSigned(), | 236 MachineType::AnyTagged(), MachineType::TaggedSigned(), |
261 MachineType::AnyTagged()}; | 237 MachineType::AnyTagged()}; |
262 data->InitializePlatformIndependent(arraysize(machine_types), 0, | 238 data->InitializePlatformIndependent(arraysize(machine_types), 0, |
263 machine_types); | 239 machine_types); |
264 } | 240 } |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 // kAccumulator, kBytecodeOffset, kBytecodeArray, kDispatchTable | 486 // kAccumulator, kBytecodeOffset, kBytecodeArray, kDispatchTable |
511 MachineType machine_types[] = {MachineType::AnyTagged(), MachineType::Int32(), | 487 MachineType machine_types[] = {MachineType::AnyTagged(), MachineType::Int32(), |
512 MachineType::AnyTagged(), | 488 MachineType::AnyTagged(), |
513 MachineType::AnyTagged()}; | 489 MachineType::AnyTagged()}; |
514 data->InitializePlatformIndependent(arraysize(machine_types), 0, | 490 data->InitializePlatformIndependent(arraysize(machine_types), 0, |
515 machine_types); | 491 machine_types); |
516 } | 492 } |
517 | 493 |
518 } // namespace internal | 494 } // namespace internal |
519 } // namespace v8 | 495 } // namespace v8 |
OLD | NEW |