Skip to content

Commit

Permalink
[mips] Split SelectAddr, which was used to match address patterns, in…
Browse files Browse the repository at this point in the history
…to two

functions. Set AddedComplexity to determine the order in which patterns are
matched.

This simplifies selection of floating point loads/stores.

No functionality change intended.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175300 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
ahatanak committed Feb 15, 2013
1 parent 79cd411 commit dc2f792
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 18 deletions.
39 changes: 26 additions & 13 deletions lib/Target/Mips/MipsISelDAGToDAG.cpp
Expand Up @@ -96,7 +96,17 @@ class MipsDAGToDAGISel : public SelectionDAGISel {
SDNode *Select(SDNode *N);

// Complex Pattern.
bool SelectAddr(SDNode *Parent, SDValue N, SDValue &Base, SDValue &Offset);
/// (reg + imm).
bool selectAddrRegImm(SDNode *Parent, SDValue Addr, SDValue &Base,
SDValue &Offset) const;

/// Fall back on this function if all else fails.
bool selectAddrDefault(SDNode *Parent, SDValue Addr, SDValue &Base,
SDValue &Offset) const;

/// Match integer address pattern.
bool selectIntAddr(SDNode *Parent, SDValue Addr, SDValue &Base,
SDValue &Offset) const;

bool SelectAddr16(SDNode *Parent, SDValue N, SDValue &Base, SDValue &Offset,
SDValue &Alias);
Expand Down Expand Up @@ -323,8 +333,8 @@ SDValue MipsDAGToDAGISel::getMips16SPAliasReg() {

/// ComplexPattern used on MipsInstrInfo
/// Used on Mips Load/Store instructions
bool MipsDAGToDAGISel::
SelectAddr(SDNode *Parent, SDValue Addr, SDValue &Base, SDValue &Offset) {
bool MipsDAGToDAGISel::selectAddrRegImm(SDNode *Parent, SDValue Addr,
SDValue &Base, SDValue &Offset) const {
EVT ValTy = Addr.getValueType();

// if Address is FI, get the TargetFrameIndex.
Expand Down Expand Up @@ -384,21 +394,24 @@ SelectAddr(SDNode *Parent, SDValue Addr, SDValue &Base, SDValue &Offset) {
return true;
}
}

// If an indexed floating point load/store can be emitted, return false.
const LSBaseSDNode *LS = dyn_cast<LSBaseSDNode>(Parent);

if (LS &&
(LS->getMemoryVT() == MVT::f32 || LS->getMemoryVT() == MVT::f64) &&
Subtarget.hasFPIdx())
return false;
}

Base = Addr;
Offset = CurDAG->getTargetConstant(0, ValTy);
return false;
}

bool MipsDAGToDAGISel::selectAddrDefault(SDNode *Parent, SDValue Addr,
SDValue &Base, SDValue &Offset) const {
Base = Addr;
Offset = CurDAG->getTargetConstant(0, Addr.getValueType());
return true;
}

bool MipsDAGToDAGISel::selectIntAddr(SDNode *Parent, SDValue Addr,
SDValue &Base, SDValue &Offset) const {
return selectAddrRegImm(Parent, Addr, Base, Offset) ||
selectAddrDefault(Parent, Addr, Base, Offset);
}

void MipsDAGToDAGISel::getMips16SPRefReg(SDNode *Parent, SDValue &AliasReg) {
SDValue AliasFPReg = CurDAG->getRegister(Mips::S0, TLI.getPointerTy());
if (Parent) {
Expand Down
42 changes: 38 additions & 4 deletions lib/Target/Mips/MipsInstrFPU.td
Expand Up @@ -152,14 +152,14 @@ class MTC1_FT_CCR<string opstr, RegisterOperand DstRC, RegisterClass SrcRC,
class LW_FT<string opstr, RegisterClass RC, InstrItinClass Itin,
Operand MemOpnd, SDPatternOperator OpNode= null_frag> :
InstSE<(outs RC:$rt), (ins MemOpnd:$addr), !strconcat(opstr, "\t$rt, $addr"),
[(set RC:$rt, (OpNode addr:$addr))], Itin, FrmFI> {
[(set RC:$rt, (OpNode addrDefault:$addr))], Itin, FrmFI> {
let DecoderMethod = "DecodeFMem";
}

class SW_FT<string opstr, RegisterClass RC, InstrItinClass Itin,
Operand MemOpnd, SDPatternOperator OpNode= null_frag> :
InstSE<(outs), (ins RC:$rt, MemOpnd:$addr), !strconcat(opstr, "\t$rt, $addr"),
[(OpNode RC:$rt, addr:$addr)], Itin, FrmFI> {
[(OpNode RC:$rt, addrDefault:$addr)], Itin, FrmFI> {
let DecoderMethod = "DecodeFMem";
}

Expand All @@ -180,13 +180,17 @@ class LWXC1_FT<string opstr, RegisterClass DRC, RegisterClass PRC,
InstrItinClass Itin, SDPatternOperator OpNode = null_frag> :
InstSE<(outs DRC:$fd), (ins PRC:$base, PRC:$index),
!strconcat(opstr, "\t$fd, ${index}(${base})"),
[(set DRC:$fd, (OpNode (add PRC:$base, PRC:$index)))], Itin, FrmFI>;
[(set DRC:$fd, (OpNode (add PRC:$base, PRC:$index)))], Itin, FrmFI> {
let AddedComplexity = 20;
}

class SWXC1_FT<string opstr, RegisterClass DRC, RegisterClass PRC,
InstrItinClass Itin, SDPatternOperator OpNode = null_frag> :
InstSE<(outs), (ins DRC:$fs, PRC:$base, PRC:$index),
!strconcat(opstr, "\t$fs, ${index}(${base})"),
[(OpNode DRC:$fs, (add PRC:$base, PRC:$index))], Itin, FrmFI>;
[(OpNode DRC:$fs, (add PRC:$base, PRC:$index))], Itin, FrmFI> {
let AddedComplexity = 20;
}

class BC1F_FT<string opstr, InstrItinClass Itin,
SDPatternOperator Op = null_frag> :
Expand Down Expand Up @@ -498,3 +502,33 @@ let Predicates = [IsFP64bit, HasStdEnc] in {
def : MipsPat<(f32 (fround FGR64:$src)), (CVT_S_D64 FGR64:$src)>;
def : MipsPat<(f64 (fextend FGR32:$src)), (CVT_D64_S FGR32:$src)>;
}

// Load/Store patterns.
let AddedComplexity = 40 in {
let Predicates = [IsN64, HasStdEnc] in {
def : MipsPat<(f32 (load addrRegImm:$a)), (LWC1_P8 addrRegImm:$a)>;
def : MipsPat<(store FGR32:$v, addrRegImm:$a),
(SWC1_P8 FGR32:$v, addrRegImm:$a)>;
def : MipsPat<(f64 (load addrRegImm:$a)), (LDC164_P8 addrRegImm:$a)>;
def : MipsPat<(store FGR64:$v, addrRegImm:$a),
(SDC164_P8 FGR64:$v, addrRegImm:$a)>;
}

let Predicates = [NotN64, HasStdEnc] in {
def : MipsPat<(f32 (load addrRegImm:$a)), (LWC1 addrRegImm:$a)>;
def : MipsPat<(store FGR32:$v, addrRegImm:$a),
(SWC1 FGR32:$v, addrRegImm:$a)>;
}

let Predicates = [NotN64, HasMips64, HasStdEnc] in {
def : MipsPat<(f64 (load addrRegImm:$a)), (LDC164 addrRegImm:$a)>;
def : MipsPat<(store FGR64:$v, addrRegImm:$a),
(SDC164 FGR64:$v, addrRegImm:$a)>;
}

let Predicates = [NotN64, NotMips64, HasStdEnc] in {
def : MipsPat<(f64 (load addrRegImm:$a)), (LDC1 addrRegImm:$a)>;
def : MipsPat<(store AFGR64:$v, addrRegImm:$a),
(SDC1 AFGR64:$v, addrRegImm:$a)>;
}
}
8 changes: 7 additions & 1 deletion lib/Target/Mips/MipsInstrInfo.td
Expand Up @@ -334,7 +334,13 @@ def immZExt5 : ImmLeaf<i32, [{return Imm == (Imm & 0x1f);}]>;
// Mips Address Mode! SDNode frameindex could possibily be a match
// since load and store instructions from stack used it.
def addr :
ComplexPattern<iPTR, 2, "SelectAddr", [frameindex], [SDNPWantParent]>;
ComplexPattern<iPTR, 2, "selectIntAddr", [frameindex], [SDNPWantParent]>;

def addrRegImm :
ComplexPattern<iPTR, 2, "selectAddrRegImm", [frameindex], [SDNPWantParent]>;

def addrDefault :
ComplexPattern<iPTR, 2, "selectAddrDefault", [frameindex], [SDNPWantParent]>;

//===----------------------------------------------------------------------===//
// Instructions specific format
Expand Down

0 comments on commit dc2f792

Please sign in to comment.