1*207e5cccSFangrui Song // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 2*207e5cccSFangrui Song // REQUIRES: aarch64-registered-target 3*207e5cccSFangrui Song // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s 4*207e5cccSFangrui Song // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK 5*207e5cccSFangrui Song // RUN: %clang_cc1 -fclang-abi-compat=latest -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s 6*207e5cccSFangrui Song // RUN: %clang_cc1 -fclang-abi-compat=latest -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK 7*207e5cccSFangrui Song // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sve -S -disable-O0-optnone -Werror -Wall -o /dev/null %s 8*207e5cccSFangrui Song // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sme -S -disable-O0-optnone -Werror -Wall -o /dev/null %s 9*207e5cccSFangrui Song 10*207e5cccSFangrui Song #include <arm_sve.h> 11*207e5cccSFangrui Song 12*207e5cccSFangrui Song #if defined __ARM_FEATURE_SME 13*207e5cccSFangrui Song #define MODE_ATTR __arm_streaming 14*207e5cccSFangrui Song #else 15*207e5cccSFangrui Song #define MODE_ATTR 16*207e5cccSFangrui Song #endif 17*207e5cccSFangrui Song 18*207e5cccSFangrui Song #ifdef SVE_OVERLOADED_FORMS 19*207e5cccSFangrui Song // A simple used,unused... macro, long enough to represent any SVE builtin. 20*207e5cccSFangrui Song #define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 21*207e5cccSFangrui Song #else 22*207e5cccSFangrui Song #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 23*207e5cccSFangrui Song #endif 24*207e5cccSFangrui Song 25*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f16_z( 26*207e5cccSFangrui Song // CHECK-NEXT: entry: 27*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 28*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 29*207e5cccSFangrui Song // CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 0) 30*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 31*207e5cccSFangrui Song // 32*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f16_zu10__SVBool_tu13__SVFloat16_tS0_S0_( 33*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 34*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 35*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 36*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 0) 37*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 38*207e5cccSFangrui Song // 39*207e5cccSFangrui Song svfloat16_t test_svcmla_f16_z(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 40*207e5cccSFangrui Song { 41*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f16,_z,)(pg, op1, op2, op3, 0); 42*207e5cccSFangrui Song } 43*207e5cccSFangrui Song 44*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f16_z_1( 45*207e5cccSFangrui Song // CHECK-NEXT: entry: 46*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 47*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 48*207e5cccSFangrui Song // CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 90) 49*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 50*207e5cccSFangrui Song // 51*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z19test_svcmla_f16_z_1u10__SVBool_tu13__SVFloat16_tS0_S0_( 52*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 53*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 54*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 55*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 90) 56*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 57*207e5cccSFangrui Song // 58*207e5cccSFangrui Song svfloat16_t test_svcmla_f16_z_1(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 59*207e5cccSFangrui Song { 60*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f16,_z,)(pg, op1, op2, op3, 90); 61*207e5cccSFangrui Song } 62*207e5cccSFangrui Song 63*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f16_z_2( 64*207e5cccSFangrui Song // CHECK-NEXT: entry: 65*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 66*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 67*207e5cccSFangrui Song // CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 180) 68*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 69*207e5cccSFangrui Song // 70*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z19test_svcmla_f16_z_2u10__SVBool_tu13__SVFloat16_tS0_S0_( 71*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 72*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 73*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 74*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 180) 75*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 76*207e5cccSFangrui Song // 77*207e5cccSFangrui Song svfloat16_t test_svcmla_f16_z_2(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 78*207e5cccSFangrui Song { 79*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f16,_z,)(pg, op1, op2, op3, 180); 80*207e5cccSFangrui Song } 81*207e5cccSFangrui Song 82*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f16_z_3( 83*207e5cccSFangrui Song // CHECK-NEXT: entry: 84*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 85*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 86*207e5cccSFangrui Song // CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 270) 87*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 88*207e5cccSFangrui Song // 89*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z19test_svcmla_f16_z_3u10__SVBool_tu13__SVFloat16_tS0_S0_( 90*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 91*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 92*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> zeroinitializer 93*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[TMP1]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 270) 94*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP2]] 95*207e5cccSFangrui Song // 96*207e5cccSFangrui Song svfloat16_t test_svcmla_f16_z_3(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 97*207e5cccSFangrui Song { 98*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f16,_z,)(pg, op1, op2, op3, 270); 99*207e5cccSFangrui Song } 100*207e5cccSFangrui Song 101*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f32_z( 102*207e5cccSFangrui Song // CHECK-NEXT: entry: 103*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[PG:%.*]]) 104*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> zeroinitializer 105*207e5cccSFangrui Song // CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.nxv4f32(<vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[TMP1]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 0) 106*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 4 x float> [[TMP2]] 107*207e5cccSFangrui Song // 108*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f32_zu10__SVBool_tu13__SVFloat32_tS0_S0_( 109*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 110*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[PG:%.*]]) 111*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> zeroinitializer 112*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.nxv4f32(<vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[TMP1]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 0) 113*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 4 x float> [[TMP2]] 114*207e5cccSFangrui Song // 115*207e5cccSFangrui Song svfloat32_t test_svcmla_f32_z(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) MODE_ATTR 116*207e5cccSFangrui Song { 117*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f32,_z,)(pg, op1, op2, op3, 0); 118*207e5cccSFangrui Song } 119*207e5cccSFangrui Song 120*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f64_z( 121*207e5cccSFangrui Song // CHECK-NEXT: entry: 122*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> [[PG:%.*]]) 123*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x double> zeroinitializer 124*207e5cccSFangrui Song // CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[TMP1]], <vscale x 2 x double> [[OP2:%.*]], <vscale x 2 x double> [[OP3:%.*]], i32 90) 125*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 2 x double> [[TMP2]] 126*207e5cccSFangrui Song // 127*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f64_zu10__SVBool_tu13__SVFloat64_tS0_S0_( 128*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 129*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> [[PG:%.*]]) 130*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = select <vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x double> zeroinitializer 131*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP2:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[TMP1]], <vscale x 2 x double> [[OP2:%.*]], <vscale x 2 x double> [[OP3:%.*]], i32 90) 132*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 2 x double> [[TMP2]] 133*207e5cccSFangrui Song // 134*207e5cccSFangrui Song svfloat64_t test_svcmla_f64_z(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) MODE_ATTR 135*207e5cccSFangrui Song { 136*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f64,_z,)(pg, op1, op2, op3, 90); 137*207e5cccSFangrui Song } 138*207e5cccSFangrui Song 139*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f16_m( 140*207e5cccSFangrui Song // CHECK-NEXT: entry: 141*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 142*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 180) 143*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP1]] 144*207e5cccSFangrui Song // 145*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f16_mu10__SVBool_tu13__SVFloat16_tS0_S0_( 146*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 147*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 148*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 180) 149*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP1]] 150*207e5cccSFangrui Song // 151*207e5cccSFangrui Song svfloat16_t test_svcmla_f16_m(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 152*207e5cccSFangrui Song { 153*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f16,_m,)(pg, op1, op2, op3, 180); 154*207e5cccSFangrui Song } 155*207e5cccSFangrui Song 156*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f32_m( 157*207e5cccSFangrui Song // CHECK-NEXT: entry: 158*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[PG:%.*]]) 159*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.nxv4f32(<vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 270) 160*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 4 x float> [[TMP1]] 161*207e5cccSFangrui Song // 162*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f32_mu10__SVBool_tu13__SVFloat32_tS0_S0_( 163*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 164*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[PG:%.*]]) 165*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.nxv4f32(<vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 270) 166*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 4 x float> [[TMP1]] 167*207e5cccSFangrui Song // 168*207e5cccSFangrui Song svfloat32_t test_svcmla_f32_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) MODE_ATTR 169*207e5cccSFangrui Song { 170*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f32,_m,)(pg, op1, op2, op3, 270); 171*207e5cccSFangrui Song } 172*207e5cccSFangrui Song 173*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f64_m( 174*207e5cccSFangrui Song // CHECK-NEXT: entry: 175*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> [[PG:%.*]]) 176*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x double> [[OP2:%.*]], <vscale x 2 x double> [[OP3:%.*]], i32 0) 177*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 2 x double> [[TMP1]] 178*207e5cccSFangrui Song // 179*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f64_mu10__SVBool_tu13__SVFloat64_tS0_S0_( 180*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 181*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> [[PG:%.*]]) 182*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x double> [[OP2:%.*]], <vscale x 2 x double> [[OP3:%.*]], i32 0) 183*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 2 x double> [[TMP1]] 184*207e5cccSFangrui Song // 185*207e5cccSFangrui Song svfloat64_t test_svcmla_f64_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) MODE_ATTR 186*207e5cccSFangrui Song { 187*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f64,_m,)(pg, op1, op2, op3, 0); 188*207e5cccSFangrui Song } 189*207e5cccSFangrui Song 190*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f16_x( 191*207e5cccSFangrui Song // CHECK-NEXT: entry: 192*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 193*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 90) 194*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP1]] 195*207e5cccSFangrui Song // 196*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f16_xu10__SVBool_tu13__SVFloat16_tS0_S0_( 197*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 198*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv8i1(<vscale x 16 x i1> [[PG:%.*]]) 199*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.nxv8f16(<vscale x 8 x i1> [[TMP0]], <vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 90) 200*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP1]] 201*207e5cccSFangrui Song // 202*207e5cccSFangrui Song svfloat16_t test_svcmla_f16_x(svbool_t pg, svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 203*207e5cccSFangrui Song { 204*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f16,_x,)(pg, op1, op2, op3, 90); 205*207e5cccSFangrui Song } 206*207e5cccSFangrui Song 207*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f32_x( 208*207e5cccSFangrui Song // CHECK-NEXT: entry: 209*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[PG:%.*]]) 210*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.nxv4f32(<vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 180) 211*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 4 x float> [[TMP1]] 212*207e5cccSFangrui Song // 213*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f32_xu10__SVBool_tu13__SVFloat32_tS0_S0_( 214*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 215*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv4i1(<vscale x 16 x i1> [[PG:%.*]]) 216*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.nxv4f32(<vscale x 4 x i1> [[TMP0]], <vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 180) 217*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 4 x float> [[TMP1]] 218*207e5cccSFangrui Song // 219*207e5cccSFangrui Song svfloat32_t test_svcmla_f32_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) MODE_ATTR 220*207e5cccSFangrui Song { 221*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f32,_x,)(pg, op1, op2, op3, 180); 222*207e5cccSFangrui Song } 223*207e5cccSFangrui Song 224*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_f64_x( 225*207e5cccSFangrui Song // CHECK-NEXT: entry: 226*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> [[PG:%.*]]) 227*207e5cccSFangrui Song // CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x double> [[OP2:%.*]], <vscale x 2 x double> [[OP3:%.*]], i32 270) 228*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 2 x double> [[TMP1]] 229*207e5cccSFangrui Song // 230*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z17test_svcmla_f64_xu10__SVBool_tu13__SVFloat64_tS0_S0_( 231*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 232*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> [[PG:%.*]]) 233*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP1:%.*]] = tail call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> [[TMP0]], <vscale x 2 x double> [[OP1:%.*]], <vscale x 2 x double> [[OP2:%.*]], <vscale x 2 x double> [[OP3:%.*]], i32 270) 234*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 2 x double> [[TMP1]] 235*207e5cccSFangrui Song // 236*207e5cccSFangrui Song svfloat64_t test_svcmla_f64_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2, svfloat64_t op3) MODE_ATTR 237*207e5cccSFangrui Song { 238*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla,_f64,_x,)(pg, op1, op2, op3, 270); 239*207e5cccSFangrui Song } 240*207e5cccSFangrui Song 241*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_lane_f16( 242*207e5cccSFangrui Song // CHECK-NEXT: entry: 243*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.lane.nxv8f16(<vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 0, i32 0) 244*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP0]] 245*207e5cccSFangrui Song // 246*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z20test_svcmla_lane_f16u13__SVFloat16_tS_S_( 247*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 248*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.lane.nxv8f16(<vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 0, i32 0) 249*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP0]] 250*207e5cccSFangrui Song // 251*207e5cccSFangrui Song svfloat16_t test_svcmla_lane_f16(svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 252*207e5cccSFangrui Song { 253*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla_lane,_f16,,)(op1, op2, op3, 0, 0); 254*207e5cccSFangrui Song } 255*207e5cccSFangrui Song 256*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_lane_f16_1( 257*207e5cccSFangrui Song // CHECK-NEXT: entry: 258*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.lane.nxv8f16(<vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 3, i32 90) 259*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 8 x half> [[TMP0]] 260*207e5cccSFangrui Song // 261*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z22test_svcmla_lane_f16_1u13__SVFloat16_tS_S_( 262*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 263*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 8 x half> @llvm.aarch64.sve.fcmla.lane.nxv8f16(<vscale x 8 x half> [[OP1:%.*]], <vscale x 8 x half> [[OP2:%.*]], <vscale x 8 x half> [[OP3:%.*]], i32 3, i32 90) 264*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 8 x half> [[TMP0]] 265*207e5cccSFangrui Song // 266*207e5cccSFangrui Song svfloat16_t test_svcmla_lane_f16_1(svfloat16_t op1, svfloat16_t op2, svfloat16_t op3) MODE_ATTR 267*207e5cccSFangrui Song { 268*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla_lane,_f16,,)(op1, op2, op3, 3, 90); 269*207e5cccSFangrui Song } 270*207e5cccSFangrui Song 271*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_lane_f32( 272*207e5cccSFangrui Song // CHECK-NEXT: entry: 273*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.lane.nxv4f32(<vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 0, i32 180) 274*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 4 x float> [[TMP0]] 275*207e5cccSFangrui Song // 276*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z20test_svcmla_lane_f32u13__SVFloat32_tS_S_( 277*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 278*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.lane.nxv4f32(<vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 0, i32 180) 279*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 4 x float> [[TMP0]] 280*207e5cccSFangrui Song // 281*207e5cccSFangrui Song svfloat32_t test_svcmla_lane_f32(svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) MODE_ATTR 282*207e5cccSFangrui Song { 283*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla_lane,_f32,,)(op1, op2, op3, 0, 180); 284*207e5cccSFangrui Song } 285*207e5cccSFangrui Song 286*207e5cccSFangrui Song // CHECK-LABEL: @test_svcmla_lane_f32_1( 287*207e5cccSFangrui Song // CHECK-NEXT: entry: 288*207e5cccSFangrui Song // CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.lane.nxv4f32(<vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 1, i32 270) 289*207e5cccSFangrui Song // CHECK-NEXT: ret <vscale x 4 x float> [[TMP0]] 290*207e5cccSFangrui Song // 291*207e5cccSFangrui Song // CPP-CHECK-LABEL: @_Z22test_svcmla_lane_f32_1u13__SVFloat32_tS_S_( 292*207e5cccSFangrui Song // CPP-CHECK-NEXT: entry: 293*207e5cccSFangrui Song // CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 4 x float> @llvm.aarch64.sve.fcmla.lane.nxv4f32(<vscale x 4 x float> [[OP1:%.*]], <vscale x 4 x float> [[OP2:%.*]], <vscale x 4 x float> [[OP3:%.*]], i32 1, i32 270) 294*207e5cccSFangrui Song // CPP-CHECK-NEXT: ret <vscale x 4 x float> [[TMP0]] 295*207e5cccSFangrui Song // 296*207e5cccSFangrui Song svfloat32_t test_svcmla_lane_f32_1(svfloat32_t op1, svfloat32_t op2, svfloat32_t op3) MODE_ATTR 297*207e5cccSFangrui Song { 298*207e5cccSFangrui Song return SVE_ACLE_FUNC(svcmla_lane,_f32,,)(op1, op2, op3, 1, 270); 299*207e5cccSFangrui Song } 300