mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-22 15:39:28 +00:00
give X86ISD::FNSTCW16m a memoperand, since it touches memory. It only
can access the stack due to how it is generated though. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114522 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0729093cd7
commit
2156b79c49
lib/Target/X86
@ -1169,7 +1169,6 @@ bool X86DAGToDAGISel::SelectAddr(SDNode *Parent, SDValue N, SDValue &Base,
|
||||
Parent->getOpcode() != ISD::PREFETCH &&
|
||||
Parent->getOpcode() != ISD::INTRINSIC_W_CHAIN && // unaligned loads, fixme
|
||||
Parent->getOpcode() != ISD::INTRINSIC_VOID && // nontemporal stores.
|
||||
Parent->getOpcode() != X86ISD::FNSTCW16m &&
|
||||
Parent->getOpcode() != X86ISD::FLD &&
|
||||
Parent->getOpcode() != X86ISD::FILD &&
|
||||
Parent->getOpcode() != X86ISD::FILD_FLAG &&
|
||||
|
@ -8158,41 +8158,48 @@ SDValue X86TargetLowering::LowerFLT_ROUNDS_(SDValue Op,
|
||||
const TargetFrameInfo &TFI = *TM.getFrameInfo();
|
||||
unsigned StackAlignment = TFI.getStackAlignment();
|
||||
EVT VT = Op.getValueType();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
DebugLoc DL = Op.getDebugLoc();
|
||||
|
||||
// Save FP Control Word to stack slot
|
||||
int SSFI = MF.getFrameInfo()->CreateStackObject(2, StackAlignment, false);
|
||||
SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
|
||||
|
||||
SDValue Chain = DAG.getNode(X86ISD::FNSTCW16m, dl, MVT::Other,
|
||||
DAG.getEntryNode(), StackSlot);
|
||||
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(SSFI),
|
||||
MachineMemOperand::MOStore, 2, 2);
|
||||
|
||||
SDValue Ops[] = { DAG.getEntryNode(), StackSlot };
|
||||
SDValue Chain = DAG.getMemIntrinsicNode(X86ISD::FNSTCW16m, DL,
|
||||
DAG.getVTList(MVT::Other),
|
||||
Ops, 2, MVT::i16, MMO);
|
||||
|
||||
// Load FP Control Word from stack slot
|
||||
SDValue CWD = DAG.getLoad(MVT::i16, dl, Chain, StackSlot,
|
||||
SDValue CWD = DAG.getLoad(MVT::i16, DL, Chain, StackSlot,
|
||||
MachinePointerInfo(), false, false, 0);
|
||||
|
||||
// Transform as necessary
|
||||
SDValue CWD1 =
|
||||
DAG.getNode(ISD::SRL, dl, MVT::i16,
|
||||
DAG.getNode(ISD::AND, dl, MVT::i16,
|
||||
DAG.getNode(ISD::SRL, DL, MVT::i16,
|
||||
DAG.getNode(ISD::AND, DL, MVT::i16,
|
||||
CWD, DAG.getConstant(0x800, MVT::i16)),
|
||||
DAG.getConstant(11, MVT::i8));
|
||||
SDValue CWD2 =
|
||||
DAG.getNode(ISD::SRL, dl, MVT::i16,
|
||||
DAG.getNode(ISD::AND, dl, MVT::i16,
|
||||
DAG.getNode(ISD::SRL, DL, MVT::i16,
|
||||
DAG.getNode(ISD::AND, DL, MVT::i16,
|
||||
CWD, DAG.getConstant(0x400, MVT::i16)),
|
||||
DAG.getConstant(9, MVT::i8));
|
||||
|
||||
SDValue RetVal =
|
||||
DAG.getNode(ISD::AND, dl, MVT::i16,
|
||||
DAG.getNode(ISD::ADD, dl, MVT::i16,
|
||||
DAG.getNode(ISD::OR, dl, MVT::i16, CWD1, CWD2),
|
||||
DAG.getNode(ISD::AND, DL, MVT::i16,
|
||||
DAG.getNode(ISD::ADD, DL, MVT::i16,
|
||||
DAG.getNode(ISD::OR, DL, MVT::i16, CWD1, CWD2),
|
||||
DAG.getConstant(1, MVT::i16)),
|
||||
DAG.getConstant(3, MVT::i16));
|
||||
|
||||
|
||||
return DAG.getNode((VT.getSizeInBits() < 16 ?
|
||||
ISD::TRUNCATE : ISD::ZERO_EXTEND), dl, VT, RetVal);
|
||||
ISD::TRUNCATE : ISD::ZERO_EXTEND), DL, VT, RetVal);
|
||||
}
|
||||
|
||||
SDValue X86TargetLowering::LowerCTLZ(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
@ -205,9 +205,6 @@ namespace llvm {
|
||||
/// operand #3 optional in flag
|
||||
TC_RETURN,
|
||||
|
||||
// FNSTCW16m - Store FP control world into i16 memory.
|
||||
FNSTCW16m,
|
||||
|
||||
// VZEXT_MOVL - Vector move low and zero extend.
|
||||
VZEXT_MOVL,
|
||||
|
||||
@ -302,6 +299,8 @@ namespace llvm {
|
||||
// VZEXT_LOAD - Load, scalar_to_vector, and zero extend.
|
||||
VZEXT_LOAD,
|
||||
|
||||
// FNSTCW16m - Store FP control world into i16 memory.
|
||||
FNSTCW16m,
|
||||
|
||||
/// FP_TO_INT*_IN_MEM - This instruction implements FP_TO_SINT with the
|
||||
/// integer destination in memory and a FP reg source. This corresponds
|
||||
|
Loading…
x
Reference in New Issue
Block a user