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