mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-26 14:25:18 +00:00
ARM assembly aliases for two-operand V[R]SHR instructions.
rdar://11189467 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154087 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
541b2a4aa3
commit
22378fd664
@ -3634,7 +3634,7 @@ multiclass N2VShL_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
|
||||
}
|
||||
multiclass N2VShR_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
|
||||
InstrItinClass itin, string OpcodeStr, string Dt,
|
||||
SDNode OpNode> {
|
||||
string baseOpc, SDNode OpNode> {
|
||||
// 64-bit vector types.
|
||||
def v8i8 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm8,
|
||||
OpcodeStr, !strconcat(Dt, "8"), v8i8, OpNode> {
|
||||
@ -3668,6 +3668,33 @@ multiclass N2VShR_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
|
||||
def v2i64 : N2VQSh<op24, op23, op11_8, 1, op4, N2RegVShRFrm, itin, shr_imm64,
|
||||
OpcodeStr, !strconcat(Dt, "64"), v2i64, OpNode>;
|
||||
// imm6 = xxxxxx
|
||||
|
||||
// Aliases for two-operand forms (source and dest regs the same).
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "8 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v8i8"))
|
||||
DPR:$Vdn, DPR:$Vdn, shr_imm8:$imm, pred:$p)>;
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "16 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v4i16"))
|
||||
DPR:$Vdn, DPR:$Vdn, shr_imm16:$imm, pred:$p)>;
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "32 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v2i32"))
|
||||
DPR:$Vdn, DPR:$Vdn, shr_imm32:$imm, pred:$p)>;
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "64 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v1i64"))
|
||||
DPR:$Vdn, DPR:$Vdn, shr_imm64:$imm, pred:$p)>;
|
||||
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "8 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v16i8"))
|
||||
QPR:$Vdn, QPR:$Vdn, shr_imm8:$imm, pred:$p)>;
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "16 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v8i16"))
|
||||
QPR:$Vdn, QPR:$Vdn, shr_imm16:$imm, pred:$p)>;
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "32 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v4i32"))
|
||||
QPR:$Vdn, QPR:$Vdn, shr_imm32:$imm, pred:$p)>;
|
||||
def : NEONInstAlias<!strconcat(OpcodeStr, "${p}.", Dt, "64 $Vdn, $imm"),
|
||||
(!cast<Instruction>(!strconcat(baseOpc, "v2i64"))
|
||||
QPR:$Vdn, QPR:$Vdn, shr_imm64:$imm, pred:$p)>;
|
||||
}
|
||||
|
||||
// Neon Shift-Accumulate vector operations,
|
||||
@ -4606,8 +4633,10 @@ defm VSHLu : N3VInt_QHSDSh<1, 0, 0b0100, 0, N3RegVShFrm,
|
||||
defm VSHLi : N2VShL_QHSD<0, 1, 0b0101, 1, IIC_VSHLiD, "vshl", "i", NEONvshl>;
|
||||
|
||||
// VSHR : Vector Shift Right (Immediate)
|
||||
defm VSHRs : N2VShR_QHSD<0, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "s",NEONvshrs>;
|
||||
defm VSHRu : N2VShR_QHSD<1, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "u",NEONvshru>;
|
||||
defm VSHRs : N2VShR_QHSD<0, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "s", "VSHRs",
|
||||
NEONvshrs>;
|
||||
defm VSHRu : N2VShR_QHSD<1, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "u", "VSHRu",
|
||||
NEONvshru>;
|
||||
|
||||
// VSHLL : Vector Shift Left Long
|
||||
defm VSHLLs : N2VLSh_QHS<0, 1, 0b1010, 0, 0, 1, "vshll", "s", NEONvshlls>;
|
||||
@ -4641,8 +4670,10 @@ defm VRSHLu : N3VInt_QHSDSh<1, 0, 0b0101, 0, N3RegVShFrm,
|
||||
IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
|
||||
"vrshl", "u", int_arm_neon_vrshiftu>;
|
||||
// VRSHR : Vector Rounding Shift Right
|
||||
defm VRSHRs : N2VShR_QHSD<0,1,0b0010,1, IIC_VSHLi4D, "vrshr", "s",NEONvrshrs>;
|
||||
defm VRSHRu : N2VShR_QHSD<1,1,0b0010,1, IIC_VSHLi4D, "vrshr", "u",NEONvrshru>;
|
||||
defm VRSHRs : N2VShR_QHSD<0,1,0b0010,1, IIC_VSHLi4D, "vrshr", "s", "VRSHRs",
|
||||
NEONvrshrs>;
|
||||
defm VRSHRu : N2VShR_QHSD<1,1,0b0010,1, IIC_VSHLi4D, "vrshr", "u", "VRSHRu",
|
||||
NEONvrshru>;
|
||||
|
||||
// VRSHRN : Vector Rounding Shift Right and Narrow
|
||||
defm VRSHRN : N2VNSh_HSD<0, 1, 0b1000, 0, 1, 1, IIC_VSHLi4D, "vrshrn", "i",
|
||||
|
@ -417,3 +417,73 @@ _foo:
|
||||
@ CHECK: vshl.i16 d4, d4, #10 @ encoding: [0x14,0x45,0x9a,0xf2]
|
||||
@ CHECK: vshl.i32 d4, d4, #17 @ encoding: [0x14,0x45,0xb1,0xf2]
|
||||
@ CHECK: vshl.i64 d4, d4, #43 @ encoding: [0x94,0x45,0xab,0xf2]
|
||||
|
||||
|
||||
@ Two-operand forms.
|
||||
vshr.s8 d15, #8
|
||||
vshr.s16 d12, #16
|
||||
vshr.s32 d13, #32
|
||||
vshr.s64 d14, #64
|
||||
vshr.u8 d16, #8
|
||||
vshr.u16 d17, #16
|
||||
vshr.u32 d6, #32
|
||||
vshr.u64 d10, #64
|
||||
vshr.s8 q1, #8
|
||||
vshr.s16 q2, #16
|
||||
vshr.s32 q3, #32
|
||||
vshr.s64 q4, #64
|
||||
vshr.u8 q5, #8
|
||||
vshr.u16 q6, #16
|
||||
vshr.u32 q7, #32
|
||||
vshr.u64 q8, #64
|
||||
|
||||
@ CHECK: vshr.s8 d15, d15, #8 @ encoding: [0x1f,0xf0,0x88,0xf2]
|
||||
@ CHECK: vshr.s16 d12, d12, #16 @ encoding: [0x1c,0xc0,0x90,0xf2]
|
||||
@ CHECK: vshr.s32 d13, d13, #32 @ encoding: [0x1d,0xd0,0xa0,0xf2]
|
||||
@ CHECK: vshr.s64 d14, d14, #64 @ encoding: [0x9e,0xe0,0x80,0xf2]
|
||||
@ CHECK: vshr.u8 d16, d16, #8 @ encoding: [0x30,0x00,0xc8,0xf3]
|
||||
@ CHECK: vshr.u16 d17, d17, #16 @ encoding: [0x31,0x10,0xd0,0xf3]
|
||||
@ CHECK: vshr.u32 d6, d6, #32 @ encoding: [0x16,0x60,0xa0,0xf3]
|
||||
@ CHECK: vshr.u64 d10, d10, #64 @ encoding: [0x9a,0xa0,0x80,0xf3]
|
||||
@ CHECK: vshr.s8 q1, q1, #8 @ encoding: [0x52,0x20,0x88,0xf2]
|
||||
@ CHECK: vshr.s16 q2, q2, #16 @ encoding: [0x54,0x40,0x90,0xf2]
|
||||
@ CHECK: vshr.s32 q3, q3, #32 @ encoding: [0x56,0x60,0xa0,0xf2]
|
||||
@ CHECK: vshr.s64 q4, q4, #64 @ encoding: [0xd8,0x80,0x80,0xf2]
|
||||
@ CHECK: vshr.u8 q5, q5, #8 @ encoding: [0x5a,0xa0,0x88,0xf3]
|
||||
@ CHECK: vshr.u16 q6, q6, #16 @ encoding: [0x5c,0xc0,0x90,0xf3]
|
||||
@ CHECK: vshr.u32 q7, q7, #32 @ encoding: [0x5e,0xe0,0xa0,0xf3]
|
||||
@ CHECK: vshr.u64 q8, q8, #64 @ encoding: [0xf0,0x00,0xc0,0xf3]
|
||||
|
||||
vrshr.s8 d15, #8
|
||||
vrshr.s16 d12, #16
|
||||
vrshr.s32 d13, #32
|
||||
vrshr.s64 d14, #64
|
||||
vrshr.u8 d16, #8
|
||||
vrshr.u16 d17, #16
|
||||
vrshr.u32 d6, #32
|
||||
vrshr.u64 d10, #64
|
||||
vrshr.s8 q1, #8
|
||||
vrshr.s16 q2, #16
|
||||
vrshr.s32 q3, #32
|
||||
vrshr.s64 q4, #64
|
||||
vrshr.u8 q5, #8
|
||||
vrshr.u16 q6, #16
|
||||
vrshr.u32 q7, #32
|
||||
vrshr.u64 q8, #64
|
||||
|
||||
@ CHECK: vrshr.s8 d15, d15, #8 @ encoding: [0x1f,0xf2,0x88,0xf2]
|
||||
@ CHECK: vrshr.s16 d12, d12, #16 @ encoding: [0x1c,0xc2,0x90,0xf2]
|
||||
@ CHECK: vrshr.s32 d13, d13, #32 @ encoding: [0x1d,0xd2,0xa0,0xf2]
|
||||
@ CHECK: vrshr.s64 d14, d14, #64 @ encoding: [0x9e,0xe2,0x80,0xf2]
|
||||
@ CHECK: vrshr.u8 d16, d16, #8 @ encoding: [0x30,0x02,0xc8,0xf3]
|
||||
@ CHECK: vrshr.u16 d17, d17, #16 @ encoding: [0x31,0x12,0xd0,0xf3]
|
||||
@ CHECK: vrshr.u32 d6, d6, #32 @ encoding: [0x16,0x62,0xa0,0xf3]
|
||||
@ CHECK: vrshr.u64 d10, d10, #64 @ encoding: [0x9a,0xa2,0x80,0xf3]
|
||||
@ CHECK: vrshr.s8 q1, q1, #8 @ encoding: [0x52,0x22,0x88,0xf2]
|
||||
@ CHECK: vrshr.s16 q2, q2, #16 @ encoding: [0x54,0x42,0x90,0xf2]
|
||||
@ CHECK: vrshr.s32 q3, q3, #32 @ encoding: [0x56,0x62,0xa0,0xf2]
|
||||
@ CHECK: vrshr.s64 q4, q4, #64 @ encoding: [0xd8,0x82,0x80,0xf2]
|
||||
@ CHECK: vrshr.u8 q5, q5, #8 @ encoding: [0x5a,0xa2,0x88,0xf3]
|
||||
@ CHECK: vrshr.u16 q6, q6, #16 @ encoding: [0x5c,0xc2,0x90,0xf3]
|
||||
@ CHECK: vrshr.u32 q7, q7, #32 @ encoding: [0x5e,0xe2,0xa0,0xf3]
|
||||
@ CHECK: vrshr.u64 q8, q8, #64 @ encoding: [0xf0,0x02,0xc0,0xf3]
|
||||
|
Loading…
x
Reference in New Issue
Block a user