diff --git a/clang/test/CodeGen/aarch64-sve-vector-ops.c b/clang/test/CodeGen/aarch64-sve-vector-ops.c index 7fb307cb497b..57d943ec7891 100644 --- a/clang/test/CodeGen/aarch64-sve-vector-ops.c +++ b/clang/test/CodeGen/aarch64-sve-vector-ops.c @@ -1,6 +1,7 @@ +// 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 \ -// RUN: -O1 -emit-llvm -o - %s 2>&1 | FileCheck %s +// RUN: -fallow-half-arguments-and-returns -disable-O0-optnone \ +// RUN: -emit-llvm -o - %s | opt -S -sroa | FileCheck %s // REQUIRES: aarch64-registered-target @@ -8,738 +9,946 @@ // ADDITION +// CHECK-LABEL: @add_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint8_t add_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: add_i8 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint16_t add_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: add_i16 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint32_t add_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: add_i32 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint64_t add_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: add_i64 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint8_t add_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: add_u8 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint16_t add_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: add_u16 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint32_t add_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: add_u32 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint64_t add_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: add_u64 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svfloat16_t add_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: add_f16 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svfloat32_t add_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: add_f32 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svfloat64_t add_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: add_f64 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a + b; } +// CHECK-LABEL: @add_inplace_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint8_t add_inplace_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: add_inplace_i8 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint16_t add_inplace_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: add_inplace_i16 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint32_t add_inplace_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: add_inplace_i32 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svint64_t add_inplace_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: add_inplace_i64 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint8_t add_inplace_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: add_inplace_u8 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint16_t add_inplace_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: add_inplace_u16 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint32_t add_inplace_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: add_inplace_u32 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = add [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svuint64_t add_inplace_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: add_inplace_u64 - // CHECK: %add = add %b, %a - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svfloat16_t add_inplace_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: add_inplace_f16 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svfloat32_t add_inplace_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: add_inplace_f32 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a += b; } +// CHECK-LABEL: @add_inplace_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[ADD:%.*]] = fadd [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[ADD]] +// svfloat64_t add_inplace_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: add_inplace_f64 - // CHECK: %add = fadd %a, %b - // CHECK-NEXT: ret %add return a += b; } // SUBTRACTION +// CHECK-LABEL: @sub_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint8_t sub_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: sub_i8 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint16_t sub_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: sub_i16 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint32_t sub_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: sub_i32 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint64_t sub_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: sub_i64 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint8_t sub_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: sub_u8 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint16_t sub_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: sub_u16 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint32_t sub_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: sub_u32 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint64_t sub_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: sub_u64 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = fsub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svfloat16_t sub_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: sub_f16 - // CHECK: %sub = fsub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = fsub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svfloat32_t sub_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: sub_f32 - // CHECK: %sub = fsub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = fsub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svfloat64_t sub_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: sub_f64 - // CHECK: %sub = fsub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint8_t sub_inplace_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: sub_inplace_i8 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint16_t sub_inplace_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: sub_inplace_i16 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint32_t sub_inplace_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: sub_inplace_i32 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svint64_t sub_inplace_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: sub_inplace_i64 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint8_t sub_inplace_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: sub_inplace_u8 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint16_t sub_inplace_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: sub_inplace_u16 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint32_t sub_inplace_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: sub_inplace_u32 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = sub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svuint64_t sub_inplace_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: sub_inplace_u64 - // CHECK: %sub = sub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = fsub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svfloat16_t sub_inplace_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: sub_inplace_f16 - // CHECK: %sub = fsub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = fsub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svfloat32_t sub_inplace_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: sub_inplace_f32 - // CHECK: %sub = fsub %a, %b - // CHECK-NEXT: ret %sub return a - b; } +// CHECK-LABEL: @sub_inplace_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[SUB:%.*]] = fsub [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[SUB]] +// svfloat64_t sub_inplace_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: sub_inplace_f64 - // CHECK: %sub = fsub %a, %b - // CHECK-NEXT: ret %sub return a - b; } // MULTIPLICATION +// CHECK-LABEL: @mul_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint8_t mul_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: mul_i8 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint16_t mul_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: mul_i16 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint32_t mul_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: mul_i32 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint64_t mul_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: mul_i64 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint8_t mul_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: mul_u8 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint16_t mul_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: mul_u16 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint32_t mul_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: mul_u32 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint64_t mul_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: mul_u64 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = fmul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svfloat16_t mul_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: mul_f16 - // CHECK: %mul = fmul %a, %b - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = fmul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svfloat32_t mul_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: mul_f32 - // CHECK: %mul = fmul %a, %b - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = fmul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svfloat64_t mul_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: mul_f64 - // CHECK: %mul = fmul %a, %b - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint8_t mul_inplace_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: mul_inplace_i8 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint16_t mul_inplace_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: mul_inplace_i16 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint32_t mul_inplace_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: mul_inplace_i32 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svint64_t mul_inplace_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: mul_inplace_i64 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint8_t mul_inplace_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: mul_inplace_u8 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint16_t mul_inplace_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: mul_inplace_u16 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint32_t mul_inplace_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: mul_inplace_u32 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = mul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svuint64_t mul_inplace_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: mul_inplace_u64 - // CHECK: %mul = mul %b, %a - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = fmul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svfloat16_t mul_inplace_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: mul_inplace_f16 - // CHECK: %mul = fmul %a, %b - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = fmul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svfloat32_t mul_inplace_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: mul_inplace_f32 - // CHECK: %mul = fmul %a, %b - // CHECK-NEXT: ret %mul return a * b; } +// CHECK-LABEL: @mul_inplace_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[MUL:%.*]] = fmul [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[MUL]] +// svfloat64_t mul_inplace_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: mul_inplace_f64 - // CHECK: %mul = fmul %a, %b - // CHECK-NEXT: ret %mul return a * b; } // DIVISION +// CHECK-LABEL: @div_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint8_t div_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: div_i8 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint16_t div_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: div_i16 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint32_t div_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: div_i32 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint64_t div_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: div_i64 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint8_t div_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: div_u8 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint16_t div_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: div_u16 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint32_t div_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: div_u32 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint64_t div_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: div_u64 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = fdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svfloat16_t div_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: div_f16 - // CHECK: %div = fdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = fdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svfloat32_t div_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: div_f32 - // CHECK: %div = fdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = fdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svfloat64_t div_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: div_f64 - // CHECK: %div = fdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint8_t div_inplace_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: div_inplace_i8 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint16_t div_inplace_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: div_inplace_i16 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint32_t div_inplace_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: div_inplace_i32 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = sdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svint64_t div_inplace_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: div_inplace_i64 - // CHECK: %div = sdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint8_t div_inplace_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: div_inplace_u8 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint16_t div_inplace_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: div_inplace_u16 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint32_t div_inplace_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: div_inplace_u32 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = udiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svuint64_t div_inplace_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: div_inplace_u64 - // CHECK: %div = udiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_f16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = fdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svfloat16_t div_inplace_f16(svfloat16_t a, svfloat16_t b) { - // CHECK-LABEL: div_inplace_f16 - // CHECK: %div = fdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_f32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = fdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svfloat32_t div_inplace_f32(svfloat32_t a, svfloat32_t b) { - // CHECK-LABEL: div_inplace_f32 - // CHECK: %div = fdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } +// CHECK-LABEL: @div_inplace_f64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[DIV:%.*]] = fdiv [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[DIV]] +// svfloat64_t div_inplace_f64(svfloat64_t a, svfloat64_t b) { - // CHECK-LABEL: div_inplace_f64 - // CHECK: %div = fdiv %a, %b - // CHECK-NEXT: ret %div return a / b; } // REMAINDER +// CHECK-LABEL: @rem_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint8_t rem_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: rem_i8 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint16_t rem_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: rem_i16 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint32_t rem_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: rem_i32 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint64_t rem_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: rem_i64 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint8_t rem_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: rem_u8 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint16_t rem_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: rem_u16 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint32_t rem_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: rem_u32 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint64_t rem_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: rem_u64 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_i8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint8_t rem_inplace_i8(svint8_t a, svint8_t b) { - // CHECK-LABEL: rem_inplace_i8 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_i16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint16_t rem_inplace_i16(svint16_t a, svint16_t b) { - // CHECK-LABEL: rem_inplace_i16 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_i32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint32_t rem_inplace_i32(svint32_t a, svint32_t b) { - // CHECK-LABEL: rem_inplace_i32 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_i64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = srem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svint64_t rem_inplace_i64(svint64_t a, svint64_t b) { - // CHECK-LABEL: rem_inplace_i64 - // CHECK: %rem = srem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_u8( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint8_t rem_inplace_u8(svuint8_t a, svuint8_t b) { - // CHECK-LABEL: rem_inplace_u8 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_u16( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint16_t rem_inplace_u16(svuint16_t a, svuint16_t b) { - // CHECK-LABEL: rem_inplace_u16 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_u32( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint32_t rem_inplace_u32(svuint32_t a, svuint32_t b) { - // CHECK-LABEL: rem_inplace_u32 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; } +// CHECK-LABEL: @rem_inplace_u64( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[REM:%.*]] = urem [[A:%.*]], [[B:%.*]] +// CHECK-NEXT: ret [[REM]] +// svuint64_t rem_inplace_u64(svuint64_t a, svuint64_t b) { - // CHECK-LABEL: rem_inplace_u64 - // CHECK: %rem = urem %a, %b - // CHECK-NEXT: ret %rem return a % b; }