mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[FastISel][AArch64] Attach MachineMemOperands to load and store instructions.
llvm-svn: 215231
This commit is contained in:
parent
18879eb501
commit
657fb37f68
@ -126,7 +126,8 @@ private:
|
|||||||
bool SimplifyAddress(Address &Addr, MVT VT, int64_t ScaleFactor,
|
bool SimplifyAddress(Address &Addr, MVT VT, int64_t ScaleFactor,
|
||||||
bool UseUnscaled);
|
bool UseUnscaled);
|
||||||
void AddLoadStoreOperands(Address &Addr, const MachineInstrBuilder &MIB,
|
void AddLoadStoreOperands(Address &Addr, const MachineInstrBuilder &MIB,
|
||||||
unsigned Flags, bool UseUnscaled);
|
unsigned Flags, MachineMemOperand *MMO,
|
||||||
|
bool UseUnscaled);
|
||||||
bool IsMemCpySmall(uint64_t Len, unsigned Alignment);
|
bool IsMemCpySmall(uint64_t Len, unsigned Alignment);
|
||||||
bool TryEmitSmallMemCpy(Address Dest, Address Src, uint64_t Len,
|
bool TryEmitSmallMemCpy(Address Dest, Address Src, uint64_t Len,
|
||||||
unsigned Alignment);
|
unsigned Alignment);
|
||||||
@ -136,9 +137,9 @@ private:
|
|||||||
// Emit functions.
|
// Emit functions.
|
||||||
bool EmitCmp(Value *Src1Value, Value *Src2Value, bool isZExt);
|
bool EmitCmp(Value *Src1Value, Value *Src2Value, bool isZExt);
|
||||||
bool EmitLoad(MVT VT, unsigned &ResultReg, Address Addr,
|
bool EmitLoad(MVT VT, unsigned &ResultReg, Address Addr,
|
||||||
bool UseUnscaled = false);
|
MachineMemOperand *MMO = nullptr, bool UseUnscaled = false);
|
||||||
bool EmitStore(MVT VT, unsigned SrcReg, Address Addr,
|
bool EmitStore(MVT VT, unsigned SrcReg, Address Addr,
|
||||||
bool UseUnscaled = false);
|
MachineMemOperand *MMO = nullptr, bool UseUnscaled = false);
|
||||||
unsigned EmitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT, bool isZExt);
|
unsigned EmitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT, bool isZExt);
|
||||||
unsigned Emiti1Ext(unsigned SrcReg, MVT DestVT, bool isZExt);
|
unsigned Emiti1Ext(unsigned SrcReg, MVT DestVT, bool isZExt);
|
||||||
unsigned Emit_MUL_rr(MVT RetVT, unsigned Op0, bool Op0IsKill,
|
unsigned Emit_MUL_rr(MVT RetVT, unsigned Op0, bool Op0IsKill,
|
||||||
@ -567,27 +568,32 @@ bool AArch64FastISel::SimplifyAddress(Address &Addr, MVT VT,
|
|||||||
|
|
||||||
void AArch64FastISel::AddLoadStoreOperands(Address &Addr,
|
void AArch64FastISel::AddLoadStoreOperands(Address &Addr,
|
||||||
const MachineInstrBuilder &MIB,
|
const MachineInstrBuilder &MIB,
|
||||||
unsigned Flags, bool UseUnscaled) {
|
unsigned Flags,
|
||||||
|
MachineMemOperand *MMO,
|
||||||
|
bool UseUnscaled) {
|
||||||
int64_t Offset = Addr.getOffset();
|
int64_t Offset = Addr.getOffset();
|
||||||
// Frame base works a bit differently. Handle it separately.
|
// Frame base works a bit differently. Handle it separately.
|
||||||
if (Addr.getKind() == Address::FrameIndexBase) {
|
if (Addr.getKind() == Address::FrameIndexBase) {
|
||||||
int FI = Addr.getFI();
|
int FI = Addr.getFI();
|
||||||
// FIXME: We shouldn't be using getObjectSize/getObjectAlignment. The size
|
// FIXME: We shouldn't be using getObjectSize/getObjectAlignment. The size
|
||||||
// and alignment should be based on the VT.
|
// and alignment should be based on the VT.
|
||||||
MachineMemOperand *MMO = FuncInfo.MF->getMachineMemOperand(
|
MMO = FuncInfo.MF->getMachineMemOperand(
|
||||||
MachinePointerInfo::getFixedStack(FI, Offset), Flags,
|
MachinePointerInfo::getFixedStack(FI, Offset), Flags,
|
||||||
MFI.getObjectSize(FI), MFI.getObjectAlignment(FI));
|
MFI.getObjectSize(FI), MFI.getObjectAlignment(FI));
|
||||||
// Now add the rest of the operands.
|
// Now add the rest of the operands.
|
||||||
MIB.addFrameIndex(FI).addImm(Offset).addMemOperand(MMO);
|
MIB.addFrameIndex(FI).addImm(Offset);
|
||||||
} else {
|
} else {
|
||||||
// Now add the rest of the operands.
|
// Now add the rest of the operands.
|
||||||
MIB.addReg(Addr.getReg());
|
MIB.addReg(Addr.getReg());
|
||||||
MIB.addImm(Offset);
|
MIB.addImm(Offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MMO)
|
||||||
|
MIB.addMemOperand(MMO);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AArch64FastISel::EmitLoad(MVT VT, unsigned &ResultReg, Address Addr,
|
bool AArch64FastISel::EmitLoad(MVT VT, unsigned &ResultReg, Address Addr,
|
||||||
bool UseUnscaled) {
|
MachineMemOperand *MMO, bool UseUnscaled) {
|
||||||
// Negative offsets require unscaled, 9-bit, signed immediate offsets.
|
// Negative offsets require unscaled, 9-bit, signed immediate offsets.
|
||||||
// Otherwise, we try using scaled, 12-bit, unsigned immediate offsets.
|
// Otherwise, we try using scaled, 12-bit, unsigned immediate offsets.
|
||||||
if (!UseUnscaled && Addr.getOffset() < 0)
|
if (!UseUnscaled && Addr.getOffset() < 0)
|
||||||
@ -639,7 +645,7 @@ bool AArch64FastISel::EmitLoad(MVT VT, unsigned &ResultReg, Address Addr,
|
|||||||
int64_t Offset = Addr.getOffset();
|
int64_t Offset = Addr.getOffset();
|
||||||
if (Offset & (ScaleFactor - 1))
|
if (Offset & (ScaleFactor - 1))
|
||||||
// Retry using an unscaled, 9-bit, signed immediate offset.
|
// Retry using an unscaled, 9-bit, signed immediate offset.
|
||||||
return EmitLoad(VT, ResultReg, Addr, /*UseUnscaled*/ true);
|
return EmitLoad(VT, ResultReg, Addr, MMO, /*UseUnscaled*/ true);
|
||||||
|
|
||||||
Addr.setOffset(Offset / ScaleFactor);
|
Addr.setOffset(Offset / ScaleFactor);
|
||||||
}
|
}
|
||||||
@ -652,7 +658,7 @@ bool AArch64FastISel::EmitLoad(MVT VT, unsigned &ResultReg, Address Addr,
|
|||||||
ResultReg = createResultReg(RC);
|
ResultReg = createResultReg(RC);
|
||||||
MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||||
TII.get(Opc), ResultReg);
|
TII.get(Opc), ResultReg);
|
||||||
AddLoadStoreOperands(Addr, MIB, MachineMemOperand::MOLoad, UseUnscaled);
|
AddLoadStoreOperands(Addr, MIB, MachineMemOperand::MOLoad, MMO, UseUnscaled);
|
||||||
|
|
||||||
// Loading an i1 requires special handling.
|
// Loading an i1 requires special handling.
|
||||||
if (VTIsi1) {
|
if (VTIsi1) {
|
||||||
@ -681,7 +687,7 @@ bool AArch64FastISel::SelectLoad(const Instruction *I) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned ResultReg;
|
unsigned ResultReg;
|
||||||
if (!EmitLoad(VT, ResultReg, Addr))
|
if (!EmitLoad(VT, ResultReg, Addr, createMachineMemOperandFor(I)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
UpdateValueMap(I, ResultReg);
|
UpdateValueMap(I, ResultReg);
|
||||||
@ -689,7 +695,7 @@ bool AArch64FastISel::SelectLoad(const Instruction *I) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AArch64FastISel::EmitStore(MVT VT, unsigned SrcReg, Address Addr,
|
bool AArch64FastISel::EmitStore(MVT VT, unsigned SrcReg, Address Addr,
|
||||||
bool UseUnscaled) {
|
MachineMemOperand *MMO, bool UseUnscaled) {
|
||||||
// Negative offsets require unscaled, 9-bit, signed immediate offsets.
|
// Negative offsets require unscaled, 9-bit, signed immediate offsets.
|
||||||
// Otherwise, we try using scaled, 12-bit, unsigned immediate offsets.
|
// Otherwise, we try using scaled, 12-bit, unsigned immediate offsets.
|
||||||
if (!UseUnscaled && Addr.getOffset() < 0)
|
if (!UseUnscaled && Addr.getOffset() < 0)
|
||||||
@ -734,7 +740,7 @@ bool AArch64FastISel::EmitStore(MVT VT, unsigned SrcReg, Address Addr,
|
|||||||
int64_t Offset = Addr.getOffset();
|
int64_t Offset = Addr.getOffset();
|
||||||
if (Offset & (ScaleFactor - 1))
|
if (Offset & (ScaleFactor - 1))
|
||||||
// Retry using an unscaled, 9-bit, signed immediate offset.
|
// Retry using an unscaled, 9-bit, signed immediate offset.
|
||||||
return EmitStore(VT, SrcReg, Addr, /*UseUnscaled*/ true);
|
return EmitStore(VT, SrcReg, Addr, MMO, /*UseUnscaled*/ true);
|
||||||
|
|
||||||
Addr.setOffset(Offset / ScaleFactor);
|
Addr.setOffset(Offset / ScaleFactor);
|
||||||
}
|
}
|
||||||
@ -756,7 +762,8 @@ bool AArch64FastISel::EmitStore(MVT VT, unsigned SrcReg, Address Addr,
|
|||||||
// Create the base instruction, then add the operands.
|
// Create the base instruction, then add the operands.
|
||||||
MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||||
TII.get(StrOpc)).addReg(SrcReg);
|
TII.get(StrOpc)).addReg(SrcReg);
|
||||||
AddLoadStoreOperands(Addr, MIB, MachineMemOperand::MOStore, UseUnscaled);
|
AddLoadStoreOperands(Addr, MIB, MachineMemOperand::MOStore, MMO, UseUnscaled);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -780,7 +787,7 @@ bool AArch64FastISel::SelectStore(const Instruction *I) {
|
|||||||
if (!ComputeAddress(I->getOperand(1), Addr))
|
if (!ComputeAddress(I->getOperand(1), Addr))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!EmitStore(VT, SrcReg, Addr))
|
if (!EmitStore(VT, SrcReg, Addr, createMachineMemOperandFor(I)))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1495,7 +1502,12 @@ bool AArch64FastISel::ProcessCallArgs(CallLoweringInfo &CLI,
|
|||||||
Addr.setReg(AArch64::SP);
|
Addr.setReg(AArch64::SP);
|
||||||
Addr.setOffset(VA.getLocMemOffset() + BEAlign);
|
Addr.setOffset(VA.getLocMemOffset() + BEAlign);
|
||||||
|
|
||||||
if (!EmitStore(ArgVT, ArgReg, Addr))
|
unsigned Alignment = DL.getABITypeAlignment(ArgVal->getType());
|
||||||
|
MachineMemOperand *MMO = FuncInfo.MF->getMachineMemOperand(
|
||||||
|
MachinePointerInfo::getStack(Addr.getOffset()),
|
||||||
|
MachineMemOperand::MOStore, ArgVT.getStoreSize(), Alignment);
|
||||||
|
|
||||||
|
if (!EmitStore(ArgVT, ArgReg, Addr, MMO))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user