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 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 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