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

Unified Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2005823002: [Subzero][MIPS32] Add LowerStore implementation (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 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/IceTargetLoweringMIPS32.cpp
diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp
index ce1f810f73912944c8b2d7f920853c642d8043e2..93202a068d2d3824dcdd1be311ca6a4b799b17b6 100644
--- a/src/IceTargetLoweringMIPS32.cpp
+++ b/src/IceTargetLoweringMIPS32.cpp
@@ -371,6 +371,23 @@ Variable *TargetMIPS32::makeReg(Type Type, RegNumT RegNum) {
return Reg;
}
+OperandMIPS32Mem *TargetMIPS32::formMemoryOperand(Operand *Operand, Type Ty) {
+ auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(Operand);
Jim Stichnoth 2016/05/23 17:12:19 Just use llvm::isa<> instead of testing the result
+ // It may be the case that address mode optimization already creates an
+ // OperandMIPS32Mem, so in that case it wouldn't need another level of
+ // transformation.
+ if (Mem) {
+ return llvm::cast<OperandMIPS32Mem>(legalize(Mem));
+ }
+ // If we didn't do address mode optimization, then we only have a
Jim Stichnoth 2016/05/23 17:12:18 reflow comment to 80-col
+ // base/offset to work with. MIPS always requires a base register, so
+ // just use that to hold the operand.
+ auto *Base = llvm::cast<Variable>(legalize(Operand, Legal_Reg));
+ return OperandMIPS32Mem::create(
+ Func, Ty, Base,
+ llvm::cast<ConstantInteger32>(Ctx->getConstantZero(IceType_i32)));
+}
+
void TargetMIPS32::emitVariable(const Variable *Var) const {
if (!BuildDefs::dump())
return;
@@ -1327,7 +1344,21 @@ void TargetMIPS32::lowerShuffleVector(const InstShuffleVector *Instr) {
}
void TargetMIPS32::lowerStore(const InstStore *Instr) {
- UnimplementedLoweringError(this, Instr);
+ Operand *Value = Instr->getData();
+ Operand *Addr = Instr->getAddr();
+ OperandMIPS32Mem *NewAddr = formMemoryOperand(Addr, Value->getType());
+ Type Ty = NewAddr->getType();
+
+ if (Ty == IceType_i64) {
+ Value = legalizeUndef(Value);
+ Variable *ValueHi = legalizeToReg(hiOperand(Value));
+ Variable *ValueLo = legalizeToReg(loOperand(Value));
+ _sw(ValueHi, llvm::cast<OperandMIPS32Mem>(hiOperand(NewAddr)));
+ _sw(ValueLo, llvm::cast<OperandMIPS32Mem>(loOperand(NewAddr)));
+ } else {
+ Variable *ValueR = legalizeToReg(Value);
+ _sw(ValueR, NewAddr);
+ }
}
void TargetMIPS32::doAddressOptStore() { UnimplementedError(getFlags()); }

Powered by Google App Engine
This is Rietveld 408576698