Ulrich Weigand | 3a610eb | 2015-04-01 12:54:25 +0000 | [diff] [blame] | 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 | |