interface-descriptors-arm64.cc 10.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
// 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.

#if V8_TARGET_ARCH_ARM64

#include "src/interface-descriptors.h"

namespace v8 {
namespace internal {

12
const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
13

14 15 16 17 18 19 20 21
void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
    CallInterfaceDescriptorData* data, int register_parameter_count) {
  const Register default_stub_registers[] = {x0, x1, x2, x3, x4};
  CHECK_LE(static_cast<size_t>(register_parameter_count),
           arraysize(default_stub_registers));
  data->InitializePlatformSpecific(register_parameter_count,
                                   default_stub_registers);
}
22

23 24
void RecordWriteDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
25 26 27 28 29 30 31 32
  const Register default_stub_registers[] = {x0, x1, x2, x3, x4};

  data->RestrictAllocatableRegisters(default_stub_registers,
                                     arraysize(default_stub_registers));

  CHECK_LE(static_cast<size_t>(kParameterCount),
           arraysize(default_stub_registers));
  data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
33 34
}

35
const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
36 37 38 39
  return x1;
}
const Register FastNewFunctionContextDescriptor::SlotsRegister() { return x0; }

40 41
const Register LoadDescriptor::ReceiverRegister() { return x1; }
const Register LoadDescriptor::NameRegister() { return x2; }
42
const Register LoadDescriptor::SlotRegister() { return x0; }
43

44
const Register LoadWithVectorDescriptor::VectorRegister() { return x3; }
45 46 47 48

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

51
const Register StoreWithVectorDescriptor::VectorRegister() { return x3; }
52

53 54 55
const Register StoreTransitionDescriptor::SlotRegister() { return x4; }
const Register StoreTransitionDescriptor::VectorRegister() { return x3; }
const Register StoreTransitionDescriptor::MapRegister() { return x5; }
56

57 58
const Register ApiGetterDescriptor::HolderRegister() { return x0; }
const Register ApiGetterDescriptor::CallbackRegister() { return x3; }
59

60 61 62 63
const Register GrowArrayElementsDescriptor::ObjectRegister() { return x0; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return x3; }


64
// static
65
const Register TypeConversionDescriptor::ArgumentRegister() { return x0; }
66

67 68
void TypeofDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
69
  Register registers[] = {x3};
70
  data->InitializePlatformSpecific(arraysize(registers), registers);
71 72
}

73 74
void CallFunctionDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
75
  // x1  function    the function to call
76
  Register registers[] = {x1};
77
  data->InitializePlatformSpecific(arraysize(registers), registers);
78 79
}

80 81 82 83 84 85 86 87
void CallTrampolineDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x1: target
  // x0: number of arguments
  Register registers[] = {x1, x0};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

88 89 90 91 92 93 94 95 96 97
void CallVarargsDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x0 : number of arguments (on the stack, not including receiver)
  // x1 : the target to call
  // x2 : arguments list (FixedArray)
  // x4 : arguments list length (untagged)
  Register registers[] = {x1, x0, x2, x4};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

98 99 100
void CallForwardVarargsDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x1: target
101 102 103 104 105 106
  // x0: number of arguments
  // x2: start index (to supported rest parameters)
  Register registers[] = {x1, x0, x2};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

107 108 109 110 111 112 113 114 115
void CallWithSpreadDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x0 : number of arguments (on the stack, not including receiver)
  // x1 : the target to call
  // x2 : the object to spread
  Register registers[] = {x1, x0, x2};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
void CallWithArrayLikeDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x1 : the target to call
  // x2 : the arguments list
  Register registers[] = {x1, x2};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

void ConstructVarargsDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x0 : number of arguments (on the stack, not including receiver)
  // x1 : the target to call
  // x3 : the new target
  // x2 : arguments list (FixedArray)
  // x4 : arguments list length (untagged)
  Register registers[] = {x1, x3, x0, x2, x4};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

135 136 137 138 139
void ConstructForwardVarargsDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x3: new target
  // x1: target
  // x0: number of arguments
140
  // x2: start index (to supported rest parameters)
141
  Register registers[] = {x1, x3, x0, x2};
