Home | History | Annotate | Download | only in CodeGen
      1 // REQUIRES: powerpc-registered-target
      2 // RUN: %clang_cc1 -faltivec -triple powerpc64le-unknown-unknown \
      3 // RUN: -target-feature +crypto -target-feature +power8-vector \
      4 // RUN: -emit-llvm %s -o - | FileCheck %s
      5 
      6 // RUN: %clang_cc1 -faltivec -triple powerpc64-unknown-unknown \
      7 // RUN: -target-feature +crypto -target-feature +power8-vector \
      8 // RUN: -emit-llvm %s -o - | FileCheck %s
      9 #include <altivec.h>
     10 #define B_INIT1 { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, \
     11                   0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 };
     12 #define B_INIT2 { 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, \
     13                   0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x70 };
     14 #define H_INIT1 { 0x0102, 0x0304, 0x0506, 0x0708, \
     15                   0x090A, 0x0B0C, 0x0D0E, 0x0F10 };
     16 #define H_INIT2 { 0x7172, 0x7374, 0x7576, 0x7778, \
     17                   0x797A, 0x7B7C, 0x7D7E, 0x7F70 };
     18 #define W_INIT1 { 0x01020304, 0x05060708, \
     19                   0x090A0B0C, 0x0D0E0F10 };
     20 #define W_INIT2 { 0x71727374, 0x75767778, \
     21                   0x797A7B7C, 0x7D7E7F70 };
     22 #define D_INIT1 { 0x0102030405060708, \
     23                   0x090A0B0C0D0E0F10 };
     24 #define D_INIT2 { 0x7172737475767778, \
     25                   0x797A7B7C7D7E7F70 };
     26 
     27 // CHECK-LABEL: define <16 x i8> @test_vpmsumb
     28 vector unsigned char test_vpmsumb(void)
     29 {
     30   vector unsigned char a = B_INIT1
     31   vector unsigned char b = B_INIT2
     32   return __builtin_altivec_crypto_vpmsumb(a, b);
     33 // CHECK: @llvm.ppc.altivec.crypto.vpmsumb
     34 }
     35 
     36 // CHECK-LABEL: define <8 x i16> @test_vpmsumh
     37 vector unsigned short test_vpmsumh(void)
     38 {
     39   vector unsigned short a = H_INIT1
     40   vector unsigned short b = H_INIT2
     41   return __builtin_altivec_crypto_vpmsumh(a, b);
     42 // CHECK: @llvm.ppc.altivec.crypto.vpmsumh
     43 }
     44 
     45 // CHECK-LABEL: define <4 x i32> @test_vpmsumw
     46 vector unsigned int test_vpmsumw(void)
     47 {
     48   vector unsigned int a = W_INIT1
     49   vector unsigned int b = W_INIT2
     50   return __builtin_altivec_crypto_vpmsumw(a, b);
     51 // CHECK: @llvm.ppc.altivec.crypto.vpmsumw
     52 }
     53 
     54 // CHECK-LABEL: define <2 x i64> @test_vpmsumd
     55 vector unsigned long long test_vpmsumd(void)
     56 {
     57   vector unsigned long long a = D_INIT1
     58   vector unsigned long long b = D_INIT2
     59   return __builtin_altivec_crypto_vpmsumd(a, b);
     60 // CHECK: @llvm.ppc.altivec.crypto.vpmsumd
     61 }
     62 
     63 // CHECK-LABEL: define <2 x i64> @test_vsbox
     64 vector unsigned long long test_vsbox(void)
     65 {
     66   vector unsigned long long a = D_INIT1
     67   return __builtin_altivec_crypto_vsbox(a);
     68 // CHECK: @llvm.ppc.altivec.crypto.vsbox
     69 }
     70 
     71 // CHECK-LABEL: define <16 x i8> @test_vpermxorb
     72 vector unsigned char test_vpermxorb(void)
     73 {
     74   vector unsigned char a = B_INIT1
     75   vector unsigned char b = B_INIT2
     76   vector unsigned char c = B_INIT2
     77   return __builtin_altivec_crypto_vpermxor(a, b, c);
     78 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
     79 }
     80 
     81 // CHECK-LABEL: define <8 x i16> @test_vpermxorh
     82 vector unsigned short test_vpermxorh(void)
     83 {
     84   vector unsigned short a = H_INIT1
     85   vector unsigned short b = H_INIT2
     86   vector unsigned short c = H_INIT2
     87   return __builtin_altivec_crypto_vpermxor(a, b, c);
     88 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
     89 }
     90 
     91 // CHECK-LABEL: define <4 x i32> @test_vpermxorw
     92 vector unsigned int test_vpermxorw(void)
     93 {
     94   vector unsigned int a = W_INIT1
     95   vector unsigned int b = W_INIT2
     96   vector unsigned int c = W_INIT2
     97   return __builtin_altivec_crypto_vpermxor(a, b, c);
     98 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
     99 }
    100 
    101 // CHECK-LABEL: define <2 x i64> @test_vpermxord
    102 vector unsigned long long test_vpermxord(void)
    103 {
    104   vector unsigned long long a = D_INIT1
    105   vector unsigned long long b = D_INIT2
    106   vector unsigned long long c = D_INIT2
    107   return __builtin_altivec_crypto_vpermxor(a, b, c);
    108 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
    109 }
    110 
    111 // CHECK-LABEL: define <2 x i64> @test_vcipher
    112 vector unsigned long long test_vcipher(void)
    113 {
    114   vector unsigned long long a = D_INIT1
    115   vector unsigned long long b = D_INIT2
    116   return __builtin_altivec_crypto_vcipher(a, b);
    117 // CHECK: @llvm.ppc.altivec.crypto.vcipher
    118 }
    119 
    120 // CHECK-LABEL: define <2 x i64> @test_vcipherlast
    121 vector unsigned long long test_vcipherlast(void)
    122 {
    123   vector unsigned long long a = D_INIT1
    124   vector unsigned long long b = D_INIT2
    125   return __builtin_altivec_crypto_vcipherlast(a, b);
    126 // CHECK: @llvm.ppc.altivec.crypto.vcipherlast
    127 }
    128 
    129 // CHECK-LABEL: @test_vncipher
    130 vector unsigned long long test_vncipher(void)
    131 {
    132   vector unsigned long long a = D_INIT1
    133   vector unsigned long long b = D_INIT2
    134   return __builtin_altivec_crypto_vncipher(a, b);
    135 // CHECK: @llvm.ppc.altivec.crypto.vncipher
    136 }
    137 
    138 // CHECK-LABEL: define <2 x i64> @test_vncipherlast
    139 vector unsigned long long test_vncipherlast(void)
    140 {
    141   vector unsigned long long a = D_INIT1
    142   vector unsigned long long b = D_INIT2
    143   return __builtin_altivec_crypto_vncipherlast(a, b);
    144 // CHECK: @llvm.ppc.altivec.crypto.vncipherlast
    145 }
    146 
    147 // CHECK-LABEL: define <4 x i32> @test_vshasigmaw
    148 vector unsigned int test_vshasigmaw(void)
    149 {
    150   vector unsigned int a = W_INIT1
    151   return __builtin_altivec_crypto_vshasigmaw(a, 1, 15);
    152 // CHECK: @llvm.ppc.altivec.crypto.vshasigmaw
    153 }
    154 
    155 // CHECK-LABEL: define <2 x i64> @test_vshasigmad
    156 vector unsigned long long test_vshasigmad(void)
    157 {
    158   vector unsigned long long a = D_INIT2
    159   return __builtin_altivec_crypto_vshasigmad(a, 1, 15);
    160 // CHECK: @llvm.ppc.altivec.crypto.vshasigmad
    161 }
    162 
    163 // Test cases for the builtins the way they are exposed to
    164 // users through altivec.h
    165 // CHECK-LABEL: define <16 x i8> @test_vpmsumb_e
    166 vector unsigned char test_vpmsumb_e(void)
    167 {
    168   vector unsigned char a = B_INIT1
    169   vector unsigned char b = B_INIT2
    170   return __builtin_crypto_vpmsumb(a, b);
    171 // CHECK: @llvm.ppc.altivec.crypto.vpmsumb
    172 }
    173 
    174 // CHECK-LABEL: define <8 x i16> @test_vpmsumh_e
    175 vector unsigned short test_vpmsumh_e(void)
    176 {
    177   vector unsigned short a = H_INIT1
    178   vector unsigned short b = H_INIT2
    179   return __builtin_crypto_vpmsumb(a, b);
    180 // CHECK: @llvm.ppc.altivec.crypto.vpmsumh
    181 }
    182 
    183 // CHECK-LABEL: define <4 x i32> @test_vpmsumw_e
    184 vector unsigned int test_vpmsumw_e(void)
    185 {
    186   vector unsigned int a = W_INIT1
    187   vector unsigned int b = W_INIT2
    188   return __builtin_crypto_vpmsumb(a, b);
    189 // CHECK: @llvm.ppc.altivec.crypto.vpmsumw
    190 }
    191 
    192 // CHECK-LABEL: define <2 x i64> @test_vpmsumd_e
    193 vector unsigned long long test_vpmsumd_e(void)
    194 {
    195   vector unsigned long long a = D_INIT1
    196   vector unsigned long long b = D_INIT2
    197   return __builtin_crypto_vpmsumb(a, b);
    198 // CHECK: @llvm.ppc.altivec.crypto.vpmsumd
    199 }
    200 
    201 // CHECK-LABEL: define <2 x i64> @test_vsbox_e
    202 vector unsigned long long test_vsbox_e(void)
    203 {
    204   vector unsigned long long a = D_INIT1
    205   return __builtin_crypto_vsbox(a);
    206 // CHECK: @llvm.ppc.altivec.crypto.vsbox
    207 }
    208 
    209 // CHECK-LABEL: define <16 x i8> @test_vpermxorb_e
    210 vector unsigned char test_vpermxorb_e(void)
    211 {
    212   vector unsigned char a = B_INIT1
    213   vector unsigned char b = B_INIT2
    214   vector unsigned char c = B_INIT2
    215   return __builtin_crypto_vpermxor(a, b, c);
    216 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
    217 }
    218 
    219 // CHECK-LABEL: define <8 x i16> @test_vpermxorh_e
    220 vector unsigned short test_vpermxorh_e(void)
    221 {
    222   vector unsigned short a = H_INIT1
    223   vector unsigned short b = H_INIT2
    224   vector unsigned short c = H_INIT2
    225   return __builtin_crypto_vpermxor(a, b, c);
    226 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
    227 }
    228 
    229 // CHECK-LABEL: define <4 x i32> @test_vpermxorw_e
    230 vector unsigned int test_vpermxorw_e(void)
    231 {
    232   vector unsigned int a = W_INIT1
    233   vector unsigned int b = W_INIT2
    234   vector unsigned int c = W_INIT2
    235   return __builtin_crypto_vpermxor(a, b, c);
    236 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
    237 }
    238 
    239 // CHECK-LABEL: define <2 x i64> @test_vpermxord_e
    240 vector unsigned long long test_vpermxord_e(void)
    241 {
    242   vector unsigned long long a = D_INIT1
    243   vector unsigned long long b = D_INIT2
    244   vector unsigned long long c = D_INIT2
    245   return __builtin_crypto_vpermxor(a, b, c);
    246 // CHECK: @llvm.ppc.altivec.crypto.vpermxor
    247 }
    248 
    249 // CHECK-LABEL: define <2 x i64> @test_vcipher_e
    250 vector unsigned long long test_vcipher_e(void)
    251 {
    252   vector unsigned long long a = D_INIT1
    253   vector unsigned long long b = D_INIT2
    254   return __builtin_crypto_vcipher(a, b);
    255 // CHECK: @llvm.ppc.altivec.crypto.vcipher
    256 }
    257 
    258 // CHECK-LABEL: define <2 x i64> @test_vcipherlast_e
    259 vector unsigned long long test_vcipherlast_e(void)
    260 {
    261   vector unsigned long long a = D_INIT1
    262   vector unsigned long long b = D_INIT2
    263   return __builtin_crypto_vcipherlast(a, b);
    264 // CHECK: @llvm.ppc.altivec.crypto.vcipherlast
    265 }
    266 
    267 // CHECK-LABEL: define <2 x i64> @test_vncipher_e
    268 vector unsigned long long test_vncipher_e(void)
    269 {
    270   vector unsigned long long a = D_INIT1
    271   vector unsigned long long b = D_INIT2
    272   return __builtin_crypto_vncipher(a, b);
    273 // CHECK: @llvm.ppc.altivec.crypto.vncipher
    274 }
    275 
    276 // CHECK-LABEL: define <2 x i64> @test_vncipherlast_e
    277 vector unsigned long long test_vncipherlast_e(void)
    278 {
    279   vector unsigned long long a = D_INIT1
    280   vector unsigned long long b = D_INIT2
    281   return __builtin_crypto_vncipherlast(a, b);
    282 // CHECK: @llvm.ppc.altivec.crypto.vncipherlast
    283 }
    284 
    285 // CHECK-LABEL: define <4 x i32> @test_vshasigmaw_e
    286 vector unsigned int test_vshasigmaw_e(void)
    287 {
    288   vector unsigned int a = W_INIT1
    289   return __builtin_crypto_vshasigmaw(a, 1, 15);
    290 // CHECK: @llvm.ppc.altivec.crypto.vshasigmaw
    291 }
    292 
    293 // CHECK-LABEL: define <2 x i64> @test_vshasigmad_e
    294 vector unsigned long long test_vshasigmad_e(void)
    295 {
    296   vector unsigned long long a = D_INIT2
    297   return __builtin_crypto_vshasigmad(a, 0, 15);
    298 // CHECK: @llvm.ppc.altivec.crypto.vshasigmad
    299 }
    300 
    301 // CHECK-LABEL: @test_vec_sbox_be
    302 vector unsigned char test_vec_sbox_be(void)
    303 {
    304   vector unsigned char a = B_INIT1
    305   return vec_sbox_be(a);
    306 // CHECK: @llvm.ppc.altivec.crypto.vsbox
    307 }
    308 
    309 // CHECK-LABEL: @test_vec_cipher_be
    310 vector unsigned char test_vec_cipher_be(void)
    311 {
    312   vector unsigned char a = B_INIT1
    313   vector unsigned char b = B_INIT2
    314   return vec_cipher_be(a, b);
    315 // CHECK: @llvm.ppc.altivec.crypto.vcipher
    316 }
    317 
    318 // CHECK-LABEL: @test_vec_cipherlast_be
    319 vector unsigned char test_vec_cipherlast_be(void)
    320 {
    321   vector unsigned char a = B_INIT1
    322   vector unsigned char b = B_INIT2
    323   return vec_cipherlast_be(a, b);
    324 // CHECK: @llvm.ppc.altivec.crypto.vcipherlast
    325 }
    326 
    327 // CHECK-LABEL: @test_vec_ncipher_be
    328 vector unsigned char test_vec_ncipher_be(void)
    329 {
    330   vector unsigned char a = B_INIT1
    331   vector unsigned char b = B_INIT2
    332   return vec_ncipher_be(a, b);
    333 // CHECK: @llvm.ppc.altivec.crypto.vncipher
    334 }
    335 
    336 // CHECK-LABEL: @test_vec_ncipherlast_be
    337 vector unsigned char test_vec_ncipherlast_be(void)
    338 {
    339   vector unsigned char a = B_INIT1
    340   vector unsigned char b = B_INIT2
    341   return vec_ncipherlast_be(a, b);
    342 // CHECK: @llvm.ppc.altivec.crypto.vncipherlast
    343 }
    344 
    345 // CHECK-LABEL: @test_vec_shasigma_bew
    346 vector unsigned int test_vec_shasigma_bew(void)
    347 {
    348   vector unsigned int a = W_INIT1
    349   return vec_shasigma_be(a, 1, 15);
    350 // CHECK: @llvm.ppc.altivec.crypto.vshasigmaw
    351 }
    352 
    353 // CHECK-LABEL: @test_vec_shasigma_bed
    354 vector unsigned long long test_vec_shasigma_bed(void)
    355 {
    356   vector unsigned long long a = D_INIT2
    357   return vec_shasigma_be(a, 1, 15);
    358 // CHECK: @llvm.ppc.altivec.crypto.vshasigmad
    359 }
    360 
    361 // CHECK-LABEL: @test_vec_pmsum_beb
    362 vector unsigned short test_vec_pmsum_beb(void)
    363 {
    364   vector unsigned char a = B_INIT1
    365   vector unsigned char b = B_INIT2
    366   return vec_pmsum_be(a, b);
    367 // CHECK: @llvm.ppc.altivec.crypto.vpmsumb
    368 }
    369 
    370 // CHECK-LABEL: @test_vec_pmsum_beh
    371 vector unsigned int test_vec_pmsum_beh(void)
    372 {
    373   vector unsigned short a = H_INIT1
    374   vector unsigned short b = H_INIT2
    375   return vec_pmsum_be(a, b);
    376 // CHECK: @llvm.ppc.altivec.crypto.vpmsumh
    377 }
    378 
    379 // CHECK-LABEL: @test_vec_pmsum_bew
    380 vector unsigned long long test_vec_pmsum_bew(void)
    381 {
    382   vector unsigned int a = W_INIT1
    383   vector unsigned int b = W_INIT2
    384   return vec_pmsum_be(a, b);
    385 // CHECK: @llvm.ppc.altivec.crypto.vpmsumw
    386 }
    387 
    388 // CHECK-LABEL: @test_vec_pmsum_bed
    389 vector unsigned __int128 test_vec_pmsum_bed(void)
    390 {
    391   vector unsigned long long a = D_INIT1
    392   vector unsigned long long b = D_INIT2
    393   return vec_pmsum_be(a, b);
    394 // CHECK: @llvm.ppc.altivec.crypto.vpmsumd
    395 }
    396 
    397