Home | History | Annotate | Download | only in CodeGen
      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