1234285Sdim//===-- MipsCondMov.td - Describe Mips Conditional Moves --*- tablegen -*--===// 2234285Sdim// 3234285Sdim// The LLVM Compiler Infrastructure 4234285Sdim// 5234285Sdim// This file is distributed under the University of Illinois Open Source 6234285Sdim// License. See LICENSE.TXT for details. 7234285Sdim// 8234285Sdim//===----------------------------------------------------------------------===// 9234285Sdim// 10234285Sdim// This is the Conditional Moves implementation. 11234285Sdim// 12234285Sdim//===----------------------------------------------------------------------===// 13234285Sdim 14234285Sdim// Conditional moves: 15234285Sdim// These instructions are expanded in 16234285Sdim// MipsISelLowering::EmitInstrWithCustomInserter if target does not have 17234285Sdim// conditional move instructions. 18234285Sdim// cond:int, data:int 19263508Sdimclass CMov_I_I_FT<string opstr, RegisterOperand CRC, RegisterOperand DRC, 20249423Sdim InstrItinClass Itin> : 21249423Sdim InstSE<(outs DRC:$rd), (ins DRC:$rs, CRC:$rt, DRC:$F), 22263508Sdim !strconcat(opstr, "\t$rd, $rs, $rt"), [], Itin, FrmFR, opstr> { 23234285Sdim let Constraints = "$F = $rd"; 24234285Sdim} 25234285Sdim 26234285Sdim// cond:int, data:float 27263508Sdimclass CMov_I_F_FT<string opstr, RegisterOperand CRC, RegisterOperand DRC, 28249423Sdim InstrItinClass Itin> : 29249423Sdim InstSE<(outs DRC:$fd), (ins DRC:$fs, CRC:$rt, DRC:$F), 30249423Sdim !strconcat(opstr, "\t$fd, $fs, $rt"), [], Itin, FrmFR> { 31234285Sdim let Constraints = "$F = $fd"; 32234285Sdim} 33234285Sdim 34234285Sdim// cond:float, data:int 35263508Sdimclass CMov_F_I_FT<string opstr, RegisterOperand RC, InstrItinClass Itin, 36249423Sdim SDPatternOperator OpNode = null_frag> : 37263508Sdim InstSE<(outs RC:$rd), (ins RC:$rs, FCCRegsOpnd:$fcc, RC:$F), 38263508Sdim !strconcat(opstr, "\t$rd, $rs, $fcc"), 39263508Sdim [(set RC:$rd, (OpNode RC:$rs, FCCRegsOpnd:$fcc, RC:$F))], 40263508Sdim Itin, FrmFR, opstr> { 41234285Sdim let Constraints = "$F = $rd"; 42234285Sdim} 43234285Sdim 44234285Sdim// cond:float, data:float 45263508Sdimclass CMov_F_F_FT<string opstr, RegisterOperand RC, InstrItinClass Itin, 46249423Sdim SDPatternOperator OpNode = null_frag> : 47263508Sdim InstSE<(outs RC:$fd), (ins RC:$fs, FCCRegsOpnd:$fcc, RC:$F), 48263508Sdim !strconcat(opstr, "\t$fd, $fs, $fcc"), 49263508Sdim [(set RC:$fd, (OpNode RC:$fs, FCCRegsOpnd:$fcc, RC:$F))], 50263508Sdim Itin, FrmFR> { 51234285Sdim let Constraints = "$F = $fd"; 52234285Sdim} 53234285Sdim 54234285Sdim// select patterns 55234285Sdimmulticlass MovzPats0<RegisterClass CRC, RegisterClass DRC, 56234285Sdim Instruction MOVZInst, Instruction SLTOp, 57234285Sdim Instruction SLTuOp, Instruction SLTiOp, 58234285Sdim Instruction SLTiuOp> { 59239462Sdim def : MipsPat<(select (i32 (setge CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 60239462Sdim (MOVZInst DRC:$T, (SLTOp CRC:$lhs, CRC:$rhs), DRC:$F)>; 61249423Sdim def : MipsPat<(select (i32 (setuge CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 62249423Sdim (MOVZInst DRC:$T, (SLTuOp CRC:$lhs, CRC:$rhs), DRC:$F)>; 63249423Sdim def : MipsPat<(select (i32 (setge CRC:$lhs, immSExt16:$rhs)), DRC:$T, DRC:$F), 64249423Sdim (MOVZInst DRC:$T, (SLTiOp CRC:$lhs, immSExt16:$rhs), DRC:$F)>; 65249423Sdim def : MipsPat<(select (i32 (setuge CRC:$lh, immSExt16:$rh)), DRC:$T, DRC:$F), 66249423Sdim (MOVZInst DRC:$T, (SLTiuOp CRC:$lh, immSExt16:$rh), DRC:$F)>; 67249423Sdim def : MipsPat<(select (i32 (setle CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 68249423Sdim (MOVZInst DRC:$T, (SLTOp CRC:$rhs, CRC:$lhs), DRC:$F)>; 69249423Sdim def : MipsPat<(select (i32 (setule CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 70249423Sdim (MOVZInst DRC:$T, (SLTuOp CRC:$rhs, CRC:$lhs), DRC:$F)>; 71249423Sdim def : MipsPat<(select (i32 (setgt CRC:$lhs, immSExt16Plus1:$rhs)), 72249423Sdim DRC:$T, DRC:$F), 73249423Sdim (MOVZInst DRC:$T, (SLTiOp CRC:$lhs, (Plus1 imm:$rhs)), DRC:$F)>; 74249423Sdim def : MipsPat<(select (i32 (setugt CRC:$lhs, immSExt16Plus1:$rhs)), 75249423Sdim DRC:$T, DRC:$F), 76249423Sdim (MOVZInst DRC:$T, (SLTiuOp CRC:$lhs, (Plus1 imm:$rhs)), 77249423Sdim DRC:$F)>; 78234285Sdim} 79234285Sdim 80234285Sdimmulticlass MovzPats1<RegisterClass CRC, RegisterClass DRC, 81234285Sdim Instruction MOVZInst, Instruction XOROp> { 82239462Sdim def : MipsPat<(select (i32 (seteq CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 83239462Sdim (MOVZInst DRC:$T, (XOROp CRC:$lhs, CRC:$rhs), DRC:$F)>; 84239462Sdim def : MipsPat<(select (i32 (seteq CRC:$lhs, 0)), DRC:$T, DRC:$F), 85239462Sdim (MOVZInst DRC:$T, CRC:$lhs, DRC:$F)>; 86234285Sdim} 87234285Sdim 88239462Sdimmulticlass MovzPats2<RegisterClass CRC, RegisterClass DRC, 89239462Sdim Instruction MOVZInst, Instruction XORiOp> { 90239462Sdim def : MipsPat< 91239462Sdim (select (i32 (seteq CRC:$lhs, immZExt16:$uimm16)), DRC:$T, DRC:$F), 92239462Sdim (MOVZInst DRC:$T, (XORiOp CRC:$lhs, immZExt16:$uimm16), DRC:$F)>; 93239462Sdim} 94239462Sdim 95234285Sdimmulticlass MovnPats<RegisterClass CRC, RegisterClass DRC, Instruction MOVNInst, 96234285Sdim Instruction XOROp> { 97239462Sdim def : MipsPat<(select (i32 (setne CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 98239462Sdim (MOVNInst DRC:$T, (XOROp CRC:$lhs, CRC:$rhs), DRC:$F)>; 99239462Sdim def : MipsPat<(select CRC:$cond, DRC:$T, DRC:$F), 100239462Sdim (MOVNInst DRC:$T, CRC:$cond, DRC:$F)>; 101239462Sdim def : MipsPat<(select (i32 (setne CRC:$lhs, 0)),DRC:$T, DRC:$F), 102239462Sdim (MOVNInst DRC:$T, CRC:$lhs, DRC:$F)>; 103234285Sdim} 104234285Sdim 105234285Sdim// Instantiation of instructions. 106263508Sdimdef MOVZ_I_I : MMRel, CMov_I_I_FT<"movz", GPR32Opnd, GPR32Opnd, IIArith>, 107249423Sdim ADD_FM<0, 0xa>; 108263508Sdim 109263508Sdimlet Predicates = [HasStdEnc], isCodeGenOnly = 1 in { 110263508Sdim def MOVZ_I_I64 : CMov_I_I_FT<"movz", GPR32Opnd, GPR64Opnd, IIArith>, 111249423Sdim ADD_FM<0, 0xa>; 112263508Sdim def MOVZ_I64_I : CMov_I_I_FT<"movz", GPR64Opnd, GPR32Opnd, IIArith>, 113263508Sdim ADD_FM<0, 0xa>; 114263508Sdim def MOVZ_I64_I64 : CMov_I_I_FT<"movz", GPR64Opnd, GPR64Opnd, IIArith>, 115263508Sdim ADD_FM<0, 0xa>; 116234285Sdim} 117234285Sdim 118263508Sdimdef MOVN_I_I : MMRel, CMov_I_I_FT<"movn", GPR32Opnd, GPR32Opnd, IIArith>, 119249423Sdim ADD_FM<0, 0xb>; 120263508Sdim 121263508Sdimlet Predicates = [HasStdEnc], isCodeGenOnly = 1 in { 122263508Sdim def MOVN_I_I64 : CMov_I_I_FT<"movn", GPR32Opnd, GPR64Opnd, IIArith>, 123249423Sdim ADD_FM<0, 0xb>; 124263508Sdim def MOVN_I64_I : CMov_I_I_FT<"movn", GPR64Opnd, GPR32Opnd, IIArith>, 125263508Sdim ADD_FM<0, 0xb>; 126263508Sdim def MOVN_I64_I64 : CMov_I_I_FT<"movn", GPR64Opnd, GPR64Opnd, IIArith>, 127263508Sdim ADD_FM<0, 0xb>; 128234285Sdim} 129234285Sdim 130263508Sdimdef MOVZ_I_S : CMov_I_F_FT<"movz.s", GPR32Opnd, FGR32Opnd, IIFmove>, 131249423Sdim CMov_I_F_FM<18, 16>; 132234285Sdim 133263508Sdimlet isCodeGenOnly = 1 in 134263508Sdimdef MOVZ_I64_S : CMov_I_F_FT<"movz.s", GPR64Opnd, FGR32Opnd, IIFmove>, 135263508Sdim CMov_I_F_FM<18, 16>, Requires<[HasMips64, HasStdEnc]>; 136263508Sdim 137263508Sdimdef MOVN_I_S : CMov_I_F_FT<"movn.s", GPR32Opnd, FGR32Opnd, IIFmove>, 138249423Sdim CMov_I_F_FM<19, 16>; 139234285Sdim 140263508Sdimlet isCodeGenOnly = 1 in 141263508Sdimdef MOVN_I64_S : CMov_I_F_FT<"movn.s", GPR64Opnd, FGR32Opnd, IIFmove>, 142263508Sdim CMov_I_F_FM<19, 16>, Requires<[HasMips64, HasStdEnc]>; 143263508Sdim 144249423Sdimlet Predicates = [NotFP64bit, HasStdEnc] in { 145263508Sdim def MOVZ_I_D32 : CMov_I_F_FT<"movz.d", GPR32Opnd, AFGR64Opnd, IIFmove>, 146249423Sdim CMov_I_F_FM<18, 17>; 147263508Sdim def MOVN_I_D32 : CMov_I_F_FT<"movn.d", GPR32Opnd, AFGR64Opnd, IIFmove>, 148249423Sdim CMov_I_F_FM<19, 17>; 149234285Sdim} 150263508Sdim 151263508Sdimlet Predicates = [IsFP64bit, HasStdEnc], DecoderNamespace = "Mips64" in { 152263508Sdim def MOVZ_I_D64 : CMov_I_F_FT<"movz.d", GPR32Opnd, FGR64Opnd, IIFmove>, 153249423Sdim CMov_I_F_FM<18, 17>; 154263508Sdim def MOVN_I_D64 : CMov_I_F_FT<"movn.d", GPR32Opnd, FGR64Opnd, IIFmove>, 155249423Sdim CMov_I_F_FM<19, 17>; 156263508Sdim let isCodeGenOnly = 1 in { 157263508Sdim def MOVZ_I64_D64 : CMov_I_F_FT<"movz.d", GPR64Opnd, FGR64Opnd, 158263508Sdim IIFmove>, CMov_I_F_FM<18, 17>; 159263508Sdim def MOVN_I64_D64 : CMov_I_F_FT<"movn.d", GPR64Opnd, FGR64Opnd, 160263508Sdim IIFmove>, CMov_I_F_FM<19, 17>; 161234982Sdim } 162234285Sdim} 163234285Sdim 164263508Sdimdef MOVT_I : MMRel, CMov_F_I_FT<"movt", GPR32Opnd, IIArith, MipsCMovFP_T>, 165263508Sdim CMov_F_I_FM<1>; 166234285Sdim 167263508Sdimlet isCodeGenOnly = 1 in 168263508Sdimdef MOVT_I64 : CMov_F_I_FT<"movt", GPR64Opnd, IIArith, MipsCMovFP_T>, 169263508Sdim CMov_F_I_FM<1>, Requires<[HasMips64, HasStdEnc]>; 170234285Sdim 171263508Sdimdef MOVF_I : MMRel, CMov_F_I_FT<"movf", GPR32Opnd, IIArith, MipsCMovFP_F>, 172263508Sdim CMov_F_I_FM<0>; 173263508Sdim 174263508Sdimlet isCodeGenOnly = 1 in 175263508Sdimdef MOVF_I64 : CMov_F_I_FT<"movf", GPR64Opnd, IIArith, MipsCMovFP_F>, 176263508Sdim CMov_F_I_FM<0>, Requires<[HasMips64, HasStdEnc]>; 177263508Sdim 178263508Sdimdef MOVT_S : CMov_F_F_FT<"movt.s", FGR32Opnd, IIFmove, MipsCMovFP_T>, 179249423Sdim CMov_F_F_FM<16, 1>; 180263508Sdimdef MOVF_S : CMov_F_F_FT<"movf.s", FGR32Opnd, IIFmove, MipsCMovFP_F>, 181249423Sdim CMov_F_F_FM<16, 0>; 182234285Sdim 183249423Sdimlet Predicates = [NotFP64bit, HasStdEnc] in { 184263508Sdim def MOVT_D32 : CMov_F_F_FT<"movt.d", AFGR64Opnd, IIFmove, MipsCMovFP_T>, 185249423Sdim CMov_F_F_FM<17, 1>; 186263508Sdim def MOVF_D32 : CMov_F_F_FT<"movf.d", AFGR64Opnd, IIFmove, MipsCMovFP_F>, 187249423Sdim CMov_F_F_FM<17, 0>; 188234285Sdim} 189263508Sdim 190263508Sdimlet Predicates = [IsFP64bit, HasStdEnc], DecoderNamespace = "Mips64" in { 191263508Sdim def MOVT_D64 : CMov_F_F_FT<"movt.d", FGR64Opnd, IIFmove, MipsCMovFP_T>, 192249423Sdim CMov_F_F_FM<17, 1>; 193263508Sdim def MOVF_D64 : CMov_F_F_FT<"movf.d", FGR64Opnd, IIFmove, MipsCMovFP_F>, 194249423Sdim CMov_F_F_FM<17, 0>; 195234285Sdim} 196234285Sdim 197234285Sdim// Instantiation of conditional move patterns. 198263508Sdimdefm : MovzPats0<GPR32, GPR32, MOVZ_I_I, SLT, SLTu, SLTi, SLTiu>; 199263508Sdimdefm : MovzPats1<GPR32, GPR32, MOVZ_I_I, XOR>; 200263508Sdimdefm : MovzPats2<GPR32, GPR32, MOVZ_I_I, XORi>; 201249423Sdimlet Predicates = [HasMips64, HasStdEnc] in { 202263508Sdim defm : MovzPats0<GPR32, GPR64, MOVZ_I_I64, SLT, SLTu, SLTi, SLTiu>; 203263508Sdim defm : MovzPats0<GPR64, GPR32, MOVZ_I_I, SLT64, SLTu64, SLTi64, 204234285Sdim SLTiu64>; 205263508Sdim defm : MovzPats0<GPR64, GPR64, MOVZ_I_I64, SLT64, SLTu64, SLTi64, 206234285Sdim SLTiu64>; 207263508Sdim defm : MovzPats1<GPR32, GPR64, MOVZ_I_I64, XOR>; 208263508Sdim defm : MovzPats1<GPR64, GPR32, MOVZ_I64_I, XOR64>; 209263508Sdim defm : MovzPats1<GPR64, GPR64, MOVZ_I64_I64, XOR64>; 210263508Sdim defm : MovzPats2<GPR32, GPR64, MOVZ_I_I64, XORi>; 211263508Sdim defm : MovzPats2<GPR64, GPR32, MOVZ_I64_I, XORi64>; 212263508Sdim defm : MovzPats2<GPR64, GPR64, MOVZ_I64_I64, XORi64>; 213234285Sdim} 214234285Sdim 215263508Sdimdefm : MovnPats<GPR32, GPR32, MOVN_I_I, XOR>; 216249423Sdimlet Predicates = [HasMips64, HasStdEnc] in { 217263508Sdim defm : MovnPats<GPR32, GPR64, MOVN_I_I64, XOR>; 218263508Sdim defm : MovnPats<GPR64, GPR32, MOVN_I64_I, XOR64>; 219263508Sdim defm : MovnPats<GPR64, GPR64, MOVN_I64_I64, XOR64>; 220234285Sdim} 221234285Sdim 222263508Sdimdefm : MovzPats0<GPR32, FGR32, MOVZ_I_S, SLT, SLTu, SLTi, SLTiu>; 223263508Sdimdefm : MovzPats1<GPR32, FGR32, MOVZ_I_S, XOR>; 224263508Sdimdefm : MovnPats<GPR32, FGR32, MOVN_I_S, XOR>; 225249423Sdimlet Predicates = [HasMips64, HasStdEnc] in { 226263508Sdim defm : MovzPats0<GPR64, FGR32, MOVZ_I_S, SLT64, SLTu64, SLTi64, 227234285Sdim SLTiu64>; 228263508Sdim defm : MovzPats1<GPR64, FGR32, MOVZ_I64_S, XOR64>; 229263508Sdim defm : MovnPats<GPR64, FGR32, MOVN_I64_S, XOR64>; 230234285Sdim} 231234285Sdim 232249423Sdimlet Predicates = [NotFP64bit, HasStdEnc] in { 233263508Sdim defm : MovzPats0<GPR32, AFGR64, MOVZ_I_D32, SLT, SLTu, SLTi, SLTiu>; 234263508Sdim defm : MovzPats1<GPR32, AFGR64, MOVZ_I_D32, XOR>; 235263508Sdim defm : MovnPats<GPR32, AFGR64, MOVN_I_D32, XOR>; 236234285Sdim} 237249423Sdimlet Predicates = [IsFP64bit, HasStdEnc] in { 238263508Sdim defm : MovzPats0<GPR32, FGR64, MOVZ_I_D64, SLT, SLTu, SLTi, SLTiu>; 239263508Sdim defm : MovzPats0<GPR64, FGR64, MOVZ_I_D64, SLT64, SLTu64, SLTi64, 240234285Sdim SLTiu64>; 241263508Sdim defm : MovzPats1<GPR32, FGR64, MOVZ_I_D64, XOR>; 242263508Sdim defm : MovzPats1<GPR64, FGR64, MOVZ_I64_D64, XOR64>; 243263508Sdim defm : MovnPats<GPR32, FGR64, MOVN_I_D64, XOR>; 244263508Sdim defm : MovnPats<GPR64, FGR64, MOVN_I64_D64, XOR64>; 245234285Sdim} 246