interface-descriptors-x64.cc 12 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
// Copyright 2012 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/v8.h"

#if V8_TARGET_ARCH_X64

#include "src/interface-descriptors.h"

namespace v8 {
namespace internal {

14
const Register CallInterfaceDescriptor::ContextRegister() { return rsi; }
15 16


17 18
const Register LoadDescriptor::ReceiverRegister() { return rdx; }
const Register LoadDescriptor::NameRegister() { return rcx; }
19
const Register LoadDescriptor::SlotRegister() { return rax; }
20 21


22
const Register LoadWithVectorDescriptor::VectorRegister() { return rbx; }
23 24 25 26 27 28 29


const Register StoreDescriptor::ReceiverRegister() { return rdx; }
const Register StoreDescriptor::NameRegister() { return rcx; }
const Register StoreDescriptor::ValueRegister() { return rax; }


30
const Register StoreTransitionDescriptor::MapRegister() { return rbx; }
31 32


33 34
const Register ElementTransitionAndStoreDescriptor::MapRegister() {
  return rbx;
35 36 37
}


38 39
const Register InstanceofDescriptor::left() { return rax; }
const Register InstanceofDescriptor::right() { return rdx; }
40 41


42 43
const Register ArgumentsAccessReadDescriptor::index() { return rdx; }
const Register ArgumentsAccessReadDescriptor::parameter_count() { return rax; }
44 45


46
const Register ApiGetterDescriptor::function_address() { return r8; }
47 48


49 50 51 52 53 54
const Register MathPowTaggedDescriptor::exponent() { return rdx; }


const Register MathPowIntegerDescriptor::exponent() {
  return MathPowTaggedDescriptor::exponent();
}
55 56


57 58 59 60
const Register GrowArrayElementsDescriptor::ObjectRegister() { return rax; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return rbx; }


61
void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
62
  Register registers[] = {rsi, rbx};
63
  data->Initialize(arraysize(registers), registers, NULL);
64 65 66
}


67
void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
68
  Register registers[] = {rsi, rdi};
69
  data->Initialize(arraysize(registers), registers, NULL);
70 71 72
}


73 74 75 76 77 78
void TypeofDescriptor::Initialize(CallInterfaceDescriptorData* data) {
  Register registers[] = {rsi, rbx};
  data->Initialize(arraysize(registers), registers, NULL);
}


79
void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
80 81
  // ToNumberStub invokes a function, and therefore needs a context.
  Register registers[] = {rsi, rax};
82
  data->Initialize(arraysize(registers), registers, NULL);
83 84 85
}


86
void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
87
  Register registers[] = {rsi, rax};
88
  data->Initialize(arraysize(registers), registers, NULL);
89 90 91
}


92 93
void FastCloneShallowArrayDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
94 95 96 97
  Register registers[] = {rsi, rax, rbx, rcx};
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
      Representation::Tagged()};
98
  data->Initialize(arraysize(registers), registers, representations);
99 100 101
}


102 103
void FastCloneShallowObjectDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
104
  Register registers[] = {rsi, rax, rbx, rcx, rdx};
105
  data->Initialize(arraysize(registers), registers, NULL);
106 107 108
}


109 110
void CreateAllocationSiteDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
111
  Register registers[] = {rsi, rbx, rdx};
112 113 114 115 116 117 118 119 120 121 122 123 124
  Representation representations[] = {Representation::Tagged(),
                                      Representation::Tagged(),
                                      Representation::Smi()};
  data->Initialize(arraysize(registers), registers, representations);
}


void CreateWeakCellDescriptor::Initialize(CallInterfaceDescriptorData* data) {
  Register registers[] = {rsi, rbx, rdx, rdi};
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
      Representation::Tagged()};
  data->Initialize(arraysize(registers), registers, representations);
125 126 127
}


128 129 130 131 132 133 134
void StoreArrayLiteralElementDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {rsi, rcx, rax};
  data->Initialize(arraysize(registers), registers, NULL);
}


