| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #if V8_TARGET_ARCH_PPC | 5 #if V8_TARGET_ARCH_PPC |
| 6 | 6 |
| 7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
| 8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 __ TailCallRuntime(Runtime::kSymbolDescriptiveString, 1, 1); | 215 __ TailCallRuntime(Runtime::kSymbolDescriptiveString, 1, 1); |
| 216 } | 216 } |
| 217 } | 217 } |
| 218 | 218 |
| 219 | 219 |
| 220 // static | 220 // static |
| 221 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { | 221 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { |
| 222 // ----------- S t a t e ------------- | 222 // ----------- S t a t e ------------- |
| 223 // -- r3 : number of arguments | 223 // -- r3 : number of arguments |
| 224 // -- r4 : constructor function | 224 // -- r4 : constructor function |
| 225 // -- r6 : original constructor |
| 225 // -- lr : return address | 226 // -- lr : return address |
| 226 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) | 227 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) |
| 227 // -- sp[argc * 4] : receiver | 228 // -- sp[argc * 4] : receiver |
| 228 // ----------------------------------- | 229 // ----------------------------------- |
| 229 | 230 |
| 230 // 1. Load the first argument into r3 and get rid of the rest (including the | 231 // 1. Load the first argument into r5 and get rid of the rest (including the |
| 231 // receiver). | 232 // receiver). |
| 232 { | 233 { |
| 233 Label no_arguments, done; | 234 Label no_arguments, done; |
| 234 __ cmpi(r3, Operand::Zero()); | 235 __ cmpi(r3, Operand::Zero()); |
| 235 __ beq(&no_arguments); | 236 __ beq(&no_arguments); |
| 236 __ subi(r3, r3, Operand(1)); | 237 __ subi(r3, r3, Operand(1)); |
| 237 __ ShiftLeftImm(r3, r3, Operand(kPointerSizeLog2)); | 238 __ ShiftLeftImm(r5, r3, Operand(kPointerSizeLog2)); |
| 238 __ LoadPUX(r3, MemOperand(sp, r3)); | 239 __ LoadPUX(r5, MemOperand(sp, r5)); |
| 239 __ Drop(2); | 240 __ Drop(2); |
| 240 __ b(&done); | 241 __ b(&done); |
| 241 __ bind(&no_arguments); | 242 __ bind(&no_arguments); |
| 242 __ LoadRoot(r3, Heap::kempty_stringRootIndex); | 243 __ LoadRoot(r5, Heap::kempty_stringRootIndex); |
| 243 __ Drop(1); | 244 __ Drop(1); |
| 244 __ bind(&done); | 245 __ bind(&done); |
| 245 } | 246 } |
| 246 | 247 |
| 247 // 2. Make sure r3 is a string. | 248 // 2. Make sure r5 is a string. |
| 248 { | 249 { |
| 249 Label convert, done_convert; | 250 Label convert, done_convert; |
| 250 __ JumpIfSmi(r3, &convert); | 251 __ JumpIfSmi(r5, &convert); |
| 251 __ CompareObjectType(r3, r5, r5, FIRST_NONSTRING_TYPE); | 252 __ CompareObjectType(r5, r7, r7, FIRST_NONSTRING_TYPE); |
| 252 __ blt(&done_convert); | 253 __ blt(&done_convert); |
| 253 __ bind(&convert); | 254 __ bind(&convert); |
| 254 { | 255 { |
| 255 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 256 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| 256 ToStringStub stub(masm->isolate()); | 257 ToStringStub stub(masm->isolate()); |
| 257 __ push(r4); | 258 __ Push(r4, r6); |
| 259 __ mr(r3, r5); |
| 258 __ CallStub(&stub); | 260 __ CallStub(&stub); |
| 259 __ pop(r4); | 261 __ mr(r5, r3); |
| 262 __ Pop(r4, r6); |
| 260 } | 263 } |
| 261 __ bind(&done_convert); | 264 __ bind(&done_convert); |
| 262 } | 265 } |
| 263 | 266 |
| 264 // 3. Allocate a JSValue wrapper for the string. | 267 // 3. Allocate a JSValue wrapper for the string. |
| 265 { | 268 { |
| 266 // ----------- S t a t e ------------- | 269 // ----------- S t a t e ------------- |
| 267 // -- r3 : the first argument | 270 // -- r5 : the first argument |
| 268 // -- r4 : constructor function | 271 // -- r4 : constructor function |
| 272 // -- r6 : original constructor |
| 269 // -- lr : return address | 273 // -- lr : return address |
| 270 // ----------------------------------- | 274 // ----------------------------------- |
| 271 | 275 |
| 272 Label allocate, done_allocate; | 276 Label allocate, done_allocate, rt_call; |
| 273 __ mr(r5, r3); | 277 |
| 278 // Fall back to runtime if the original constructor and function differ. |
| 279 __ cmp(r4, r6); |
| 280 __ bne(&rt_call); |
| 281 |
| 274 __ Allocate(JSValue::kSize, r3, r6, r7, &allocate, TAG_OBJECT); | 282 __ Allocate(JSValue::kSize, r3, r6, r7, &allocate, TAG_OBJECT); |
| 275 __ bind(&done_allocate); | 283 __ bind(&done_allocate); |
| 276 | 284 |
| 277 // Initialize the JSValue in r3. | 285 // Initialize the JSValue in r3. |
| 278 __ LoadGlobalFunctionInitialMap(r4, r6, r7); | 286 __ LoadGlobalFunctionInitialMap(r4, r6, r7); |
| 279 __ StoreP(r6, FieldMemOperand(r3, HeapObject::kMapOffset), r0); | 287 __ StoreP(r6, FieldMemOperand(r3, HeapObject::kMapOffset), r0); |
| 280 __ LoadRoot(r6, Heap::kEmptyFixedArrayRootIndex); | 288 __ LoadRoot(r6, Heap::kEmptyFixedArrayRootIndex); |
| 281 __ StoreP(r6, FieldMemOperand(r3, JSObject::kPropertiesOffset), r0); | 289 __ StoreP(r6, FieldMemOperand(r3, JSObject::kPropertiesOffset), r0); |
| 282 __ StoreP(r6, FieldMemOperand(r3, JSObject::kElementsOffset), r0); | 290 __ StoreP(r6, FieldMemOperand(r3, JSObject::kElementsOffset), r0); |
| 283 __ StoreP(r5, FieldMemOperand(r3, JSValue::kValueOffset), r0); | 291 __ StoreP(r5, FieldMemOperand(r3, JSValue::kValueOffset), r0); |
| 284 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize); | 292 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize); |
| 285 __ Ret(); | 293 __ Ret(); |
| 286 | 294 |
| 287 // Fallback to the runtime to allocate in new space. | 295 // Fallback to the runtime to allocate in new space. |
| 288 __ bind(&allocate); | 296 __ bind(&allocate); |
| 289 { | 297 { |
| 290 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 298 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| 291 __ LoadSmiLiteral(r6, Smi::FromInt(JSValue::kSize)); | 299 __ LoadSmiLiteral(r6, Smi::FromInt(JSValue::kSize)); |
| 292 __ Push(r4, r5, r6); | 300 __ Push(r4, r5, r6); |
| 293 __ CallRuntime(Runtime::kAllocateInNewSpace, 1); | 301 __ CallRuntime(Runtime::kAllocateInNewSpace, 1); |
| 294 __ Pop(r4, r5); | 302 __ Pop(r4, r5); |
| 295 } | 303 } |
| 296 __ b(&done_allocate); | 304 __ b(&done_allocate); |
| 305 |
| 306 // Fallback to the runtime to create new object. |
| 307 __ bind(&rt_call); |
| 308 { |
| 309 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| 310 __ Push(r4, r5, r4, r6); // constructor function, original constructor |
| 311 __ CallRuntime(Runtime::kNewObject, 2); |
| 312 __ Pop(r4, r5); |
| 313 } |
| 314 __ StoreP(r5, FieldMemOperand(r3, JSValue::kValueOffset), r0); |
| 315 __ Ret(); |
| 297 } | 316 } |
| 298 } | 317 } |
| 299 | 318 |
| 300 | 319 |
| 301 static void CallRuntimePassFunction(MacroAssembler* masm, | 320 static void CallRuntimePassFunction(MacroAssembler* masm, |
| 302 Runtime::FunctionId function_id) { | 321 Runtime::FunctionId function_id) { |
| 303 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 322 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| 304 // Push a copy of the function onto the stack. | 323 // Push a copy of the function onto the stack. |
| 305 // Push function as parameter to the runtime call. | 324 // Push function as parameter to the runtime call. |
| 306 __ Push(r4, r4); | 325 __ Push(r4, r4); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 | 521 |
| 503 // Reload the original constructor and fall-through. | 522 // Reload the original constructor and fall-through. |
| 504 __ bind(&rt_call_reload_new_target); | 523 __ bind(&rt_call_reload_new_target); |
| 505 __ LoadP(r6, MemOperand(sp, 0 * kPointerSize)); | 524 __ LoadP(r6, MemOperand(sp, 0 * kPointerSize)); |
| 506 } | 525 } |
| 507 | 526 |
| 508 // Allocate the new receiver object using the runtime call. | 527 // Allocate the new receiver object using the runtime call. |
| 509 // r4: constructor function | 528 // r4: constructor function |
| 510 // r6: original constructor | 529 // r6: original constructor |
| 511 __ bind(&rt_call); | 530 __ bind(&rt_call); |
| 512 __ Push(r4, r6); | 531 __ Push(r4, r6); // constructor function, original constructor |
| 513 __ CallRuntime(Runtime::kNewObject, 2); | 532 __ CallRuntime(Runtime::kNewObject, 2); |
| 514 __ mr(r7, r3); | 533 __ mr(r7, r3); |
| 515 | 534 |
| 516 // Receiver for constructor call allocated. | 535 // Receiver for constructor call allocated. |
| 517 // r7: JSObject | 536 // r7: JSObject |
| 518 __ bind(&allocated); | 537 __ bind(&allocated); |
| 519 | 538 |
| 520 // Restore the parameters. | 539 // Restore the parameters. |
| 521 __ Pop(r4, ip); | 540 __ Pop(r4, ip); |
| 522 | 541 |
| (...skipping 1422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1945 __ bkpt(0); | 1964 __ bkpt(0); |
| 1946 } | 1965 } |
| 1947 } | 1966 } |
| 1948 | 1967 |
| 1949 | 1968 |
| 1950 #undef __ | 1969 #undef __ |
| 1951 } // namespace internal | 1970 } // namespace internal |
| 1952 } // namespace v8 | 1971 } // namespace v8 |
| 1953 | 1972 |
| 1954 #endif // V8_TARGET_ARCH_PPC | 1973 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |