mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-10 08:40:41 +00:00
Added a new instruction class NVDupLane to be inherited by VDUPLND and VDUPLNQ,
instead of the current N2V. Format of NVDupLane instances are set to NEONFrm currently. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99518 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
86afec7730
commit
e4614f7e84
lib/Target/ARM
@ -1666,6 +1666,19 @@ class NVDup<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
|
||||
: NVLaneOp<opcod1, opcod2, opcod3, oops, iops, NEONDupFrm, itin,
|
||||
opc, dt, asm, pattern>;
|
||||
|
||||
// Vector Duplicate Lane (from scalar to all elements)
|
||||
class NVDupLane<bits<4> op19_16, bit op6, dag oops, dag iops,
|
||||
InstrItinClass itin, string opc, string dt, string asm,
|
||||
list<dag> pattern>
|
||||
: NDataI<oops, iops, NEONFrm, itin, opc, dt, asm, "", pattern> {
|
||||
let Inst{24-23} = 0b11;
|
||||
let Inst{21-20} = 0b11;
|
||||
let Inst{19-16} = op19_16;
|
||||
let Inst{11-7} = 0b11000;
|
||||
let Inst{6} = op6;
|
||||
let Inst{4} = 0;
|
||||
}
|
||||
|
||||
// NEONFPPat - Same as Pat<>, but requires that the compiler be using NEON
|
||||
// for single-precision FP.
|
||||
class NEONFPPat<dag pattern, dag result> : Pat<pattern, result> {
|
||||
|
@ -854,7 +854,6 @@ def SubReg_i32_lane : SDNodeXForm<imm, [{
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Basic 2-register operations: single-, double- and quad-register.
|
||||
// This is used for NVCVTFrm form.
|
||||
class N2VS<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
|
||||
bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr,
|
||||
string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode>
|
||||
@ -3007,30 +3006,29 @@ def VDUPfq : NVDup<0b11101010, 0b1011, 0b00, (outs QPR:$dst), (ins GPR:$src),
|
||||
|
||||
// VDUP : Vector Duplicate Lane (from scalar to all elements)
|
||||
|
||||
class VDUPLND<bits<2> op19_18, bits<2> op17_16,
|
||||
string OpcodeStr, string Dt, ValueType Ty>
|
||||
: N2V<0b11, 0b11, op19_18, op17_16, 0b11000, 0, 0,
|
||||
(outs DPR:$dst), (ins DPR:$src, nohash_imm:$lane), IIC_VMOVD,
|
||||
OpcodeStr, Dt, "$dst, $src[$lane]", "",
|
||||
[(set DPR:$dst, (Ty (NEONvduplane (Ty DPR:$src), imm:$lane)))]>;
|
||||
class VDUPLND<bits<4> op19_16, string OpcodeStr, string Dt,
|
||||
ValueType Ty>
|
||||
: NVDupLane<op19_16, 0, (outs DPR:$dst), (ins DPR:$src, nohash_imm:$lane),
|
||||
IIC_VMOVD, OpcodeStr, Dt, "$dst, $src[$lane]",
|
||||
[(set DPR:$dst, (Ty (NEONvduplane (Ty DPR:$src), imm:$lane)))]>;
|
||||
|
||||
class VDUPLNQ<bits<2> op19_18, bits<2> op17_16, string OpcodeStr, string Dt,
|
||||
class VDUPLNQ<bits<4> op19_16, string OpcodeStr, string Dt,
|
||||
ValueType ResTy, ValueType OpTy>
|
||||
: N2V<0b11, 0b11, op19_18, op17_16, 0b11000, 1, 0,
|
||||
(outs QPR:$dst), (ins DPR:$src, nohash_imm:$lane), IIC_VMOVD,
|
||||
OpcodeStr, Dt, "$dst, $src[$lane]", "",
|
||||
[(set QPR:$dst, (ResTy (NEONvduplane (OpTy DPR:$src), imm:$lane)))]>;
|
||||
: NVDupLane<op19_16, 1, (outs QPR:$dst), (ins DPR:$src, nohash_imm:$lane),
|
||||
IIC_VMOVD, OpcodeStr, Dt, "$dst, $src[$lane]",
|
||||
[(set QPR:$dst, (ResTy (NEONvduplane (OpTy DPR:$src),
|
||||
imm:$lane)))]>;
|
||||
|
||||
// Inst{19-16} is partially specified depending on the element size.
|
||||
|
||||
def VDUPLN8d : VDUPLND<{?,?}, {?,1}, "vdup", "8", v8i8>;
|
||||
def VDUPLN16d : VDUPLND<{?,?}, {1,0}, "vdup", "16", v4i16>;
|
||||
def VDUPLN32d : VDUPLND<{?,1}, {0,0}, "vdup", "32", v2i32>;
|
||||
def VDUPLNfd : VDUPLND<{?,1}, {0,0}, "vdup", "32", v2f32>;
|
||||
def VDUPLN8q : VDUPLNQ<{?,?}, {?,1}, "vdup", "8", v16i8, v8i8>;
|
||||
def VDUPLN16q : VDUPLNQ<{?,?}, {1,0}, "vdup", "16", v8i16, v4i16>;
|
||||
def VDUPLN32q : VDUPLNQ<{?,1}, {0,0}, "vdup", "32", v4i32, v2i32>;
|
||||
def VDUPLNfq : VDUPLNQ<{?,1}, {0,0}, "vdup", "32", v4f32, v2f32>;
|
||||
def VDUPLN8d : VDUPLND<{?,?,?,1}, "vdup", "8", v8i8>;
|
||||
def VDUPLN16d : VDUPLND<{?,?,1,0}, "vdup", "16", v4i16>;
|
||||
def VDUPLN32d : VDUPLND<{?,1,0,0}, "vdup", "32", v2i32>;
|
||||
def VDUPLNfd : VDUPLND<{?,1,0,0}, "vdup", "32", v2f32>;
|
||||
def VDUPLN8q : VDUPLNQ<{?,?,?,1}, "vdup", "8", v16i8, v8i8>;
|
||||
def VDUPLN16q : VDUPLNQ<{?,?,1,0}, "vdup", "16", v8i16, v4i16>;
|
||||
def VDUPLN32q : VDUPLNQ<{?,1,0,0}, "vdup", "32", v4i32, v2i32>;
|
||||
def VDUPLNfq : VDUPLNQ<{?,1,0,0}, "vdup", "32", v4f32, v2f32>;
|
||||
|
||||
def : Pat<(v16i8 (NEONvduplane (v16i8 QPR:$src), imm:$lane)),
|
||||
(v16i8 (VDUPLN8q (v8i8 (EXTRACT_SUBREG QPR:$src,
|
||||
|
Loading…
x
Reference in New Issue
Block a user