Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/ppc/code-stubs-ppc.cc

Issue 965823002: Contribution of PowerPC port (continuation of 422063005) - currency (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ppc/builtins-ppc.cc ('k') | src/ppc/debug-ppc.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_PPC 7 #if V8_TARGET_ARCH_PPC
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 103
104 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm, 104 void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm,
105 ExternalReference miss) { 105 ExternalReference miss) {
106 // Update the static counter each time a new code stub is generated. 106 // Update the static counter each time a new code stub is generated.
107 isolate()->counters()->code_stubs()->Increment(); 107 isolate()->counters()->code_stubs()->Increment();
108 108
109 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor(); 109 CallInterfaceDescriptor descriptor = GetCallInterfaceDescriptor();
110 int param_count = descriptor.GetEnvironmentParameterCount(); 110 int param_count = descriptor.GetEnvironmentParameterCount();
111 { 111 {
112 // Call the runtime system in a fresh internal frame. 112 // Call the runtime system in a fresh internal frame.
113 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 113 FrameScope scope(masm, StackFrame::INTERNAL);
114 DCHECK(param_count == 0 || 114 DCHECK(param_count == 0 ||
115 r3.is(descriptor.GetEnvironmentParameterRegister(param_count - 1))); 115 r3.is(descriptor.GetEnvironmentParameterRegister(param_count - 1)));
116 // Push arguments 116 // Push arguments
117 for (int i = 0; i < param_count; ++i) { 117 for (int i = 0; i < param_count; ++i) {
118 __ push(descriptor.GetEnvironmentParameterRegister(i)); 118 __ push(descriptor.GetEnvironmentParameterRegister(i));
119 } 119 }
120 __ CallExternalReference(miss, param_count); 120 __ CallExternalReference(miss, param_count);
121 } 121 }
122 122
123 __ Ret(); 123 __ Ret();
(...skipping 1053 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 // __ lwz(r7, MemOperand(sp, offset_to_argv)); 1177 // __ lwz(r7, MemOperand(sp, offset_to_argv));
1178 1178
1179 // Push a frame with special values setup to mark it as an entry frame. 1179 // Push a frame with special values setup to mark it as an entry frame.
1180 // r3: code entry 1180 // r3: code entry
1181 // r4: function 1181 // r4: function
1182 // r5: receiver 1182 // r5: receiver
1183 // r6: argc 1183 // r6: argc
1184 // r7: argv 1184 // r7: argv
1185 __ li(r0, Operand(-1)); // Push a bad frame pointer to fail if it is used. 1185 __ li(r0, Operand(-1)); // Push a bad frame pointer to fail if it is used.
1186 __ push(r0); 1186 __ push(r0);
1187 #if V8_OOL_CONSTANT_POOL
1188 __ mov(kConstantPoolRegister,
1189 Operand(isolate()->factory()->empty_constant_pool_array()));
1190 __ push(kConstantPoolRegister);
1191 #endif
1192 int marker = type(); 1187 int marker = type();
1193 __ LoadSmiLiteral(r0, Smi::FromInt(marker)); 1188 __ LoadSmiLiteral(r0, Smi::FromInt(marker));
1194 __ push(r0); 1189 __ push(r0);
1195 __ push(r0); 1190 __ push(r0);
1196 // Save copies of the top frame descriptor on the stack. 1191 // Save copies of the top frame descriptor on the stack.
1197 __ mov(r8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); 1192 __ mov(r8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate())));
1198 __ LoadP(r0, MemOperand(r8)); 1193 __ LoadP(r0, MemOperand(r8));
1199 __ push(r0); 1194 __ push(r0);
1200 1195
1201 // Set up frame pointer for the frame to be pushed. 1196 // Set up frame pointer for the frame to be pushed.
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 1324
1330 // Fixed register usage throughout the stub: 1325 // Fixed register usage throughout the stub:
1331 const Register object = r3; // Object (lhs). 1326 const Register object = r3; // Object (lhs).
1332 Register map = r6; // Map of the object. 1327 Register map = r6; // Map of the object.
1333 const Register function = r4; // Function (rhs). 1328 const Register function = r4; // Function (rhs).
1334 const Register prototype = r7; // Prototype of the function. 1329 const Register prototype = r7; // Prototype of the function.
1335 const Register inline_site = r9; 1330 const Register inline_site = r9;
1336 const Register scratch = r5; 1331 const Register scratch = r5;
1337 Register scratch3 = no_reg; 1332 Register scratch3 = no_reg;
1338 1333
1339 // delta = mov + unaligned LoadP + cmp + bne 1334 // delta = mov + tagged LoadP + cmp + bne
1340 #if V8_TARGET_ARCH_PPC64
1341 const int32_t kDeltaToLoadBoolResult = 1335 const int32_t kDeltaToLoadBoolResult =
1342 (Assembler::kMovInstructions + 4) * Assembler::kInstrSize; 1336 (Assembler::kMovInstructions + Assembler::kTaggedLoadInstructions + 2) *
1343 #else 1337 Assembler::kInstrSize;
1344 const int32_t kDeltaToLoadBoolResult =
1345 (Assembler::kMovInstructions + 3) * Assembler::kInstrSize;
1346 #endif
1347 1338
1348 Label slow, loop, is_instance, is_not_instance, not_js_object; 1339 Label slow, loop, is_instance, is_not_instance, not_js_object;
1349 1340
1350 if (!HasArgsInRegisters()) { 1341 if (!HasArgsInRegisters()) {
1351 __ LoadP(object, MemOperand(sp, 1 * kPointerSize)); 1342 __ LoadP(object, MemOperand(sp, 1 * kPointerSize));
1352 __ LoadP(function, MemOperand(sp, 0)); 1343 __ LoadP(function, MemOperand(sp, 0));
1353 } 1344 }
1354 1345
1355 // Check that the left hand is a JS object and load map. 1346 // Check that the left hand is a JS object and load map.
1356 __ JumpIfSmi(object, &not_js_object); 1347 __ JumpIfSmi(object, &not_js_object);
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1496 1487
1497 // Slow-case. Tail call builtin. 1488 // Slow-case. Tail call builtin.
1498 __ bind(&slow); 1489 __ bind(&slow);
1499 if (!ReturnTrueFalseObject()) { 1490 if (!ReturnTrueFalseObject()) {
1500 if (HasArgsInRegisters()) { 1491 if (HasArgsInRegisters()) {
1501 __ Push(r3, r4); 1492 __ Push(r3, r4);
1502 } 1493 }
1503 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); 1494 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION);
1504 } else { 1495 } else {
1505 { 1496 {
1506 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 1497 FrameScope scope(masm, StackFrame::INTERNAL);
1507 __ Push(r3, r4); 1498 __ Push(r3, r4);
1508 __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION); 1499 __ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
1509 } 1500 }
1510 if (CpuFeatures::IsSupported(ISELECT)) { 1501 if (CpuFeatures::IsSupported(ISELECT)) {
1511 __ cmpi(r3, Operand::Zero()); 1502 __ cmpi(r3, Operand::Zero());
1512 __ LoadRoot(r3, Heap::kTrueValueRootIndex); 1503 __ LoadRoot(r3, Heap::kTrueValueRootIndex);
1513 __ LoadRoot(r4, Heap::kFalseValueRootIndex); 1504 __ LoadRoot(r4, Heap::kFalseValueRootIndex);
1514 __ isel(eq, r3, r3, r4); 1505 __ isel(eq, r3, r3, r4);
1515 } else { 1506 } else {
1516 Label true_value, done; 1507 Label true_value, done;
(...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after
2578 if (!FLAG_pretenuring_call_new) { 2569 if (!FLAG_pretenuring_call_new) {
2579 // Make sure the function is the Array() function. 2570 // Make sure the function is the Array() function.
2580 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, r7); 2571 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, r7);
2581 __ cmp(r4, r7); 2572 __ cmp(r4, r7);
2582 __ bne(&not_array_function); 2573 __ bne(&not_array_function);
2583 2574
2584 // The target function is the Array constructor, 2575 // The target function is the Array constructor,
2585 // Create an AllocationSite if we don't already have it, store it in the 2576 // Create an AllocationSite if we don't already have it, store it in the
2586 // slot. 2577 // slot.
2587 { 2578 {
2588 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 2579 FrameScope scope(masm, StackFrame::INTERNAL);
2589 2580
2590 // Arguments register must be smi-tagged to call out. 2581 // Arguments register must be smi-tagged to call out.
2591 __ SmiTag(r3); 2582 __ SmiTag(r3);
2592 __ Push(r6, r5, r4, r3); 2583 __ Push(r6, r5, r4, r3);
2593 2584
2594 CreateAllocationSiteStub create_stub(masm->isolate()); 2585 CreateAllocationSiteStub create_stub(masm->isolate());
2595 __ CallStub(&create_stub); 2586 __ CallStub(&create_stub);
2596 2587
2597 __ Pop(r6, r5, r4, r3); 2588 __ Pop(r6, r5, r4, r3);
2598 __ SmiUntag(r3); 2589 __ SmiUntag(r3);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2664 __ li(r5, Operand::Zero()); 2655 __ li(r5, Operand::Zero());
2665 __ GetBuiltinFunction(r4, Builtins::CALL_NON_FUNCTION); 2656 __ GetBuiltinFunction(r4, Builtins::CALL_NON_FUNCTION);
2666 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), 2657 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
2667 RelocInfo::CODE_TARGET); 2658 RelocInfo::CODE_TARGET);
2668 } 2659 }
2669 2660
2670 2661
2671 static void EmitWrapCase(MacroAssembler* masm, int argc, Label* cont) { 2662 static void EmitWrapCase(MacroAssembler* masm, int argc, Label* cont) {
2672 // Wrap the receiver and patch it back onto the stack. 2663 // Wrap the receiver and patch it back onto the stack.
2673 { 2664 {
2674 FrameAndConstantPoolScope frame_scope(masm, StackFrame::INTERNAL); 2665 FrameScope frame_scope(masm, StackFrame::INTERNAL);
2675 __ Push(r4, r6); 2666 __ Push(r4, r6);
2676 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); 2667 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
2677 __ pop(r4); 2668 __ pop(r4);
2678 } 2669 }
2679 __ StoreP(r3, MemOperand(sp, argc * kPointerSize), r0); 2670 __ StoreP(r3, MemOperand(sp, argc * kPointerSize), r0);
2680 __ b(cont); 2671 __ b(cont);
2681 } 2672 }
2682 2673
2683 2674
2684 static void CallFunctionNoFeedback(MacroAssembler* masm, int argc, 2675 static void CallFunctionNoFeedback(MacroAssembler* masm, int argc,
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 // Update stats. 2972 // Update stats.
2982 __ LoadP(r7, FieldMemOperand(r5, with_types_offset)); 2973 __ LoadP(r7, FieldMemOperand(r5, with_types_offset));
2983 __ AddSmiLiteral(r7, r7, Smi::FromInt(1), r0); 2974 __ AddSmiLiteral(r7, r7, Smi::FromInt(1), r0);
2984 __ StoreP(r7, FieldMemOperand(r5, with_types_offset), r0); 2975 __ StoreP(r7, FieldMemOperand(r5, with_types_offset), r0);
2985 2976
2986 // Store the function. Use a stub since we need a frame for allocation. 2977 // Store the function. Use a stub since we need a frame for allocation.
2987 // r5 - vector 2978 // r5 - vector
2988 // r6 - slot 2979 // r6 - slot
2989 // r4 - function 2980 // r4 - function
2990 { 2981 {
2991 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 2982 FrameScope scope(masm, StackFrame::INTERNAL);
2992 CreateWeakCellStub create_stub(masm->isolate()); 2983 CreateWeakCellStub create_stub(masm->isolate());
2993 __ Push(r4); 2984 __ Push(r4);
2994 __ CallStub(&create_stub); 2985 __ CallStub(&create_stub);
2995 __ Pop(r4); 2986 __ Pop(r4);
2996 } 2987 }
2997 2988
2998 __ b(&have_js_function); 2989 __ b(&have_js_function);
2999 2990
3000 // We are here because tracing is on or we encountered a MISS case we can't 2991 // We are here because tracing is on or we encountered a MISS case we can't
3001 // handle here. 2992 // handle here.
3002 __ bind(&miss); 2993 __ bind(&miss);
3003 GenerateMiss(masm); 2994 GenerateMiss(masm);
3004 2995
3005 // the slow case 2996 // the slow case
3006 __ bind(&slow_start); 2997 __ bind(&slow_start);
3007 // Check that the function is really a JavaScript function. 2998 // Check that the function is really a JavaScript function.
3008 // r4: pushed function (to be verified) 2999 // r4: pushed function (to be verified)
3009 __ JumpIfSmi(r4, &non_function); 3000 __ JumpIfSmi(r4, &non_function);
3010 3001
3011 // Goto slow case if we do not have a function. 3002 // Goto slow case if we do not have a function.
3012 __ CompareObjectType(r4, r7, r7, JS_FUNCTION_TYPE); 3003 __ CompareObjectType(r4, r7, r7, JS_FUNCTION_TYPE);
3013 __ bne(&slow); 3004 __ bne(&slow);
3014 __ b(&have_js_function); 3005 __ b(&have_js_function);
3015 } 3006 }
3016 3007
3017 3008
3018 void CallICStub::GenerateMiss(MacroAssembler* masm) { 3009 void CallICStub::GenerateMiss(MacroAssembler* masm) {
3019 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 3010 FrameScope scope(masm, StackFrame::INTERNAL);
3020 3011
3021 // Push the function and feedback info. 3012 // Push the function and feedback info.
3022 __ Push(r4, r5, r6); 3013 __ Push(r4, r5, r6);
3023 3014
3024 // Call the entry. 3015 // Call the entry.
3025 IC::UtilityId id = GetICState() == DEFAULT ? IC::kCallIC_Miss 3016 IC::UtilityId id = GetICState() == DEFAULT ? IC::kCallIC_Miss
3026 : IC::kCallIC_Customization_Miss; 3017 : IC::kCallIC_Customization_Miss;
3027 3018
3028 ExternalReference miss = ExternalReference(IC_Utility(id), masm->isolate()); 3019 ExternalReference miss = ExternalReference(IC_Utility(id), masm->isolate());
3029 __ CallExternalReference(miss, 3); 3020 __ CallExternalReference(miss, 3);
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after
3967 GenerateMiss(masm); 3958 GenerateMiss(masm);
3968 } 3959 }
3969 3960
3970 3961
3971 void CompareICStub::GenerateMiss(MacroAssembler* masm) { 3962 void CompareICStub::GenerateMiss(MacroAssembler* masm) {
3972 { 3963 {
3973 // Call the runtime system in a fresh internal frame. 3964 // Call the runtime system in a fresh internal frame.
3974 ExternalReference miss = 3965 ExternalReference miss =
3975 ExternalReference(IC_Utility(IC::kCompareIC_Miss), isolate()); 3966 ExternalReference(IC_Utility(IC::kCompareIC_Miss), isolate());
3976 3967
3977 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 3968 FrameScope scope(masm, StackFrame::INTERNAL);
3978 __ Push(r4, r3); 3969 __ Push(r4, r3);
3979 __ Push(r4, r3); 3970 __ Push(r4, r3);
3980 __ LoadSmiLiteral(r0, Smi::FromInt(op())); 3971 __ LoadSmiLiteral(r0, Smi::FromInt(op()));
3981 __ push(r0); 3972 __ push(r0);
3982 __ CallExternalReference(miss, 3); 3973 __ CallExternalReference(miss, 3);
3983 // Compute the entry point of the rewritten stub. 3974 // Compute the entry point of the rewritten stub.
3984 __ addi(r5, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); 3975 __ addi(r5, r3, Operand(Code::kHeaderSize - kHeapObjectTag));
3985 // Restore registers. 3976 // Restore registers.
3986 __ Pop(r4, r3); 3977 __ Pop(r4, r3);
3987 } 3978 }
(...skipping 1313 matching lines...) Expand 10 before | Expand all | Expand 10 after
5301 kStackUnwindSpace, NULL, 5292 kStackUnwindSpace, NULL,
5302 MemOperand(fp, 6 * kPointerSize), NULL); 5293 MemOperand(fp, 6 * kPointerSize), NULL);
5303 } 5294 }
5304 5295
5305 5296
5306 #undef __ 5297 #undef __
5307 } 5298 }
5308 } // namespace v8::internal 5299 } // namespace v8::internal
5309 5300
5310 #endif // V8_TARGET_ARCH_PPC 5301 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « src/ppc/builtins-ppc.cc ('k') | src/ppc/debug-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698