xref: /llvm-project/clang/test/CodeGen/AArch64/gcs.c (revision 207e5ccceec8d3cc3f32723e78f2a142bc61b07d)
1*207e5cccSFangrui Song // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2
2*207e5cccSFangrui Song // RUN: %clang_cc1 -triple aarch64-eabi -target-feature +gcs -emit-llvm %s -o - | FileCheck %s
3*207e5cccSFangrui Song 
4*207e5cccSFangrui Song #include <arm_acle.h>
5*207e5cccSFangrui Song 
6*207e5cccSFangrui Song // CHECK-LABEL: define dso_local i64 @test_chkfeat
7*207e5cccSFangrui Song // CHECK-SAME: () #[[ATTR0:[0-9]+]] {
8*207e5cccSFangrui Song // CHECK-NEXT:  entry:
9*207e5cccSFangrui Song // CHECK-NEXT:    [[__FEATURES_ADDR_I:%.*]] = alloca i64, align 8
10*207e5cccSFangrui Song // CHECK-NEXT:    store i64 1, ptr [[__FEATURES_ADDR_I]], align 8
11*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[__FEATURES_ADDR_I]], align 8
12*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.aarch64.chkfeat(i64 [[TMP0]])
13*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP2:%.*]] = load i64, ptr [[__FEATURES_ADDR_I]], align 8
14*207e5cccSFangrui Song // CHECK-NEXT:    [[XOR_I:%.*]] = xor i64 [[TMP1]], [[TMP2]]
15*207e5cccSFangrui Song // CHECK-NEXT:    ret i64 [[XOR_I]]
16*207e5cccSFangrui Song //
17*207e5cccSFangrui Song uint64_t test_chkfeat() {
18*207e5cccSFangrui Song   return __chkfeat(_CHKFEAT_GCS);
19*207e5cccSFangrui Song }
20*207e5cccSFangrui Song 
21*207e5cccSFangrui Song // CHECK-LABEL: define dso_local ptr @test_gcspr
22*207e5cccSFangrui Song // CHECK-SAME: () #[[ATTR0]] {
23*207e5cccSFangrui Song // CHECK-NEXT:  entry:
24*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.read_volatile_register.i64(metadata [[META2:![0-9]+]])
25*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP1:%.*]] = inttoptr i64 [[TMP0]] to ptr
26*207e5cccSFangrui Song // CHECK-NEXT:    ret ptr [[TMP1]]
27*207e5cccSFangrui Song //
28*207e5cccSFangrui Song void *test_gcspr() {
29*207e5cccSFangrui Song   return __gcspr();
30*207e5cccSFangrui Song }
31*207e5cccSFangrui Song 
32*207e5cccSFangrui Song // CHECK-LABEL: define dso_local i64 @test_gcspopm
33*207e5cccSFangrui Song // CHECK-SAME: () #[[ATTR0]] {
34*207e5cccSFangrui Song // CHECK-NEXT:  entry:
35*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP0:%.*]] = call i64 @llvm.aarch64.gcspopm(i64 0)
36*207e5cccSFangrui Song // CHECK-NEXT:    ret i64 [[TMP0]]
37*207e5cccSFangrui Song //
38*207e5cccSFangrui Song uint64_t test_gcspopm() {
39*207e5cccSFangrui Song   return __gcspopm();
40*207e5cccSFangrui Song }
41*207e5cccSFangrui Song 
42*207e5cccSFangrui Song // CHECK-LABEL: define dso_local ptr @test_gcsss
43*207e5cccSFangrui Song // CHECK-SAME: (ptr noundef [[P:%.*]]) #[[ATTR0]] {
44*207e5cccSFangrui Song // CHECK-NEXT:  entry:
45*207e5cccSFangrui Song // CHECK-NEXT:    [[__STACK_ADDR_I:%.*]] = alloca ptr, align 8
46*207e5cccSFangrui Song // CHECK-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
47*207e5cccSFangrui Song // CHECK-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
48*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
49*207e5cccSFangrui Song // CHECK-NEXT:    store ptr [[TMP0]], ptr [[__STACK_ADDR_I]], align 8
50*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[__STACK_ADDR_I]], align 8
51*207e5cccSFangrui Song // CHECK-NEXT:    [[TMP2:%.*]] = call ptr @llvm.aarch64.gcsss(ptr [[TMP1]])
52*207e5cccSFangrui Song // CHECK-NEXT:    ret ptr [[TMP2]]
53*207e5cccSFangrui Song //
54*207e5cccSFangrui Song const void *test_gcsss(const void *p) {
55*207e5cccSFangrui Song   return __gcsss(p);
56*207e5cccSFangrui Song }
57