// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve \
// RUN: -fallow-half-arguments-and-returns -disable-O0-optnone \
// RUN: -emit-llvm -o - %s | opt -S -sroa | FileCheck %s
// REQUIRES: aarch64-registered-target
// ADDITION
// CHECK-LABEL: @add_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[ADD]]
//
svint16_t
// CHECK-LABEL: @add_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[ADD]]
//
svint32_t
// CHECK-LABEL: @add_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[ADD]]
//
svint64_t
// CHECK-LABEL: @add_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svuint8_t
// CHECK-LABEL: @add_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[ADD]]
//
svuint16_t
// CHECK-LABEL: @add_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[ADD]]
//
svuint32_t
// CHECK-LABEL: @add_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[ADD]]
//
svuint64_t
// CHECK-LABEL: @add_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[ADD]]
//
svfloat16_t
// CHECK-LABEL: @add_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[ADD]]
//
svfloat32_t
// CHECK-LABEL: @add_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_inplace_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_inplace_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[ADD]]
//
svint16_t
// CHECK-LABEL: @add_inplace_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[ADD]]
//
svint32_t
// CHECK-LABEL: @add_inplace_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[ADD]]
//
svint64_t
// CHECK-LABEL: @add_inplace_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svuint8_t
// CHECK-LABEL: @add_inplace_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[ADD]]
//
svuint16_t
// CHECK-LABEL: @add_inplace_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[ADD]]
//
svuint32_t
// CHECK-LABEL: @add_inplace_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[ADD]]
//
svuint64_t
// CHECK-LABEL: @add_inplace_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[ADD]]
//
svfloat16_t
// CHECK-LABEL: @add_inplace_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[ADD]]
//
svfloat32_t
// CHECK-LABEL: @add_inplace_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_scalar_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_scalar_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[ADD]]
//
svint16_t
// CHECK-LABEL: @add_scalar_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[ADD]]
//
svint32_t
// CHECK-LABEL: @add_scalar_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[ADD]]
//
svint64_t
// CHECK-LABEL: @add_scalar_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svuint8_t
// CHECK-LABEL: @add_scalar_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[ADD]]
//
svuint16_t
// CHECK-LABEL: @add_scalar_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[ADD]]
//
svuint32_t
// CHECK-LABEL: @add_scalar_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[ADD]]
//
svuint64_t
// CHECK-LABEL: @add_scalar_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x half> poison, half [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x half> [[SPLAT_SPLATINSERT]], <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 8 x half> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x half> [[ADD]]
//
svfloat16_t
// CHECK-LABEL: @add_scalar_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x float> poison, float [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x float> [[SPLAT_SPLATINSERT]], <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 4 x float> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x float> [[ADD]]
//
svfloat32_t
// CHECK-LABEL: @add_scalar_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x double> poison, double [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x double> [[SPLAT_SPLATINSERT]], <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_i8_i_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_i8_il_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_i8_ill_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_i8_u_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_i8_ul_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_i8_ull_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = add <vscale x 16 x i8> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 16 x i8> [[ADD]]
//
svint8_t
// CHECK-LABEL: @add_f64_i_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_f64_il_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_f64_ill_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_f64_u_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_f64_ul_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_f64_ull_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_f64_f_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// CHECK-LABEL: @add_f64_d_lit(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[ADD:%.*]] = fadd <vscale x 2 x double> [[A:%.*]], zeroinitializer
// CHECK-NEXT: ret <vscale x 2 x double> [[ADD]]
//
svfloat64_t
// SUBTRACTION
// CHECK-LABEL: @sub_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svint8_t
// CHECK-LABEL: @sub_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svint16_t
// CHECK-LABEL: @sub_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svint32_t
// CHECK-LABEL: @sub_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svint64_t
// CHECK-LABEL: @sub_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svuint8_t
// CHECK-LABEL: @sub_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svuint16_t
// CHECK-LABEL: @sub_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svuint32_t
// CHECK-LABEL: @sub_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svuint64_t
// CHECK-LABEL: @sub_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[SUB]]
//
svfloat16_t
// CHECK-LABEL: @sub_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[SUB]]
//
svfloat32_t
// CHECK-LABEL: @sub_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[SUB]]
//
svfloat64_t
// CHECK-LABEL: @sub_inplace_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svint8_t
// CHECK-LABEL: @sub_inplace_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svint16_t
// CHECK-LABEL: @sub_inplace_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svint32_t
// CHECK-LABEL: @sub_inplace_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svint64_t
// CHECK-LABEL: @sub_inplace_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svuint8_t
// CHECK-LABEL: @sub_inplace_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svuint16_t
// CHECK-LABEL: @sub_inplace_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svuint32_t
// CHECK-LABEL: @sub_inplace_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svuint64_t
// CHECK-LABEL: @sub_inplace_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[SUB]]
//
svfloat16_t
// CHECK-LABEL: @sub_inplace_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[SUB]]
//
svfloat32_t
// CHECK-LABEL: @sub_inplace_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[SUB]]
//
svfloat64_t
// CHECK-LABEL: @sub_scalar_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svint8_t
// CHECK-LABEL: @sub_scalar_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svint16_t
// CHECK-LABEL: @sub_scalar_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svint32_t
// CHECK-LABEL: @sub_scalar_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svint64_t
// CHECK-LABEL: @sub_scalar_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svuint8_t
// CHECK-LABEL: @sub_scalar_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svuint16_t
// CHECK-LABEL: @sub_scalar_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svuint32_t
// CHECK-LABEL: @sub_scalar_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svuint64_t
// CHECK-LABEL: @sub_scalar_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x half> poison, half [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x half> [[SPLAT_SPLATINSERT]], <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 8 x half> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x half> [[SUB]]
//
svfloat16_t
// CHECK-LABEL: @sub_scalar_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x float> poison, float [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x float> [[SPLAT_SPLATINSERT]], <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 4 x float> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x float> [[SUB]]
//
svfloat32_t
// CHECK-LABEL: @sub_scalar_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x double> poison, double [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x double> [[SPLAT_SPLATINSERT]], <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[SUB:%.*]] = fsub <vscale x 2 x double> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x double> [[SUB]]
//
svfloat64_t
// MULTIPLICATION
// CHECK-LABEL: @mul_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[MUL]]
//
svint8_t
// CHECK-LABEL: @mul_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[MUL]]
//
svint16_t
// CHECK-LABEL: @mul_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[MUL]]
//
svint32_t
// CHECK-LABEL: @mul_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[MUL]]
//
svint64_t
// CHECK-LABEL: @mul_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[MUL]]
//
svuint8_t
// CHECK-LABEL: @mul_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[MUL]]
//
svuint16_t
// CHECK-LABEL: @mul_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[MUL]]
//
svuint32_t
// CHECK-LABEL: @mul_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[MUL]]
//
svuint64_t
// CHECK-LABEL: @mul_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[MUL]]
//
svfloat16_t
// CHECK-LABEL: @mul_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[MUL]]
//
svfloat32_t
// CHECK-LABEL: @mul_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[MUL]]
//
svfloat64_t
// CHECK-LABEL: @mul_inplace_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[MUL]]
//
svint8_t
// CHECK-LABEL: @mul_inplace_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[MUL]]
//
svint16_t
// CHECK-LABEL: @mul_inplace_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[MUL]]
//
svint32_t
// CHECK-LABEL: @mul_inplace_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[MUL]]
//
svint64_t
// CHECK-LABEL: @mul_inplace_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[MUL]]
//
svuint8_t
// CHECK-LABEL: @mul_inplace_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[MUL]]
//
svuint16_t
// CHECK-LABEL: @mul_inplace_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[MUL]]
//
svuint32_t
// CHECK-LABEL: @mul_inplace_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[MUL]]
//
svuint64_t
// CHECK-LABEL: @mul_inplace_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[MUL]]
//
svfloat16_t
// CHECK-LABEL: @mul_inplace_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[MUL]]
//
svfloat32_t
// CHECK-LABEL: @mul_inplace_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[MUL]]
//
svfloat64_t
// CHECK-LABEL: @mul_scalar_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[MUL]]
//
svint8_t
// CHECK-LABEL: @mul_scalar_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[MUL]]
//
svint16_t
// CHECK-LABEL: @mul_scalar_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[MUL]]
//
svint32_t
// CHECK-LABEL: @mul_scalar_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[MUL]]
//
svint64_t
// CHECK-LABEL: @mul_scalar_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[MUL]]
//
svuint8_t
// CHECK-LABEL: @mul_scalar_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[MUL]]
//
svuint16_t
// CHECK-LABEL: @mul_scalar_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[MUL]]
//
svuint32_t
// CHECK-LABEL: @mul_scalar_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = mul <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[MUL]]
//
svuint64_t
// CHECK-LABEL: @mul_scalar_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x half> poison, half [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x half> [[SPLAT_SPLATINSERT]], <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 8 x half> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x half> [[MUL]]
//
svfloat16_t
// CHECK-LABEL: @mul_scalar_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x float> poison, float [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x float> [[SPLAT_SPLATINSERT]], <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 4 x float> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x float> [[MUL]]
//
svfloat32_t
// CHECK-LABEL: @mul_scalar_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x double> poison, double [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x double> [[SPLAT_SPLATINSERT]], <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[MUL:%.*]] = fmul <vscale x 2 x double> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x double> [[MUL]]
//
svfloat64_t
// DIVISION
// CHECK-LABEL: @div_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[DIV]]
//
svint8_t
// CHECK-LABEL: @div_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[DIV]]
//
svint16_t
// CHECK-LABEL: @div_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[DIV]]
//
svint32_t
// CHECK-LABEL: @div_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[DIV]]
//
svint64_t
// CHECK-LABEL: @div_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[DIV]]
//
svuint8_t
// CHECK-LABEL: @div_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[DIV]]
//
svuint16_t
// CHECK-LABEL: @div_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[DIV]]
//
svuint32_t
// CHECK-LABEL: @div_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[DIV]]
//
svuint64_t
// CHECK-LABEL: @div_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[DIV]]
//
svfloat16_t
// CHECK-LABEL: @div_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[DIV]]
//
svfloat32_t
// CHECK-LABEL: @div_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[DIV]]
//
svfloat64_t
// CHECK-LABEL: @div_inplace_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[DIV]]
//
svint8_t
// CHECK-LABEL: @div_inplace_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[DIV]]
//
svint16_t
// CHECK-LABEL: @div_inplace_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[DIV]]
//
svint32_t
// CHECK-LABEL: @div_inplace_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[DIV]]
//
svint64_t
// CHECK-LABEL: @div_inplace_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[DIV]]
//
svuint8_t
// CHECK-LABEL: @div_inplace_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[DIV]]
//
svuint16_t
// CHECK-LABEL: @div_inplace_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[DIV]]
//
svuint32_t
// CHECK-LABEL: @div_inplace_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[DIV]]
//
svuint64_t
// CHECK-LABEL: @div_inplace_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 8 x half> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x half> [[DIV]]
//
svfloat16_t
// CHECK-LABEL: @div_inplace_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 4 x float> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x float> [[DIV]]
//
svfloat32_t
// CHECK-LABEL: @div_inplace_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 2 x double> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x double> [[DIV]]
//
svfloat64_t
// CHECK-LABEL: @div_scalar_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[DIV]]
//
svint8_t
// CHECK-LABEL: @div_scalar_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[DIV]]
//
svint16_t
// CHECK-LABEL: @div_scalar_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[DIV]]
//
svint32_t
// CHECK-LABEL: @div_scalar_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = sdiv <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[DIV]]
//
svint64_t
// CHECK-LABEL: @div_scalar_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[DIV]]
//
svuint8_t
// CHECK-LABEL: @div_scalar_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[DIV]]
//
svuint16_t
// CHECK-LABEL: @div_scalar_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[DIV]]
//
svuint32_t
// CHECK-LABEL: @div_scalar_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = udiv <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[DIV]]
//
svuint64_t
// CHECK-LABEL: @div_scalar_f16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x half> poison, half [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x half> [[SPLAT_SPLATINSERT]], <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 8 x half> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x half> [[DIV]]
//
svfloat16_t
// CHECK-LABEL: @div_scalar_f32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x float> poison, float [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x float> [[SPLAT_SPLATINSERT]], <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 4 x float> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x float> [[DIV]]
//
svfloat32_t
// CHECK-LABEL: @div_scalar_f64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x double> poison, double [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x double> [[SPLAT_SPLATINSERT]], <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[DIV:%.*]] = fdiv <vscale x 2 x double> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x double> [[DIV]]
//
svfloat64_t
// REMAINDER
// CHECK-LABEL: @rem_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[REM]]
//
svint8_t
// CHECK-LABEL: @rem_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[REM]]
//
svint16_t
// CHECK-LABEL: @rem_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[REM]]
//
svint32_t
// CHECK-LABEL: @rem_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[REM]]
//
svint64_t
// CHECK-LABEL: @rem_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[REM]]
//
svuint8_t
// CHECK-LABEL: @rem_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[REM]]
//
svuint16_t
// CHECK-LABEL: @rem_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[REM]]
//
svuint32_t
// CHECK-LABEL: @rem_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[REM]]
//
svuint64_t
// CHECK-LABEL: @rem_inplace_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[REM]]
//
svint8_t
// CHECK-LABEL: @rem_inplace_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[REM]]
//
svint16_t
// CHECK-LABEL: @rem_inplace_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[REM]]
//
svint32_t
// CHECK-LABEL: @rem_inplace_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[REM]]
//
svint64_t
// CHECK-LABEL: @rem_inplace_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 16 x i8> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[REM]]
//
svuint8_t
// CHECK-LABEL: @rem_inplace_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 8 x i16> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[REM]]
//
svuint16_t
// CHECK-LABEL: @rem_inplace_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 4 x i32> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[REM]]
//
svuint32_t
// CHECK-LABEL: @rem_inplace_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 2 x i64> [[A:%.*]], [[B:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[REM]]
//
svuint64_t
// CHECK-LABEL: @rem_scalar_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[REM]]
//
svint8_t
// CHECK-LABEL: @rem_scalar_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[REM]]
//
svint16_t
// CHECK-LABEL: @rem_scalar_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[REM]]
//
svint32_t
// CHECK-LABEL: @rem_scalar_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = srem <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[REM]]
//
svint64_t
// CHECK-LABEL: @rem_scalar_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[SPLAT_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 16 x i8> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[REM]]
//
svuint8_t
// CHECK-LABEL: @rem_scalar_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 8 x i16> poison, i16 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 8 x i16> [[SPLAT_SPLATINSERT]], <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 8 x i16> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[REM]]
//
svuint16_t
// CHECK-LABEL: @rem_scalar_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[SPLAT_SPLATINSERT]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 4 x i32> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[REM]]
//
svuint32_t
// CHECK-LABEL: @rem_scalar_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 2 x i64> poison, i64 [[B:%.*]], i32 0
// CHECK-NEXT: [[SPLAT_SPLAT:%.*]] = shufflevector <vscale x 2 x i64> [[SPLAT_SPLATINSERT]], <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
// CHECK-NEXT: [[REM:%.*]] = urem <vscale x 2 x i64> [[A:%.*]], [[SPLAT_SPLAT]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[REM]]
//
svuint64_t
// UNARY PROMOTION
// CHECK-LABEL: @prom_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 16 x i8> [[A:%.*]]
//
svint8_t
// CHECK-LABEL: @prom_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 8 x i16> [[A:%.*]]
//
svint16_t
// CHECK-LABEL: @prom_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 4 x i32> [[A:%.*]]
//
svint32_t
// CHECK-LABEL: @prom_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 2 x i64> [[A:%.*]]
//
svint64_t
// CHECK-LABEL: @prom_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 16 x i8> [[A:%.*]]
//
svuint8_t
// CHECK-LABEL: @prom_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 8 x i16> [[A:%.*]]
//
svuint16_t
// CHECK-LABEL: @prom_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 4 x i32> [[A:%.*]]
//
svuint32_t
// CHECK-LABEL: @prom_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: ret <vscale x 2 x i64> [[A:%.*]]
//
svuint64_t
// UNARY NEGATION
// CHECK-LABEL: @neg_i8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svint8_t
// CHECK-LABEL: @neg_i16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svint16_t
// CHECK-LABEL: @neg_i32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svint32_t
// CHECK-LABEL: @neg_i64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svint64_t
// CHECK-LABEL: @neg_u8(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 16 x i8> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 16 x i8> [[SUB]]
//
svuint8_t
// CHECK-LABEL: @neg_u16(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 8 x i16> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 8 x i16> [[SUB]]
//
svuint16_t
// CHECK-LABEL: @neg_u32(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 4 x i32> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 4 x i32> [[SUB]]
//
svuint32_t
// CHECK-LABEL: @neg_u64(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[SUB:%.*]] = sub <vscale x 2 x i64> zeroinitializer, [[A:%.*]]
// CHECK-NEXT: ret <vscale x 2 x i64> [[SUB]]
//
svuint64_t