| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_MIPS64 | 7 #if V8_TARGET_ARCH_PPC |
| 8 | 8 |
| 9 #include "src/interface-descriptors.h" | 9 #include "src/interface-descriptors.h" |
| 10 | 10 |
| 11 namespace v8 { | 11 namespace v8 { |
| 12 namespace internal { | 12 namespace internal { |
| 13 | 13 |
| 14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; } | 14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; } |
| 15 | 15 |
| 16 | 16 |
| 17 const Register LoadDescriptor::ReceiverRegister() { return a1; } | 17 const Register LoadDescriptor::ReceiverRegister() { return r4; } |
| 18 const Register LoadDescriptor::NameRegister() { return a2; } | 18 const Register LoadDescriptor::NameRegister() { return r5; } |
| 19 | 19 |
| 20 | 20 |
| 21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return a0; } | 21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return r3; } |
| 22 | 22 |
| 23 | 23 |
| 24 const Register VectorLoadICDescriptor::VectorRegister() { return a3; } | 24 const Register VectorLoadICDescriptor::VectorRegister() { return r6; } |
| 25 | 25 |
| 26 | 26 |
| 27 const Register StoreDescriptor::ReceiverRegister() { return a1; } | 27 const Register StoreDescriptor::ReceiverRegister() { return r4; } |
| 28 const Register StoreDescriptor::NameRegister() { return a2; } | 28 const Register StoreDescriptor::NameRegister() { return r5; } |
| 29 const Register StoreDescriptor::ValueRegister() { return a0; } | 29 const Register StoreDescriptor::ValueRegister() { return r3; } |
| 30 | 30 |
| 31 | 31 |
| 32 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return a3; } | 32 const Register StoreTransitionDescriptor::MapRegister() { return r6; } |
| 33 | 33 |
| 34 | 34 |
| 35 const Register InstanceofDescriptor::left() { return a0; } | 35 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return r6; } |
| 36 const Register InstanceofDescriptor::right() { return a1; } | |
| 37 | 36 |
| 38 | 37 |
| 39 const Register ArgumentsAccessReadDescriptor::index() { return a1; } | 38 const Register InstanceofDescriptor::left() { return r3; } |
| 40 const Register ArgumentsAccessReadDescriptor::parameter_count() { return a0; } | 39 const Register InstanceofDescriptor::right() { return r4; } |
| 41 | 40 |
| 42 | 41 |
| 43 const Register ApiGetterDescriptor::function_address() { return a2; } | 42 const Register ArgumentsAccessReadDescriptor::index() { return r4; } |
| 43 const Register ArgumentsAccessReadDescriptor::parameter_count() { return r3; } |
| 44 | 44 |
| 45 | 45 |
| 46 const Register MathPowTaggedDescriptor::exponent() { return a2; } | 46 const Register ApiGetterDescriptor::function_address() { return r5; } |
| 47 |
| 48 |
| 49 const Register MathPowTaggedDescriptor::exponent() { return r5; } |
| 47 | 50 |
| 48 | 51 |
| 49 const Register MathPowIntegerDescriptor::exponent() { | 52 const Register MathPowIntegerDescriptor::exponent() { |
| 50 return MathPowTaggedDescriptor::exponent(); | 53 return MathPowTaggedDescriptor::exponent(); |
| 51 } | 54 } |
| 52 | 55 |
| 53 | 56 |
| 54 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 57 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 55 Register registers[] = {cp, a2}; | 58 Register registers[] = {cp, r5}; |
| 56 data->Initialize(arraysize(registers), registers, NULL); | 59 data->Initialize(arraysize(registers), registers, NULL); |
| 57 } | 60 } |
| 58 | 61 |
| 59 | 62 |
| 60 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 63 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 61 Register registers[] = {cp, a1}; | 64 Register registers[] = {cp, r4}; |
| 62 data->Initialize(arraysize(registers), registers, NULL); | 65 data->Initialize(arraysize(registers), registers, NULL); |
| 63 } | 66 } |
| 64 | 67 |
| 65 | 68 |
| 66 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 69 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 67 Register registers[] = {cp, a0}; | 70 Register registers[] = {cp, r3}; |
| 68 data->Initialize(arraysize(registers), registers, NULL); | 71 data->Initialize(arraysize(registers), registers, NULL); |
| 69 } | 72 } |
| 70 | 73 |
| 71 | 74 |
| 72 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 75 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 73 Register registers[] = {cp, a0}; | 76 Register registers[] = {cp, r3}; |
| 74 data->Initialize(arraysize(registers), registers, NULL); | 77 data->Initialize(arraysize(registers), registers, NULL); |
| 75 } | 78 } |
| 76 | 79 |
| 77 | 80 |
| 78 void FastCloneShallowArrayDescriptor::Initialize( | 81 void FastCloneShallowArrayDescriptor::Initialize( |
| 79 CallInterfaceDescriptorData* data) { | 82 CallInterfaceDescriptorData* data) { |
| 80 Register registers[] = {cp, a3, a2, a1}; | 83 Register registers[] = {cp, r6, r5, r4}; |
| 81 Representation representations[] = { | 84 Representation representations[] = { |
| 82 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), | 85 Representation::Tagged(), Representation::Tagged(), Representation::Smi(), |
| 83 Representation::Tagged()}; | 86 Representation::Tagged()}; |
| 84 data->Initialize(arraysize(registers), registers, representations); | 87 data->Initialize(arraysize(registers), registers, representations); |
| 85 } | 88 } |
| 86 | 89 |
| 87 | 90 |
| 88 void FastCloneShallowObjectDescriptor::Initialize( | 91 void FastCloneShallowObjectDescriptor::Initialize( |
| 89 CallInterfaceDescriptorData* data) { | 92 CallInterfaceDescriptorData* data) { |
| 90 Register registers[] = {cp, a3, a2, a1, a0}; | 93 Register registers[] = {cp, r6, r5, r4, r3}; |
| 91 data->Initialize(arraysize(registers), registers, NULL); | 94 data->Initialize(arraysize(registers), registers, NULL); |
| 92 } | 95 } |
| 93 | 96 |
| 94 | 97 |
| 95 void CreateAllocationSiteDescriptor::Initialize( | 98 void CreateAllocationSiteDescriptor::Initialize( |
| 96 CallInterfaceDescriptorData* data) { | 99 CallInterfaceDescriptorData* data) { |
| 97 Register registers[] = {cp, a2, a3}; | 100 Register registers[] = {cp, r5, r6}; |
| 98 data->Initialize(arraysize(registers), registers, NULL); | 101 data->Initialize(arraysize(registers), registers, NULL); |
| 99 } | 102 } |
| 100 | 103 |
| 101 | 104 |
| 102 void StoreArrayLiteralElementDescriptor::Initialize( | 105 void StoreArrayLiteralElementDescriptor::Initialize( |
| 103 CallInterfaceDescriptorData* data) { | 106 CallInterfaceDescriptorData* data) { |
| 104 Register registers[] = {cp, a3, a0}; | 107 Register registers[] = {cp, r6, r3}; |
| 108 data->Initialize(arraysize(registers), registers, NULL); |
| 109 } |
| 110 |
| 111 |
| 112 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 113 Register registers[] = {cp, r4}; |
| 105 data->Initialize(arraysize(registers), registers, NULL); | 114 data->Initialize(arraysize(registers), registers, NULL); |
| 106 } | 115 } |
| 107 | 116 |
| 108 | 117 |
| 109 void CallFunctionWithFeedbackDescriptor::Initialize( | 118 void CallFunctionWithFeedbackDescriptor::Initialize( |
| 110 CallInterfaceDescriptorData* data) { | 119 CallInterfaceDescriptorData* data) { |
| 111 Register registers[] = {cp, a1, a3}; | 120 Register registers[] = {cp, r4, r6}; |
| 112 Representation representations[] = {Representation::Tagged(), | 121 Representation representations[] = {Representation::Tagged(), |
| 113 Representation::Tagged(), | 122 Representation::Tagged(), |
| 114 Representation::Smi()}; | 123 Representation::Smi()}; |
| 115 data->Initialize(arraysize(registers), registers, representations); | 124 data->Initialize(arraysize(registers), registers, representations); |
| 116 } | 125 } |
| 117 | 126 |
| 118 | 127 |
| 119 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { | |
| 120 Register registers[] = {cp, a1}; | |
| 121 data->Initialize(arraysize(registers), registers, NULL); | |
| 122 } | |
| 123 | |
| 124 | |
| 125 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 128 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 126 // a0 : number of arguments | 129 // r3 : number of arguments |
| 127 // a1 : the function to call | 130 // r4 : the function to call |
| 128 // a2 : feedback vector | 131 // r5 : feedback vector |
| 129 // a3 : (only if a2 is not the megamorphic symbol) slot in feedback | 132 // r6 : (only if r5 is not the megamorphic symbol) slot in feedback |
| 130 // vector (Smi) | 133 // vector (Smi) |
| 131 // TODO(turbofan): So far we don't gather type feedback and hence skip the | 134 // TODO(turbofan): So far we don't gather type feedback and hence skip the |
| 132 // slot parameter, but ArrayConstructStub needs the vector to be undefined. | 135 // slot parameter, but ArrayConstructStub needs the vector to be undefined. |
| 133 Register registers[] = {cp, a0, a1, a2}; | 136 Register registers[] = {cp, r3, r4, r5}; |
| 134 data->Initialize(arraysize(registers), registers, NULL); | 137 data->Initialize(arraysize(registers), registers, NULL); |
| 135 } | 138 } |
| 136 | 139 |
| 137 | 140 |
| 138 void RegExpConstructResultDescriptor::Initialize( | 141 void RegExpConstructResultDescriptor::Initialize( |
| 139 CallInterfaceDescriptorData* data) { | 142 CallInterfaceDescriptorData* data) { |
| 140 Register registers[] = {cp, a2, a1, a0}; | 143 Register registers[] = {cp, r5, r4, r3}; |
| 141 data->Initialize(arraysize(registers), registers, NULL); | 144 data->Initialize(arraysize(registers), registers, NULL); |
| 142 } | 145 } |
| 143 | 146 |
| 144 | 147 |
| 145 void TransitionElementsKindDescriptor::Initialize( | 148 void TransitionElementsKindDescriptor::Initialize( |
| 146 CallInterfaceDescriptorData* data) { | 149 CallInterfaceDescriptorData* data) { |
| 147 Register registers[] = {cp, a0, a1}; | 150 Register registers[] = {cp, r3, r4}; |
| 148 data->Initialize(arraysize(registers), registers, NULL); | 151 data->Initialize(arraysize(registers), registers, NULL); |
| 149 } | 152 } |
| 150 | 153 |
| 151 | 154 |
| 152 void ArrayConstructorConstantArgCountDescriptor::Initialize( | 155 void ArrayConstructorConstantArgCountDescriptor::Initialize( |
| 153 CallInterfaceDescriptorData* data) { | 156 CallInterfaceDescriptorData* data) { |
| 154 // register state | 157 // register state |
| 155 // cp -- context | 158 // cp -- context |
| 156 // a0 -- number of arguments | 159 // r3 -- number of arguments |
| 157 // a1 -- function | 160 // r4 -- function |
| 158 // a2 -- allocation site with elements kind | 161 // r5 -- allocation site with elements kind |
| 159 Register registers[] = {cp, a1, a2}; | 162 Register registers[] = {cp, r4, r5}; |
| 160 data->Initialize(arraysize(registers), registers, NULL); | 163 data->Initialize(arraysize(registers), registers, NULL); |
| 161 } | 164 } |
| 162 | 165 |
| 163 | 166 |
| 164 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 167 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 165 // stack param count needs (constructor pointer, and single argument) | 168 // stack param count needs (constructor pointer, and single argument) |
| 166 Register registers[] = {cp, a1, a2, a0}; | 169 Register registers[] = {cp, r4, r5, r3}; |
| 167 Representation representations[] = { | 170 Representation representations[] = { |
| 168 Representation::Tagged(), Representation::Tagged(), | 171 Representation::Tagged(), Representation::Tagged(), |
| 169 Representation::Tagged(), Representation::Integer32()}; | 172 Representation::Tagged(), Representation::Integer32()}; |
| 170 data->Initialize(arraysize(registers), registers, representations); | 173 data->Initialize(arraysize(registers), registers, representations); |
| 171 } | 174 } |
| 172 | 175 |
| 173 | 176 |
| 174 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( | 177 void InternalArrayConstructorConstantArgCountDescriptor::Initialize( |
| 175 CallInterfaceDescriptorData* data) { | 178 CallInterfaceDescriptorData* data) { |
| 176 // register state | 179 // register state |
| 177 // cp -- context | 180 // cp -- context |
| 178 // a0 -- number of arguments | 181 // r3 -- number of arguments |
| 179 // a1 -- constructor function | 182 // r4 -- constructor function |
| 180 Register registers[] = {cp, a1}; | 183 Register registers[] = {cp, r4}; |
| 181 data->Initialize(arraysize(registers), registers, NULL); | 184 data->Initialize(arraysize(registers), registers, NULL); |
| 182 } | 185 } |
| 183 | 186 |
| 184 | 187 |
| 185 void InternalArrayConstructorDescriptor::Initialize( | 188 void InternalArrayConstructorDescriptor::Initialize( |
| 186 CallInterfaceDescriptorData* data) { | 189 CallInterfaceDescriptorData* data) { |
| 187 // stack param count needs (constructor pointer, and single argument) | 190 // stack param count needs (constructor pointer, and single argument) |
| 188 Register registers[] = {cp, a1, a0}; | 191 Register registers[] = {cp, r4, r3}; |
| 189 Representation representations[] = {Representation::Tagged(), | 192 Representation representations[] = {Representation::Tagged(), |
| 190 Representation::Tagged(), | 193 Representation::Tagged(), |
| 191 Representation::Integer32()}; | 194 Representation::Integer32()}; |
| 192 data->Initialize(arraysize(registers), registers, representations); | 195 data->Initialize(arraysize(registers), registers, representations); |
| 193 } | 196 } |
| 194 | 197 |
| 195 | 198 |
| 196 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 199 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 197 Register registers[] = {cp, a0}; | 200 Register registers[] = {cp, r3}; |
| 198 data->Initialize(arraysize(registers), registers, NULL); | 201 data->Initialize(arraysize(registers), registers, NULL); |
| 199 } | 202 } |
| 200 | 203 |
| 201 | 204 |
| 202 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 205 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 203 Register registers[] = {cp, a0}; | 206 Register registers[] = {cp, r3}; |
| 204 data->Initialize(arraysize(registers), registers, NULL); | 207 data->Initialize(arraysize(registers), registers, NULL); |
| 205 } | 208 } |
| 206 | 209 |
| 207 | 210 |
| 208 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 211 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 209 Register registers[] = {cp, a1, a0}; | 212 Register registers[] = {cp, r4, r3}; |
| 210 data->Initialize(arraysize(registers), registers, NULL); | 213 data->Initialize(arraysize(registers), registers, NULL); |
| 211 } | 214 } |
| 212 | 215 |
| 213 | 216 |
| 214 void BinaryOpWithAllocationSiteDescriptor::Initialize( | 217 void BinaryOpWithAllocationSiteDescriptor::Initialize( |
| 215 CallInterfaceDescriptorData* data) { | 218 CallInterfaceDescriptorData* data) { |
| 216 Register registers[] = {cp, a2, a1, a0}; | 219 Register registers[] = {cp, r5, r4, r3}; |
| 217 data->Initialize(arraysize(registers), registers, NULL); | 220 data->Initialize(arraysize(registers), registers, NULL); |
| 218 } | 221 } |
| 219 | 222 |
| 220 | 223 |
| 221 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 224 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 222 Register registers[] = {cp, a1, a0}; | 225 Register registers[] = {cp, r4, r3}; |
| 223 data->Initialize(arraysize(registers), registers, NULL); | 226 data->Initialize(arraysize(registers), registers, NULL); |
| 224 } | 227 } |
| 225 | 228 |
| 226 | 229 |
| 227 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 230 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 228 Register registers[] = { | 231 Register registers[] = { |
| 229 cp, // context | 232 cp, // context |
| 230 a2, // key | 233 r5, // key |
| 231 }; | 234 }; |
| 232 Representation representations[] = { | 235 Representation representations[] = { |
| 233 Representation::Tagged(), // context | 236 Representation::Tagged(), // context |
| 234 Representation::Tagged(), // key | 237 Representation::Tagged(), // key |
| 235 }; | 238 }; |
| 236 data->Initialize(arraysize(registers), registers, representations); | 239 data->Initialize(arraysize(registers), registers, representations); |
| 237 } | 240 } |
| 238 | 241 |
| 239 | 242 |
| 240 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 243 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 241 Register registers[] = { | 244 Register registers[] = { |
| 242 cp, // context | 245 cp, // context |
| 243 a2, // name | 246 r5, // name |
| 244 }; | 247 }; |
| 245 Representation representations[] = { | 248 Representation representations[] = { |
| 246 Representation::Tagged(), // context | 249 Representation::Tagged(), // context |
| 247 Representation::Tagged(), // name | 250 Representation::Tagged(), // name |
| 248 }; | 251 }; |
| 249 data->Initialize(arraysize(registers), registers, representations); | 252 data->Initialize(arraysize(registers), registers, representations); |
| 250 } | 253 } |
| 251 | 254 |
| 252 | 255 |
| 253 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 256 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 254 Register registers[] = { | 257 Register registers[] = { |
| 255 cp, // context | 258 cp, // context |
| 256 a0, // receiver | 259 r3, // receiver |
| 257 }; | 260 }; |
| 258 Representation representations[] = { | 261 Representation representations[] = { |
| 259 Representation::Tagged(), // context | 262 Representation::Tagged(), // context |
| 260 Representation::Tagged(), // receiver | 263 Representation::Tagged(), // receiver |
| 261 }; | 264 }; |
| 262 data->Initialize(arraysize(registers), registers, representations); | 265 data->Initialize(arraysize(registers), registers, representations); |
| 263 } | 266 } |
| 264 | 267 |
| 265 | 268 |
| 266 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 269 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 267 Register registers[] = { | 270 Register registers[] = { |
| 268 cp, // context | 271 cp, // context |
| 269 a1, // JSFunction | 272 r4, // JSFunction |
| 270 a0, // actual number of arguments | 273 r3, // actual number of arguments |
| 271 a2, // expected number of arguments | 274 r5, // expected number of arguments |
| 272 }; | 275 }; |
| 273 Representation representations[] = { | 276 Representation representations[] = { |
| 274 Representation::Tagged(), // context | 277 Representation::Tagged(), // context |
| 275 Representation::Tagged(), // JSFunction | 278 Representation::Tagged(), // JSFunction |
| 276 Representation::Integer32(), // actual number of arguments | 279 Representation::Integer32(), // actual number of arguments |
| 277 Representation::Integer32(), // expected number of arguments | 280 Representation::Integer32(), // expected number of arguments |
| 278 }; | 281 }; |
| 279 data->Initialize(arraysize(registers), registers, representations); | 282 data->Initialize(arraysize(registers), registers, representations); |
| 280 } | 283 } |
| 281 | 284 |
| 282 | 285 |
| 283 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { | 286 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) { |
| 284 Register registers[] = { | 287 Register registers[] = { |
| 285 cp, // context | 288 cp, // context |
| 286 a0, // callee | 289 r3, // callee |
| 287 a4, // call_data | 290 r7, // call_data |
| 288 a2, // holder | 291 r5, // holder |
| 289 a1, // api_function_address | 292 r4, // api_function_address |
| 290 }; | 293 }; |
| 291 Representation representations[] = { | 294 Representation representations[] = { |
| 292 Representation::Tagged(), // context | 295 Representation::Tagged(), // context |
| 293 Representation::Tagged(), // callee | 296 Representation::Tagged(), // callee |
| 294 Representation::Tagged(), // call_data | 297 Representation::Tagged(), // call_data |
| 295 Representation::Tagged(), // holder | 298 Representation::Tagged(), // holder |
| 296 Representation::External(), // api_function_address | 299 Representation::External(), // api_function_address |
| 297 }; | 300 }; |
| 298 data->Initialize(arraysize(registers), registers, representations); | 301 data->Initialize(arraysize(registers), registers, representations); |
| 299 } | 302 } |
| 300 } | 303 } |
| 301 } // namespace v8::internal | 304 } // namespace v8::internal |
| 302 | 305 |
| 303 #endif // V8_TARGET_ARCH_MIPS64 | 306 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |