mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
R600/SI: Handle sign_extend and zero_extend to i64 with patterns.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210563 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -113,10 +113,6 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) :
|
|||||||
setOperationAction(ISD::SETCC, MVT::v2i1, Expand);
|
setOperationAction(ISD::SETCC, MVT::v2i1, Expand);
|
||||||
setOperationAction(ISD::SETCC, MVT::v4i1, Expand);
|
setOperationAction(ISD::SETCC, MVT::v4i1, Expand);
|
||||||
|
|
||||||
setOperationAction(ISD::ANY_EXTEND, MVT::i64, Custom);
|
|
||||||
setOperationAction(ISD::SIGN_EXTEND, MVT::i64, Custom);
|
|
||||||
setOperationAction(ISD::ZERO_EXTEND, MVT::i64, Custom);
|
|
||||||
|
|
||||||
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Legal);
|
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Legal);
|
||||||
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i1, Custom);
|
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i1, Custom);
|
||||||
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i1, Custom);
|
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i1, Custom);
|
||||||
@@ -611,10 +607,7 @@ SDValue SITargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case ISD::SELECT: return LowerSELECT(Op, DAG);
|
case ISD::SELECT: return LowerSELECT(Op, DAG);
|
||||||
case ISD::SIGN_EXTEND: return LowerSIGN_EXTEND(Op, DAG);
|
|
||||||
case ISD::STORE: return LowerSTORE(Op, DAG);
|
case ISD::STORE: return LowerSTORE(Op, DAG);
|
||||||
case ISD::ANY_EXTEND: // Fall-through
|
|
||||||
case ISD::ZERO_EXTEND: return LowerZERO_EXTEND(Op, DAG);
|
|
||||||
case ISD::GlobalAddress: return LowerGlobalAddress(MFI, Op, DAG);
|
case ISD::GlobalAddress: return LowerGlobalAddress(MFI, Op, DAG);
|
||||||
case ISD::INTRINSIC_WO_CHAIN: {
|
case ISD::INTRINSIC_WO_CHAIN: {
|
||||||
unsigned IntrinsicID =
|
unsigned IntrinsicID =
|
||||||
@@ -902,21 +895,6 @@ SDValue SITargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
return DAG.getNode(ISD::BITCAST, DL, MVT::i64, Res);
|
return DAG.getNode(ISD::BITCAST, DL, MVT::i64, Res);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue SITargetLowering::LowerSIGN_EXTEND(SDValue Op,
|
|
||||||
SelectionDAG &DAG) const {
|
|
||||||
EVT VT = Op.getValueType();
|
|
||||||
SDLoc DL(Op);
|
|
||||||
|
|
||||||
if (VT != MVT::i64) {
|
|
||||||
return SDValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
SDValue Hi = DAG.getNode(ISD::SRA, DL, MVT::i32, Op.getOperand(0),
|
|
||||||
DAG.getConstant(31, MVT::i32));
|
|
||||||
|
|
||||||
return DAG.getNode(ISD::BUILD_PAIR, DL, VT, Op.getOperand(0), Hi);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
||||||
SDLoc DL(Op);
|
SDLoc DL(Op);
|
||||||
StoreSDNode *Store = cast<StoreSDNode>(Op);
|
StoreSDNode *Store = cast<StoreSDNode>(Op);
|
||||||
@@ -997,24 +975,6 @@ SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
return Chain;
|
return Chain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SDValue SITargetLowering::LowerZERO_EXTEND(SDValue Op,
|
|
||||||
SelectionDAG &DAG) const {
|
|
||||||
EVT VT = Op.getValueType();
|
|
||||||
SDLoc DL(Op);
|
|
||||||
|
|
||||||
if (VT != MVT::i64) {
|
|
||||||
return SDValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
SDValue Src = Op.getOperand(0);
|
|
||||||
if (Src.getValueType() != MVT::i32)
|
|
||||||
Src = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i32, Src);
|
|
||||||
|
|
||||||
SDValue Zero = DAG.getConstant(0, MVT::i32);
|
|
||||||
return DAG.getNode(ISD::BUILD_PAIR, DL, VT, Src, Zero);
|
|
||||||
}
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Custom DAG optimizations
|
// Custom DAG optimizations
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@@ -27,9 +27,7 @@ class SITargetLowering : public AMDGPUTargetLowering {
|
|||||||
SelectionDAG &DAG) const;
|
SelectionDAG &DAG) const;
|
||||||
SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
|
|
||||||
SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerZERO_EXTEND(SDValue Op, SelectionDAG &DAG) const;
|
|
||||||
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
|
||||||
bool foldImm(SDValue &Operand, int32_t &Immediate,
|
bool foldImm(SDValue &Operand, int32_t &Immediate,
|
||||||
|
@@ -2431,6 +2431,42 @@ def : Pat <
|
|||||||
(S_MOV_B32 -1), sub1)
|
(S_MOV_B32 -1), sub1)
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
class ZExt_i64_i32_Pat <SDNode ext> : Pat <
|
||||||
|
(i64 (ext i32:$src)),
|
||||||
|
(INSERT_SUBREG (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $src, sub0),
|
||||||
|
(S_MOV_B32 0), sub1)
|
||||||
|
>;
|
||||||
|
|
||||||
|
class ZExt_i64_i1_Pat <SDNode ext> : Pat <
|
||||||
|
(i64 (ext i1:$src)),
|
||||||
|
(INSERT_SUBREG
|
||||||
|
(INSERT_SUBREG (i64 (IMPLICIT_DEF)),
|
||||||
|
(V_CNDMASK_B32_e64 (i32 0), (i32 1), $src), sub0),
|
||||||
|
(S_MOV_B32 0), sub1)
|
||||||
|
>;
|
||||||
|
|
||||||
|
|
||||||
|
def : ZExt_i64_i32_Pat<zext>;
|
||||||
|
def : ZExt_i64_i32_Pat<anyext>;
|
||||||
|
def : ZExt_i64_i1_Pat<zext>;
|
||||||
|
def : ZExt_i64_i1_Pat<anyext>;
|
||||||
|
|
||||||
|
def : Pat <
|
||||||
|
(i64 (sext i32:$src)),
|
||||||
|
(INSERT_SUBREG
|
||||||
|
(INSERT_SUBREG (i64 (IMPLICIT_DEF)), $src, sub0),
|
||||||
|
(S_ASHR_I32 $src, 31), sub1)
|
||||||
|
>;
|
||||||
|
|
||||||
|
def : Pat <
|
||||||
|
(i64 (sext i1:$src)),
|
||||||
|
(INSERT_SUBREG
|
||||||
|
(INSERT_SUBREG
|
||||||
|
(i64 (IMPLICIT_DEF)),
|
||||||
|
(V_CNDMASK_B32_e64 0, -1, $src), sub0),
|
||||||
|
(V_CNDMASK_B32_e64 0, -1, $src), sub1)
|
||||||
|
>;
|
||||||
|
|
||||||
def : Pat <
|
def : Pat <
|
||||||
(f32 (sint_to_fp i1:$src)),
|
(f32 (sint_to_fp i1:$src)),
|
||||||
(V_CNDMASK_B32_e64 (i32 0), CONST.FP32_NEG_ONE, $src)
|
(V_CNDMASK_B32_e64 (i32 0), CONST.FP32_NEG_ONE, $src)
|
||||||
|
@@ -1,12 +1,61 @@
|
|||||||
|
; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
|
||||||
|
|
||||||
; RUN: llc < %s -march=r600 -mcpu=SI -verify-machineinstrs | FileCheck %s
|
; SI-LABEL: @s_sext_i1_to_i32:
|
||||||
|
; SI: V_CNDMASK_B32_e64
|
||||||
; CHECK: V_ASHR
|
; SI: S_ENDPGM
|
||||||
define void @test(i64 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
|
define void @s_sext_i1_to_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
|
||||||
entry:
|
%cmp = icmp eq i32 %a, %b
|
||||||
%0 = mul i32 %a, %b
|
%sext = sext i1 %cmp to i32
|
||||||
%1 = add i32 %0, %c
|
store i32 %sext, i32 addrspace(1)* %out, align 4
|
||||||
%2 = sext i32 %1 to i64
|
ret void
|
||||||
store i64 %2, i64 addrspace(1)* %out
|
}
|
||||||
|
|
||||||
|
; SI-LABEL: @test:
|
||||||
|
; SI: V_ASHR
|
||||||
|
; SI: S_ENDPG
|
||||||
|
define void @test(i64 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) nounwind {
|
||||||
|
entry:
|
||||||
|
%mul = mul i32 %a, %b
|
||||||
|
%add = add i32 %mul, %c
|
||||||
|
%sext = sext i32 %add to i64
|
||||||
|
store i64 %sext, i64 addrspace(1)* %out, align 8
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; SI-LABEL: @s_sext_i1_to_i64:
|
||||||
|
; SI: V_CNDMASK_B32_e64
|
||||||
|
; SI: V_CNDMASK_B32_e64
|
||||||
|
; SI: S_ENDPGM
|
||||||
|
define void @s_sext_i1_to_i64(i64 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
|
||||||
|
%cmp = icmp eq i32 %a, %b
|
||||||
|
%sext = sext i1 %cmp to i64
|
||||||
|
store i64 %sext, i64 addrspace(1)* %out, align 8
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; SI-LABEL: @s_sext_i32_to_i64:
|
||||||
|
; SI: S_ASHR_I32
|
||||||
|
; SI: S_ENDPGM
|
||||||
|
define void @s_sext_i32_to_i64(i64 addrspace(1)* %out, i32 %a) nounwind {
|
||||||
|
%sext = sext i32 %a to i64
|
||||||
|
store i64 %sext, i64 addrspace(1)* %out, align 8
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; SI-LABEL: @v_sext_i32_to_i64:
|
||||||
|
; SI: V_ASHR
|
||||||
|
; SI: S_ENDPGM
|
||||||
|
define void @v_sext_i32_to_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
|
||||||
|
%val = load i32 addrspace(1)* %in, align 4
|
||||||
|
%sext = sext i32 %val to i64
|
||||||
|
store i64 %sext, i64 addrspace(1)* %out, align 8
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; SI-LABEL: @s_sext_i16_to_i64:
|
||||||
|
; SI: S_ENDPGM
|
||||||
|
define void @s_sext_i16_to_i64(i64 addrspace(1)* %out, i16 %a) nounwind {
|
||||||
|
%sext = sext i16 %a to i64
|
||||||
|
store i64 %sext, i64 addrspace(1)* %out, align 8
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user