1*9880d681SAndroid Build Coastguard Worker//===-- MipsCondMov.td - Describe Mips Conditional Moves --*- tablegen -*--===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This is the Conditional Moves implementation. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// Conditional moves: 15*9880d681SAndroid Build Coastguard Worker// These instructions are expanded in 16*9880d681SAndroid Build Coastguard Worker// MipsISelLowering::EmitInstrWithCustomInserter if target does not have 17*9880d681SAndroid Build Coastguard Worker// conditional move instructions. 18*9880d681SAndroid Build Coastguard Worker// cond:int, data:int 19*9880d681SAndroid Build Coastguard Workerclass CMov_I_I_FT<string opstr, RegisterOperand CRC, RegisterOperand DRC, 20*9880d681SAndroid Build Coastguard Worker InstrItinClass Itin> : 21*9880d681SAndroid Build Coastguard Worker InstSE<(outs DRC:$rd), (ins DRC:$rs, CRC:$rt, DRC:$F), 22*9880d681SAndroid Build Coastguard Worker !strconcat(opstr, "\t$rd, $rs, $rt"), [], Itin, FrmFR, opstr> { 23*9880d681SAndroid Build Coastguard Worker let Constraints = "$F = $rd"; 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker// cond:int, data:float 27*9880d681SAndroid Build Coastguard Workerclass CMov_I_F_FT<string opstr, RegisterOperand CRC, RegisterOperand DRC, 28*9880d681SAndroid Build Coastguard Worker InstrItinClass Itin> : 29*9880d681SAndroid Build Coastguard Worker InstSE<(outs DRC:$fd), (ins DRC:$fs, CRC:$rt, DRC:$F), 30*9880d681SAndroid Build Coastguard Worker !strconcat(opstr, "\t$fd, $fs, $rt"), [], Itin, FrmFR, opstr>, 31*9880d681SAndroid Build Coastguard Worker HARDFLOAT { 32*9880d681SAndroid Build Coastguard Worker let Constraints = "$F = $fd"; 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker// cond:float, data:int 36*9880d681SAndroid Build Coastguard Workerclass CMov_F_I_FT<string opstr, RegisterOperand RC, InstrItinClass Itin, 37*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> : 38*9880d681SAndroid Build Coastguard Worker InstSE<(outs RC:$rd), (ins RC:$rs, FCCRegsOpnd:$fcc, RC:$F), 39*9880d681SAndroid Build Coastguard Worker !strconcat(opstr, "\t$rd, $rs, $fcc"), 40*9880d681SAndroid Build Coastguard Worker [(set RC:$rd, (OpNode RC:$rs, FCCRegsOpnd:$fcc, RC:$F))], 41*9880d681SAndroid Build Coastguard Worker Itin, FrmFR, opstr>, HARDFLOAT { 42*9880d681SAndroid Build Coastguard Worker let Constraints = "$F = $rd"; 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker// cond:float, data:float 46*9880d681SAndroid Build Coastguard Workerclass CMov_F_F_FT<string opstr, RegisterOperand RC, InstrItinClass Itin, 47*9880d681SAndroid Build Coastguard Worker SDPatternOperator OpNode = null_frag> : 48*9880d681SAndroid Build Coastguard Worker InstSE<(outs RC:$fd), (ins RC:$fs, FCCRegsOpnd:$fcc, RC:$F), 49*9880d681SAndroid Build Coastguard Worker !strconcat(opstr, "\t$fd, $fs, $fcc"), 50*9880d681SAndroid Build Coastguard Worker [(set RC:$fd, (OpNode RC:$fs, FCCRegsOpnd:$fcc, RC:$F))], 51*9880d681SAndroid Build Coastguard Worker Itin, FrmFR, opstr>, HARDFLOAT { 52*9880d681SAndroid Build Coastguard Worker let Constraints = "$F = $fd"; 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker// select patterns 56*9880d681SAndroid Build Coastguard Workermulticlass MovzPats0<RegisterClass CRC, RegisterClass DRC, 57*9880d681SAndroid Build Coastguard Worker Instruction MOVZInst, Instruction SLTOp, 58*9880d681SAndroid Build Coastguard Worker Instruction SLTuOp, Instruction SLTiOp, 59*9880d681SAndroid Build Coastguard Worker Instruction SLTiuOp> { 60*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setge CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 61*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTOp CRC:$lhs, CRC:$rhs), DRC:$F)>; 62*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setuge CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 63*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTuOp CRC:$lhs, CRC:$rhs), DRC:$F)>; 64*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setge CRC:$lhs, immSExt16:$rhs)), DRC:$T, DRC:$F), 65*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTiOp CRC:$lhs, immSExt16:$rhs), DRC:$F)>; 66*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setuge CRC:$lh, immSExt16:$rh)), DRC:$T, DRC:$F), 67*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTiuOp CRC:$lh, immSExt16:$rh), DRC:$F)>; 68*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setle CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 69*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTOp CRC:$rhs, CRC:$lhs), DRC:$F)>; 70*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setule CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 71*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTuOp CRC:$rhs, CRC:$lhs), DRC:$F)>; 72*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setgt CRC:$lhs, immSExt16Plus1:$rhs)), 73*9880d681SAndroid Build Coastguard Worker DRC:$T, DRC:$F), 74*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTiOp CRC:$lhs, (Plus1 imm:$rhs)), DRC:$F)>; 75*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setugt CRC:$lhs, immSExt16Plus1:$rhs)), 76*9880d681SAndroid Build Coastguard Worker DRC:$T, DRC:$F), 77*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (SLTiuOp CRC:$lhs, (Plus1 imm:$rhs)), 78*9880d681SAndroid Build Coastguard Worker DRC:$F)>; 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workermulticlass MovzPats1<RegisterClass CRC, RegisterClass DRC, 82*9880d681SAndroid Build Coastguard Worker Instruction MOVZInst, Instruction XOROp> { 83*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (seteq CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 84*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (XOROp CRC:$lhs, CRC:$rhs), DRC:$F)>; 85*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (seteq CRC:$lhs, 0)), DRC:$T, DRC:$F), 86*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, CRC:$lhs, DRC:$F)>; 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workermulticlass MovzPats2<RegisterClass CRC, RegisterClass DRC, 90*9880d681SAndroid Build Coastguard Worker Instruction MOVZInst, Instruction XORiOp> { 91*9880d681SAndroid Build Coastguard Worker def : MipsPat< 92*9880d681SAndroid Build Coastguard Worker (select (i32 (seteq CRC:$lhs, immZExt16:$uimm16)), DRC:$T, DRC:$F), 93*9880d681SAndroid Build Coastguard Worker (MOVZInst DRC:$T, (XORiOp CRC:$lhs, immZExt16:$uimm16), DRC:$F)>; 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workermulticlass MovnPats<RegisterClass CRC, RegisterClass DRC, Instruction MOVNInst, 97*9880d681SAndroid Build Coastguard Worker Instruction XOROp> { 98*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setne CRC:$lhs, CRC:$rhs)), DRC:$T, DRC:$F), 99*9880d681SAndroid Build Coastguard Worker (MOVNInst DRC:$T, (XOROp CRC:$lhs, CRC:$rhs), DRC:$F)>; 100*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select CRC:$cond, DRC:$T, DRC:$F), 101*9880d681SAndroid Build Coastguard Worker (MOVNInst DRC:$T, CRC:$cond, DRC:$F)>; 102*9880d681SAndroid Build Coastguard Worker def : MipsPat<(select (i32 (setne CRC:$lhs, 0)),DRC:$T, DRC:$F), 103*9880d681SAndroid Build Coastguard Worker (MOVNInst DRC:$T, CRC:$lhs, DRC:$F)>; 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker// Instantiation of instructions. 107*9880d681SAndroid Build Coastguard Workerdef MOVZ_I_I : MMRel, CMov_I_I_FT<"movz", GPR32Opnd, GPR32Opnd, II_MOVZ>, 108*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xa>, INSN_MIPS4_32_NOT_32R6_64R6; 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 111*9880d681SAndroid Build Coastguard Worker def MOVZ_I_I64 : CMov_I_I_FT<"movz", GPR32Opnd, GPR64Opnd, II_MOVZ>, 112*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xa>, INSN_MIPS4_32_NOT_32R6_64R6; 113*9880d681SAndroid Build Coastguard Worker def MOVZ_I64_I : CMov_I_I_FT<"movz", GPR64Opnd, GPR32Opnd, II_MOVZ>, 114*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xa>, INSN_MIPS4_32_NOT_32R6_64R6; 115*9880d681SAndroid Build Coastguard Worker def MOVZ_I64_I64 : CMov_I_I_FT<"movz", GPR64Opnd, GPR64Opnd, II_MOVZ>, 116*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xa>, INSN_MIPS4_32_NOT_32R6_64R6; 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdef MOVN_I_I : MMRel, CMov_I_I_FT<"movn", GPR32Opnd, GPR32Opnd, II_MOVN>, 120*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xb>, INSN_MIPS4_32_NOT_32R6_64R6; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in { 123*9880d681SAndroid Build Coastguard Worker def MOVN_I_I64 : CMov_I_I_FT<"movn", GPR32Opnd, GPR64Opnd, II_MOVN>, 124*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xb>, INSN_MIPS4_32_NOT_32R6_64R6; 125*9880d681SAndroid Build Coastguard Worker def MOVN_I64_I : CMov_I_I_FT<"movn", GPR64Opnd, GPR32Opnd, II_MOVN>, 126*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xb>, INSN_MIPS4_32_NOT_32R6_64R6; 127*9880d681SAndroid Build Coastguard Worker def MOVN_I64_I64 : CMov_I_I_FT<"movn", GPR64Opnd, GPR64Opnd, II_MOVN>, 128*9880d681SAndroid Build Coastguard Worker ADD_FM<0, 0xb>, INSN_MIPS4_32_NOT_32R6_64R6; 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdef MOVZ_I_S : MMRel, CMov_I_F_FT<"movz.s", GPR32Opnd, FGR32Opnd, II_MOVZ_S>, 132*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<18, 16>, INSN_MIPS4_32_NOT_32R6_64R6; 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 135*9880d681SAndroid Build Coastguard Workerdef MOVZ_I64_S : CMov_I_F_FT<"movz.s", GPR64Opnd, FGR32Opnd, II_MOVZ_S>, 136*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<18, 16>, INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdef MOVN_I_S : MMRel, CMov_I_F_FT<"movn.s", GPR32Opnd, FGR32Opnd, II_MOVN_S>, 139*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<19, 16>, INSN_MIPS4_32_NOT_32R6_64R6; 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 142*9880d681SAndroid Build Coastguard Workerdef MOVN_I64_S : CMov_I_F_FT<"movn.s", GPR64Opnd, FGR32Opnd, II_MOVN_S>, 143*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<19, 16>, INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdef MOVZ_I_D32 : MMRel, CMov_I_F_FT<"movz.d", GPR32Opnd, AFGR64Opnd, 146*9880d681SAndroid Build Coastguard Worker II_MOVZ_D>, CMov_I_F_FM<18, 17>, 147*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_32; 148*9880d681SAndroid Build Coastguard Workerdef MOVN_I_D32 : MMRel, CMov_I_F_FT<"movn.d", GPR32Opnd, AFGR64Opnd, 149*9880d681SAndroid Build Coastguard Worker II_MOVN_D>, CMov_I_F_FM<19, 17>, 150*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_32; 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerlet DecoderNamespace = "Mips64" in { 153*9880d681SAndroid Build Coastguard Worker def MOVZ_I_D64 : CMov_I_F_FT<"movz.d", GPR32Opnd, FGR64Opnd, II_MOVZ_D>, 154*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<18, 17>, INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 155*9880d681SAndroid Build Coastguard Worker def MOVN_I_D64 : CMov_I_F_FT<"movn.d", GPR32Opnd, FGR64Opnd, II_MOVN_D>, 156*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<19, 17>, INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 157*9880d681SAndroid Build Coastguard Worker let isCodeGenOnly = 1 in { 158*9880d681SAndroid Build Coastguard Worker def MOVZ_I64_D64 : CMov_I_F_FT<"movz.d", GPR64Opnd, FGR64Opnd, II_MOVZ_D>, 159*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<18, 17>, INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 160*9880d681SAndroid Build Coastguard Worker def MOVN_I64_D64 : CMov_I_F_FT<"movn.d", GPR64Opnd, FGR64Opnd, II_MOVN_D>, 161*9880d681SAndroid Build Coastguard Worker CMov_I_F_FM<19, 17>, INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 162*9880d681SAndroid Build Coastguard Worker } 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdef MOVT_I : MMRel, CMov_F_I_FT<"movt", GPR32Opnd, II_MOVT, MipsCMovFP_T>, 166*9880d681SAndroid Build Coastguard Worker CMov_F_I_FM<1>, INSN_MIPS4_32_NOT_32R6_64R6; 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 169*9880d681SAndroid Build Coastguard Workerdef MOVT_I64 : CMov_F_I_FT<"movt", GPR64Opnd, II_MOVT, MipsCMovFP_T>, 170*9880d681SAndroid Build Coastguard Worker CMov_F_I_FM<1>, INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdef MOVF_I : MMRel, CMov_F_I_FT<"movf", GPR32Opnd, II_MOVF, MipsCMovFP_F>, 173*9880d681SAndroid Build Coastguard Worker CMov_F_I_FM<0>, INSN_MIPS4_32_NOT_32R6_64R6; 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in 176*9880d681SAndroid Build Coastguard Workerdef MOVF_I64 : CMov_F_I_FT<"movf", GPR64Opnd, II_MOVF, MipsCMovFP_F>, 177*9880d681SAndroid Build Coastguard Worker CMov_F_I_FM<0>, INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdef MOVT_S : MMRel, CMov_F_F_FT<"movt.s", FGR32Opnd, II_MOVT_S, MipsCMovFP_T>, 180*9880d681SAndroid Build Coastguard Worker CMov_F_F_FM<16, 1>, INSN_MIPS4_32_NOT_32R6_64R6; 181*9880d681SAndroid Build Coastguard Workerdef MOVF_S : MMRel, CMov_F_F_FT<"movf.s", FGR32Opnd, II_MOVF_S, MipsCMovFP_F>, 182*9880d681SAndroid Build Coastguard Worker CMov_F_F_FM<16, 0>, INSN_MIPS4_32_NOT_32R6_64R6; 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerdef MOVT_D32 : MMRel, CMov_F_F_FT<"movt.d", AFGR64Opnd, II_MOVT_D, 185*9880d681SAndroid Build Coastguard Worker MipsCMovFP_T>, CMov_F_F_FM<17, 1>, 186*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_32; 187*9880d681SAndroid Build Coastguard Workerdef MOVF_D32 : MMRel, CMov_F_F_FT<"movf.d", AFGR64Opnd, II_MOVF_D, 188*9880d681SAndroid Build Coastguard Worker MipsCMovFP_F>, CMov_F_F_FM<17, 0>, 189*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_32; 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerlet DecoderNamespace = "Mips64" in { 192*9880d681SAndroid Build Coastguard Worker def MOVT_D64 : CMov_F_F_FT<"movt.d", FGR64Opnd, II_MOVT_D, MipsCMovFP_T>, 193*9880d681SAndroid Build Coastguard Worker CMov_F_F_FM<17, 1>, INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 194*9880d681SAndroid Build Coastguard Worker def MOVF_D64 : CMov_F_F_FT<"movf.d", FGR64Opnd, II_MOVF_D, MipsCMovFP_F>, 195*9880d681SAndroid Build Coastguard Worker CMov_F_F_FM<17, 0>, INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker// Instantiation of conditional move patterns. 199*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR32, GPR32, MOVZ_I_I, SLT, SLTu, SLTi, SLTiu>, 200*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6; 201*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR32, GPR32, MOVZ_I_I, XOR>, INSN_MIPS4_32_NOT_32R6_64R6; 202*9880d681SAndroid Build Coastguard Workerdefm : MovzPats2<GPR32, GPR32, MOVZ_I_I, XORi>, INSN_MIPS4_32_NOT_32R6_64R6; 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR32, GPR64, MOVZ_I_I64, SLT, SLTu, SLTi, SLTiu>, 205*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 206*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR64, GPR32, MOVZ_I_I, SLT64, SLTu64, SLTi64, SLTiu64>, 207*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 208*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR64, GPR64, MOVZ_I_I64, SLT64, SLTu64, SLTi64, SLTiu64>, 209*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 210*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR32, GPR64, MOVZ_I_I64, XOR>, 211*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 212*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR64, GPR32, MOVZ_I64_I, XOR64>, 213*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 214*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR64, GPR64, MOVZ_I64_I64, XOR64>, 215*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 216*9880d681SAndroid Build Coastguard Workerdefm : MovzPats2<GPR32, GPR64, MOVZ_I_I64, XORi>, 217*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 218*9880d681SAndroid Build Coastguard Workerdefm : MovzPats2<GPR64, GPR32, MOVZ_I64_I, XORi64>, 219*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 220*9880d681SAndroid Build Coastguard Workerdefm : MovzPats2<GPR64, GPR64, MOVZ_I64_I64, XORi64>, 221*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR32, GPR32, MOVN_I_I, XOR>, INSN_MIPS4_32_NOT_32R6_64R6; 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR32, GPR64, MOVN_I_I64, XOR>, INSN_MIPS4_32_NOT_32R6_64R6, 226*9880d681SAndroid Build Coastguard Worker GPR_64; 227*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR64, GPR32, MOVN_I64_I, XOR64>, INSN_MIPS4_32_NOT_32R6_64R6, 228*9880d681SAndroid Build Coastguard Worker GPR_64; 229*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR64, GPR64, MOVN_I64_I64, XOR64>, INSN_MIPS4_32_NOT_32R6_64R6, 230*9880d681SAndroid Build Coastguard Worker GPR_64; 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR32, FGR32, MOVZ_I_S, SLT, SLTu, SLTi, SLTiu>, 233*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6; 234*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR32, FGR32, MOVZ_I_S, XOR>, INSN_MIPS4_32_NOT_32R6_64R6; 235*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR32, FGR32, MOVN_I_S, XOR>, INSN_MIPS4_32_NOT_32R6_64R6; 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR64, FGR32, MOVZ_I_S, SLT64, SLTu64, SLTi64, SLTiu64>, 238*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, GPR_64; 239*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR64, FGR32, MOVZ_I64_S, XOR64>, INSN_MIPS4_32_NOT_32R6_64R6, 240*9880d681SAndroid Build Coastguard Worker GPR_64; 241*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR64, FGR32, MOVN_I64_S, XOR64>, INSN_MIPS4_32_NOT_32R6_64R6, 242*9880d681SAndroid Build Coastguard Worker GPR_64; 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR32, AFGR64, MOVZ_I_D32, SLT, SLTu, SLTi, SLTiu>, 245*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_32; 246*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR32, AFGR64, MOVZ_I_D32, XOR>, INSN_MIPS4_32_NOT_32R6_64R6, 247*9880d681SAndroid Build Coastguard Worker FGR_32; 248*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR32, AFGR64, MOVN_I_D32, XOR>, INSN_MIPS4_32_NOT_32R6_64R6, 249*9880d681SAndroid Build Coastguard Worker FGR_32; 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR32, FGR64, MOVZ_I_D64, SLT, SLTu, SLTi, SLTiu>, 252*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 253*9880d681SAndroid Build Coastguard Workerdefm : MovzPats0<GPR64, FGR64, MOVZ_I_D64, SLT64, SLTu64, SLTi64, SLTiu64>, 254*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 255*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR32, FGR64, MOVZ_I_D64, XOR>, INSN_MIPS4_32_NOT_32R6_64R6, 256*9880d681SAndroid Build Coastguard Worker FGR_64; 257*9880d681SAndroid Build Coastguard Workerdefm : MovzPats1<GPR64, FGR64, MOVZ_I64_D64, XOR64>, 258*9880d681SAndroid Build Coastguard Worker INSN_MIPS4_32_NOT_32R6_64R6, FGR_64; 259*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR32, FGR64, MOVN_I_D64, XOR>, INSN_MIPS4_32_NOT_32R6_64R6, 260*9880d681SAndroid Build Coastguard Worker FGR_64; 261*9880d681SAndroid Build Coastguard Workerdefm : MovnPats<GPR64, FGR64, MOVN_I64_D64, XOR64>, INSN_MIPS4_32_NOT_32R6_64R6, 262*9880d681SAndroid Build Coastguard Worker FGR_64; 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker// For targets that don't have conditional-move instructions 265*9880d681SAndroid Build Coastguard Worker// we have to match SELECT nodes with pseudo instructions. 266*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1 in { 267*9880d681SAndroid Build Coastguard Worker class Select_Pseudo<RegisterOperand RC> : 268*9880d681SAndroid Build Coastguard Worker PseudoSE<(outs RC:$dst), (ins GPR32Opnd:$cond, RC:$T, RC:$F), 269*9880d681SAndroid Build Coastguard Worker [(set RC:$dst, (select GPR32Opnd:$cond, RC:$T, RC:$F))]>, 270*9880d681SAndroid Build Coastguard Worker ISA_MIPS1_NOT_4_32; 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Worker class SelectFP_Pseudo_T<RegisterOperand RC> : 273*9880d681SAndroid Build Coastguard Worker PseudoSE<(outs RC:$dst), (ins GPR32Opnd:$cond, RC:$T, RC:$F), 274*9880d681SAndroid Build Coastguard Worker [(set RC:$dst, (MipsCMovFP_T RC:$T, GPR32Opnd:$cond, RC:$F))]>, 275*9880d681SAndroid Build Coastguard Worker ISA_MIPS1_NOT_4_32; 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker class SelectFP_Pseudo_F<RegisterOperand RC> : 278*9880d681SAndroid Build Coastguard Worker PseudoSE<(outs RC:$dst), (ins GPR32Opnd:$cond, RC:$T, RC:$F), 279*9880d681SAndroid Build Coastguard Worker [(set RC:$dst, (MipsCMovFP_F RC:$T, GPR32Opnd:$cond, RC:$F))]>, 280*9880d681SAndroid Build Coastguard Worker ISA_MIPS1_NOT_4_32; 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdef PseudoSELECT_I : Select_Pseudo<GPR32Opnd>; 284*9880d681SAndroid Build Coastguard Workerdef PseudoSELECT_I64 : Select_Pseudo<GPR64Opnd>; 285*9880d681SAndroid Build Coastguard Workerdef PseudoSELECT_S : Select_Pseudo<FGR32Opnd>; 286*9880d681SAndroid Build Coastguard Workerdef PseudoSELECT_D32 : Select_Pseudo<AFGR64Opnd>, FGR_32; 287*9880d681SAndroid Build Coastguard Workerdef PseudoSELECT_D64 : Select_Pseudo<FGR64Opnd>, FGR_64; 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_T_I : SelectFP_Pseudo_T<GPR32Opnd>; 290*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_T_I64 : SelectFP_Pseudo_T<GPR64Opnd>; 291*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_T_S : SelectFP_Pseudo_T<FGR32Opnd>; 292*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_T_D32 : SelectFP_Pseudo_T<AFGR64Opnd>, FGR_32; 293*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_T_D64 : SelectFP_Pseudo_T<FGR64Opnd>, FGR_64; 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_F_I : SelectFP_Pseudo_F<GPR32Opnd>; 296*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_F_I64 : SelectFP_Pseudo_F<GPR64Opnd>; 297*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_F_S : SelectFP_Pseudo_F<FGR32Opnd>; 298*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_F_D32 : SelectFP_Pseudo_F<AFGR64Opnd>, FGR_32; 299*9880d681SAndroid Build Coastguard Workerdef PseudoSELECTFP_F_D64 : SelectFP_Pseudo_F<FGR64Opnd>, FGR_64; 300