| // REQUIRES: systemz-registered-target | |
| // RUN: %clang_cc1 -target-cpu zEC12 -triple s390x-ibm-linux -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s | |
| // RUN: %clang_cc1 -target-cpu zEC12 -triple s390x-ibm-linux -Wall -Wno-unused -Werror -emit-llvm -x c++ %s -o - | FileCheck %s | |
| #include <stdint.h> | |
| #include <htmintrin.h> | |
| int global = 0; | |
| uint64_t g; | |
| struct __htm_tdb global_tdb; | |
| void test_htm1(struct __htm_tdb *tdb, int reg, int *mem, uint64_t *mem64) { | |
| // CHECK-LABEL: test_htm1 | |
| __builtin_tbegin ((void *)0); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr null, i32 65292) | |
| __builtin_tbegin ((void *)0x12345678); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr inttoptr (i64 305419896 to ptr), i32 65292) | |
| __builtin_tbegin (tdb); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292) | |
| __builtin_tbegin (&global_tdb); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr @global_tdb, i32 65292) | |
| __builtin_tbegin_nofloat ((void *)0); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr null, i32 65292) | |
| __builtin_tbegin_nofloat ((void *)0x12345678); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr inttoptr (i64 305419896 to ptr), i32 65292) | |
| __builtin_tbegin_nofloat (tdb); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292) | |
| __builtin_tbegin_nofloat (&global_tdb); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr @global_tdb, i32 65292) | |
| __builtin_tbegin_retry ((void *)0, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr null, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbegin_retry ((void *)0x12345678, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbegin_retry (tdb, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbegin_retry (&global_tdb, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin(ptr %{{.*}}, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbegin_retry_nofloat ((void *)0, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr null, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbegin_retry_nofloat ((void *)0x12345678, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbegin_retry_nofloat (tdb, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbegin_retry_nofloat (&global_tdb, 6); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292) | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tbeginc (); | |
| // CHECK: call void @llvm.s390.tbeginc(ptr null, i32 65288) | |
| __builtin_tabort (256); | |
| // CHECK: call void @llvm.s390.tabort(i64 256) | |
| __builtin_tabort (-1); | |
| // CHECK: call void @llvm.s390.tabort(i64 -1) | |
| __builtin_tabort (reg); | |
| // CHECK: call void @llvm.s390.tabort(i64 %{{.*}}) | |
| __builtin_tend(); | |
| // CHECK: call i32 @llvm.s390.tend() | |
| int n = __builtin_tx_nesting_depth(); | |
| // CHECK: call i32 @llvm.s390.etnd() | |
| __builtin_non_tx_store (mem64, 0); | |
| // CHECK: call void @llvm.s390.ntstg(i64 0, ptr %{{.*}}) | |
| const uint64_t val_var = 0x1122334455667788; | |
| __builtin_non_tx_store (mem64, val_var); | |
| // CHECK: call void @llvm.s390.ntstg(i64 1234605616436508552, ptr %{{.*}}) | |
| __builtin_non_tx_store (mem64, (uint64_t)reg); | |
| // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr %{{.*}}) | |
| __builtin_non_tx_store (mem64, g); | |
| // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr %{{.*}}) | |
| __builtin_non_tx_store ((uint64_t *)0, 0); | |
| // CHECK: call void @llvm.s390.ntstg(i64 0, ptr null) | |
| __builtin_non_tx_store ((uint64_t *)0x12345678, 0); | |
| // CHECK: call void @llvm.s390.ntstg(i64 0, ptr inttoptr (i64 305419896 to ptr)) | |
| __builtin_non_tx_store (&g, 23); | |
| // CHECK: call void @llvm.s390.ntstg(i64 23, ptr @g) | |
| __builtin_non_tx_store (&g, reg); | |
| // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr @g) | |
| __builtin_non_tx_store (&g, *mem); | |
| // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr @g) | |
| __builtin_non_tx_store (&g, global); | |
| // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr @g) | |
| __builtin_tx_assist (0); | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 0) | |
| __builtin_tx_assist (1); | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 1) | |
| __builtin_tx_assist (reg); | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tx_assist (*mem); | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| __builtin_tx_assist (global); | |
| // CHECK: call void @llvm.s390.ppa.txassist(i32 %{{.*}}) | |
| } | |
| #include <htmxlintrin.h> | |
| void test_htmxl1(void) { | |
| // CHECK-LABEL: test_htmxl1 | |
| struct __htm_tdb tdb_struct; | |
| void * const tdb = &tdb_struct; | |
| long result; | |
| unsigned char code; | |
| result = __TM_simple_begin (); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr null, i32 65292) | |
| result = __TM_begin (tdb); | |
| // CHECK: call i32 @llvm.s390.tbegin.nofloat(ptr %{{.*}}, i32 65292) | |
| result = __TM_end (); | |
| // CHECK: call i32 @llvm.s390.tend() | |
| __TM_abort (); | |
| // CHECK: call void @llvm.s390.tabort(i64 256) | |
| __TM_named_abort (42); | |
| // CHECK: call void @llvm.s390.tabort(i64 %{{.*}}) | |
| __TM_non_transactional_store (&g, 42); | |
| // CHECK: call void @llvm.s390.ntstg(i64 %{{.*}}, ptr %{{.*}}) | |
| result = __TM_nesting_depth (tdb); | |
| // CHECK: call i32 @llvm.s390.etnd() | |
| result = __TM_is_user_abort (tdb); | |
| result = __TM_is_named_user_abort (tdb, &code); | |
| result = __TM_is_illegal (tdb); | |
| result = __TM_is_footprint_exceeded (tdb); | |
| result = __TM_is_nested_too_deep (tdb); | |
| result = __TM_is_conflict (tdb); | |
| result = __TM_is_failure_persistent (result); | |
| result = __TM_failure_address (tdb); | |
| result = __TM_failure_code (tdb); | |
| } | |
| void test_eh_return_data_regno() { | |
| volatile int res; | |
| res = __builtin_eh_return_data_regno(0); // CHECK: store volatile i32 6 | |
| res = __builtin_eh_return_data_regno(1); // CHECK: store volatile i32 7 | |
| res = __builtin_eh_return_data_regno(2); // CHECK: store volatile i32 8 | |
| res = __builtin_eh_return_data_regno(3); // CHECK: store volatile i32 9 | |
| } |