135
void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
136
  Register registers[] = {rsi, rdi};
137
  data->Initialize(arraysize(registers), registers, NULL);
138 139 140
}


141 142 143 144 145 146 147 148 149 150
void CallFunctionWithFeedbackDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {rsi, rdi, rdx};
  Representation representations[] = {Representation::Tagged(),
                                      Representation::Tagged(),
                                      Representation::Smi()};
  data->Initialize(arraysize(registers), registers, representations);
}


151 152 153 154 155 156 157 158 159 160
void CallFunctionWithFeedbackAndVectorDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {rsi, rdi, rdx, rbx};
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
      Representation::Tagged()};
  data->Initialize(arraysize(registers), registers, representations);
}


161
void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
162 163 164 165 166 167 168 169
  // rax : number of arguments
  // rbx : feedback vector
  // rdx : (only if rbx is not the megamorphic symbol) slot in feedback
  //       vector (Smi)
  // rdi : constructor function
  // TODO(turbofan): So far we don't gather type feedback and hence skip the
  // slot parameter, but ArrayConstructStub needs the vector to be undefined.
  Register registers[] = {rsi, rax, rdi, rbx};
170
  data->Initialize(arraysize(registers), registers, NULL);
171 172 173
}


174 175
void RegExpConstructResultDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
176
  Register registers[] = {rsi, rcx, rbx, rax};
177
  data->Initialize(arraysize(registers), registers, NULL);
178 179 180
}


181 182
void TransitionElementsKindDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
183
  Register registers[] = {rsi, rax, rbx};
184
  data->Initialize(arraysize(registers), registers, NULL);
185 186 187
}


188 189 190 191 192 193 194 195 196
void AllocateHeapNumberDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
  // register state
  // rsi -- context
  Register registers[] = {rsi};
  data->Initialize(arraysize(registers), registers, nullptr);
}


197 198
void ArrayConstructorConstantArgCountDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
199 200 201 202 203
  // register state
  // rax -- number of arguments
  // rdi -- function
  // rbx -- allocation site with elements kind
  Register registers[] = {rsi, rdi, rbx};
204
  data->Initialize(arraysize(registers), registers, NULL);
205 206 207
}


208
void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
209 210 211 212 213
  // stack param count needs (constructor pointer, and single argument)
  Register registers[] = {rsi, rdi, rbx, rax};
  Representation representations[] = {
      Representation::Tagged(), Representation::Tagged(),
      Representation::Tagged(), Representation::Integer32()};
214
  data->Initialize(arraysize(registers), registers, representations);
215 216 217 218
}


void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
219
    CallInterfaceDescriptorData* data) {
220 221 222 223 224
  // register state
  // rsi -- context
  // rax -- number of arguments
  // rdi -- constructor function
  Register registers[] = {rsi, rdi};
225
  data->Initialize(arraysize(registers), registers, NULL);
226 227 228
}


229 230
void InternalArrayConstructorDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
231 232 233 234 235
  // stack param count needs (constructor pointer, and single argument)
  Register registers[] = {rsi, rdi, rax};
  Representation representations[] = {Representation::Tagged(),
                                      Representation::Tagged(),
                                      Representation::Integer32()};
236
  data->Initialize(arraysize(registers), registers, representations);
237 238 239
}


240 241 242 243 244 245
void CompareDescriptor::Initialize(CallInterfaceDescriptorData* data) {
  Register registers[] = {rsi, rdx, rax};
  data->Initialize(arraysize(registers), registers, NULL);
}


246
void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
247
  Register registers[] = {rsi, rax};
248
  data->Initialize(arraysize(registers), registers, NULL);
249 250 251
}


252
void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
253
  Register registers[] = {rsi, rax};
254
  data->Initialize(arraysize(registers), registers, NULL);
255 256 257
}


