// REQUIRES: powerpc-registered-target // RUN: %clang_cc1 -triple powerpc64-unknown-linux-gnu \ // RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s // RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu \ // RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s // RUN: %clang_cc1 -triple powerpc64-unknown-aix \ // RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s // RUN: %clang_cc1 -triple powerpc-unknown-linux-gnu \ // RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s // RUN: %clang_cc1 -triple powerpcle-unknown-linux-gnu \ // RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s // RUN: %clang_cc1 -triple powerpc-unknown-aix \ // RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s // All of these cipher builtins are only for Power 8 and up. // CHECK-LABEL: @testvcipher( // CHECK: [[TMP4:%.*]] = call <2 x i64> @llvm.ppc.altivec.crypto.vcipher // CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i64> [[TMP4]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP5]] // vector unsigned char testvcipher(vector unsigned char state_array, vector unsigned char round_key) { return __vcipher(state_array, round_key); } // CHECK-LABEL: @testvcipherlast( // CHECK: [[TMP4:%.*]] = call <2 x i64> @llvm.ppc.altivec.crypto.vcipherlast // CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i64> [[TMP4]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP5]] // vector unsigned char testvcipherlast(vector unsigned char state_array, vector unsigned char round_key) { return __vcipherlast(state_array, round_key); } // CHECK-LABEL: @testvncipher( // CHECK: [[TMP4:%.*]] = call <2 x i64> @llvm.ppc.altivec.crypto.vncipher // CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i64> [[TMP4]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP5]] // vector unsigned char testvncipher(vector unsigned char state_array, vector unsigned char round_key) { return __vncipher(state_array, round_key); } // CHECK-LABEL: @testvncipherlast( // CHECK: [[TMP4:%.*]] = call <2 x i64> @llvm.ppc.altivec.crypto.vncipherlast // CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i64> [[TMP4]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP5]] // vector unsigned char testvncipherlast(vector unsigned char state_array, vector unsigned char round_key) { return __vncipherlast(state_array, round_key); } // CHECK-LABEL: @testvpermxor( // CHECK: [[TMP3:%.*]] = call <16 x i8> @llvm.ppc.altivec.crypto.vpermxor // CHECK-NEXT: ret <16 x i8> [[TMP3]] // vector unsigned char testvpermxor(vector unsigned char a, vector unsigned char b, vector unsigned char mask) { return __vpermxor(a, b, mask); } // CHECK-LABEL: @testvpmsumb( // CHECK: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.altivec.crypto.vpmsumb // CHECK-NEXT: ret <16 x i8> [[TMP2]] // vector unsigned char testvpmsumb(vector unsigned char a, vector unsigned char b) { return __vpmsumb(a, b); } // CHECK-LABEL: @testvpmsumd( // CHECK: [[TMP2:%.*]] = call <2 x i64> @llvm.ppc.altivec.crypto.vpmsumd // CHECK-NEXT: ret <2 x i64> [[TMP2]] // vector unsigned long long testvpmsumd(vector unsigned long long a, vector unsigned long long b) { return __vpmsumd(a, b); } // CHECK-LABEL: @testvpmsumh( // CHECK: [[TMP2:%.*]] = call <8 x i16> @llvm.ppc.altivec.crypto.vpmsumh // CHECK-NEXT: ret <8 x i16> [[TMP2]] // vector unsigned short testvpmsumh(vector unsigned short a, vector unsigned short b) { return __vpmsumh(a, b); } // CHECK-LABEL: @testvpmsumw( // CHECK: [[TMP2:%.*]] = call <4 x i32> @llvm.ppc.altivec.crypto.vpmsumw // CHECK-NEXT: ret <4 x i32> [[TMP2]] // vector unsigned int testvpmsumw(vector unsigned int a, vector unsigned int b) { return __vpmsumw(a, b); }