142 143
  data->InitializePlatformSpecific(arraysize(registers), registers);
}
144

145 146 147 148 149 150 151 152 153 154
void ConstructWithSpreadDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x0 : number of arguments (on the stack, not including receiver)
  // x1 : the target to call
  // x3 : the new target
  // x2 : the object to spread
  Register registers[] = {x1, x3, x0, x2};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

155 156 157 158 159 160 161 162 163
void ConstructWithArrayLikeDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x1 : the target to call
  // x3 : the new target
  // x2 : the arguments list
  Register registers[] = {x1, x3, x2};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

164 165 166 167 168 169 170 171 172 173
void ConstructStubDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  // x3: new target
  // x1: target
  // x0: number of arguments
  // x2: allocation site or undefined
  Register registers[] = {x1, x3, x0, x2};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

174
void AbortDescriptor::InitializePlatformSpecific(
175 176 177 178
    CallInterfaceDescriptorData* data) {
  Register registers[] = {x1};
  data->InitializePlatformSpecific(arraysize(registers), registers);
}
179

180
void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
181
    CallInterfaceDescriptorData* data) {
182
  data->InitializePlatformSpecific(0, nullptr);
183 184
}

185 186
void CompareDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
187 188
  // x1: left operand
  // x0: right operand
189
  Register registers[] = {x1, x0};
190
  data->InitializePlatformSpecific(arraysize(registers), registers);
191 192
}

193 194
void BinaryOpDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
195 196
  // x1: left operand
  // x0: right operand
197
  Register registers[] = {x1, x0};
198
  data->InitializePlatformSpecific(arraysize(registers), registers);
199 200
}

201 202
void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
203 204
  Register registers[] = {
      x1,  // JSFunction
205
      x3,  // the new target
206 207 208
      x0,  // actual number of arguments
      x2,  // expected number of arguments
  };
209
  data->InitializePlatformSpecific(arraysize(registers), registers);
210 211
}

212
void ApiCallbackDescriptor::InitializePlatformSpecific(
213
    CallInterfaceDescriptorData* data) {
214
  Register registers[] = {
215 216 217 218
      JavaScriptFrame::context_register(),  // callee context
      x4,                                   // call_data
      x2,                                   // holder
      x1,                                   // api_function_address
219
  };
220
  data->InitializePlatformSpecific(arraysize(registers), registers);
221
}
222

223 224 225
void InterpreterDispatchDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
226
      kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
227
      kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
228 229
  data->InitializePlatformSpecific(arraysize(registers), registers);
}
230

231
void InterpreterPushArgsThenCallDescriptor::InitializePlatformSpecific(
232 233
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
234
      x0,  // argument count (not including receiver)
235 236 237 238 239 240
      x2,  // address of first argument
      x1   // the target callable to be call
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

241
void InterpreterPushArgsThenConstructDescriptor::InitializePlatformSpecific(
242 243 244
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
      x0,  // argument count (not including receiver)
245
      x3,  // new target
246
      x1,  // constructor to call
247 248
      x2,  // allocation site feedback if available, undefined otherwise
      x4   // address of the first argument
249 250
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
251 252
}

253 254 255
namespace {

void InterpreterCEntryDescriptor_InitializePlatformSpecific(
256 257 258 259 260 261 262 263 264
    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);
}

265 266 267 268 269 270 271 272 273 274 275 276
}  // namespace

void InterpreterCEntry1Descriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}

void InterpreterCEntry2Descriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}

277 278 279 280
void ResumeGeneratorDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
      x0,  // the value to pass to the generator
281
      x1   // the JSGeneratorObject to resume
282 283 284
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
}
285

286 287 288 289 290 291 292 293
void FrameDropperTrampolineDescriptor::InitializePlatformSpecific(
    CallInterfaceDescriptorData* data) {
  Register registers[] = {
      x1,  // loaded new FP
  };
  data->InitializePlatformSpecific(arraysize(registers), registers);
}

294 295
}  // namespace internal
}  // namespace v8
296 297

#endif  // V8_TARGET_ARCH_ARM64