interface-descriptors-arm64.cc 15.1 KB
Newer Older
1 2 3 4
// 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.

5 6
#include "src/arm64/interface-descriptors-arm64.h"

7 8 9 10 11 12 13
#if V8_TARGET_ARCH_ARM64

#include "src/interface-descriptors.h"

namespace v8 {
namespace internal {

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


17 18
const Register LoadDescriptor::ReceiverRegister() { return x1; }
const Register LoadDescriptor::NameRegister() { return x2; }
19
const Register LoadDescriptor::SlotRegister() { return x0; }
20 21


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


const Register StoreDescriptor::ReceiverRegister() { return x1; }
const Register StoreDescriptor::NameRegister() { return x2; }
const Register StoreDescriptor::ValueRegister() { return x0; }


30 31 32 33 34 35
const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return x4; }


const Register VectorStoreICDescriptor::VectorRegister() { return x3; }


36 37 38 39 40
const Register VectorStoreTransitionDescriptor::SlotRegister() { return x4; }
const Register VectorStoreTransitionDescriptor::VectorRegister() { return x3; }
const Register VectorStoreTransitionDescriptor::MapRegister() { return x5; }


41
const Register StoreTransitionDescriptor::MapRegister() { return x3; }
42 43


44 45 46 47 48 49 50
const Register LoadGlobalViaContextDescriptor::SlotRegister() { return x2; }


const Register StoreGlobalViaContextDescriptor::SlotRegister() { return x2; }
const Register StoreGlobalViaContextDescriptor::ValueRegister() { return x0; }


51 52
const Register InstanceOfDescriptor::LeftRegister() { return x1; }
const Register InstanceOfDescriptor::RightRegister() { return x0; }
53 54


55 56 57 58
const Register StringCompareDescriptor::LeftRegister() { return x1; }
const Register StringCompareDescriptor::RightRegister() { return x0; }


59 60 61 62
const Register ArgumentsAccessReadDescriptor::index() { return x1; }
const Register ArgumentsAccessReadDescriptor::parameter_count() { return x0; }


63 64 65 66 67
const Register ArgumentsAccessNewDescriptor::function() { return x1; }
const Register ArgumentsAccessNewDescriptor::parameter_count() { return x2; }
const Register ArgumentsAccessNewDescriptor::parameter_pointer() { return x3; }


68 69 70 71 72 73 74 75 76
const Register ApiGetterDescriptor::function_address() { return x2; }


const Register MathPowTaggedDescriptor::exponent() { return x11; }


const Register MathPowIntegerDescriptor::exponent() { return x12; }


77 78 79 80
const Register GrowArrayElementsDescriptor::ObjectRegister() { return x0; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return x3; }


81 82
void FastNewClosureDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
83
  // x2: function info
84
  Register registers[] = {x2};
85
  data->InitializePlatformSpecific(arraysize(registers), registers);
86 87 88
}


89 90
void FastNewContextDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
91
  // x1: function
92
  Register registers[] = {x1};
93
  data->InitializePlatformSpecific(arraysize(registers), registers);
94 95 96
}


97 98
void ToNumberDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
99
  // x0: value
100
  Register registers[] = {x0};
101
  data->InitializePlatformSpecific(arraysize(registers), registers);
102 103 104
}


105 106 107 108
// static
const Register ToLengthDescriptor::ReceiverRegister() { return x0; }


109 110 111 112
// static
const Register ToStringDescriptor::ReceiverRegister() { return x0; }


113 114 115 116
// static
const Register ToObjectDescriptor::ReceiverRegister() { return x0; }


117 118
void NumberToStringDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
119
  // x0: value
120
  Register registers[] = {x0};
121
  data->InitializePlatformSpecific(arraysize(registers), registers);
122 123 124
}


125 126
void TypeofDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
127
  Register registers[] = {x3};
128
  data->InitializePlatformSpecific(arraysize(registers), registers);
129 130 131
}


132 133 134 135 136 137 138 139 140 141 142
void FastCloneRegExpDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x3: closure
  // x2: object literal index
  // x1: constant properties
  // x0: object literal flags
  Register registers[] = {x3, x2, x1, x0};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}


143
void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
144
    CallInterfaceDescriptorData* data) {
145
  // x3: closure
146 147
  // x2: array literal index
  // x1: constant elements
148
  Register registers[] = {x3, x2, x1};
149
  data->InitializePlatformSpecific(arraysize(registers), registers);
150 151 152
}


153
void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
154
    CallInterfaceDescriptorData* data) {
155
  // x3: closure
156 157 158
  // x2: object literal index
  // x1: constant properties
  // x0: object literal flags
159
  Register registers[] = {x3, x2, x1, x0};
160
  data->InitializePlatformSpecific(arraysize(registers), registers);
161 162 163
}


