xref: /aosp_15_r20/external/clang/test/CodeGen/builtins-systemz.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // REQUIRES: systemz-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 -target-cpu zEC12 -triple s390x-ibm-linux -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -target-cpu zEC12 -triple s390x-ibm-linux -Wall -Wno-unused -Werror -emit-llvm -x c++ %s -o - | FileCheck %s
4*67e74705SXin Li 
5*67e74705SXin Li #include <stdint.h>
6*67e74705SXin Li #include <htmintrin.h>
7*67e74705SXin Li 
8*67e74705SXin Li int global = 0;
9*67e74705SXin Li uint64_t g;
10*67e74705SXin Li struct __htm_tdb global_tdb;
11*67e74705SXin Li 
test_htm1(struct __htm_tdb * tdb,int reg,int * mem,uint64_t * mem64)12*67e74705SXin Li void test_htm1(struct __htm_tdb *tdb, int reg, int *mem, uint64_t *mem64) {
13*67e74705SXin Li // CHECK-LABEL: test_htm1
14*67e74705SXin Li 
15*67e74705SXin Li   __builtin_tbegin ((void *)0);
16*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* null, i32 65292)
17*67e74705SXin Li   __builtin_tbegin ((void *)0x12345678);
18*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* inttoptr (i64 305419896 to i8*), i32 65292)
19*67e74705SXin Li   __builtin_tbegin (tdb);
20*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* %{{.*}}, i32 65292)
21*67e74705SXin Li   __builtin_tbegin (&global_tdb);
22*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* getelementptr inbounds (%struct.__htm_tdb, %struct.__htm_tdb* @global_tdb, i32 0, i32 0), i32 65292)
23*67e74705SXin Li 
24*67e74705SXin Li   __builtin_tbegin_nofloat ((void *)0);
25*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* null, i32 65292)
26*67e74705SXin Li   __builtin_tbegin_nofloat ((void *)0x12345678);
27*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* inttoptr (i64 305419896 to i8*), i32 65292)
28*67e74705SXin Li   __builtin_tbegin_nofloat (tdb);
29*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* %{{.*}}, i32 65292)
30*67e74705SXin Li   __builtin_tbegin_nofloat (&global_tdb);
31*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* getelementptr inbounds (%struct.__htm_tdb, %struct.__htm_tdb* @global_tdb, i32 0, i32 0), i32 65292)
32*67e74705SXin Li 
33*67e74705SXin Li   __builtin_tbegin_retry ((void *)0, 6);
34*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* null, i32 65292)
35*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
36*67e74705SXin Li   __builtin_tbegin_retry ((void *)0x12345678, 6);
37*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* %{{.*}}, i32 65292)
38*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
39*67e74705SXin Li   __builtin_tbegin_retry (tdb, 6);
40*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* %{{.*}}, i32 65292)
41*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
42*67e74705SXin Li   __builtin_tbegin_retry (&global_tdb, 6);
43*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin(i8* %{{.*}}, i32 65292)
44*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
45*67e74705SXin Li 
46*67e74705SXin Li   __builtin_tbegin_retry_nofloat ((void *)0, 6);
47*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* null, i32 65292)
48*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
49*67e74705SXin Li   __builtin_tbegin_retry_nofloat ((void *)0x12345678, 6);
50*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* %{{.*}}, i32 65292)
51*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
52*67e74705SXin Li   __builtin_tbegin_retry_nofloat (tdb, 6);
53*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* %{{.*}}, i32 65292)
54*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
55*67e74705SXin Li   __builtin_tbegin_retry_nofloat (&global_tdb, 6);
56*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* %{{.*}}, i32 65292)
57*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
58*67e74705SXin Li 
59*67e74705SXin Li   __builtin_tbeginc ();
60*67e74705SXin Li // CHECK: call void @llvm.s390.tbeginc(i8* null, i32 65288)
61*67e74705SXin Li 
62*67e74705SXin Li   __builtin_tabort (256);
63*67e74705SXin Li // CHECK: call void @llvm.s390.tabort(i64 256)
64*67e74705SXin Li   __builtin_tabort (-1);
65*67e74705SXin Li // CHECK: call void @llvm.s390.tabort(i64 -1)
66*67e74705SXin Li   __builtin_tabort (reg);
67*67e74705SXin Li // CHECK: call void @llvm.s390.tabort(i64 %{{.*}})
68*67e74705SXin Li 
69*67e74705SXin Li   __builtin_tend();
70*67e74705SXin Li // CHECK: call i32 @llvm.s390.tend()
71*67e74705SXin Li 
72*67e74705SXin Li   int n = __builtin_tx_nesting_depth();
73*67e74705SXin Li // CHECK: call i32 @llvm.s390.etnd()
74*67e74705SXin Li 
75*67e74705SXin Li   __builtin_non_tx_store (mem64, 0);
76*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 0, i64* %{{.*}})
77*67e74705SXin Li   const uint64_t val_var = 0x1122334455667788;
78*67e74705SXin Li   __builtin_non_tx_store (mem64, val_var);
79*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 1234605616436508552, i64* %{{.*}})
80*67e74705SXin Li   __builtin_non_tx_store (mem64, (uint64_t)reg);
81*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, i64* %{{.*}})
82*67e74705SXin Li   __builtin_non_tx_store (mem64, g);
83*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, i64* %{{.*}})
84*67e74705SXin Li   __builtin_non_tx_store ((uint64_t *)0, 0);
85*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 0, i64* null)
86*67e74705SXin Li   __builtin_non_tx_store ((uint64_t *)0x12345678, 0);
87*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 0, i64* inttoptr (i64 305419896 to i64*))
88*67e74705SXin Li   __builtin_non_tx_store (&g, 23);
89*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 23, i64* @g)
90*67e74705SXin Li   __builtin_non_tx_store (&g, reg);
91*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, i64* @g)
92*67e74705SXin Li   __builtin_non_tx_store (&g, *mem);
93*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, i64* @g)
94*67e74705SXin Li   __builtin_non_tx_store (&g, global);
95*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, i64* @g)
96*67e74705SXin Li 
97*67e74705SXin Li   __builtin_tx_assist (0);
98*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 0)
99*67e74705SXin Li   __builtin_tx_assist (1);
100*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 1)
101*67e74705SXin Li   __builtin_tx_assist (reg);
102*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
103*67e74705SXin Li   __builtin_tx_assist (*mem);
104*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
105*67e74705SXin Li   __builtin_tx_assist (global);
106*67e74705SXin Li // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}})
107*67e74705SXin Li }
108*67e74705SXin Li 
109*67e74705SXin Li #include <htmxlintrin.h>
110*67e74705SXin Li 
test_htmxl1(void)111*67e74705SXin Li void test_htmxl1(void) {
112*67e74705SXin Li // CHECK-LABEL: test_htmxl1
113*67e74705SXin Li 
114*67e74705SXin Li   struct __htm_tdb tdb_struct;
115*67e74705SXin Li   void * const tdb = &tdb_struct;
116*67e74705SXin Li   long result;
117*67e74705SXin Li   unsigned char code;
118*67e74705SXin Li 
119*67e74705SXin Li   result = __TM_simple_begin ();
120*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* null, i32 65292)
121*67e74705SXin Li   result = __TM_begin (tdb);
122*67e74705SXin Li // CHECK: call i32 @llvm.s390.tbegin.nofloat(i8* %{{.*}}, i32 65292)
123*67e74705SXin Li   result = __TM_end ();
124*67e74705SXin Li // CHECK: call i32 @llvm.s390.tend()
125*67e74705SXin Li   __TM_abort ();
126*67e74705SXin Li // CHECK: call void @llvm.s390.tabort(i64 256)
127*67e74705SXin Li   __TM_named_abort (42);
128*67e74705SXin Li // CHECK: call void @llvm.s390.tabort(i64 %{{.*}})
129*67e74705SXin Li   __TM_non_transactional_store (&g, 42);
130*67e74705SXin Li // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, i64* %{{.*}})
131*67e74705SXin Li   result = __TM_nesting_depth (tdb);
132*67e74705SXin Li // CHECK: call i32 @llvm.s390.etnd()
133*67e74705SXin Li 
134*67e74705SXin Li   result = __TM_is_user_abort (tdb);
135*67e74705SXin Li   result = __TM_is_named_user_abort (tdb, &code);
136*67e74705SXin Li   result = __TM_is_illegal (tdb);
137*67e74705SXin Li   result = __TM_is_footprint_exceeded (tdb);
138*67e74705SXin Li   result = __TM_is_nested_too_deep (tdb);
139*67e74705SXin Li   result = __TM_is_conflict (tdb);
140*67e74705SXin Li   result = __TM_is_failure_persistent (result);
141*67e74705SXin Li   result = __TM_failure_address (tdb);
142*67e74705SXin Li   result = __TM_failure_code (tdb);
143*67e74705SXin Li }
144*67e74705SXin Li 
145