; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv64 -mattr=+v < %s \ ; RUN: --verify-machineinstrs | FileCheck %s define @test_1xi1( %in, %in2) nounwind { ; CHECK-LABEL: test_1xi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_2xi1( %in, %in2) nounwind { ; CHECK-LABEL: test_2xi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_4xi1( %in, %in2) nounwind { ; CHECK-LABEL: test_4xi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_8xi1( %in, %in2) nounwind { ; CHECK-LABEL: test_8xi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_16xi1( %in, %in2) nounwind { ; CHECK-LABEL: test_16xi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_32xi1( %in, %in2) nounwind { ; CHECK-LABEL: test_32xi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_64xi1( %in, %in2) nounwind { ; CHECK-LABEL: test_64xi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v0, v8 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_1xi64( %in, %in2) nounwind { ; CHECK-LABEL: test_1xi64: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_2xi64( %in, %in2) nounwind { ; CHECK-LABEL: test_2xi64: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v10 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_4xi64( %in, %in2) nounwind { ; CHECK-LABEL: test_4xi64: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v12 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_8xi64( %in, %in2) nounwind { ; CHECK-LABEL: test_8xi64: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v16 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_1xi32( %in, %in2) nounwind { ; CHECK-LABEL: test_1xi32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_2xi32( %in, %in2) nounwind { ; CHECK-LABEL: test_2xi32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_4xi32( %in, %in2) nounwind { ; CHECK-LABEL: test_4xi32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v10 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_8xi32( %in, %in2) nounwind { ; CHECK-LABEL: test_8xi32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v12 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_16xi32( %in, %in2) nounwind { ; CHECK-LABEL: test_16xi32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v16 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_1xi16( %in, %in2) nounwind { ; CHECK-LABEL: test_1xi16: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_2xi16( %in, %in2) nounwind { ; CHECK-LABEL: test_2xi16: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_4xi16( %in, %in2) nounwind { ; CHECK-LABEL: test_4xi16: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_8xi16( %in, %in2) nounwind { ; CHECK-LABEL: test_8xi16: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v10 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_16xi16( %in, %in2) nounwind { ; CHECK-LABEL: test_16xi16: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v12 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_32xi16( %in, %in2) nounwind { ; CHECK-LABEL: test_32xi16: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v16 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_1xi8( %in, %in2) nounwind { ; CHECK-LABEL: test_1xi8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_2xi8( %in, %in2) nounwind { ; CHECK-LABEL: test_2xi8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_4xi8( %in, %in2) nounwind { ; CHECK-LABEL: test_4xi8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_8xi8( %in, %in2) nounwind { ; CHECK-LABEL: test_8xi8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v9 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_16xi8( %in, %in2) nounwind { ; CHECK-LABEL: test_16xi8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v10 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_32xi8( %in, %in2) nounwind { ; CHECK-LABEL: test_32xi8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v12 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_64xi8( %in, %in2) nounwind { ; CHECK-LABEL: test_64xi8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v16 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "=^vr,^vr,^vr"( %in, %in2) ret %0 } define @test_64xi8_with_mask( %in, %in2, %mask) nounwind { ; CHECK-LABEL: test_64xi8_with_mask: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v8, v8, v16, v0.t ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2, $3.t", "=^vr,^vr,^vr,^vm"( %in, %in2, %mask) ret %0 } define @test_specify_reg_mf2( %in, %in2) nounwind { ; CHECK-LABEL: test_specify_reg_mf2: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v2, v9 ; CHECK-NEXT: vmv1r.v v1, v8 ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v0, v1, v2 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v8, v0 ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "={v0},{v1},{v2}"( %in, %in2) ret %0 } define @test_specify_reg_m1( %in, %in2) nounwind { ; CHECK-LABEL: test_specify_reg_m1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v2, v9 ; CHECK-NEXT: vmv1r.v v1, v8 ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v0, v1, v2 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v8, v0 ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "={v0},{v1},{v2}"( %in, %in2) ret %0 } define @test_specify_reg_m2( %in, %in2) nounwind { ; CHECK-LABEL: test_specify_reg_m2: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv2r.v v4, v10 ; CHECK-NEXT: vmv2r.v v2, v8 ; CHECK-NEXT: #APP ; CHECK-NEXT: vadd.vv v0, v2, v4 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv2r.v v8, v0 ; CHECK-NEXT: ret entry: %0 = tail call asm "vadd.vv $0, $1, $2", "={v0},{v2},{v4}"( %in, %in2) ret %0 } define @test_specify_reg_mask( %in, %in2) nounwind { ; CHECK-LABEL: test_specify_reg_mask: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma ; CHECK-NEXT: vmv1r.v v2, v8 ; CHECK-NEXT: vmv1r.v v1, v0 ; CHECK-NEXT: #APP ; CHECK-NEXT: vmand.mm v0, v1, v2 ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: %0 = tail call asm "vmand.mm $0, $1, $2", "={v0},{v1},{v2}"( %in, %in2) ret %0 } define void @test_vector_tuple_type0(target("riscv.vector.tuple", , 3) %val, ptr %base) nounwind { ; CHECK-LABEL: test_vector_tuple_type0: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vsseg3e8.v v8, (a0) ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: tail call void asm "vsseg3e8.v $0, ($1)", "^vr,r"(target("riscv.vector.tuple", , 3) %val, ptr %base) ret void } define void @test_vector_tuple_type1(target("riscv.vector.tuple", , 3) %val, ptr %base) nounwind { ; CHECK-LABEL: test_vector_tuple_type1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: #APP ; CHECK-NEXT: vsseg3e8.v v8, (a0) ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: tail call void asm "vsseg3e8.v $0, ($1)", "^vr,r"(target("riscv.vector.tuple", , 3) %val, ptr %base) ret void } define void @test_vector_tuple_type2(target("riscv.vector.tuple", , 4) %val, target("riscv.vector.tuple", , 7) %val2, target("riscv.vector.tuple", , 7) %val3, ptr %base) nounwind { ; CHECK-LABEL: test_vector_tuple_type2: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: vl1r.v v23, (a0) ; CHECK-NEXT: csrr a2, vlenb ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl1r.v v24, (a0) ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl1r.v v25, (a0) ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl1r.v v26, (a0) ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl1r.v v27, (a0) ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl1r.v v28, (a0) ; CHECK-NEXT: add a0, a0, a2 ; CHECK-NEXT: vl1r.v v29, (a0) ; CHECK-NEXT: #APP ; CHECK-NEXT: vsseg3e8.v v8, (a1) ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: #APP ; CHECK-NEXT: vsseg7e8.v v16, (a1) ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: #APP ; CHECK-NEXT: vsseg7e8.v v23, (a1) ; CHECK-NEXT: #NO_APP ; CHECK-NEXT: ret entry: tail call void asm "vsseg3e8.v $0, ($1)", "^vr,r"(target("riscv.vector.tuple", , 4) %val, ptr %base) tail call void asm "vsseg7e8.v $0, ($1)", "^vr,r"(target("riscv.vector.tuple", , 7) %val2, ptr %base) tail call void asm "vsseg7e8.v $0, ($1)", "^vr,r"(target("riscv.vector.tuple", , 7) %val3, ptr %base) ret void }