164
void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
165
    CallInterfaceDescriptorData* data) {
166 167
  // x2: feedback vector
  // x3: call feedback slot
168
  Register registers[] = {x2, x3};
169
  data->InitializePlatformSpecific(arraysize(registers), registers);
170 171 172
}


173 174
void CreateWeakCellDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
175 176 177
  // x2: feedback vector
  // x3: call feedback slot
  // x1: tagged value to put in the weak cell
178
  Register registers[] = {x2, x3, x1};
179
  data->InitializePlatformSpecific(arraysize(registers), registers);
180 181 182
}


183
void StoreArrayLiteralElementDescriptor::InitializePlatformSpecific(
184
    CallInterfaceDescriptorData* data) {
185
  Register registers[] = {x3, x0};
186
  data->InitializePlatformSpecific(arraysize(registers), registers);
187 188 189
}


190 191
void CallFunctionDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
192
  // x1  function    the function to call
193
  Register registers[] = {x1};
194
  data->InitializePlatformSpecific(arraysize(registers), registers);
195 196 197
}


198
void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
199
    CallInterfaceDescriptorData* data) {
200
  Register registers[] = {x1, x3};
201
  data->InitializePlatformSpecific(arraysize(registers), registers);
202 203 204
}


205
void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
206
    CallInterfaceDescriptorData* data) {
207
  Register registers[] = {x1, x3, x2};
208
  data->InitializePlatformSpecific(arraysize(registers), registers);
209 210 211
}


212
void ConstructDescriptor::InitializePlatformSpecific(
213
    CallInterfaceDescriptorData* data) {
214 215 216
  // x0 : number of arguments
  // x1 : the function to call
  // x2 : feedback vector
217
  // x3 : slot in feedback vector (Smi, for RecordCallTarget)
218 219
  // TODO(turbofan): So far we don't gather type feedback and hence skip the
  // slot parameter, but ArrayConstructStub needs the vector to be undefined.
220
  Register registers[] = {x0, x1, x3, x3};
221
  data->InitializePlatformSpecific(arraysize(registers), registers);
222 223
}

224

225 226 227 228 229 230 231 232 233
void CallTrampolineDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x1: target
  // x0: number of arguments
  Register registers[] = {x1, x0};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}


234 235 236 237 238 239 240 241 242 243
void ConstructTrampolineDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x3: new target
  // x1: target
  // x0: number of arguments
  Register registers[] = {x1, x3, x0};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}


244
void RegExpConstructResultDescriptor::InitializePlatformSpecific(
245
    CallInterfaceDescriptorData* data) {
246 247 248
  // x2: length
  // x1: index (of last match)
  // x0: string
249
  Register registers[] = {x2, x1, x0};
250
  data->InitializePlatformSpecific(arraysize(registers), registers);
251 252 253
}


254
void TransitionElementsKindDescriptor::InitializePlatformSpecific(
255
    CallInterfaceDescriptorData* data) {
256 257
  // x0: value (js_array)
  // x1: to_map
258
  Register registers[] = {x0, x1};
259
  data->InitializePlatformSpecific(arraysize(registers), registers);
260 261 262
}


263
void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
264
    CallInterfaceDescriptorData* data) {
265
  data->InitializePlatformSpecific(0, nullptr, nullptr);
266 267 268
}


269 270 271 272 273 274 275
void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {x0};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}


276
void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
277
    CallInterfaceDescriptorData* data) {
278 279 280
  // x1: function
  // x2: allocation site with elements kind
  // x0: number of arguments to the constructor function
281
  Register registers[] = {x1, x2};
282
  data->InitializePlatformSpecific(arraysize(registers), registers);
283 284 285
}


286 287
void ArrayConstructorDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
288
  // stack param count needs (constructor pointer, and single argument)
289
  Register registers[] = {x1, x2, x0};
290
  data->InitializePlatformSpecific(arraysize(registers), registers);
291 292 293
}


294 295
void InternalArrayConstructorConstantArgCountDescriptor::
    InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
296 297
  // x1: constructor function
  // x0: number of arguments to the constructor function
298
  Register registers[] = {x1};
299
  data->InitializePlatformSpecific(arraysize(registers), registers);
300 301 302
}


303
void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
304
    CallInterfaceDescriptorData* data) {
305
  // stack param count needs (constructor pointer, and single argument)
306
  Register registers[] = {x1, x0};
307
  data->InitializePlatformSpecific(arraysize(registers), registers);
308 309 310
}


311 312
void CompareDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
313 314
  // x1: left operand
  // x0: right operand
315
  Register registers[] = {x1, x0};
316
  data->InitializePlatformSpecific(arraysize(registers), registers);
