================ @@ -345,6 +345,54 @@ class VString<int nf, bit signed> { !eq(nf, 8): !if(signed, "vvvvvvvv", "UvUvUvUvUvUvUvUv")); } + +class FixedVString<int fixed_lmul, int num, bit signed> { + string V = "(LFixedLog2LMUL:" # fixed_lmul # ")" # !if(signed, "v", "Uv"); + string S = !cond(!eq(num, 1): V, + !eq(num, 2): V # V, + !eq(num, 4): V # V # V # V, + !eq(num, 8): V # V # V # V # V # V # V # V, + true: ""); +} + +// This function is used in RVVNonTupleVCreateBuiltin to determine how many +// variable we need to assemble the bigger LMUL value. +// X = 2^{pow_x - pow_y}, with value range of pow_x, pow_y = [0, 3], pow_x > pow_y +class GetPowDiff<int pow_x, int pow_y> { + int X = !cond(!eq(pow_x, 1): 2, + !eq(pow_x, 2): + !cond(!eq(pow_y, 0): 4, + !eq(pow_y, 1): 2, + true: 0), + !eq(pow_x, 3): + !cond(!eq(pow_y, 0): 8, + !eq(pow_y, 1): 4, + !eq(pow_y, 2): 2, + true: 0), + true: 0); +} + +multiclass RVVNonTupleVCreateBuiltin<int dst_lmul, list<int> src_lmul_list> { + defvar dst_v = FixedVString<dst_lmul, 1, /*signed=*/true>.V; + defvar dst_uv = FixedVString<dst_lmul, 1, /*signed=*/false>.V; + foreach src_lmul = src_lmul_list in { + defvar num = GetPowDiff<dst_lmul, src_lmul>.X; + + defvar src_v = FixedVString<src_lmul, num, /*signed=*/true>.V; + defvar src_s = FixedVString<src_lmul, num, /*signed=*/true>.S; + + def vcreate # src_v # dst_v : RVVBuiltin<src_v # dst_v, + dst_v # src_s, ---------------- wangpc-pp wrote:
The indent is not correct. https://github.com/llvm/llvm-project/pull/70355 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits