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