317 318 319
}


320 321
void CompareNilDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
322
  // x0: value to compare
323
  Register registers[] = {x0};
324
  data->InitializePlatformSpecific(arraysize(registers), registers);
325 326 327
}


328 329
void ToBooleanDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
330
  // x0: value
331
  Register registers[] = {x0};
332
  data->InitializePlatformSpecific(arraysize(registers), registers);
333 334 335
}


336 337
void BinaryOpDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
338 339
  // x1: left operand
  // x0: right operand
340
  Register registers[] = {x1, x0};
341
  data->InitializePlatformSpecific(arraysize(registers), registers);
342 343 344
}


345
void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
346
    CallInterfaceDescriptorData* data) {
347 348 349
  // x2: allocation site
  // x1: left operand
  // x0: right operand
350
  Register registers[] = {x2, x1, x0};
351
  data->InitializePlatformSpecific(arraysize(registers), registers);
352 353 354
}


355 356
void StringAddDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
357 358
  // x1: left operand
  // x0: right operand
359
  Register registers[] = {x1, x0};
360
  data->InitializePlatformSpecific(arraysize(registers), registers);
361 362 363
}


364 365
void KeyedDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
366 367 368 369 370 371
  static PlatformInterfaceDescriptor noInlineDescriptor =
      PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);

  Register registers[] = {
      x2,  // key
  };
372 373
  data->InitializePlatformSpecific(arraysize(registers), registers,
                                   &noInlineDescriptor);
374 375 376
}


377 378
void NamedDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
379 380 381
  static PlatformInterfaceDescriptor noInlineDescriptor =
      PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);

382 383 384
  Register registers[] = {
      x2,  // name
  };
385 386
  data->InitializePlatformSpecific(arraysize(registers), registers,
                                   &noInlineDescriptor);
387 388 389
}


390 391
void CallHandlerDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
392 393 394 395 396 397
  static PlatformInterfaceDescriptor default_descriptor =
      PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);

  Register registers[] = {
      x0,  // receiver
  };
398 399
  data->InitializePlatformSpecific(arraysize(registers), registers,
                                   &default_descriptor);
400 401 402
}


403 404
void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
405 406 407 408 409
  static PlatformInterfaceDescriptor default_descriptor =
      PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);

  Register registers[] = {
      x1,  // JSFunction
410
      x3,  // the new target
411 412 413
      x0,  // actual number of arguments
      x2,  // expected number of arguments
  };
414 415
  data->InitializePlatformSpecific(arraysize(registers), registers,
                                   &default_descriptor);
416 417 418
}


419 420
void ApiFunctionDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
421 422 423
  static PlatformInterfaceDescriptor default_descriptor =
      PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);

424 425 426 427 428 429 430
  Register registers[] = {
      x0,  // callee
      x4,  // call_data
      x2,  // holder
      x1,  // api_function_address
      x3,  // actual number of arguments
  };
431 432
  data->InitializePlatformSpecific(arraysize(registers), registers,
                                   &default_descriptor);
433 434 435
}


436 437
void ApiAccessorDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
438 439 440
  static PlatformInterfaceDescriptor default_descriptor =
      PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);

441 442 443 444 445 446
  Register registers[] = {
      x0,  // callee
      x4,  // call_data
      x2,  // holder
      x1,  // api_function_address
  };
447 448
  data->InitializePlatformSpecific(arraysize(registers), registers,
                                   &default_descriptor);
449
}
450 451


452 453 454 455 456 457 458 459 460 461 462 463
void MathRoundVariantCallFromUnoptimizedCodeDescriptor::
    InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
  Register registers[] = {
      x1,  // math rounding function
      x3,  // vector slot id
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
}


void MathRoundVariantCallFromOptimizedCodeDescriptor::
    InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
464 465 466
  Register registers[] = {
      x1,  // math rounding function
      x3,  // vector slot id
467
      x4,  // type vector
468
  };
469
  data->InitializePlatformSpecific(arraysize(registers), registers);
470
}
471 472


473
void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
474 475
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
476
      x0,  // argument count (not including receiver)
477 478 479 480 481 482
      x2,  // address of first argument
      x1   // the target callable to be call
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

483

484 485 486 487
void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
      x0,  // argument count (not including receiver)
488
      x3,  // new target
489 490 491 492 493 494 495
      x1,  // constructor to call
      x2   // address of the first argument
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
}


496 497 498 499 500 501 502 503 504 505 506
void InterpreterCEntryDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
      x0,   // argument count (argc)
      x11,  // address of first argument (argv)
      x1    // the runtime function to call
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
}


507 508
}  // namespace internal
}  // namespace v8
509 510

#endif  // V8_TARGET_ARCH_ARM64