5 #if V8_TARGET_ARCH_IA32 7 #include "src/interface-descriptors.h" 8 #include "src/macro-assembler.h" 13 const Register CallInterfaceDescriptor::ContextRegister() {
return esi; }
15 void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
16 CallInterfaceDescriptorData* data,
int register_parameter_count) {
17 constexpr Register default_stub_registers[] = {eax, ecx, edx, edi};
18 STATIC_ASSERT(arraysize(default_stub_registers) == kMaxBuiltinRegisterParams);
19 CHECK_LE(static_cast<size_t>(register_parameter_count),
20 arraysize(default_stub_registers));
21 data->InitializePlatformSpecific(register_parameter_count,
22 default_stub_registers);
25 void RecordWriteDescriptor::InitializePlatformSpecific(
26 CallInterfaceDescriptorData* data) {
27 static const Register default_stub_registers[] = {ecx, edx, esi, edi,
30 data->RestrictAllocatableRegisters(default_stub_registers,
31 arraysize(default_stub_registers));
33 CHECK_LE(static_cast<size_t>(kParameterCount),
34 arraysize(default_stub_registers));
35 data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
38 const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
41 const Register FastNewFunctionContextDescriptor::SlotsRegister() {
return eax; }
43 const Register LoadDescriptor::ReceiverRegister() {
return edx; }
44 const Register LoadDescriptor::NameRegister() {
return ecx; }
45 const Register LoadDescriptor::SlotRegister() {
return eax; }
47 const Register LoadWithVectorDescriptor::VectorRegister() {
return no_reg; }
49 const Register StoreDescriptor::ReceiverRegister() {
return edx; }
50 const Register StoreDescriptor::NameRegister() {
return ecx; }
51 const Register StoreDescriptor::ValueRegister() {
return no_reg; }
52 const Register StoreDescriptor::SlotRegister() {
return no_reg; }
54 const Register StoreWithVectorDescriptor::VectorRegister() {
return no_reg; }
56 const Register StoreTransitionDescriptor::SlotRegister() {
return no_reg; }
57 const Register StoreTransitionDescriptor::VectorRegister() {
return no_reg; }
58 const Register StoreTransitionDescriptor::MapRegister() {
return edi; }
60 const Register ApiGetterDescriptor::HolderRegister() {
return ecx; }
61 const Register ApiGetterDescriptor::CallbackRegister() {
return eax; }
63 const Register GrowArrayElementsDescriptor::ObjectRegister() {
return eax; }
64 const Register GrowArrayElementsDescriptor::KeyRegister() {
return ecx; }
67 const Register TypeConversionDescriptor::ArgumentRegister() {
return eax; }
69 void TypeofDescriptor::InitializePlatformSpecific(
70 CallInterfaceDescriptorData* data) {
71 Register registers[] = {ecx};
72 data->InitializePlatformSpecific(arraysize(registers), registers);
75 void CallFunctionDescriptor::InitializePlatformSpecific(
76 CallInterfaceDescriptorData* data) {
77 Register registers[] = {edi};
78 data->InitializePlatformSpecific(arraysize(registers), registers);
81 void CallTrampolineDescriptor::InitializePlatformSpecific(
82 CallInterfaceDescriptorData* data) {
85 Register registers[] = {edi, eax};
86 data->InitializePlatformSpecific(arraysize(registers), registers);
89 void CallVarargsDescriptor::InitializePlatformSpecific(
90 CallInterfaceDescriptorData* data) {
95 Register registers[] = {edi, eax, ecx};
96 data->InitializePlatformSpecific(arraysize(registers), registers);
99 void CallForwardVarargsDescriptor::InitializePlatformSpecific(
100 CallInterfaceDescriptorData* data) {
104 Register registers[] = {edi, eax, ecx};
105 data->InitializePlatformSpecific(arraysize(registers), registers);
108 void CallWithSpreadDescriptor::InitializePlatformSpecific(
109 CallInterfaceDescriptorData* data) {
113 Register registers[] = {edi, eax, ecx};
114 data->InitializePlatformSpecific(arraysize(registers), registers);
117 void CallWithArrayLikeDescriptor::InitializePlatformSpecific(
118 CallInterfaceDescriptorData* data) {
121 Register registers[] = {edi, edx};
122 data->InitializePlatformSpecific(arraysize(registers), registers);
125 void ConstructVarargsDescriptor::InitializePlatformSpecific(
126 CallInterfaceDescriptorData* data) {
132 Register registers[] = {edi, edx, eax, ecx};
133 data->InitializePlatformSpecific(arraysize(registers), registers);
136 void ConstructForwardVarargsDescriptor::InitializePlatformSpecific(
137 CallInterfaceDescriptorData* data) {
142 Register registers[] = {edi, edx, eax, ecx};
143 data->InitializePlatformSpecific(arraysize(registers), registers);
146 void ConstructWithSpreadDescriptor::InitializePlatformSpecific(
147 CallInterfaceDescriptorData* data) {
152 Register registers[] = {edi, edx, eax, ecx};
153 data->InitializePlatformSpecific(arraysize(registers), registers);
156 void ConstructWithArrayLikeDescriptor::InitializePlatformSpecific(
157 CallInterfaceDescriptorData* data) {
161 Register registers[] = {edi, edx, ecx};
162 data->InitializePlatformSpecific(arraysize(registers), registers);
165 void ConstructStubDescriptor::InitializePlatformSpecific(
166 CallInterfaceDescriptorData* data) {
172 Register registers[] = {edi, edx, eax, ecx};
173 data->InitializePlatformSpecific(arraysize(registers), registers);
176 void AbortDescriptor::InitializePlatformSpecific(
177 CallInterfaceDescriptorData* data) {
178 Register registers[] = {edx};
179 data->InitializePlatformSpecific(arraysize(registers), registers);
182 void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
183 CallInterfaceDescriptorData* data) {
185 data->InitializePlatformSpecific(0,
nullptr);
188 void CompareDescriptor::InitializePlatformSpecific(
189 CallInterfaceDescriptorData* data) {
190 Register registers[] = {edx, eax};
191 data->InitializePlatformSpecific(arraysize(registers), registers);
194 void BinaryOpDescriptor::InitializePlatformSpecific(
195 CallInterfaceDescriptorData* data) {
196 Register registers[] = {edx, eax};
197 data->InitializePlatformSpecific(arraysize(registers), registers);
200 void ArgumentsAdaptorDescriptor::InitializePlatformSpecific(
201 CallInterfaceDescriptorData* data) {
202 Register registers[] = {
208 data->InitializePlatformSpecific(arraysize(registers), registers);
211 void ApiCallbackDescriptor::InitializePlatformSpecific(
212 CallInterfaceDescriptorData* data) {
213 Register registers[] = {
214 JavaScriptFrame::context_register(),
219 data->InitializePlatformSpecific(arraysize(registers), registers);
222 void InterpreterDispatchDescriptor::InitializePlatformSpecific(
223 CallInterfaceDescriptorData* data) {
224 Register registers[] = {
225 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
226 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
227 data->InitializePlatformSpecific(arraysize(registers), registers);
230 void InterpreterPushArgsThenCallDescriptor::InitializePlatformSpecific(
231 CallInterfaceDescriptorData* data) {
232 Register registers[] = {
237 data->InitializePlatformSpecific(arraysize(registers), registers);
240 void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
241 CallInterfaceDescriptorData* data) {
242 Register registers[] = {
246 data->InitializePlatformSpecific(arraysize(registers), registers);
249 void ResumeGeneratorDescriptor::InitializePlatformSpecific(
250 CallInterfaceDescriptorData* data) {
251 Register registers[] = {
255 data->InitializePlatformSpecific(arraysize(registers), registers);
258 void FrameDropperTrampolineDescriptor::InitializePlatformSpecific(
259 CallInterfaceDescriptorData* data) {
260 Register registers[] = {
263 data->InitializePlatformSpecific(arraysize(registers), registers);
269 #endif // V8_TARGET_ARCH_IA32