258
void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
259
  Register registers[] = {rsi, rdx, rax};
260
  data->Initialize(arraysize(registers), registers, NULL);
261 262 263
}


264 265
void BinaryOpWithAllocationSiteDescriptor::Initialize(
    CallInterfaceDescriptorData* data) {
266
  Register registers[] = {rsi, rcx, rdx, rax};
267
  data->Initialize(arraysize(registers), registers, NULL);
268 269 270
}


271
void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
272
  Register registers[] = {rsi, rdx, rax};
273
  data->Initialize(arraysize(registers), registers, NULL);
274 275 276
}


277
void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
278 279 280 281 282 283 284 285
  Register registers[] = {
      rsi,  // context
      rcx,  // key
  };
  Representation representations[] = {
      Representation::Tagged(),  // context
      Representation::Tagged(),  // key
  };
286
  data->Initialize(arraysize(registers), registers, representations);
287 288 289
}


290
void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
291 292 293 294 295 296 297 298
  Register registers[] = {
      rsi,  // context
      rcx,  // name
  };
  Representation representations[] = {
      Representation::Tagged(),  // context
      Representation::Tagged(),  // name
  };
299
  data->Initialize(arraysize(registers), registers, representations);
300 301 302
}


303
void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
304 305 306 307 308 309 310 311
  Register registers[] = {
      rsi,  // context
      rdx,  // receiver
  };
  Representation representations[] = {
      Representation::Tagged(),  // context
      Representation::Tagged(),  // receiver
  };
312
  data->Initialize(arraysize(registers), registers, representations);
313 314 315
}


316
void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
317 318 319 320 321 322 323 324 325 326 327 328
  Register registers[] = {
      rsi,  // context
      rdi,  // JSFunction
      rax,  // actual number of arguments
      rbx,  // expected number of arguments
  };
  Representation representations[] = {
      Representation::Tagged(),     // context
      Representation::Tagged(),     // JSFunction
      Representation::Integer32(),  // actual number of arguments
      Representation::Integer32(),  // expected number of arguments
  };
329
  data->Initialize(arraysize(registers), registers, representations);
330 331 332
}


333
void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
334 335
  Register registers[] = {
      rsi,  // context
336
      rdi,  // callee
337 338 339
      rbx,  // call_data
      rcx,  // holder
      rdx,  // api_function_address
340
      rax,  // actual number of arguments
341 342 343 344 345 346 347 348 349 350 351 352 353 354
  };
  Representation representations[] = {
      Representation::Tagged(),     // context
      Representation::Tagged(),     // callee
      Representation::Tagged(),     // call_data
      Representation::Tagged(),     // holder
      Representation::External(),   // api_function_address
      Representation::Integer32(),  // actual number of arguments
  };
  data->Initialize(arraysize(registers), registers, representations);
}


void ApiAccessorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
355 356
  Register registers[] = {
      rsi,  // context
357
      rdi,  // callee
358 359 360 361 362 363 364 365 366 367 368
      rbx,  // call_data
      rcx,  // holder
      rdx,  // api_function_address
  };
  Representation representations[] = {
      Representation::Tagged(),    // context
      Representation::Tagged(),    // callee
      Representation::Tagged(),    // call_data
      Representation::Tagged(),    // holder
      Representation::External(),  // api_function_address
  };
369
  data->Initialize(arraysize(registers), registers, representations);
370
}
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385


void MathRoundVariantDescriptor::Initialize(CallInterfaceDescriptorData* data) {
  Register registers[] = {
      rsi,  // context
      rdi,  // math rounding function
      rdx,  // vector slot id
  };
  Representation representations[] = {
      Representation::Tagged(),  //
      Representation::Tagged(),  //
      Representation::Tagged(),  //
  };
  data->Initialize(arraysize(registers), registers, representations);
}
386 387 388 389
}
}  // namespace v8::internal

#endif  // V8_TARGET_ARCH_X64