| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,272 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | ||
| // REQUIRES: riscv-registered-target | ||
| // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV32 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV64 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +m -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -Werror -Wall -o - %s -S >/dev/null 2>&1 | FileCheck --check-prefix=ASM --allow-empty %s | ||
|
|
||
| // ASM-NOT: warning | ||
| #include <riscv_vector.h> | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32mf2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i32> @llvm.riscv.vfclass.nxv1f32.i32(<vscale x 1 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32mf2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i32> @llvm.riscv.vfclass.nxv1f32.i64(<vscale x 1 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x i32> [[TMP0]] | ||
| // | ||
| vuint32mf2_t test_vfclass_v_u32mf2(vfloat32mf2_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i32> @llvm.riscv.vfclass.nxv2f32.i32(<vscale x 2 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i32> @llvm.riscv.vfclass.nxv2f32.i64(<vscale x 2 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x i32> [[TMP0]] | ||
| // | ||
| vuint32m1_t test_vfclass_v_u32m1(vfloat32m1_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i32> @llvm.riscv.vfclass.nxv4f32.i32(<vscale x 4 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i32> @llvm.riscv.vfclass.nxv4f32.i64(<vscale x 4 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x i32> [[TMP0]] | ||
| // | ||
| vuint32m2_t test_vfclass_v_u32m2(vfloat32m2_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i32> @llvm.riscv.vfclass.nxv8f32.i32(<vscale x 8 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i32> @llvm.riscv.vfclass.nxv8f32.i64(<vscale x 8 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x i32> [[TMP0]] | ||
| // | ||
| vuint32m4_t test_vfclass_v_u32m4(vfloat32m4_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x i32> @llvm.riscv.vfclass.nxv16f32.i32(<vscale x 16 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x i32> @llvm.riscv.vfclass.nxv16f32.i64(<vscale x 16 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x i32> [[TMP0]] | ||
| // | ||
| vuint32m8_t test_vfclass_v_u32m8(vfloat32m8_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i64> @llvm.riscv.vfclass.nxv1f64.i32(<vscale x 1 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i64> @llvm.riscv.vfclass.nxv1f64.i64(<vscale x 1 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x i64> [[TMP0]] | ||
| // | ||
| vuint64m1_t test_vfclass_v_u64m1(vfloat64m1_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i64> @llvm.riscv.vfclass.nxv2f64.i32(<vscale x 2 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i64> @llvm.riscv.vfclass.nxv2f64.i64(<vscale x 2 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x i64> [[TMP0]] | ||
| // | ||
| vuint64m2_t test_vfclass_v_u64m2(vfloat64m2_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i64> @llvm.riscv.vfclass.nxv4f64.i32(<vscale x 4 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i64> @llvm.riscv.vfclass.nxv4f64.i64(<vscale x 4 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x i64> [[TMP0]] | ||
| // | ||
| vuint64m4_t test_vfclass_v_u64m4(vfloat64m4_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i64> @llvm.riscv.vfclass.nxv8f64.i32(<vscale x 8 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i64> @llvm.riscv.vfclass.nxv8f64.i64(<vscale x 8 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x i64> [[TMP0]] | ||
| // | ||
| vuint64m8_t test_vfclass_v_u64m8(vfloat64m8_t op1, size_t vl) { | ||
| return vfclass(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32mf2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i32> @llvm.riscv.vfclass.mask.nxv1f32.i32(<vscale x 1 x i32> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32mf2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i32> @llvm.riscv.vfclass.mask.nxv1f32.i64(<vscale x 1 x i32> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x i32> [[TMP0]] | ||
| // | ||
| vuint32mf2_t test_vfclass_v_u32mf2_m(vbool64_t mask, vuint32mf2_t maskedoff, | ||
| vfloat32mf2_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i32> @llvm.riscv.vfclass.mask.nxv2f32.i32(<vscale x 2 x i32> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i32> @llvm.riscv.vfclass.mask.nxv2f32.i64(<vscale x 2 x i32> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x i32> [[TMP0]] | ||
| // | ||
| vuint32m1_t test_vfclass_v_u32m1_m(vbool32_t mask, vuint32m1_t maskedoff, | ||
| vfloat32m1_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i32> @llvm.riscv.vfclass.mask.nxv4f32.i32(<vscale x 4 x i32> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i32> @llvm.riscv.vfclass.mask.nxv4f32.i64(<vscale x 4 x i32> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x i32> [[TMP0]] | ||
| // | ||
| vuint32m2_t test_vfclass_v_u32m2_m(vbool16_t mask, vuint32m2_t maskedoff, | ||
| vfloat32m2_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i32> @llvm.riscv.vfclass.mask.nxv8f32.i32(<vscale x 8 x i32> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i32> @llvm.riscv.vfclass.mask.nxv8f32.i64(<vscale x 8 x i32> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x i32> [[TMP0]] | ||
| // | ||
| vuint32m4_t test_vfclass_v_u32m4_m(vbool8_t mask, vuint32m4_t maskedoff, | ||
| vfloat32m4_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u32m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x i32> @llvm.riscv.vfclass.mask.nxv16f32.i32(<vscale x 16 x i32> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x i32> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u32m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x i32> @llvm.riscv.vfclass.mask.nxv16f32.i64(<vscale x 16 x i32> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x i32> [[TMP0]] | ||
| // | ||
| vuint32m8_t test_vfclass_v_u32m8_m(vbool4_t mask, vuint32m8_t maskedoff, | ||
| vfloat32m8_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i64> @llvm.riscv.vfclass.mask.nxv1f64.i32(<vscale x 1 x i64> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x i64> @llvm.riscv.vfclass.mask.nxv1f64.i64(<vscale x 1 x i64> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x i64> [[TMP0]] | ||
| // | ||
| vuint64m1_t test_vfclass_v_u64m1_m(vbool64_t mask, vuint64m1_t maskedoff, | ||
| vfloat64m1_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i64> @llvm.riscv.vfclass.mask.nxv2f64.i32(<vscale x 2 x i64> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x i64> @llvm.riscv.vfclass.mask.nxv2f64.i64(<vscale x 2 x i64> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x i64> [[TMP0]] | ||
| // | ||
| vuint64m2_t test_vfclass_v_u64m2_m(vbool32_t mask, vuint64m2_t maskedoff, | ||
| vfloat64m2_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i64> @llvm.riscv.vfclass.mask.nxv4f64.i32(<vscale x 4 x i64> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x i64> @llvm.riscv.vfclass.mask.nxv4f64.i64(<vscale x 4 x i64> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x i64> [[TMP0]] | ||
| // | ||
| vuint64m4_t test_vfclass_v_u64m4_m(vbool16_t mask, vuint64m4_t maskedoff, | ||
| vfloat64m4_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfclass_v_u64m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i64> @llvm.riscv.vfclass.mask.nxv8f64.i32(<vscale x 8 x i64> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x i64> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfclass_v_u64m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i64> @llvm.riscv.vfclass.mask.nxv8f64.i64(<vscale x 8 x i64> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x i64> [[TMP0]] | ||
| // | ||
| vuint64m8_t test_vfclass_v_u64m8_m(vbool8_t mask, vuint64m8_t maskedoff, | ||
| vfloat64m8_t op1, size_t vl) { | ||
| return vfclass(mask, maskedoff, op1, vl); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,190 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | ||
| // REQUIRES: riscv-registered-target | ||
| // RUN: %clang_cc1 -triple riscv32 -target-feature +experimental-v -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV32 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +experimental-v -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV64 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +m -target-feature +experimental-v -Werror -Wall -o - %s -S >/dev/null 2>&1 | FileCheck --check-prefix=ASM --allow-empty %s | ||
|
|
||
| // ASM-NOT: warning | ||
| #include <riscv_vector.h> | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.nxv64i1.i32(<vscale x 64 x i1> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR8:#.*]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.nxv64i1.i64(<vscale x 64 x i1> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR8:#.*]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b1(vbool1_t op1, size_t vl) { return vfirst(op1, vl); } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.nxv32i1.i32(<vscale x 32 x i1> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.nxv32i1.i64(<vscale x 32 x i1> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b2(vbool2_t op1, size_t vl) { return vfirst(op1, vl); } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.nxv16i1.i32(<vscale x 16 x i1> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.nxv16i1.i64(<vscale x 16 x i1> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b4(vbool4_t op1, size_t vl) { return vfirst(op1, vl); } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.nxv8i1.i32(<vscale x 8 x i1> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.nxv8i1.i64(<vscale x 8 x i1> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b8(vbool8_t op1, size_t vl) { return vfirst(op1, vl); } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b16( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.nxv4i1.i32(<vscale x 4 x i1> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b16( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.nxv4i1.i64(<vscale x 4 x i1> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b16(vbool16_t op1, size_t vl) { return vfirst(op1, vl); } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b32( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.nxv2i1.i32(<vscale x 2 x i1> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b32( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.nxv2i1.i64(<vscale x 2 x i1> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b32(vbool32_t op1, size_t vl) { return vfirst(op1, vl); } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b64( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.nxv1i1.i32(<vscale x 1 x i1> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b64( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.nxv1i1.i64(<vscale x 1 x i1> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b64(vbool64_t op1, size_t vl) { return vfirst(op1, vl); } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.mask.nxv64i1.i32(<vscale x 64 x i1> [[OP1:%.*]], <vscale x 64 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.mask.nxv64i1.i64(<vscale x 64 x i1> [[OP1:%.*]], <vscale x 64 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b1_m(vbool1_t mask, vbool1_t op1, size_t vl) { | ||
| return vfirst(mask, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.mask.nxv32i1.i32(<vscale x 32 x i1> [[OP1:%.*]], <vscale x 32 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.mask.nxv32i1.i64(<vscale x 32 x i1> [[OP1:%.*]], <vscale x 32 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b2_m(vbool2_t mask, vbool2_t op1, size_t vl) { | ||
| return vfirst(mask, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.mask.nxv16i1.i32(<vscale x 16 x i1> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.mask.nxv16i1.i64(<vscale x 16 x i1> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b4_m(vbool4_t mask, vbool4_t op1, size_t vl) { | ||
| return vfirst(mask, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.mask.nxv8i1.i32(<vscale x 8 x i1> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.mask.nxv8i1.i64(<vscale x 8 x i1> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b8_m(vbool8_t mask, vbool8_t op1, size_t vl) { | ||
| return vfirst(mask, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b16_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.mask.nxv4i1.i32(<vscale x 4 x i1> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b16_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.mask.nxv4i1.i64(<vscale x 4 x i1> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b16_m(vbool16_t mask, vbool16_t op1, size_t vl) { | ||
| return vfirst(mask, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b32_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.mask.nxv2i1.i32(<vscale x 2 x i1> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b32_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.mask.nxv2i1.i64(<vscale x 2 x i1> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b32_m(vbool32_t mask, vbool32_t op1, size_t vl) { | ||
| return vfirst(mask, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfirst_m_b64_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vfirst.mask.nxv1i1.i32(<vscale x 1 x i1> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV32-NEXT: ret i32 [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfirst_m_b64_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vfirst.mask.nxv1i1.i64(<vscale x 1 x i1> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR8]] | ||
| // CHECK-RV64-NEXT: ret i64 [[TMP0]] | ||
| // | ||
| long test_vfirst_m_b64_m(vbool64_t mask, vbool64_t op1, size_t vl) { | ||
| return vfirst(mask, op1, vl); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,146 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | ||
| // REQUIRES: riscv-registered-target | ||
| // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV32 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV64 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +m -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -Werror -Wall -o - %s -S >/dev/null 2>&1 | FileCheck --check-prefix=ASM --allow-empty %s | ||
|
|
||
| // ASM-NOT: warning | ||
| #include <riscv_vector.h> | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f32mf2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfmerge.nxv1f32.f32.i32(<vscale x 1 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f32mf2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfmerge.nxv1f32.f32.i64(<vscale x 1 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| vfloat32mf2_t test_vfmerge_vfm_f32mf2(vbool64_t mask, vfloat32mf2_t op1, | ||
| float op2, size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f32m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfmerge.nxv2f32.f32.i32(<vscale x 2 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f32m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfmerge.nxv2f32.f32.i64(<vscale x 2 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| vfloat32m1_t test_vfmerge_vfm_f32m1(vbool32_t mask, vfloat32m1_t op1, float op2, | ||
| size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f32m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfmerge.nxv4f32.f32.i32(<vscale x 4 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f32m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfmerge.nxv4f32.f32.i64(<vscale x 4 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| vfloat32m2_t test_vfmerge_vfm_f32m2(vbool16_t mask, vfloat32m2_t op1, float op2, | ||
| size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f32m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfmerge.nxv8f32.f32.i32(<vscale x 8 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f32m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfmerge.nxv8f32.f32.i64(<vscale x 8 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| vfloat32m4_t test_vfmerge_vfm_f32m4(vbool8_t mask, vfloat32m4_t op1, float op2, | ||
| size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f32m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfmerge.nxv16f32.f32.i32(<vscale x 16 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f32m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfmerge.nxv16f32.f32.i64(<vscale x 16 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| vfloat32m8_t test_vfmerge_vfm_f32m8(vbool4_t mask, vfloat32m8_t op1, float op2, | ||
| size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f64m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfmerge.nxv1f64.f64.i32(<vscale x 1 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f64m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfmerge.nxv1f64.f64.i64(<vscale x 1 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfmerge_vfm_f64m1(vbool64_t mask, vfloat64m1_t op1, | ||
| double op2, size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f64m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfmerge.nxv2f64.f64.i32(<vscale x 2 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f64m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfmerge.nxv2f64.f64.i64(<vscale x 2 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfmerge_vfm_f64m2(vbool32_t mask, vfloat64m2_t op1, | ||
| double op2, size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f64m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfmerge.nxv4f64.f64.i32(<vscale x 4 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f64m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfmerge.nxv4f64.f64.i64(<vscale x 4 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfmerge_vfm_f64m4(vbool16_t mask, vfloat64m4_t op1, | ||
| double op2, size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfmerge_vfm_f64m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfmerge.nxv8f64.f64.i32(<vscale x 8 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfmerge_vfm_f64m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfmerge.nxv8f64.f64.i64(<vscale x 8 x double> [[OP1:%.*]], double [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfmerge_vfm_f64m8(vbool8_t mask, vfloat64m8_t op1, double op2, | ||
| size_t vl) { | ||
| return vfmerge(mask, op1, op2, vl); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,272 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | ||
| // REQUIRES: riscv-registered-target | ||
| // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV32 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV64 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +m -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -Werror -Wall -o - %s -S >/dev/null 2>&1 | FileCheck --check-prefix=ASM --allow-empty %s | ||
|
|
||
| // ASM-NOT: warning | ||
| #include <riscv_vector.h> | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32mf2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrec7.nxv1f32.i32(<vscale x 1 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32mf2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrec7.nxv1f32.i64(<vscale x 1 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| vfloat32mf2_t test_vfrec7_v_f32mf2(vfloat32mf2_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrec7.nxv2f32.i32(<vscale x 2 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrec7.nxv2f32.i64(<vscale x 2 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| vfloat32m1_t test_vfrec7_v_f32m1(vfloat32m1_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrec7.nxv4f32.i32(<vscale x 4 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrec7.nxv4f32.i64(<vscale x 4 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| vfloat32m2_t test_vfrec7_v_f32m2(vfloat32m2_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrec7.nxv8f32.i32(<vscale x 8 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrec7.nxv8f32.i64(<vscale x 8 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| vfloat32m4_t test_vfrec7_v_f32m4(vfloat32m4_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrec7.nxv16f32.i32(<vscale x 16 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrec7.nxv16f32.i64(<vscale x 16 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| vfloat32m8_t test_vfrec7_v_f32m8(vfloat32m8_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrec7.nxv1f64.i32(<vscale x 1 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrec7.nxv1f64.i64(<vscale x 1 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfrec7_v_f64m1(vfloat64m1_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrec7.nxv2f64.i32(<vscale x 2 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrec7.nxv2f64.i64(<vscale x 2 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfrec7_v_f64m2(vfloat64m2_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrec7.nxv4f64.i32(<vscale x 4 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrec7.nxv4f64.i64(<vscale x 4 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfrec7_v_f64m4(vfloat64m4_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrec7.nxv8f64.i32(<vscale x 8 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrec7.nxv8f64.i64(<vscale x 8 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfrec7_v_f64m8(vfloat64m8_t op1, size_t vl) { | ||
| return vfrec7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32mf2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrec7.mask.nxv1f32.i32(<vscale x 1 x float> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32mf2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrec7.mask.nxv1f32.i64(<vscale x 1 x float> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| vfloat32mf2_t test_vfrec7_v_f32mf2_m(vbool64_t mask, vfloat32mf2_t maskedoff, | ||
| vfloat32mf2_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrec7.mask.nxv2f32.i32(<vscale x 2 x float> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrec7.mask.nxv2f32.i64(<vscale x 2 x float> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| vfloat32m1_t test_vfrec7_v_f32m1_m(vbool32_t mask, vfloat32m1_t maskedoff, | ||
| vfloat32m1_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrec7.mask.nxv4f32.i32(<vscale x 4 x float> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrec7.mask.nxv4f32.i64(<vscale x 4 x float> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| vfloat32m2_t test_vfrec7_v_f32m2_m(vbool16_t mask, vfloat32m2_t maskedoff, | ||
| vfloat32m2_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrec7.mask.nxv8f32.i32(<vscale x 8 x float> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrec7.mask.nxv8f32.i64(<vscale x 8 x float> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| vfloat32m4_t test_vfrec7_v_f32m4_m(vbool8_t mask, vfloat32m4_t maskedoff, | ||
| vfloat32m4_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f32m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrec7.mask.nxv16f32.i32(<vscale x 16 x float> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f32m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrec7.mask.nxv16f32.i64(<vscale x 16 x float> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| vfloat32m8_t test_vfrec7_v_f32m8_m(vbool4_t mask, vfloat32m8_t maskedoff, | ||
| vfloat32m8_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrec7.mask.nxv1f64.i32(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrec7.mask.nxv1f64.i64(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfrec7_v_f64m1_m(vbool64_t mask, vfloat64m1_t maskedoff, | ||
| vfloat64m1_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrec7.mask.nxv2f64.i32(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrec7.mask.nxv2f64.i64(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfrec7_v_f64m2_m(vbool32_t mask, vfloat64m2_t maskedoff, | ||
| vfloat64m2_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrec7.mask.nxv4f64.i32(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrec7.mask.nxv4f64.i64(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfrec7_v_f64m4_m(vbool16_t mask, vfloat64m4_t maskedoff, | ||
| vfloat64m4_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrec7_v_f64m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrec7.mask.nxv8f64.i32(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrec7_v_f64m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrec7.mask.nxv8f64.i64(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfrec7_v_f64m8_m(vbool8_t mask, vfloat64m8_t maskedoff, | ||
| vfloat64m8_t op1, size_t vl) { | ||
| return vfrec7(mask, maskedoff, op1, vl); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,272 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | ||
| // REQUIRES: riscv-registered-target | ||
| // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV32 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV64 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +m -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -Werror -Wall -o - %s -S >/dev/null 2>&1 | FileCheck --check-prefix=ASM --allow-empty %s | ||
|
|
||
| // ASM-NOT: warning | ||
| #include <riscv_vector.h> | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32mf2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrsqrt7.nxv1f32.i32(<vscale x 1 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32mf2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrsqrt7.nxv1f32.i64(<vscale x 1 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| vfloat32mf2_t test_vfrsqrt7_v_f32mf2(vfloat32mf2_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrsqrt7.nxv2f32.i32(<vscale x 2 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrsqrt7.nxv2f32.i64(<vscale x 2 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| vfloat32m1_t test_vfrsqrt7_v_f32m1(vfloat32m1_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrsqrt7.nxv4f32.i32(<vscale x 4 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrsqrt7.nxv4f32.i64(<vscale x 4 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| vfloat32m2_t test_vfrsqrt7_v_f32m2(vfloat32m2_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrsqrt7.nxv8f32.i32(<vscale x 8 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrsqrt7.nxv8f32.i64(<vscale x 8 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| vfloat32m4_t test_vfrsqrt7_v_f32m4(vfloat32m4_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrsqrt7.nxv16f32.i32(<vscale x 16 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrsqrt7.nxv16f32.i64(<vscale x 16 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| vfloat32m8_t test_vfrsqrt7_v_f32m8(vfloat32m8_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrsqrt7.nxv1f64.i32(<vscale x 1 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrsqrt7.nxv1f64.i64(<vscale x 1 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfrsqrt7_v_f64m1(vfloat64m1_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrsqrt7.nxv2f64.i32(<vscale x 2 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrsqrt7.nxv2f64.i64(<vscale x 2 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfrsqrt7_v_f64m2(vfloat64m2_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrsqrt7.nxv4f64.i32(<vscale x 4 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrsqrt7.nxv4f64.i64(<vscale x 4 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfrsqrt7_v_f64m4(vfloat64m4_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrsqrt7.nxv8f64.i32(<vscale x 8 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrsqrt7.nxv8f64.i64(<vscale x 8 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfrsqrt7_v_f64m8(vfloat64m8_t op1, size_t vl) { | ||
| return vfrsqrt7(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32mf2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrsqrt7.mask.nxv1f32.i32(<vscale x 1 x float> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32mf2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfrsqrt7.mask.nxv1f32.i64(<vscale x 1 x float> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| vfloat32mf2_t test_vfrsqrt7_v_f32mf2_m(vbool64_t mask, vfloat32mf2_t maskedoff, | ||
| vfloat32mf2_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrsqrt7.mask.nxv2f32.i32(<vscale x 2 x float> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfrsqrt7.mask.nxv2f32.i64(<vscale x 2 x float> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| vfloat32m1_t test_vfrsqrt7_v_f32m1_m(vbool32_t mask, vfloat32m1_t maskedoff, | ||
| vfloat32m1_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrsqrt7.mask.nxv4f32.i32(<vscale x 4 x float> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfrsqrt7.mask.nxv4f32.i64(<vscale x 4 x float> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| vfloat32m2_t test_vfrsqrt7_v_f32m2_m(vbool16_t mask, vfloat32m2_t maskedoff, | ||
| vfloat32m2_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrsqrt7.mask.nxv8f32.i32(<vscale x 8 x float> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfrsqrt7.mask.nxv8f32.i64(<vscale x 8 x float> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| vfloat32m4_t test_vfrsqrt7_v_f32m4_m(vbool8_t mask, vfloat32m4_t maskedoff, | ||
| vfloat32m4_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f32m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrsqrt7.mask.nxv16f32.i32(<vscale x 16 x float> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f32m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfrsqrt7.mask.nxv16f32.i64(<vscale x 16 x float> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| vfloat32m8_t test_vfrsqrt7_v_f32m8_m(vbool4_t mask, vfloat32m8_t maskedoff, | ||
| vfloat32m8_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrsqrt7.mask.nxv1f64.i32(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfrsqrt7.mask.nxv1f64.i64(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfrsqrt7_v_f64m1_m(vbool64_t mask, vfloat64m1_t maskedoff, | ||
| vfloat64m1_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrsqrt7.mask.nxv2f64.i32(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfrsqrt7.mask.nxv2f64.i64(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfrsqrt7_v_f64m2_m(vbool32_t mask, vfloat64m2_t maskedoff, | ||
| vfloat64m2_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrsqrt7.mask.nxv4f64.i32(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfrsqrt7.mask.nxv4f64.i64(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfrsqrt7_v_f64m4_m(vbool16_t mask, vfloat64m4_t maskedoff, | ||
| vfloat64m4_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfrsqrt7_v_f64m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrsqrt7.mask.nxv8f64.i32(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfrsqrt7_v_f64m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfrsqrt7.mask.nxv8f64.i64(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfrsqrt7_v_f64m8_m(vbool8_t mask, vfloat64m8_t maskedoff, | ||
| vfloat64m8_t op1, size_t vl) { | ||
| return vfrsqrt7(mask, maskedoff, op1, vl); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,272 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | ||
| // REQUIRES: riscv-registered-target | ||
| // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV32 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV64 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +m -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -Werror -Wall -o - %s -S >/dev/null 2>&1 | FileCheck --check-prefix=ASM --allow-empty %s | ||
|
|
||
| // ASM-NOT: warning | ||
| #include <riscv_vector.h> | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32mf2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfsqrt.nxv1f32.i32(<vscale x 1 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32mf2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfsqrt.nxv1f32.i64(<vscale x 1 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6:#.*]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| vfloat32mf2_t test_vfsqrt_v_f32mf2(vfloat32mf2_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfsqrt.nxv2f32.i32(<vscale x 2 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfsqrt.nxv2f32.i64(<vscale x 2 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| vfloat32m1_t test_vfsqrt_v_f32m1(vfloat32m1_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfsqrt.nxv4f32.i32(<vscale x 4 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfsqrt.nxv4f32.i64(<vscale x 4 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| vfloat32m2_t test_vfsqrt_v_f32m2(vfloat32m2_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfsqrt.nxv8f32.i32(<vscale x 8 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfsqrt.nxv8f32.i64(<vscale x 8 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| vfloat32m4_t test_vfsqrt_v_f32m4(vfloat32m4_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfsqrt.nxv16f32.i32(<vscale x 16 x float> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfsqrt.nxv16f32.i64(<vscale x 16 x float> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| vfloat32m8_t test_vfsqrt_v_f32m8(vfloat32m8_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfsqrt.nxv1f64.i32(<vscale x 1 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfsqrt.nxv1f64.i64(<vscale x 1 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfsqrt_v_f64m1(vfloat64m1_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfsqrt.nxv2f64.i32(<vscale x 2 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfsqrt.nxv2f64.i64(<vscale x 2 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfsqrt_v_f64m2(vfloat64m2_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfsqrt.nxv4f64.i32(<vscale x 4 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfsqrt.nxv4f64.i64(<vscale x 4 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfsqrt_v_f64m4(vfloat64m4_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfsqrt.nxv8f64.i32(<vscale x 8 x double> [[OP1:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfsqrt.nxv8f64.i64(<vscale x 8 x double> [[OP1:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfsqrt_v_f64m8(vfloat64m8_t op1, size_t vl) { | ||
| return vfsqrt(op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32mf2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfsqrt.mask.nxv1f32.i32(<vscale x 1 x float> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32mf2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.vfsqrt.mask.nxv1f32.i64(<vscale x 1 x float> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]] | ||
| // | ||
| vfloat32mf2_t test_vfsqrt_v_f32mf2_m(vbool64_t mask, vfloat32mf2_t maskedoff, | ||
| vfloat32mf2_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfsqrt.mask.nxv2f32.i32(<vscale x 2 x float> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.vfsqrt.mask.nxv2f32.i64(<vscale x 2 x float> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]] | ||
| // | ||
| vfloat32m1_t test_vfsqrt_v_f32m1_m(vbool32_t mask, vfloat32m1_t maskedoff, | ||
| vfloat32m1_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfsqrt.mask.nxv4f32.i32(<vscale x 4 x float> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.vfsqrt.mask.nxv4f32.i64(<vscale x 4 x float> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]] | ||
| // | ||
| vfloat32m2_t test_vfsqrt_v_f32m2_m(vbool16_t mask, vfloat32m2_t maskedoff, | ||
| vfloat32m2_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfsqrt.mask.nxv8f32.i32(<vscale x 8 x float> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.vfsqrt.mask.nxv8f32.i64(<vscale x 8 x float> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]] | ||
| // | ||
| vfloat32m4_t test_vfsqrt_v_f32m4_m(vbool8_t mask, vfloat32m4_t maskedoff, | ||
| vfloat32m4_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f32m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfsqrt.mask.nxv16f32.i32(<vscale x 16 x float> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f32m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.vfsqrt.mask.nxv16f32.i64(<vscale x 16 x float> [[MASKEDOFF:%.*]], <vscale x 16 x float> [[OP1:%.*]], <vscale x 16 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]] | ||
| // | ||
| vfloat32m8_t test_vfsqrt_v_f32m8_m(vbool4_t mask, vfloat32m8_t maskedoff, | ||
| vfloat32m8_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfsqrt.mask.nxv1f64.i32(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfsqrt.mask.nxv1f64.i64(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x double> [[OP1:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfsqrt_v_f64m1_m(vbool64_t mask, vfloat64m1_t maskedoff, | ||
| vfloat64m1_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfsqrt.mask.nxv2f64.i32(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfsqrt.mask.nxv2f64.i64(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfsqrt_v_f64m2_m(vbool32_t mask, vfloat64m2_t maskedoff, | ||
| vfloat64m2_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfsqrt.mask.nxv4f64.i32(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfsqrt.mask.nxv4f64.i64(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x double> [[OP1:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfsqrt_v_f64m4_m(vbool16_t mask, vfloat64m4_t maskedoff, | ||
| vfloat64m4_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfsqrt_v_f64m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfsqrt.mask.nxv8f64.i32(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfsqrt_v_f64m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfsqrt.mask.nxv8f64.i64(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x double> [[OP1:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR6]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfsqrt_v_f64m8_m(vbool8_t mask, vfloat64m8_t maskedoff, | ||
| vfloat64m8_t op1, size_t vl) { | ||
| return vfsqrt(mask, maskedoff, op1, vl); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,251 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | ||
| // REQUIRES: riscv-registered-target | ||
| // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV32 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -disable-O0-optnone -emit-llvm %s -o - | opt -S -mem2reg | FileCheck --check-prefix=CHECK-RV64 %s | ||
| // RUN: %clang_cc1 -triple riscv64 -target-feature +m -target-feature +f -target-feature +d -target-feature +experimental-v \ | ||
| // RUN: -Werror -Wall -o - %s -S >/dev/null 2>&1 | FileCheck --check-prefix=ASM --allow-empty %s | ||
|
|
||
| // ASM-NOT: warning | ||
| #include <riscv_vector.h> | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.nxv1f64.nxv1f32.nxv1f32.i32(<vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x float> [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5:#.*]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.nxv1f64.nxv1f32.nxv1f32.i64(<vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x float> [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5:#.*]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfwmul_vv_f64m1(vfloat32mf2_t op1, vfloat32mf2_t op2, | ||
| size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m1( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.nxv1f64.nxv1f32.f32.i32(<vscale x 1 x float> [[OP1:%.*]], float [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m1( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.nxv1f64.nxv1f32.f32.i64(<vscale x 1 x float> [[OP1:%.*]], float [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfwmul_vf_f64m1(vfloat32mf2_t op1, float op2, size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.nxv2f64.nxv2f32.nxv2f32.i32(<vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x float> [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.nxv2f64.nxv2f32.nxv2f32.i64(<vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x float> [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfwmul_vv_f64m2(vfloat32m1_t op1, vfloat32m1_t op2, | ||
| size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m2( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.nxv2f64.nxv2f32.f32.i32(<vscale x 2 x float> [[OP1:%.*]], float [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m2( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.nxv2f64.nxv2f32.f32.i64(<vscale x 2 x float> [[OP1:%.*]], float [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfwmul_vf_f64m2(vfloat32m1_t op1, float op2, size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.nxv4f32.i32(<vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.nxv4f32.i64(<vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfwmul_vv_f64m4(vfloat32m2_t op1, vfloat32m2_t op2, | ||
| size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m4( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.f32.i32(<vscale x 4 x float> [[OP1:%.*]], float [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m4( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.nxv4f64.nxv4f32.f32.i64(<vscale x 4 x float> [[OP1:%.*]], float [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfwmul_vf_f64m4(vfloat32m2_t op1, float op2, size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.nxv8f64.nxv8f32.nxv8f32.i32(<vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x float> [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.nxv8f64.nxv8f32.nxv8f32.i64(<vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x float> [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfwmul_vv_f64m8(vfloat32m4_t op1, vfloat32m4_t op2, | ||
| size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m8( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.nxv8f64.nxv8f32.f32.i32(<vscale x 8 x float> [[OP1:%.*]], float [[OP2:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m8( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.nxv8f64.nxv8f32.f32.i64(<vscale x 8 x float> [[OP1:%.*]], float [[OP2:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfwmul_vf_f64m8(vfloat32m4_t op1, float op2, size_t vl) { | ||
| return vfwmul(op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.mask.nxv1f64.nxv1f32.nxv1f32.i32(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x float> [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.mask.nxv1f64.nxv1f32.nxv1f32.i64(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], <vscale x 1 x float> [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfwmul_vv_f64m1_m(vbool64_t mask, vfloat64m1_t maskedoff, | ||
| vfloat32mf2_t op1, vfloat32mf2_t op2, | ||
| size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m1_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.mask.nxv1f64.nxv1f32.f32.i32(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m1_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.vfwmul.mask.nxv1f64.nxv1f32.f32.i64(<vscale x 1 x double> [[MASKEDOFF:%.*]], <vscale x 1 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 1 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 1 x double> [[TMP0]] | ||
| // | ||
| vfloat64m1_t test_vfwmul_vf_f64m1_m(vbool64_t mask, vfloat64m1_t maskedoff, | ||
| vfloat32mf2_t op1, float op2, size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.mask.nxv2f64.nxv2f32.nxv2f32.i32(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x float> [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.mask.nxv2f64.nxv2f32.nxv2f32.i64(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], <vscale x 2 x float> [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfwmul_vv_f64m2_m(vbool32_t mask, vfloat64m2_t maskedoff, | ||
| vfloat32m1_t op1, vfloat32m1_t op2, | ||
| size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m2_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.mask.nxv2f64.nxv2f32.f32.i32(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m2_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.vfwmul.mask.nxv2f64.nxv2f32.f32.i64(<vscale x 2 x double> [[MASKEDOFF:%.*]], <vscale x 2 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 2 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 2 x double> [[TMP0]] | ||
| // | ||
| vfloat64m2_t test_vfwmul_vf_f64m2_m(vbool32_t mask, vfloat64m2_t maskedoff, | ||
| vfloat32m1_t op1, float op2, size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.mask.nxv4f64.nxv4f32.nxv4f32.i32(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.mask.nxv4f64.nxv4f32.nxv4f32.i64(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfwmul_vv_f64m4_m(vbool16_t mask, vfloat64m4_t maskedoff, | ||
| vfloat32m2_t op1, vfloat32m2_t op2, | ||
| size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m4_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.mask.nxv4f64.nxv4f32.f32.i32(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m4_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.vfwmul.mask.nxv4f64.nxv4f32.f32.i64(<vscale x 4 x double> [[MASKEDOFF:%.*]], <vscale x 4 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 4 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 4 x double> [[TMP0]] | ||
| // | ||
| vfloat64m4_t test_vfwmul_vf_f64m4_m(vbool16_t mask, vfloat64m4_t maskedoff, | ||
| vfloat32m2_t op1, float op2, size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vv_f64m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.mask.nxv8f64.nxv8f32.nxv8f32.i32(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x float> [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vv_f64m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.mask.nxv8f64.nxv8f32.nxv8f32.i64(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], <vscale x 8 x float> [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfwmul_vv_f64m8_m(vbool8_t mask, vfloat64m8_t maskedoff, | ||
| vfloat32m4_t op1, vfloat32m4_t op2, | ||
| size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } | ||
|
|
||
| // CHECK-RV32-LABEL: @test_vfwmul_vf_f64m8_m( | ||
| // CHECK-RV32-NEXT: entry: | ||
| // CHECK-RV32-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.mask.nxv8f64.nxv8f32.f32.i32(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i32 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV32-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| // CHECK-RV64-LABEL: @test_vfwmul_vf_f64m8_m( | ||
| // CHECK-RV64-NEXT: entry: | ||
| // CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.vfwmul.mask.nxv8f64.nxv8f32.f32.i64(<vscale x 8 x double> [[MASKEDOFF:%.*]], <vscale x 8 x float> [[OP1:%.*]], float [[OP2:%.*]], <vscale x 8 x i1> [[MASK:%.*]], i64 [[VL:%.*]]) [[ATTR5]] | ||
| // CHECK-RV64-NEXT: ret <vscale x 8 x double> [[TMP0]] | ||
| // | ||
| vfloat64m8_t test_vfwmul_vf_f64m8_m(vbool8_t mask, vfloat64m8_t maskedoff, | ||
| vfloat32m4_t op1, float op2, size_t vl) { | ||
| return vfwmul(mask, maskedoff, op1, op2, vl); | ||
| } |