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
8int global = 0;
9uint64_t g;
10struct __htm_tdb global_tdb;
11
12void 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
111void 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