+MachineInstr *SparcV8RegisterInfo::foldMemoryOperand(MachineInstr* MI,
+ unsigned OpNum,
+ int FI) const {
+ bool isFloat = false;
+ switch (MI->getOpcode()) {
+ case V8::ORrr:
+ if (MI->getOperand(1).isRegister() && MI->getOperand(1).getReg() == V8::G0&&
+ MI->getOperand(0).isRegister() && MI->getOperand(2).isRegister()) {
+ if (OpNum == 0) // COPY -> STORE
+ return BuildMI(V8::STri, 3).addFrameIndex(FI).addImm(0)
+ .addReg(MI->getOperand(2).getReg());
+ else // COPY -> LOAD
+ return BuildMI(V8::LDri, 2, MI->getOperand(0).getReg())
+ .addFrameIndex(FI).addImm(0);
+ }
+ break;
+ case V8::FMOVS:
+ isFloat = true;
+ // FALLTHROUGH
+ case V8::FMOVD:
+ if (OpNum == 0) // COPY -> STORE
+ return BuildMI(isFloat ? V8::STFri : V8::STDFri, 3)
+ .addFrameIndex(FI).addImm(0).addReg(MI->getOperand(1).getReg());
+ else // COPY -> LOAD
+ return BuildMI(isFloat ? V8::LDFri : V8::LDDFri, 2,
+ MI->getOperand(0).getReg()).addFrameIndex(FI).addImm(0);
+ break;
+ }
+ return 0;
+}
+