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

Side by Side Diff: src/arm/macro-assembler-arm.cc

Issue 1155703006: Revert of Embedded constant pools. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 6 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/arm/macro-assembler-arm.h ('k') | src/arm64/assembler-arm64.h » ('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 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 <limits.h> // For LONG_MIN, LONG_MAX. 5 #include <limits.h> // For LONG_MIN, LONG_MAX.
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #if V8_TARGET_ARCH_ARM 9 #if V8_TARGET_ARCH_ARM
10 10
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 pop(lr); 684 pop(lr);
685 bind(&done); 685 bind(&done);
686 if (and_then == kReturnAtEnd) { 686 if (and_then == kReturnAtEnd) {
687 Ret(); 687 Ret();
688 } 688 }
689 } 689 }
690 690
691 691
692 void MacroAssembler::PushFixedFrame(Register marker_reg) { 692 void MacroAssembler::PushFixedFrame(Register marker_reg) {
693 DCHECK(!marker_reg.is_valid() || marker_reg.code() < cp.code()); 693 DCHECK(!marker_reg.is_valid() || marker_reg.code() < cp.code());
694 stm(db_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | cp.bit() | 694 stm(db_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) |
695 (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | 695 cp.bit() |
696 fp.bit() | lr.bit()); 696 (FLAG_enable_ool_constant_pool ? pp.bit() : 0) |
697 fp.bit() |
698 lr.bit());
697 } 699 }
698 700
699 701
700 void MacroAssembler::PopFixedFrame(Register marker_reg) { 702 void MacroAssembler::PopFixedFrame(Register marker_reg) {
701 DCHECK(!marker_reg.is_valid() || marker_reg.code() < cp.code()); 703 DCHECK(!marker_reg.is_valid() || marker_reg.code() < cp.code());
702 ldm(ia_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | cp.bit() | 704 ldm(ia_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) |
703 (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | 705 cp.bit() |
704 fp.bit() | lr.bit()); 706 (FLAG_enable_ool_constant_pool ? pp.bit() : 0) |
707 fp.bit() |
708 lr.bit());
705 } 709 }
706 710
707 711
708 // Push and pop all registers that can hold pointers. 712 // Push and pop all registers that can hold pointers.
709 void MacroAssembler::PushSafepointRegisters() { 713 void MacroAssembler::PushSafepointRegisters() {
710 // Safepoints expect a block of contiguous register values starting with r0: 714 // Safepoints expect a block of contiguous register values starting with r0:
711 DCHECK(((1 << kNumSafepointSavedRegisters) - 1) == kSafepointSavedRegisters); 715 DCHECK(((1 << kNumSafepointSavedRegisters) - 1) == kSafepointSavedRegisters);
712 // Safepoints expect a block of kNumSafepointRegisters values on the 716 // Safepoints expect a block of kNumSafepointRegisters values on the
713 // stack, so adjust the stack for unsaved registers. 717 // stack, so adjust the stack for unsaved registers.
714 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; 718 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters;
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 void MacroAssembler::VmovLow(DwVfpRegister dst, Register src) { 978 void MacroAssembler::VmovLow(DwVfpRegister dst, Register src) {
975 if (dst.code() < 16) { 979 if (dst.code() < 16) {
976 const LowDwVfpRegister loc = LowDwVfpRegister::from_code(dst.code()); 980 const LowDwVfpRegister loc = LowDwVfpRegister::from_code(dst.code());
977 vmov(loc.low(), src); 981 vmov(loc.low(), src);
978 } else { 982 } else {
979 vmov(dst, VmovIndexLo, src); 983 vmov(dst, VmovIndexLo, src);
980 } 984 }
981 } 985 }
982 986
983 987
984 void MacroAssembler::LoadConstantPoolPointerRegisterFromCodeTargetAddress(
985 Register code_target_address) {
986 DCHECK(FLAG_enable_embedded_constant_pool);
987 ldr(pp, MemOperand(code_target_address,
988 Code::kConstantPoolOffset - Code::kHeaderSize));
989 add(pp, pp, code_target_address);
990 }
991
992
993 void MacroAssembler::LoadConstantPoolPointerRegister() { 988 void MacroAssembler::LoadConstantPoolPointerRegister() {
994 DCHECK(FLAG_enable_embedded_constant_pool); 989 if (FLAG_enable_ool_constant_pool) {
995 int entry_offset = pc_offset() + Instruction::kPCReadOffset; 990 int constant_pool_offset = Code::kConstantPoolOffset - Code::kHeaderSize -
996 sub(ip, pc, Operand(entry_offset)); 991 pc_offset() - Instruction::kPCReadOffset;
997 LoadConstantPoolPointerRegisterFromCodeTargetAddress(ip); 992 DCHECK(ImmediateFitsAddrMode2Instruction(constant_pool_offset));
993 ldr(pp, MemOperand(pc, constant_pool_offset));
994 }
998 } 995 }
999 996
1000 997
1001 void MacroAssembler::StubPrologue() { 998 void MacroAssembler::StubPrologue() {
1002 PushFixedFrame(); 999 PushFixedFrame();
1003 Push(Smi::FromInt(StackFrame::STUB)); 1000 Push(Smi::FromInt(StackFrame::STUB));
1004 // Adjust FP to point to saved FP. 1001 // Adjust FP to point to saved FP.
1005 add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); 1002 add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
1006 if (FLAG_enable_embedded_constant_pool) { 1003 if (FLAG_enable_ool_constant_pool) {
1007 LoadConstantPoolPointerRegister(); 1004 LoadConstantPoolPointerRegister();
1008 set_constant_pool_available(true); 1005 set_ool_constant_pool_available(true);
1009 } 1006 }
1010 } 1007 }
1011 1008
1012 1009
1013 void MacroAssembler::Prologue(bool code_pre_aging) { 1010 void MacroAssembler::Prologue(bool code_pre_aging) {
1014 { PredictableCodeSizeScope predictible_code_size_scope( 1011 { PredictableCodeSizeScope predictible_code_size_scope(
1015 this, kNoCodeAgeSequenceLength); 1012 this, kNoCodeAgeSequenceLength);
1016 // The following three instructions must remain together and unmodified 1013 // The following three instructions must remain together and unmodified
1017 // for code aging to work properly. 1014 // for code aging to work properly.
1018 if (code_pre_aging) { 1015 if (code_pre_aging) {
1019 // Pre-age the code. 1016 // Pre-age the code.
1020 Code* stub = Code::GetPreAgedCodeAgeStub(isolate()); 1017 Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
1021 add(r0, pc, Operand(-8)); 1018 add(r0, pc, Operand(-8));
1022 ldr(pc, MemOperand(pc, -4)); 1019 ldr(pc, MemOperand(pc, -4));
1023 emit_code_stub_address(stub); 1020 emit_code_stub_address(stub);
1024 } else { 1021 } else {
1025 PushFixedFrame(r1); 1022 PushFixedFrame(r1);
1026 nop(ip.code()); 1023 nop(ip.code());
1027 // Adjust FP to point to saved FP. 1024 // Adjust FP to point to saved FP.
1028 add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); 1025 add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
1029 } 1026 }
1030 } 1027 }
1031 if (FLAG_enable_embedded_constant_pool) { 1028 if (FLAG_enable_ool_constant_pool) {
1032 LoadConstantPoolPointerRegister(); 1029 LoadConstantPoolPointerRegister();
1033 set_constant_pool_available(true); 1030 set_ool_constant_pool_available(true);
1034 } 1031 }
1035 } 1032 }
1036 1033
1037 1034
1038 void MacroAssembler::EnterFrame(StackFrame::Type type, 1035 void MacroAssembler::EnterFrame(StackFrame::Type type,
1039 bool load_constant_pool_pointer_reg) { 1036 bool load_constant_pool_pointer_reg) {
1040 // r0-r3: preserved 1037 // r0-r3: preserved
1041 PushFixedFrame(); 1038 PushFixedFrame();
1042 if (FLAG_enable_embedded_constant_pool && load_constant_pool_pointer_reg) { 1039 if (FLAG_enable_ool_constant_pool && load_constant_pool_pointer_reg) {
1043 LoadConstantPoolPointerRegister(); 1040 LoadConstantPoolPointerRegister();
1044 } 1041 }
1045 mov(ip, Operand(Smi::FromInt(type))); 1042 mov(ip, Operand(Smi::FromInt(type)));
1046 push(ip); 1043 push(ip);
1047 mov(ip, Operand(CodeObject())); 1044 mov(ip, Operand(CodeObject()));
1048 push(ip); 1045 push(ip);
1049 // Adjust FP to point to saved FP. 1046 // Adjust FP to point to saved FP.
1050 add(fp, sp, 1047 add(fp, sp,
1051 Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize)); 1048 Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize));
1052 } 1049 }
1053 1050
1054 1051
1055 int MacroAssembler::LeaveFrame(StackFrame::Type type) { 1052 int MacroAssembler::LeaveFrame(StackFrame::Type type) {
1056 // r0: preserved 1053 // r0: preserved
1057 // r1: preserved 1054 // r1: preserved
1058 // r2: preserved 1055 // r2: preserved
1059 1056
1060 // Drop the execution stack down to the frame pointer and restore 1057 // Drop the execution stack down to the frame pointer and restore
1061 // the caller frame pointer, return address and constant pool pointer 1058 // the caller frame pointer, return address and constant pool pointer
1062 // (if FLAG_enable_embedded_constant_pool). 1059 // (if FLAG_enable_ool_constant_pool).
1063 int frame_ends; 1060 int frame_ends;
1064 if (FLAG_enable_embedded_constant_pool) { 1061 if (FLAG_enable_ool_constant_pool) {
1065 add(sp, fp, Operand(StandardFrameConstants::kConstantPoolOffset)); 1062 add(sp, fp, Operand(StandardFrameConstants::kConstantPoolOffset));
1066 frame_ends = pc_offset(); 1063 frame_ends = pc_offset();
1067 ldm(ia_w, sp, pp.bit() | fp.bit() | lr.bit()); 1064 ldm(ia_w, sp, pp.bit() | fp.bit() | lr.bit());
1068 } else { 1065 } else {
1069 mov(sp, fp); 1066 mov(sp, fp);
1070 frame_ends = pc_offset(); 1067 frame_ends = pc_offset();
1071 ldm(ia_w, sp, fp.bit() | lr.bit()); 1068 ldm(ia_w, sp, fp.bit() | lr.bit());
1072 } 1069 }
1073 return frame_ends; 1070 return frame_ends;
1074 } 1071 }
1075 1072
1076 1073
1077 void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space) { 1074 void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space) {
1078 // Set up the frame structure on the stack. 1075 // Set up the frame structure on the stack.
1079 DCHECK_EQ(2 * kPointerSize, ExitFrameConstants::kCallerSPDisplacement); 1076 DCHECK_EQ(2 * kPointerSize, ExitFrameConstants::kCallerSPDisplacement);
1080 DCHECK_EQ(1 * kPointerSize, ExitFrameConstants::kCallerPCOffset); 1077 DCHECK_EQ(1 * kPointerSize, ExitFrameConstants::kCallerPCOffset);
1081 DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset); 1078 DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset);
1082 Push(lr, fp); 1079 Push(lr, fp);
1083 mov(fp, Operand(sp)); // Set up new frame pointer. 1080 mov(fp, Operand(sp)); // Set up new frame pointer.
1084 // Reserve room for saved entry sp and code object. 1081 // Reserve room for saved entry sp and code object.
1085 sub(sp, sp, Operand(ExitFrameConstants::kFrameSize)); 1082 sub(sp, sp, Operand(ExitFrameConstants::kFrameSize));
1086 if (emit_debug_code()) { 1083 if (emit_debug_code()) {
1087 mov(ip, Operand::Zero()); 1084 mov(ip, Operand::Zero());
1088 str(ip, MemOperand(fp, ExitFrameConstants::kSPOffset)); 1085 str(ip, MemOperand(fp, ExitFrameConstants::kSPOffset));
1089 } 1086 }
1090 if (FLAG_enable_embedded_constant_pool) { 1087 if (FLAG_enable_ool_constant_pool) {
1091 str(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset)); 1088 str(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset));
1092 } 1089 }
1093 mov(ip, Operand(CodeObject())); 1090 mov(ip, Operand(CodeObject()));
1094 str(ip, MemOperand(fp, ExitFrameConstants::kCodeOffset)); 1091 str(ip, MemOperand(fp, ExitFrameConstants::kCodeOffset));
1095 1092
1096 // Save the frame pointer and the context in top. 1093 // Save the frame pointer and the context in top.
1097 mov(ip, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); 1094 mov(ip, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate())));
1098 str(fp, MemOperand(ip)); 1095 str(fp, MemOperand(ip));
1099 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); 1096 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate())));
1100 str(cp, MemOperand(ip)); 1097 str(cp, MemOperand(ip));
1101 1098
1102 // Optionally save all double registers. 1099 // Optionally save all double registers.
1103 if (save_doubles) { 1100 if (save_doubles) {
1104 SaveFPRegs(sp, ip); 1101 SaveFPRegs(sp, ip);
1105 // Note that d0 will be accessible at 1102 // Note that d0 will be accessible at
1106 // fp - ExitFrameConstants::kFrameSize - 1103 // fp - ExitFrameConstants::kFrameSize -
1107 // DwVfpRegister::kMaxNumRegisters * kDoubleSize, 1104 // DwVfpRegister::kMaxNumRegisters * kDoubleSize,
1108 // since the sp slot, code slot and constant pool slot (if 1105 // since the sp slot, code slot and constant pool slot (if
1109 // FLAG_enable_embedded_constant_pool) were pushed after the fp. 1106 // FLAG_enable_ool_constant_pool) were pushed after the fp.
1110 } 1107 }
1111 1108
1112 // Reserve place for the return address and stack space and align the frame 1109 // Reserve place for the return address and stack space and align the frame
1113 // preparing for calling the runtime function. 1110 // preparing for calling the runtime function.
1114 const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); 1111 const int frame_alignment = MacroAssembler::ActivationFrameAlignment();
1115 sub(sp, sp, Operand((stack_space + 1) * kPointerSize)); 1112 sub(sp, sp, Operand((stack_space + 1) * kPointerSize));
1116 if (frame_alignment > 0) { 1113 if (frame_alignment > 0) {
1117 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment)); 1114 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment));
1118 and_(sp, sp, Operand(-frame_alignment)); 1115 and_(sp, sp, Operand(-frame_alignment));
1119 } 1116 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 if (restore_context) { 1176 if (restore_context) {
1180 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); 1177 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate())));
1181 ldr(cp, MemOperand(ip)); 1178 ldr(cp, MemOperand(ip));
1182 } 1179 }
1183 #ifdef DEBUG 1180 #ifdef DEBUG
1184 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); 1181 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate())));
1185 str(r3, MemOperand(ip)); 1182 str(r3, MemOperand(ip));
1186 #endif 1183 #endif
1187 1184
1188 // Tear down the exit frame, pop the arguments, and return. 1185 // Tear down the exit frame, pop the arguments, and return.
1189 if (FLAG_enable_embedded_constant_pool) { 1186 if (FLAG_enable_ool_constant_pool) {
1190 ldr(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset)); 1187 ldr(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset));
1191 } 1188 }
1192 mov(sp, Operand(fp)); 1189 mov(sp, Operand(fp));
1193 ldm(ia_w, sp, fp.bit() | lr.bit()); 1190 ldm(ia_w, sp, fp.bit() | lr.bit());
1194 if (argument_count.is_valid()) { 1191 if (argument_count.is_valid()) {
1195 if (argument_count_is_length) { 1192 if (argument_count_is_length) {
1196 add(sp, sp, argument_count); 1193 add(sp, sp, argument_count);
1197 } else { 1194 } else {
1198 add(sp, sp, Operand(argument_count, LSL, kPointerSizeLog2)); 1195 add(sp, sp, Operand(argument_count, LSL, kPointerSizeLog2));
1199 } 1196 }
(...skipping 2198 matching lines...) Expand 10 before | Expand all | Expand 10 after
3398 } 3395 }
3399 } 3396 }
3400 3397
3401 3398
3402 void MacroAssembler::GetRelocatedValueLocation(Register ldr_location, 3399 void MacroAssembler::GetRelocatedValueLocation(Register ldr_location,
3403 Register result, 3400 Register result,
3404 Register scratch) { 3401 Register scratch) {
3405 Label small_constant_pool_load, load_result; 3402 Label small_constant_pool_load, load_result;
3406 ldr(result, MemOperand(ldr_location)); 3403 ldr(result, MemOperand(ldr_location));
3407 3404
3408 if (FLAG_enable_embedded_constant_pool) { 3405 if (FLAG_enable_ool_constant_pool) {
3409 // Check if this is an extended constant pool load. 3406 // Check if this is an extended constant pool load.
3410 and_(scratch, result, Operand(GetConsantPoolLoadMask())); 3407 and_(scratch, result, Operand(GetConsantPoolLoadMask()));
3411 teq(scratch, Operand(GetConsantPoolLoadPattern())); 3408 teq(scratch, Operand(GetConsantPoolLoadPattern()));
3412 b(eq, &small_constant_pool_load); 3409 b(eq, &small_constant_pool_load);
3413 if (emit_debug_code()) { 3410 if (emit_debug_code()) {
3414 // Check that the instruction sequence is: 3411 // Check that the instruction sequence is:
3415 // movw reg, #offset_low 3412 // movw reg, #offset_low
3416 // movt reg, #offset_high 3413 // movt reg, #offset_high
3417 // ldr reg, [pp, reg] 3414 // ldr reg, [pp, reg]
3418 Instr patterns[] = {GetMovWPattern(), GetMovTPattern(), 3415 Instr patterns[] = {GetMovWPattern(), GetMovTPattern(),
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3452 // Result was clobbered. Restore it. 3449 // Result was clobbered. Restore it.
3453 ldr(result, MemOperand(ldr_location)); 3450 ldr(result, MemOperand(ldr_location));
3454 } 3451 }
3455 3452
3456 // Get the offset into the constant pool. 3453 // Get the offset into the constant pool.
3457 const uint32_t kLdrOffsetMask = (1 << 12) - 1; 3454 const uint32_t kLdrOffsetMask = (1 << 12) - 1;
3458 and_(result, result, Operand(kLdrOffsetMask)); 3455 and_(result, result, Operand(kLdrOffsetMask));
3459 3456
3460 bind(&load_result); 3457 bind(&load_result);
3461 // Get the address of the constant. 3458 // Get the address of the constant.
3462 if (FLAG_enable_embedded_constant_pool) { 3459 if (FLAG_enable_ool_constant_pool) {
3463 add(result, pp, Operand(result)); 3460 add(result, pp, Operand(result));
3464 } else { 3461 } else {
3465 add(result, ldr_location, Operand(result)); 3462 add(result, ldr_location, Operand(result));
3466 add(result, result, Operand(Instruction::kPCReadOffset)); 3463 add(result, result, Operand(Instruction::kPCReadOffset));
3467 } 3464 }
3468 } 3465 }
3469 3466
3470 3467
3471 void MacroAssembler::CheckPageFlag( 3468 void MacroAssembler::CheckPageFlag(
3472 Register object, 3469 Register object,
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
3912 } 3909 }
3913 } 3910 }
3914 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); 3911 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift));
3915 add(result, result, Operand(dividend, LSR, 31)); 3912 add(result, result, Operand(dividend, LSR, 31));
3916 } 3913 }
3917 3914
3918 } // namespace internal 3915 } // namespace internal
3919 } // namespace v8 3916 } // namespace v8
3920 3917
3921 #endif // V8_TARGET_ARCH_ARM 3918 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/macro-assembler-arm.h ('k') | src/arm64/assembler-arm64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698