Lines 261-266
MipsTargetLowering::MipsTargetLowering(const MipsT
Link Here
|
261 |
setOperationAction(ISD::LOAD, MVT::i64, Custom); |
261 |
setOperationAction(ISD::LOAD, MVT::i64, Custom); |
262 |
setOperationAction(ISD::STORE, MVT::i64, Custom); |
262 |
setOperationAction(ISD::STORE, MVT::i64, Custom); |
263 |
setOperationAction(ISD::FP_TO_SINT, MVT::i64, Custom); |
263 |
setOperationAction(ISD::FP_TO_SINT, MVT::i64, Custom); |
|
|
264 |
setOperationAction(ISD::SHL_PARTS, MVT::i64, Custom); |
265 |
setOperationAction(ISD::SRA_PARTS, MVT::i64, Custom); |
266 |
setOperationAction(ISD::SRL_PARTS, MVT::i64, Custom); |
264 |
} |
267 |
} |
265 |
|
268 |
|
266 |
if (!Subtarget.isGP64bit()) { |
269 |
if (!Subtarget.isGP64bit()) { |
Lines 2017-2026
SDValue MipsTargetLowering::lowerATOMIC_FENCE(SDVa
Link Here
|
2017 |
SDValue MipsTargetLowering::lowerShiftLeftParts(SDValue Op, |
2020 |
SDValue MipsTargetLowering::lowerShiftLeftParts(SDValue Op, |
2018 |
SelectionDAG &DAG) const { |
2021 |
SelectionDAG &DAG) const { |
2019 |
SDLoc DL(Op); |
2022 |
SDLoc DL(Op); |
|
|
2023 |
MVT VT = Subtarget.isGP64bit() ? MVT::i64 : MVT::i32; |
2024 |
|
2020 |
SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1); |
2025 |
SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1); |
2021 |
SDValue Shamt = Op.getOperand(2); |
2026 |
SDValue Shamt = Op.getOperand(2); |
2022 |
|
2027 |
// if shamt < (VT.bits): |
2023 |
// if shamt < 32: |
|
|
2024 |
// lo = (shl lo, shamt) |
2028 |
// lo = (shl lo, shamt) |
2025 |
// hi = (or (shl hi, shamt) (srl (srl lo, 1), ~shamt)) |
2029 |
// hi = (or (shl hi, shamt) (srl (srl lo, 1), ~shamt)) |
2026 |
// else: |
2030 |
// else: |
Lines 2028-2045
SDValue MipsTargetLowering::lowerShiftLeftParts(SD
Link Here
|
2028 |
// hi = (shl lo, shamt[4:0]) |
2032 |
// hi = (shl lo, shamt[4:0]) |
2029 |
SDValue Not = DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt, |
2033 |
SDValue Not = DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt, |
2030 |
DAG.getConstant(-1, MVT::i32)); |
2034 |
DAG.getConstant(-1, MVT::i32)); |
2031 |
SDValue ShiftRight1Lo = DAG.getNode(ISD::SRL, DL, MVT::i32, Lo, |
2035 |
SDValue ShiftRight1Lo = DAG.getNode(ISD::SRL, DL, VT, Lo, |
2032 |
DAG.getConstant(1, MVT::i32)); |
2036 |
DAG.getConstant(1, VT)); |
2033 |
SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, MVT::i32, ShiftRight1Lo, |
2037 |
SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, ShiftRight1Lo, Not); |
2034 |
Not); |
2038 |
SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, Hi, Shamt); |
2035 |
SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, MVT::i32, Hi, Shamt); |
2039 |
SDValue Or = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo); |
2036 |
SDValue Or = DAG.getNode(ISD::OR, DL, MVT::i32, ShiftLeftHi, ShiftRightLo); |
2040 |
SDValue ShiftLeftLo = DAG.getNode(ISD::SHL, DL, VT, Lo, Shamt); |
2037 |
SDValue ShiftLeftLo = DAG.getNode(ISD::SHL, DL, MVT::i32, Lo, Shamt); |
|
|
2038 |
SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt, |
2041 |
SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt, |
2039 |
DAG.getConstant(0x20, MVT::i32)); |
2042 |
DAG.getConstant(0x20, MVT::i32)); |
2040 |
Lo = DAG.getNode(ISD::SELECT, DL, MVT::i32, Cond, |
2043 |
Lo = DAG.getNode(ISD::SELECT, DL, VT, Cond, |
2041 |
DAG.getConstant(0, MVT::i32), ShiftLeftLo); |
2044 |
DAG.getConstant(0, VT), ShiftLeftLo); |
2042 |
Hi = DAG.getNode(ISD::SELECT, DL, MVT::i32, Cond, ShiftLeftLo, Or); |
2045 |
Hi = DAG.getNode(ISD::SELECT, DL, VT, Cond, ShiftLeftLo, Or); |
2043 |
|
2046 |
|
2044 |
SDValue Ops[2] = {Lo, Hi}; |
2047 |
SDValue Ops[2] = {Lo, Hi}; |
2045 |
return DAG.getMergeValues(Ops, DL); |
2048 |
return DAG.getMergeValues(Ops, DL); |
Lines 2050-2057
SDValue MipsTargetLowering::lowerShiftRightParts(S
Link Here
|
2050 |
SDLoc DL(Op); |
2053 |
SDLoc DL(Op); |
2051 |
SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1); |
2054 |
SDValue Lo = Op.getOperand(0), Hi = Op.getOperand(1); |
2052 |
SDValue Shamt = Op.getOperand(2); |
2055 |
SDValue Shamt = Op.getOperand(2); |
|
|
2056 |
MVT VT = Subtarget.isGP64bit() ? MVT::i64 : MVT::i32; |
2053 |
|
2057 |
|
2054 |
// if shamt < 32: |
2058 |
// if shamt < (VT.bits): |
2055 |
// lo = (or (shl (shl hi, 1), ~shamt) (srl lo, shamt)) |
2059 |
// lo = (or (shl (shl hi, 1), ~shamt) (srl lo, shamt)) |
2056 |
// if isSRA: |
2060 |
// if isSRA: |
2057 |
// hi = (sra hi, shamt) |
2061 |
// hi = (sra hi, shamt) |
Lines 2066-2086
SDValue MipsTargetLowering::lowerShiftRightParts(S
Link Here
|
2066 |
// hi = 0 |
2070 |
// hi = 0 |
2067 |
SDValue Not = DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt, |
2071 |
SDValue Not = DAG.getNode(ISD::XOR, DL, MVT::i32, Shamt, |
2068 |
DAG.getConstant(-1, MVT::i32)); |
2072 |
DAG.getConstant(-1, MVT::i32)); |
2069 |
SDValue ShiftLeft1Hi = DAG.getNode(ISD::SHL, DL, MVT::i32, Hi, |
2073 |
SDValue ShiftLeft1Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, |
2070 |
DAG.getConstant(1, MVT::i32)); |
2074 |
DAG.getConstant(1, VT)); |
2071 |
SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, MVT::i32, ShiftLeft1Hi, Not); |
2075 |
SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, ShiftLeft1Hi, Not); |
2072 |
SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, MVT::i32, Lo, Shamt); |
2076 |
SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, Lo, Shamt); |
2073 |
SDValue Or = DAG.getNode(ISD::OR, DL, MVT::i32, ShiftLeftHi, ShiftRightLo); |
2077 |
SDValue Or = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo); |
2074 |
SDValue ShiftRightHi = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL, DL, MVT::i32, |
2078 |
SDValue ShiftRightHi = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL, |
2075 |
Hi, Shamt); |
2079 |
DL, VT, Hi, Shamt); |
2076 |
SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt, |
2080 |
SDValue Cond = DAG.getNode(ISD::AND, DL, MVT::i32, Shamt, |
2077 |
DAG.getConstant(0x20, MVT::i32)); |
2081 |
DAG.getConstant(0x20, MVT::i32)); |
2078 |
SDValue Shift31 = DAG.getNode(ISD::SRA, DL, MVT::i32, Hi, |
2082 |
SDValue Shift31 = DAG.getNode(ISD::SRA, DL, VT, Hi, DAG.getConstant(31, VT)); |
2079 |
DAG.getConstant(31, MVT::i32)); |
2083 |
Lo = DAG.getNode(ISD::SELECT, DL, VT, Cond, ShiftRightHi, Or); |
2080 |
Lo = DAG.getNode(ISD::SELECT, DL, MVT::i32, Cond, ShiftRightHi, Or); |
2084 |
Hi = DAG.getNode(ISD::SELECT, DL, VT, Cond, |
2081 |
Hi = DAG.getNode(ISD::SELECT, DL, MVT::i32, Cond, |
2085 |
IsSRA ? Shift31 : DAG.getConstant(0, VT), ShiftRightHi); |
2082 |
IsSRA ? Shift31 : DAG.getConstant(0, MVT::i32), |
|
|
2083 |
ShiftRightHi); |
2084 |
|
2086 |
|
2085 |
SDValue Ops[2] = {Lo, Hi}; |
2087 |
SDValue Ops[2] = {Lo, Hi}; |
2086 |
return DAG.getMergeValues(Ops, DL); |
2088 |
return DAG.getMergeValues(Ops, DL); |