1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_MIPS64
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/interface-descriptors.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register CallInterfaceDescriptor::ContextRegister() { return cp; }
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
1513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CallInterfaceDescriptorData* data, int register_parameter_count) {
1613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  const Register default_stub_registers[] = {a0, a1, a2, a3, a4};
1713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK_LE(static_cast<size_t>(register_parameter_count),
1813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch           arraysize(default_stub_registers));
1913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  data->InitializePlatformSpecific(register_parameter_count,
2013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                   default_stub_registers);
2113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Register FastNewFunctionContextDescriptor::FunctionRegister() {
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return a1;
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Register FastNewFunctionContextDescriptor::SlotsRegister() { return a0; }
27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register LoadDescriptor::ReceiverRegister() { return a1; }
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register LoadDescriptor::NameRegister() { return a2; }
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Register LoadDescriptor::SlotRegister() { return a0; }
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochconst Register LoadICProtoArrayDescriptor::HandlerRegister() { return a4; }
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register StoreDescriptor::ReceiverRegister() { return a1; }
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register StoreDescriptor::NameRegister() { return a2; }
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register StoreDescriptor::ValueRegister() { return a0; }
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Register StoreDescriptor::SlotRegister() { return a4; }
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Register StoreWithVectorDescriptor::VectorRegister() { return a3; }
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst Register StoreTransitionDescriptor::SlotRegister() { return a4; }
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst Register StoreTransitionDescriptor::VectorRegister() { return a3; }
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst Register StoreTransitionDescriptor::MapRegister() { return a5; }
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Register StringCompareDescriptor::LeftRegister() { return a1; }
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Register StringCompareDescriptor::RightRegister() { return a0; }
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
50bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst Register ApiGetterDescriptor::HolderRegister() { return a0; }
51bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst Register ApiGetterDescriptor::CallbackRegister() { return a3; }
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register MathPowTaggedDescriptor::exponent() { return a2; }
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Register MathPowIntegerDescriptor::exponent() {
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MathPowTaggedDescriptor::exponent();
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FastNewClosureDescriptor::InitializePlatformSpecific(
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Register registers[] = {a1, a2, a3};
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst Register TypeConversionDescriptor::ArgumentRegister() { return a0; }
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid TypeofDescriptor::InitializePlatformSpecific(
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a3};
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FastCloneRegExpDescriptor::InitializePlatformSpecific(
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a3, a2, a1, a0};
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a3, a2, a1};
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a3, a2, a1, a0};
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CreateAllocationSiteDescriptor::InitializePlatformSpecific(
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a2, a3};
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CreateWeakCellDescriptor::InitializePlatformSpecific(
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a2, a3, a1};
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid CallICTrampolineDescriptor::InitializePlatformSpecific(
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
11762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Register registers[] = {a1, a0, a3};
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid CallICDescriptor::InitializePlatformSpecific(
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Register registers[] = {a1, a0, a3, a2};
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CallFunctionDescriptor::InitializePlatformSpecific(
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a1};
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CallConstructDescriptor::InitializePlatformSpecific(
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a0 : number of arguments
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a1 : the function to call
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a2 : feedback vector
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a3 : slot in feedback vector (Smi, for RecordCallTarget)
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a4 : new target (for IsSuperConstructorCall)
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(turbofan): So far we don't gather type feedback and hence skip the
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // slot parameter, but ArrayConstructStub needs the vector to be undefined.
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a0, a1, a4, a2};
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CallTrampolineDescriptor::InitializePlatformSpecific(
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a1: target
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a0: number of arguments
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a1, a0};
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid CallForwardVarargsDescriptor::InitializePlatformSpecific(
15862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CallInterfaceDescriptorData* data) {
15962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a1: the target to call
16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a2: start index (to support rest parameters)
16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Register registers[] = {a1, a2};
16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
16362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ConstructStubDescriptor::InitializePlatformSpecific(
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a1: target
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a3: new target
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a0: number of arguments
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a2: allocation site or undefined
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a1, a3, a0, a2};
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ConstructTrampolineDescriptor::InitializePlatformSpecific(
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a1: target
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a3: new target
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // a0: number of arguments
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a1, a3, a0};
182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid TransitionElementsKindDescriptor::InitializePlatformSpecific(
187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a0, a1};
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AllocateHeapNumberDescriptor::InitializePlatformSpecific(
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    CallInterfaceDescriptorData* data) {
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // register state
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(0, nullptr, nullptr);
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
19962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid ArrayConstructorDescriptor::InitializePlatformSpecific(
20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CallInterfaceDescriptorData* data) {
20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // kTarget, kNewTarget, kActualArgumentsCount, kAllocationSite
20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Register registers[] = {a1, a3, a0, a2};
20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
206bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
208bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // register state
209bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // a0 -- number of arguments
210bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // a1 -- function
211bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // a2 -- allocation site with elements kind
212bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Register registers[] = {a1, a2, a0};
213bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
21613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // register state
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a0 -- number of arguments
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a1 -- function
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // a2 -- allocation site with elements kind
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a1, a2, a0};
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // stack param count needs (constructor pointer, and single argument)
22913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Register registers[] = {a1, a2, a0};
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid VarArgFunctionDescriptor::InitializePlatformSpecific(
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
2353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // stack param count needs (arg count)
236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a0};
2373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid CompareDescriptor::InitializePlatformSpecific(
240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
2413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Register registers[] = {a1, a0};
242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BinaryOpDescriptor::InitializePlatformSpecific(
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CallInterfaceDescriptorData* data) {
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a1, a0};
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a2, a1, a0};
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid BinaryOpWithVectorDescriptor::InitializePlatformSpecific(
260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CallInterfaceDescriptorData* data) {
261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // register state
262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // a1 -- lhs
263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // a0 -- rhs
264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // a4 -- slot id
265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // a3 -- vector
266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Register registers[] = {a1, a0, a4, a3};
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
270bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid CountOpDescriptor::InitializePlatformSpecific(
271bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    CallInterfaceDescriptorData* data) {
272bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Register registers[] = {a1};
273bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
274bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid StringAddDescriptor::InitializePlatformSpecific(
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {a1, a0};
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid KeyedDescriptor::InitializePlatformSpecific(
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register registers[] = {
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a2,  // key
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid NamedDescriptor::InitializePlatformSpecific(
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register registers[] = {
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a2,  // name
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CallHandlerDescriptor::InitializePlatformSpecific(
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register registers[] = {
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a0,  // receiver
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ArgumentAdaptorDescriptor::InitializePlatformSpecific(
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register registers[] = {
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a1,  // JSFunction
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a3,  // the new target
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a0,  // actual number of arguments
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a2,  // expected number of arguments
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
321f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid ApiCallbackDescriptor::InitializePlatformSpecific(
322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Register registers[] = {
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a0,  // callee
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a4,  // call_data
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a2,  // holder
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      a1,  // api_function_address
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
332109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid InterpreterDispatchDescriptor::InitializePlatformSpecific(
333109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    CallInterfaceDescriptorData* data) {
334109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Register registers[] = {
335bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
336bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
337109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
338109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {
343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a0,  // argument count (not including receiver)
344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a2,  // address of first argument
345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a1   // the target callable to be call
346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a0,  // argument count (not including receiver)
354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a3,  // new target
355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a1,  // constructor to call
356f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      a2,  // allocation site feedback if available, undefined otherwise.
357f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      a4   // address of the first argument
358f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  };
359f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
360f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
361f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
362f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid InterpreterPushArgsAndConstructArrayDescriptor::InitializePlatformSpecific(
363f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CallInterfaceDescriptorData* data) {
364f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Register registers[] = {
365f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      a0,  // argument count (not including receiver)
366f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      a1,  // the target to call verified to be Array function
367f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      a2,  // allocation site feedback
368f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      a3,  // address of first argument
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid InterpreterCEntryDescriptor::InitializePlatformSpecific(
374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CallInterfaceDescriptorData* data) {
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Register registers[] = {
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a0,  // argument count (argc)
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a2,  // address of first argument (argv)
378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      a1   // the runtime function to call
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
383bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid ResumeGeneratorDescriptor::InitializePlatformSpecific(
384bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    CallInterfaceDescriptorData* data) {
385bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Register registers[] = {
386bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      v0,  // the value to pass to the generator
387bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      a1,  // the JSGeneratorObject to resume
388bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      a2   // the resume mode (tagged)
389bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
390bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
391bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
392bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
39362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid FrameDropperTrampolineDescriptor::InitializePlatformSpecific(
39462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CallInterfaceDescriptorData* data) {
39562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Register registers[] = {
39662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      a1,  // loaded new FP
39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  };
39862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  data->InitializePlatformSpecific(arraysize(registers), registers);
39962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
40062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_TARGET_ARCH_MIPS64
405