forked from OSchip/llvm-project
[WebAssembly][NFC] Move specific instruction formats to specific files
Summary: WebAssemblyInstrFormats.td retains only multiclasses that are used in multiple other tablegen files. Reviewers: aheejin, dschuff Subscribers: sbc100, jgravelle-google, sunfish, jfb, llvm-commits Differential Revision: https://reviews.llvm.org/D51143 llvm-svn: 340503
This commit is contained in:
parent
ab0011ebc0
commit
914f0f20a4
|
@ -16,6 +16,14 @@
|
|||
// Atomic loads
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
multiclass ATOMIC_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s,
|
||||
list<dag> pattern_r, string asmstr_r = "",
|
||||
string asmstr_s = "", bits<32> inst = -1> {
|
||||
defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s,
|
||||
inst>,
|
||||
Requires<[HasAtomics]>;
|
||||
}
|
||||
|
||||
let Defs = [ARGUMENTS] in {
|
||||
defm ATOMIC_LOAD_I32 : WebAssemblyLoad<I32, "i32.atomic.load", 0xfe10>;
|
||||
defm ATOMIC_LOAD_I64 : WebAssemblyLoad<I64, "i64.atomic.load", 0xfe11>;
|
||||
|
|
|
@ -12,6 +12,39 @@
|
|||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
multiclass UnaryFP<SDNode node, string name, bits<32> f32Inst,
|
||||
bits<32> f64Inst> {
|
||||
defm _F32 : I<(outs F32:$dst), (ins F32:$src), (outs), (ins),
|
||||
[(set F32:$dst, (node F32:$src))],
|
||||
!strconcat("f32.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("f32.", name), f32Inst>;
|
||||
defm _F64 : I<(outs F64:$dst), (ins F64:$src), (outs), (ins),
|
||||
[(set F64:$dst, (node F64:$src))],
|
||||
!strconcat("f64.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("f64.", name), f64Inst>;
|
||||
}
|
||||
multiclass BinaryFP<SDNode node, string name, bits<32> f32Inst,
|
||||
bits<32> f64Inst> {
|
||||
defm _F32 : I<(outs F32:$dst), (ins F32:$lhs, F32:$rhs), (outs), (ins),
|
||||
[(set F32:$dst, (node F32:$lhs, F32:$rhs))],
|
||||
!strconcat("f32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f32.", name), f32Inst>;
|
||||
defm _F64 : I<(outs F64:$dst), (ins F64:$lhs, F64:$rhs), (outs), (ins),
|
||||
[(set F64:$dst, (node F64:$lhs, F64:$rhs))],
|
||||
!strconcat("f64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f64.", name), f64Inst>;
|
||||
}
|
||||
multiclass ComparisonFP<CondCode cond, string name, bits<32> f32Inst, bits<32> f64Inst> {
|
||||
defm _F32 : I<(outs I32:$dst), (ins F32:$lhs, F32:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc F32:$lhs, F32:$rhs, cond))],
|
||||
!strconcat("f32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f32.", name), f32Inst>;
|
||||
defm _F64 : I<(outs I32:$dst), (ins F64:$lhs, F64:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc F64:$lhs, F64:$rhs, cond))],
|
||||
!strconcat("f64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f64.", name), f64Inst>;
|
||||
}
|
||||
|
||||
let Defs = [ARGUMENTS] in {
|
||||
|
||||
let isCommutable = 1 in
|
||||
|
|
|
@ -58,6 +58,7 @@ multiclass NRI<dag oops, dag iops, list<dag> pattern, string asmstr = "",
|
|||
defm "": I<oops, iops, oops, iops, pattern, asmstr, asmstr, inst>;
|
||||
}
|
||||
|
||||
// Instructions requiring HasSIMD128 and the simd128 prefix byte
|
||||
multiclass SIMD_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s,
|
||||
list<dag> pattern_r, string asmstr_r = "",
|
||||
string asmstr_s = "", bits<32> simdop = -1> {
|
||||
|
@ -65,120 +66,3 @@ multiclass SIMD_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s,
|
|||
!or(0xfd00, !and(0xff, simdop))>,
|
||||
Requires<[HasSIMD128]>;
|
||||
}
|
||||
|
||||
multiclass ATOMIC_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s,
|
||||
list<dag> pattern_r, string asmstr_r = "",
|
||||
string asmstr_s = "", bits<32> inst = -1> {
|
||||
defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s,
|
||||
inst>,
|
||||
Requires<[HasAtomics]>;
|
||||
}
|
||||
|
||||
// Unary and binary instructions, for the local types that WebAssembly supports.
|
||||
multiclass UnaryInt<SDNode node, string name, bits<32> i32Inst,
|
||||
bits<32> i64Inst> {
|
||||
defm _I32 : I<(outs I32:$dst), (ins I32:$src), (outs), (ins),
|
||||
[(set I32:$dst, (node I32:$src))],
|
||||
!strconcat("i32.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("i32.", name), i32Inst>;
|
||||
defm _I64 : I<(outs I64:$dst), (ins I64:$src), (outs), (ins),
|
||||
[(set I64:$dst, (node I64:$src))],
|
||||
!strconcat("i64.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("i64.", name), i64Inst>;
|
||||
}
|
||||
multiclass BinaryInt<SDNode node, string name, bits<32> i32Inst,
|
||||
bits<32> i64Inst> {
|
||||
defm _I32 : I<(outs I32:$dst), (ins I32:$lhs, I32:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (node I32:$lhs, I32:$rhs))],
|
||||
!strconcat("i32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i32.", name), i32Inst>;
|
||||
defm _I64 : I<(outs I64:$dst), (ins I64:$lhs, I64:$rhs), (outs), (ins),
|
||||
[(set I64:$dst, (node I64:$lhs, I64:$rhs))],
|
||||
!strconcat("i64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i64.", name), i64Inst>;
|
||||
}
|
||||
multiclass UnaryFP<SDNode node, string name, bits<32> f32Inst,
|
||||
bits<32> f64Inst> {
|
||||
defm _F32 : I<(outs F32:$dst), (ins F32:$src), (outs), (ins),
|
||||
[(set F32:$dst, (node F32:$src))],
|
||||
!strconcat("f32.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("f32.", name), f32Inst>;
|
||||
defm _F64 : I<(outs F64:$dst), (ins F64:$src), (outs), (ins),
|
||||
[(set F64:$dst, (node F64:$src))],
|
||||
!strconcat("f64.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("f64.", name), f64Inst>;
|
||||
}
|
||||
multiclass BinaryFP<SDNode node, string name, bits<32> f32Inst,
|
||||
bits<32> f64Inst> {
|
||||
defm _F32 : I<(outs F32:$dst), (ins F32:$lhs, F32:$rhs), (outs), (ins),
|
||||
[(set F32:$dst, (node F32:$lhs, F32:$rhs))],
|
||||
!strconcat("f32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f32.", name), f32Inst>;
|
||||
defm _F64 : I<(outs F64:$dst), (ins F64:$lhs, F64:$rhs), (outs), (ins),
|
||||
[(set F64:$dst, (node F64:$lhs, F64:$rhs))],
|
||||
!strconcat("f64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f64.", name), f64Inst>;
|
||||
}
|
||||
multiclass SIMDBinaryIntNoI64x2<SDNode node, string name, bits<32> baseInst> {
|
||||
defm _I8x16 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v16i8 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i8x16.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i8x16.", name), baseInst>;
|
||||
defm _I16x8 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v8i16 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i16x8.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i16x8.", name), !add(baseInst, 1)>;
|
||||
defm _I32x4 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v4i32 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i32x4.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i32x4.", name), !add(baseInst, 2)>;
|
||||
}
|
||||
multiclass SIMDBinaryInt<SDNode node, string name, bits<32> baseInst> {
|
||||
defm "" : SIMDBinaryIntNoI64x2<node, name, baseInst>;
|
||||
defm _I64x2 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v2i64 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i64x2.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i64x2.", name), !add(baseInst, 3)>;
|
||||
}
|
||||
multiclass SIMDBinaryFP<SDNode node, string name, bits<32> baseInst> {
|
||||
defm _F32x4 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v4f32 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("f32x4.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f32x4.", name), baseInst>;
|
||||
defm _F64x2 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v2f64 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("f64x2.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f64x2.", name), !add(baseInst, 1)>;
|
||||
}
|
||||
multiclass ComparisonInt<CondCode cond, string name, bits<32> i32Inst, bits<32> i64Inst> {
|
||||
defm _I32 : I<(outs I32:$dst), (ins I32:$lhs, I32:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc I32:$lhs, I32:$rhs, cond))],
|
||||
!strconcat("i32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i32.", name), i32Inst>;
|
||||
defm _I64 : I<(outs I32:$dst), (ins I64:$lhs, I64:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc I64:$lhs, I64:$rhs, cond))],
|
||||
!strconcat("i64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i64.", name), i64Inst>;
|
||||
}
|
||||
multiclass ComparisonFP<CondCode cond, string name, bits<32> f32Inst, bits<32> f64Inst> {
|
||||
defm _F32 : I<(outs I32:$dst), (ins F32:$lhs, F32:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc F32:$lhs, F32:$rhs, cond))],
|
||||
!strconcat("f32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f32.", name), f32Inst>;
|
||||
defm _F64 : I<(outs I32:$dst), (ins F64:$lhs, F64:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc F64:$lhs, F64:$rhs, cond))],
|
||||
!strconcat("f64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f64.", name), f64Inst>;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,40 @@
|
|||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
multiclass UnaryInt<SDNode node, string name, bits<32> i32Inst,
|
||||
bits<32> i64Inst> {
|
||||
defm _I32 : I<(outs I32:$dst), (ins I32:$src), (outs), (ins),
|
||||
[(set I32:$dst, (node I32:$src))],
|
||||
!strconcat("i32.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("i32.", name), i32Inst>;
|
||||
defm _I64 : I<(outs I64:$dst), (ins I64:$src), (outs), (ins),
|
||||
[(set I64:$dst, (node I64:$src))],
|
||||
!strconcat("i64.", !strconcat(name, "\t$dst, $src")),
|
||||
!strconcat("i64.", name), i64Inst>;
|
||||
}
|
||||
multiclass BinaryInt<SDNode node, string name, bits<32> i32Inst,
|
||||
bits<32> i64Inst> {
|
||||
defm _I32 : I<(outs I32:$dst), (ins I32:$lhs, I32:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (node I32:$lhs, I32:$rhs))],
|
||||
!strconcat("i32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i32.", name), i32Inst>;
|
||||
defm _I64 : I<(outs I64:$dst), (ins I64:$lhs, I64:$rhs), (outs), (ins),
|
||||
[(set I64:$dst, (node I64:$lhs, I64:$rhs))],
|
||||
!strconcat("i64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i64.", name), i64Inst>;
|
||||
}
|
||||
multiclass ComparisonInt<CondCode cond, string name, bits<32> i32Inst, bits<32> i64Inst> {
|
||||
defm _I32 : I<(outs I32:$dst), (ins I32:$lhs, I32:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc I32:$lhs, I32:$rhs, cond))],
|
||||
!strconcat("i32.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i32.", name), i32Inst>;
|
||||
defm _I64 : I<(outs I32:$dst), (ins I64:$lhs, I64:$rhs), (outs), (ins),
|
||||
[(set I32:$dst, (setcc I64:$lhs, I64:$rhs, cond))],
|
||||
!strconcat("i64.", !strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i64.", name), i64Inst>;
|
||||
}
|
||||
|
||||
|
||||
let Defs = [ARGUMENTS] in {
|
||||
|
||||
// The spaces after the names are for aesthetic purposes only, to make
|
||||
|
|
|
@ -18,6 +18,51 @@ def ImmI#SIZE : ImmLeaf<i32, "return (Imm & ((1UL << "#SIZE#") - 1)) == Imm;">;
|
|||
foreach SIZE = [2, 4, 8, 16, 32] in
|
||||
def LaneIdx#SIZE : ImmLeaf<i32, "return 0 <= Imm && Imm < "#SIZE#";">;
|
||||
|
||||
|
||||
multiclass SIMDBinaryFP<SDNode node, string name, bits<32> baseInst> {
|
||||
defm _F32x4 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v4f32 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("f32x4.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f32x4.", name), baseInst>;
|
||||
defm _F64x2 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v2f64 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("f64x2.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("f64x2.", name), !add(baseInst, 1)>;
|
||||
}
|
||||
multiclass SIMDBinaryIntNoI64x2<SDNode node, string name, bits<32> baseInst> {
|
||||
defm _I8x16 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v16i8 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i8x16.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i8x16.", name), baseInst>;
|
||||
defm _I16x8 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v8i16 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i16x8.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i16x8.", name), !add(baseInst, 1)>;
|
||||
defm _I32x4 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v4i32 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i32x4.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i32x4.", name), !add(baseInst, 2)>;
|
||||
}
|
||||
multiclass SIMDBinaryInt<SDNode node, string name, bits<32> baseInst> {
|
||||
defm "" : SIMDBinaryIntNoI64x2<node, name, baseInst>;
|
||||
defm _I64x2 : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
|
||||
(outs), (ins),
|
||||
[(set (v2i64 V128:$dst), (node V128:$lhs, V128:$rhs))],
|
||||
!strconcat("i64x2.",
|
||||
!strconcat(name, "\t$dst, $lhs, $rhs")),
|
||||
!strconcat("i64x2.", name), !add(baseInst, 3)>;
|
||||
}
|
||||
|
||||
// const vectors
|
||||
multiclass ConstVec<ValueType vec_t, dag ops, dag pat, string args> {
|
||||
defm CONST_V128_#vec_t : SIMD_I<(outs V128:$dst), ops, (outs), ops,
|
||||
|
|
Loading…
Reference in New Issue