2022-01-18 22:12:03 +08:00
|
|
|
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
|
|
|
|
|
|
|
|
// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -target-feature +mops -target-feature +mte -S -emit-llvm -o - %s | FileCheck %s
|
|
|
|
|
2022-02-09 08:08:18 +08:00
|
|
|
#define __ARM_FEATURE_MOPS 1
|
2022-01-18 22:12:03 +08:00
|
|
|
#include <arm_acle.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
// CHECK-LABEL: @bzero_0(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 0, i64 0)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP1]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *bzero_0(void *dst) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, 0, 0);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @bzero_1(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 0, i64 1)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP1]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *bzero_1(void *dst) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, 0, 1);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @bzero_10(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 0, i64 10)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP1]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *bzero_10(void *dst) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, 0, 10);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @bzero_10000(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 0, i64 10000)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP1]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *bzero_10000(void *dst) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, 0, 10000);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @bzero_n(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: [[SIZE_ADDR:%.*]] = alloca i64, align 8
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: store i64 [[SIZE:%.*]], i64* [[SIZE_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i64, i64* [[SIZE_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 0, i64 [[TMP1]])
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP2]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *bzero_n(void *dst, size_t size) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, 0, size);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @memset_0(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: [[VALUE_ADDR:%.*]] = alloca i32, align 4
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: store i32 [[VALUE:%.*]], i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 [[TMP2]], i64 0)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP3]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *memset_0(void *dst, int value) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, value, 0);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @memset_1(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: [[VALUE_ADDR:%.*]] = alloca i32, align 4
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: store i32 [[VALUE:%.*]], i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 [[TMP2]], i64 1)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP3]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *memset_1(void *dst, int value) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, value, 1);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @memset_10(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: [[VALUE_ADDR:%.*]] = alloca i32, align 4
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: store i32 [[VALUE:%.*]], i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 [[TMP2]], i64 10)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP3]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *memset_10(void *dst, int value) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, value, 10);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @memset_10000(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: [[VALUE_ADDR:%.*]] = alloca i32, align 4
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: store i32 [[VALUE:%.*]], i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 [[TMP2]], i64 10000)
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP3]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *memset_10000(void *dst, int value) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, value, 10000);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: @memset_n(
|
|
|
|
// CHECK-NEXT: entry:
|
|
|
|
// CHECK-NEXT: [[DST_ADDR:%.*]] = alloca i8*, align 8
|
|
|
|
// CHECK-NEXT: [[VALUE_ADDR:%.*]] = alloca i32, align 4
|
|
|
|
// CHECK-NEXT: [[SIZE_ADDR:%.*]] = alloca i64, align 8
|
|
|
|
// CHECK-NEXT: store i8* [[DST:%.*]], i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: store i32 [[VALUE:%.*]], i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: store i64 [[SIZE:%.*]], i64* [[SIZE_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[DST_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[VALUE_ADDR]], align 4
|
|
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* [[SIZE_ADDR]], align 8
|
|
|
|
// CHECK-NEXT: [[TMP3:%.*]] = trunc i32 [[TMP1]] to i8
|
|
|
|
// CHECK-NEXT: [[TMP4:%.*]] = call i8* @llvm.aarch64.mops.memset.tag(i8* [[TMP0]], i8 [[TMP3]], i64 [[TMP2]])
|
|
|
|
// CHECK-NEXT: ret i8* [[TMP4]]
|
2022-02-09 08:08:18 +08:00
|
|
|
//
|
2022-01-18 22:12:03 +08:00
|
|
|
void *memset_n(void *dst, int value, size_t size) {
|
2022-02-09 08:08:18 +08:00
|
|
|
return __arm_mops_memset_tag(dst, value, size);
|
2022-01-18 22:12:03 +08:00
|
|
|
}
|