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" |
11 #include "src/interpreter/bytecodes.h" | |
12 #include "src/runtime/runtime.h" | 11 #include "src/runtime/runtime.h" |
13 | 12 |
14 namespace v8 { | 13 namespace v8 { |
15 namespace internal { | 14 namespace internal { |
16 | 15 |
17 | 16 |
18 #define __ ACCESS_MASM(masm) | 17 #define __ ACCESS_MASM(masm) |
19 | 18 |
20 | 19 |
21 void Builtins::Generate_Adaptor(MacroAssembler* masm, CFunctionId id, | 20 void Builtins::Generate_Adaptor(MacroAssembler* masm, CFunctionId id, |
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
900 // Allocate the local and temporary register file on the stack. | 899 // Allocate the local and temporary register file on the stack. |
901 { | 900 { |
902 // Load frame size (word) from the BytecodeArray object. | 901 // Load frame size (word) from the BytecodeArray object. |
903 __ lwz(r5, FieldMemOperand(kInterpreterBytecodeArrayRegister, | 902 __ lwz(r5, FieldMemOperand(kInterpreterBytecodeArrayRegister, |
904 BytecodeArray::kFrameSizeOffset)); | 903 BytecodeArray::kFrameSizeOffset)); |
905 | 904 |
906 // Do a stack check to ensure we don't go over the limit. | 905 // Do a stack check to ensure we don't go over the limit. |
907 Label ok; | 906 Label ok; |
908 __ sub(r6, sp, r5); | 907 __ sub(r6, sp, r5); |
909 __ LoadRoot(r0, Heap::kRealStackLimitRootIndex); | 908 __ LoadRoot(r0, Heap::kRealStackLimitRootIndex); |
910 __ cmp(r6, r0); | 909 __ cmpl(r6, r0); |
911 __ bge(&ok); | 910 __ bge(&ok); |
912 __ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION); | 911 __ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION); |
913 __ bind(&ok); | 912 __ bind(&ok); |
914 | 913 |
915 // If ok, push undefined as the initial value for all register file entries. | 914 // If ok, push undefined as the initial value for all register file entries. |
916 // Note: there should always be at least one stack slot for the return | |
917 // register in the register file. | |
918 // TODO(rmcilroy): Consider doing more than one push per loop iteration. | 915 // TODO(rmcilroy): Consider doing more than one push per loop iteration. |
919 Label loop_header; | 916 Label loop, no_args; |
920 __ LoadRoot(r6, Heap::kUndefinedValueRootIndex); | 917 __ LoadRoot(r6, Heap::kUndefinedValueRootIndex); |
921 __ ShiftRightImm(r5, r5, Operand(kPointerSizeLog2)); | 918 __ ShiftRightImm(r5, r5, Operand(kPointerSizeLog2), SetRC); |
| 919 __ beq(&no_args, cr0); |
922 __ mtctr(r5); | 920 __ mtctr(r5); |
923 __ bind(&loop_header); | 921 __ bind(&loop); |
924 __ push(r6); | 922 __ push(r6); |
925 __ bdnz(&loop_header); | 923 __ bdnz(&loop); |
| 924 __ bind(&no_args); |
926 } | 925 } |
927 | 926 |
928 // TODO(rmcilroy): List of things not currently dealt with here but done in | 927 // TODO(rmcilroy): List of things not currently dealt with here but done in |
929 // fullcodegen's prologue: | 928 // fullcodegen's prologue: |
930 // - Support profiler (specifically profiling_counter). | 929 // - Support profiler (specifically profiling_counter). |
931 // - Call ProfileEntryHookStub when isolate has a function_entry_hook. | 930 // - Call ProfileEntryHookStub when isolate has a function_entry_hook. |
932 // - Allow simulator stop operations if FLAG_stop_at is set. | 931 // - Allow simulator stop operations if FLAG_stop_at is set. |
933 // - Deal with sloppy mode functions which need to replace the | 932 // - Deal with sloppy mode functions which need to replace the |
934 // receiver with the global proxy when called as functions (without an | 933 // receiver with the global proxy when called as functions (without an |
935 // explicit receiver object). | 934 // explicit receiver object). |
(...skipping 13 matching lines...) Expand all Loading... |
949 // Perform stack guard check. | 948 // Perform stack guard check. |
950 { | 949 { |
951 Label ok; | 950 Label ok; |
952 __ LoadRoot(r0, Heap::kStackLimitRootIndex); | 951 __ LoadRoot(r0, Heap::kStackLimitRootIndex); |
953 __ cmp(sp, r0); | 952 __ cmp(sp, r0); |
954 __ bge(&ok); | 953 __ bge(&ok); |
955 __ CallRuntime(Runtime::kStackGuard, 0); | 954 __ CallRuntime(Runtime::kStackGuard, 0); |
956 __ bind(&ok); | 955 __ bind(&ok); |
957 } | 956 } |
958 | 957 |
959 // Load bytecode offset and dispatch table into registers. | 958 // Load accumulator, register file, bytecode offset, dispatch table into |
| 959 // registers. |
| 960 __ LoadRoot(kInterpreterAccumulatorRegister, Heap::kUndefinedValueRootIndex); |
| 961 __ subi( |
| 962 kInterpreterRegisterFileRegister, fp, |
| 963 Operand(kPointerSize + StandardFrameConstants::kFixedFrameSizeFromFp)); |
960 __ mov(kInterpreterBytecodeOffsetRegister, | 964 __ mov(kInterpreterBytecodeOffsetRegister, |
961 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); | 965 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); |
962 __ LoadRoot(kInterpreterDispatchTableRegister, | 966 __ LoadRoot(kInterpreterDispatchTableRegister, |
963 Heap::kInterpreterTableRootIndex); | 967 Heap::kInterpreterTableRootIndex); |
964 __ addi(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, | 968 __ addi(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, |
965 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 969 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
966 | 970 |
967 // Dispatch to the first bytecode handler for the function. | 971 // Dispatch to the first bytecode handler for the function. |
968 __ lbzx(r3, MemOperand(kInterpreterBytecodeArrayRegister, | 972 __ lbzx(r4, MemOperand(kInterpreterBytecodeArrayRegister, |
969 kInterpreterBytecodeOffsetRegister)); | 973 kInterpreterBytecodeOffsetRegister)); |
970 __ ShiftLeftImm(ip, r3, Operand(kPointerSizeLog2)); | 974 __ ShiftLeftImm(ip, r4, Operand(kPointerSizeLog2)); |
971 __ LoadPX(ip, MemOperand(kInterpreterDispatchTableRegister, ip)); | 975 __ LoadPX(ip, MemOperand(kInterpreterDispatchTableRegister, ip)); |
972 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging | 976 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging |
973 // and header removal. | 977 // and header removal. |
974 __ addi(ip, ip, Operand(Code::kHeaderSize - kHeapObjectTag)); | 978 __ addi(ip, ip, Operand(Code::kHeaderSize - kHeapObjectTag)); |
975 __ Jump(ip); | 979 __ Call(ip); |
976 } | 980 } |
977 | 981 |
978 | 982 |
979 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { | 983 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
980 // TODO(rmcilroy): List of things not currently dealt with here but done in | 984 // TODO(rmcilroy): List of things not currently dealt with here but done in |
981 // fullcodegen's EmitReturnSequence. | 985 // fullcodegen's EmitReturnSequence. |
982 // - Supporting FLAG_trace for Runtime::TraceExit. | 986 // - Supporting FLAG_trace for Runtime::TraceExit. |
983 // - Support profiler (specifically decrementing profiling_counter | 987 // - Support profiler (specifically decrementing profiling_counter |
984 // appropriately and calling out to HandleInterrupts if necessary). | 988 // appropriately and calling out to HandleInterrupts if necessary). |
985 | 989 |
986 // Load return value into r3. | 990 // The return value is in accumulator, which is already in r3. |
987 __ LoadP(r3, | 991 |
988 MemOperand(fp, -kPointerSize - | |
989 StandardFrameConstants::kFixedFrameSizeFromFp)); | |
990 // Leave the frame (also dropping the register file). | 992 // Leave the frame (also dropping the register file). |
991 __ LeaveFrame(StackFrame::JAVA_SCRIPT); | 993 __ LeaveFrame(StackFrame::JAVA_SCRIPT); |
992 // Drop receiver + arguments. | 994 // Drop receiver + arguments. |
993 __ Drop(1); // TODO(rmcilroy): Get number of arguments from BytecodeArray. | 995 __ Drop(1); // TODO(rmcilroy): Get number of arguments from BytecodeArray. |
994 __ blr(); | 996 __ blr(); |
995 } | 997 } |
996 | 998 |
997 | 999 |
998 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { | 1000 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { |
999 CallRuntimePassFunction(masm, Runtime::kCompileLazy); | 1001 CallRuntimePassFunction(masm, Runtime::kCompileLazy); |
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1921 __ bkpt(0); | 1923 __ bkpt(0); |
1922 } | 1924 } |
1923 } | 1925 } |
1924 | 1926 |
1925 | 1927 |
1926 #undef __ | 1928 #undef __ |
1927 } // namespace internal | 1929 } // namespace internal |
1928 } // namespace v8 | 1930 } // namespace v8 |
1929 | 1931 |
1930 #endif // V8_TARGET_ARCH_PPC | 1932 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |