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

Unified Diff: src/compiler/mips/code-generator-mips.cc

Issue 2816743003: [turbofan] Add alignment parameter to StackSlot operator (Closed)
Patch Set: Add MIPS64 implementation. Add regression tests Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: src/compiler/mips/code-generator-mips.cc
diff --git a/src/compiler/mips/code-generator-mips.cc b/src/compiler/mips/code-generator-mips.cc
index 3e67b31953ef4e7a8f1b7cf2c6a3a031b88b2bb2..10c71c5df791c197a8848ff2735364f218287c98 100644
--- a/src/compiler/mips/code-generator-mips.cc
+++ b/src/compiler/mips/code-generator-mips.cc
@@ -775,8 +775,35 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArchStackSlot: {
FrameOffset offset =
frame_access_state()->GetFrameOffset(i.InputInt32(0));
- __ Addu(i.OutputRegister(), offset.from_stack_pointer() ? sp : fp,
- Operand(offset.offset()));
+ Register base_reg = offset.from_stack_pointer() ? sp : fp;
+ __ Addu(i.OutputRegister(), base_reg, Operand(offset.offset()));
+ int alignment = i.InputInt32(1);
+ DCHECK(alignment == 0 || alignment == 4 || alignment == 8 ||
+ alignment == 16);
+ if (FLAG_debug_code && alignment > 0) {
+ // Verify that the output_register is properly aligned
+ __ And(kScratchReg, i.OutputRegister(), Operand(kPointerSize - 1));
+ __ Assert(eq, kAllocationIsNotDoubleAligned, kScratchReg,
+ Operand(zero_reg));
+ }
+
+ if (alignment == 2 * kPointerSize) {
+ Label done;
+ __ Addu(kScratchReg, base_reg, Operand(offset.offset()));
+ __ And(kScratchReg, kScratchReg, Operand(alignment - 1));
+ __ BranchShort(&done, eq, kScratchReg, Operand(zero_reg));
+ __ Addu(i.OutputRegister(), i.OutputRegister(), kPointerSize);
+ __ bind(&done);
+ } else if (alignment > 2 * kPointerSize) {
+ Label done;
+ __ Addu(kScratchReg, base_reg, Operand(offset.offset()));
+ __ And(kScratchReg, kScratchReg, Operand(alignment - 1));
+ __ BranchShort(&done, eq, kScratchReg, Operand(zero_reg));
+ __ li(kScratchReg2, alignment);
+ __ Subu(kScratchReg2, kScratchReg2, Operand(kScratchReg));
+ __ Addu(i.OutputRegister(), i.OutputRegister(), kScratchReg2);
+ __ bind(&done);
+ }
break;
}
case kIeee754Float64Acos:

Powered by Google App Engine
This is Rietveld 408576698