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

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

Issue 519283005: MIPS: First step to cleanup the power-of-2 mess. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « src/mips/lithium-codegen-mips.cc ('k') | src/mips/regexp-macro-assembler-mips.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 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_MIPS 9 #if V8_TARGET_ARCH_MIPS
10 10
11 #include "src/base/bits.h"
11 #include "src/bootstrapper.h" 12 #include "src/bootstrapper.h"
12 #include "src/codegen.h" 13 #include "src/codegen.h"
13 #include "src/cpu-profiler.h" 14 #include "src/cpu-profiler.h"
14 #include "src/debug.h" 15 #include "src/debug.h"
15 #include "src/isolate-inl.h" 16 #include "src/isolate-inl.h"
16 #include "src/runtime.h" 17 #include "src/runtime.h"
17 18
18 namespace v8 { 19 namespace v8 {
19 namespace internal { 20 namespace internal {
20 21
(...skipping 4933 matching lines...) Expand 10 before | Expand all | Expand 10 after
4954 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); 4955 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate())));
4955 sw(fp, MemOperand(t8)); 4956 sw(fp, MemOperand(t8));
4956 li(t8, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); 4957 li(t8, Operand(ExternalReference(Isolate::kContextAddress, isolate())));
4957 sw(cp, MemOperand(t8)); 4958 sw(cp, MemOperand(t8));
4958 4959
4959 const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); 4960 const int frame_alignment = MacroAssembler::ActivationFrameAlignment();
4960 if (save_doubles) { 4961 if (save_doubles) {
4961 // The stack must be allign to 0 modulo 8 for stores with sdc1. 4962 // The stack must be allign to 0 modulo 8 for stores with sdc1.
4962 DCHECK(kDoubleSize == frame_alignment); 4963 DCHECK(kDoubleSize == frame_alignment);
4963 if (frame_alignment > 0) { 4964 if (frame_alignment > 0) {
4964 DCHECK(IsPowerOf2(frame_alignment)); 4965 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment));
4965 And(sp, sp, Operand(-frame_alignment)); // Align stack. 4966 And(sp, sp, Operand(-frame_alignment)); // Align stack.
4966 } 4967 }
4967 int space = FPURegister::kMaxNumRegisters * kDoubleSize; 4968 int space = FPURegister::kMaxNumRegisters * kDoubleSize;
4968 Subu(sp, sp, Operand(space)); 4969 Subu(sp, sp, Operand(space));
4969 // Remember: we only need to save every 2nd double FPU value. 4970 // Remember: we only need to save every 2nd double FPU value.
4970 for (int i = 0; i < FPURegister::kMaxNumRegisters; i+=2) { 4971 for (int i = 0; i < FPURegister::kMaxNumRegisters; i+=2) {
4971 FPURegister reg = FPURegister::from_code(i); 4972 FPURegister reg = FPURegister::from_code(i);
4972 sdc1(reg, MemOperand(sp, i * kDoubleSize)); 4973 sdc1(reg, MemOperand(sp, i * kDoubleSize));
4973 } 4974 }
4974 } 4975 }
4975 4976
4976 // Reserve place for the return address, stack space and an optional slot 4977 // Reserve place for the return address, stack space and an optional slot
4977 // (used by the DirectCEntryStub to hold the return value if a struct is 4978 // (used by the DirectCEntryStub to hold the return value if a struct is
4978 // returned) and align the frame preparing for calling the runtime function. 4979 // returned) and align the frame preparing for calling the runtime function.
4979 DCHECK(stack_space >= 0); 4980 DCHECK(stack_space >= 0);
4980 Subu(sp, sp, Operand((stack_space + 2) * kPointerSize)); 4981 Subu(sp, sp, Operand((stack_space + 2) * kPointerSize));
4981 if (frame_alignment > 0) { 4982 if (frame_alignment > 0) {
4982 DCHECK(IsPowerOf2(frame_alignment)); 4983 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment));
4983 And(sp, sp, Operand(-frame_alignment)); // Align stack. 4984 And(sp, sp, Operand(-frame_alignment)); // Align stack.
4984 } 4985 }
4985 4986
4986 // Set the exit frame sp value to point just before the return address 4987 // Set the exit frame sp value to point just before the return address
4987 // location. 4988 // location.
4988 addiu(at, sp, kPointerSize); 4989 addiu(at, sp, kPointerSize);
4989 sw(at, MemOperand(fp, ExitFrameConstants::kSPOffset)); 4990 sw(at, MemOperand(fp, ExitFrameConstants::kSPOffset));
4990 } 4991 }
4991 4992
4992 4993
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
5067 } 5068 }
5068 5069
5069 5070
5070 void MacroAssembler::AssertStackIsAligned() { 5071 void MacroAssembler::AssertStackIsAligned() {
5071 if (emit_debug_code()) { 5072 if (emit_debug_code()) {
5072 const int frame_alignment = ActivationFrameAlignment(); 5073 const int frame_alignment = ActivationFrameAlignment();
5073 const int frame_alignment_mask = frame_alignment - 1; 5074 const int frame_alignment_mask = frame_alignment - 1;
5074 5075
5075 if (frame_alignment > kPointerSize) { 5076 if (frame_alignment > kPointerSize) {
5076 Label alignment_as_expected; 5077 Label alignment_as_expected;
5077 DCHECK(IsPowerOf2(frame_alignment)); 5078 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment));
5078 andi(at, sp, frame_alignment_mask); 5079 andi(at, sp, frame_alignment_mask);
5079 Branch(&alignment_as_expected, eq, at, Operand(zero_reg)); 5080 Branch(&alignment_as_expected, eq, at, Operand(zero_reg));
5080 // Don't use Check here, as it will call Runtime_Abort re-entering here. 5081 // Don't use Check here, as it will call Runtime_Abort re-entering here.
5081 stop("Unexpected stack alignment"); 5082 stop("Unexpected stack alignment");
5082 bind(&alignment_as_expected); 5083 bind(&alignment_as_expected);
5083 } 5084 }
5084 } 5085 }
5085 } 5086 }
5086 5087
5087 5088
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
5468 // mips, even though those argument slots are not normally used. 5469 // mips, even though those argument slots are not normally used.
5469 // Remaining arguments are pushed on the stack, above (higher address than) 5470 // Remaining arguments are pushed on the stack, above (higher address than)
5470 // the argument slots. 5471 // the argument slots.
5471 int stack_passed_arguments = CalculateStackPassedWords( 5472 int stack_passed_arguments = CalculateStackPassedWords(
5472 num_reg_arguments, num_double_arguments); 5473 num_reg_arguments, num_double_arguments);
5473 if (frame_alignment > kPointerSize) { 5474 if (frame_alignment > kPointerSize) {
5474 // Make stack end at alignment and make room for num_arguments - 4 words 5475 // Make stack end at alignment and make room for num_arguments - 4 words
5475 // and the original value of sp. 5476 // and the original value of sp.
5476 mov(scratch, sp); 5477 mov(scratch, sp);
5477 Subu(sp, sp, Operand((stack_passed_arguments + 1) * kPointerSize)); 5478 Subu(sp, sp, Operand((stack_passed_arguments + 1) * kPointerSize));
5478 DCHECK(IsPowerOf2(frame_alignment)); 5479 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment));
5479 And(sp, sp, Operand(-frame_alignment)); 5480 And(sp, sp, Operand(-frame_alignment));
5480 sw(scratch, MemOperand(sp, stack_passed_arguments * kPointerSize)); 5481 sw(scratch, MemOperand(sp, stack_passed_arguments * kPointerSize));
5481 } else { 5482 } else {
5482 Subu(sp, sp, Operand(stack_passed_arguments * kPointerSize)); 5483 Subu(sp, sp, Operand(stack_passed_arguments * kPointerSize));
5483 } 5484 }
5484 } 5485 }
5485 5486
5486 5487
5487 void MacroAssembler::PrepareCallCFunction(int num_reg_arguments, 5488 void MacroAssembler::PrepareCallCFunction(int num_reg_arguments,
5488 Register scratch) { 5489 Register scratch) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
5525 // running in the simulator. The simulator has its own alignment check which 5526 // running in the simulator. The simulator has its own alignment check which
5526 // provides more information. 5527 // provides more information.
5527 // The argument stots are presumed to have been set up by 5528 // The argument stots are presumed to have been set up by
5528 // PrepareCallCFunction. The C function must be called via t9, for mips ABI. 5529 // PrepareCallCFunction. The C function must be called via t9, for mips ABI.
5529 5530
5530 #if V8_HOST_ARCH_MIPS 5531 #if V8_HOST_ARCH_MIPS
5531 if (emit_debug_code()) { 5532 if (emit_debug_code()) {
5532 int frame_alignment = base::OS::ActivationFrameAlignment(); 5533 int frame_alignment = base::OS::ActivationFrameAlignment();
5533 int frame_alignment_mask = frame_alignment - 1; 5534 int frame_alignment_mask = frame_alignment - 1;
5534 if (frame_alignment > kPointerSize) { 5535 if (frame_alignment > kPointerSize) {
5535 DCHECK(IsPowerOf2(frame_alignment)); 5536 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment));
5536 Label alignment_as_expected; 5537 Label alignment_as_expected;
5537 And(at, sp, Operand(frame_alignment_mask)); 5538 And(at, sp, Operand(frame_alignment_mask));
5538 Branch(&alignment_as_expected, eq, at, Operand(zero_reg)); 5539 Branch(&alignment_as_expected, eq, at, Operand(zero_reg));
5539 // Don't use Check here, as it will call Runtime_Abort possibly 5540 // Don't use Check here, as it will call Runtime_Abort possibly
5540 // re-entering here. 5541 // re-entering here.
5541 stop("Unexpected alignment in CallCFunction"); 5542 stop("Unexpected alignment in CallCFunction");
5542 bind(&alignment_as_expected); 5543 bind(&alignment_as_expected);
5543 } 5544 }
5544 } 5545 }
5545 #endif // V8_HOST_ARCH_MIPS 5546 #endif // V8_HOST_ARCH_MIPS
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
6116 } 6117 }
6117 if (ms.shift() > 0) sra(result, result, ms.shift()); 6118 if (ms.shift() > 0) sra(result, result, ms.shift());
6118 srl(at, dividend, 31); 6119 srl(at, dividend, 31);
6119 Addu(result, result, Operand(at)); 6120 Addu(result, result, Operand(at));
6120 } 6121 }
6121 6122
6122 6123
6123 } } // namespace v8::internal 6124 } } // namespace v8::internal
6124 6125
6125 #endif // V8_TARGET_ARCH_MIPS 6126 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/lithium-codegen-mips.cc ('k') | src/mips/regexp-macro-assembler-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698