7 #include "src/interface-descriptors.h" 8 #include "src/macro-assembler.h" 13 const Register CallInterfaceDescriptor::ContextRegister() {
return rsi; }
15 void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
16 CallInterfaceDescriptorData* data,
int register_parameter_count) {
17 const Register default_stub_registers[] = {rax, rbx, rcx, rdx, rdi};
18 CHECK_LE(static_cast<size_t>(register_parameter_count),
19 arraysize(default_stub_registers));
20 data->InitializePlatformSpecific(register_parameter_count,
21 default_stub_registers);
24 void RecordWriteDescriptor::InitializePlatformSpecific(
25 CallInterfaceDescriptorData* data) {
26 const Register default_stub_registers[] = {arg_reg_1, arg_reg_2, arg_reg_3,
27 arg_reg_4, kReturnRegister0};
29 data->RestrictAllocatableRegisters(default_stub_registers,
30 arraysize(default_stub_registers));
32 CHECK_LE(static_cast<size_t>(kParameterCount),
33 arraysize(default_stub_registers));
34 data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
37 const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
40 const Register FastNewFunctionContextDescriptor::SlotsRegister() {
return rax; }
42 const Register LoadDescriptor::ReceiverRegister() {
return rdx; }
43 const Register LoadDescriptor::NameRegister() {
return rcx; }
44 const Register LoadDescriptor::SlotRegister() {
return rax; }
46 const Register LoadWithVectorDescriptor::VectorRegister() {
return rbx; }
48 const Register StoreDescriptor::ReceiverRegister() {
return rdx; }
49 const Register StoreDescriptor::NameRegister() {
return rcx; }
50 const Register StoreDescriptor::ValueRegister() {
return rax; }
51 const Register StoreDescriptor::SlotRegister() {
return rdi; }
53 const Register StoreWithVectorDescriptor::VectorRegister() {
return rbx; }
55 const Register StoreTransitionDescriptor::SlotRegister() {
return rdi; }
56 const Register StoreTransitionDescriptor::VectorRegister() {
return rbx; }
57 const Register StoreTransitionDescriptor::MapRegister() {
return r11; }
59 const Register ApiGetterDescriptor::HolderRegister() {
return rcx; }
60 const Register ApiGetterDescriptor::CallbackRegister() {
return rbx; }
62 const Register GrowArrayElementsDescriptor::ObjectRegister() {
return rax; }
63 const Register GrowArrayElementsDescriptor::KeyRegister() {
return rbx; }
66 void TypeofDescriptor::InitializePlatformSpecific(
67 CallInterfaceDescriptorData* data) {
68 Register registers[] = {rbx};
69 data->InitializePlatformSpecific(arraysize(registers), registers);
74 const Register TypeConversionDescriptor::ArgumentRegister() {
return rax; }
76 void CallFunctionDescriptor::InitializePlatformSpecific(
77 CallInterfaceDescriptorData* data) {
78 Register registers[] = {rdi};
79 data->InitializePlatformSpecific(arraysize(registers), registers);
82 void CallTrampolineDescriptor::InitializePlatformSpecific(
83 CallInterfaceDescriptorData* data) {
86 Register registers[] = {rdi, rax};
87 data->InitializePlatformSpecific(arraysize(registers), registers);
90 void CallVarargsDescriptor::InitializePlatformSpecific(
91 CallInterfaceDescriptorData* data) {
96 Register registers[] = {rdi, rax, rcx, rbx};
97 data->InitializePlatformSpecific(arraysize(registers), registers);
100 void CallForwardVarargsDescriptor::InitializePlatformSpecific(
101 CallInterfaceDescriptorData* data) {
105 Register registers[] = {rdi, rax, rcx};
106 data->InitializePlatformSpecific(arraysize(registers), registers);
109 void CallWithSpreadDescriptor::InitializePlatformSpecific(
110 CallInterfaceDescriptorData* data) {
114 Register registers[] = {rdi, rax, rbx};
115 data->InitializePlatformSpecific(arraysize(registers), registers);
118 void CallWithArrayLikeDescriptor::InitializePlatformSpecific(
119 CallInterfaceDescriptorData* data) {
122 Register registers[] = {rdi, rbx};
123 data->InitializePlatformSpecific(arraysize(registers), registers);
126 void ConstructVarargsDescriptor::InitializePlatformSpecific(
127 CallInterfaceDescriptorData* data) {
133 Register registers[] = {rdi, rdx, rax, rcx, rbx};
134 data->InitializePlatformSpecific(arraysize(registers), registers);
137 void ConstructForwardVarargsDescriptor::InitializePlatformSpecific(
138 CallInterfaceDescriptorData* data) {
143 Register registers[] = {rdi, rdx, rax, rcx};
144 data->InitializePlatformSpecific(arraysize(registers), registers);
147 void ConstructWithSpreadDescriptor::InitializePlatformSpecific(
148 CallInterfaceDescriptorData* data) {
153 Register registers[] = {rdi, rdx, rax, rbx};
154 data->InitializePlatformSpecific(arraysize(registers), registers);
157 void ConstructWithArrayLikeDescriptor::InitializePlatformSpecific(
158 CallInterfaceDescriptorData* data) {
162 Register registers[] = {rdi, rdx, rbx};
163 data->InitializePlatformSpecific(arraysize(registers), registers);
166 void ConstructStubDescriptor::InitializePlatformSpecific(
167 CallInterfaceDescriptorData* data) {
172 Register registers[] = {rdi, rdx, rax, rbx};
173 data->InitializePlatformSpecific(arraysize(registers), registers);
176 void AbortDescriptor::InitializePlatformSpecific(
177 CallInterfaceDescriptorData* data) {
178 Register registers[] = {rdx};
179 data->InitializePlatformSpecific(arraysize(registers), registers);
182 void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
183 CallInterfaceDescriptorData* data) {
184 data->InitializePlatformSpecific(0,
nullptr);
187 void CompareDescriptor::InitializePlatformSpecific(
188 CallInterfaceDescriptorData* data) {
189 Register registers[] = {rdx, rax};
190 data->InitializePlatformSpecific(arraysize(registers), registers);
193 void BinaryOpDescriptor::InitializePlatformSpecific(
194 CallInterfaceDescriptorData* data) {
195 Register registers[] = {rdx, rax};
196 data->InitializePlatformSpecific(arraysize(registers), registers);
199 void ArgumentsAdaptorDescriptor::InitializePlatformSpecific(
200 CallInterfaceDescriptorData* data) {
201 Register registers[] = {
207 data->InitializePlatformSpecific(arraysize(registers), registers);
210 void ApiCallbackDescriptor::InitializePlatformSpecific(
211 CallInterfaceDescriptorData* data) {
212 Register registers[] = {
213 JavaScriptFrame::context_register(),
218 data->InitializePlatformSpecific(arraysize(registers), registers);
221 void InterpreterDispatchDescriptor::InitializePlatformSpecific(
222 CallInterfaceDescriptorData* data) {
223 Register registers[] = {
224 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
225 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
226 data->InitializePlatformSpecific(arraysize(registers), registers);
229 void InterpreterPushArgsThenCallDescriptor::InitializePlatformSpecific(
230 CallInterfaceDescriptorData* data) {
231 Register registers[] = {
236 data->InitializePlatformSpecific(arraysize(registers), registers);
239 void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
240 CallInterfaceDescriptorData* data) {
241 Register registers[] = {
248 data->InitializePlatformSpecific(arraysize(registers), registers);
251 void ResumeGeneratorDescriptor::InitializePlatformSpecific(
252 CallInterfaceDescriptorData* data) {
253 Register registers[] = {
257 data->InitializePlatformSpecific(arraysize(registers), registers);
260 void FrameDropperTrampolineDescriptor::InitializePlatformSpecific(
261 CallInterfaceDescriptorData* data) {
262 Register registers[] = {
265 data->InitializePlatformSpecific(arraysize(registers), registers);
271 #endif // V8_TARGET_ARCH_X64