blob: b87fe22d776179c2749bb7f67bdd68b0031eccda [file] [log] [blame]
// RUN: %clang_cc1 %s -ffreestanding -triple=x86_64-unknown-unknown -target-feature +kl -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s
// RUN: %clang_cc1 %s -ffreestanding -triple=i386-unknown-unknown -target-feature +kl -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s
// RUN: %clang_cc1 %s -ffreestanding -triple=x86_64-unknown-unknown -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s
// RUN: %clang_cc1 %s -ffreestanding -triple=i386-unknown-unknown -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s
#include <x86intrin.h>
void test_loadiwkey(unsigned int ctl, __m128i intkey, __m128i enkey_lo, __m128i enkey_hi) {
//CHECK-LABEL: @test_loadiwkey
//CHECK: @llvm.x86.loadiwkey
_mm_loadiwkey(ctl, intkey, enkey_lo, enkey_hi);
}
unsigned int test_encodekey128_u32(unsigned int htype, __m128i key, void *h) {
//CHECK-LABEL: @test_encodekey128_u32
//CHECK: call { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 %{{.*}}, <2 x i64> %{{.*}})
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 1
//CHECK: itcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 2
//CHECK: getelementptr i8, i8* %{{.*}}, i32 16
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 3
//CHECK: getelementptr i8, i8* %{{.*}}, i32 32
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 4
//CHECK: getelementptr i8, i8* %{{.*}}, i32 48
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 5
//CHECK: getelementptr i8, i8* %{{.*}}, i32 64
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 6
//CHECK: getelementptr i8, i8* %{{.*}}, i32 80
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 0
return _mm_encodekey128_u32(htype, key, h);
}
unsigned int test_encodekey256_u32(unsigned int htype, __m128i key_lo, __m128i key_hi, void *h) {
//CHECK-LABEL: @test_encodekey256_u32
//CHECK: call { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey256(i32 %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 1
//CHECK: itcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 2
//CHECK: getelementptr i8, i8* %{{.*}}, i32 16
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 3
//CHECK: getelementptr i8, i8* %{{.*}}, i32 32
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 4
//CHECK: getelementptr i8, i8* %{{.*}}, i32 48
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 5
//CHECK: getelementptr i8, i8* %{{.*}}, i32 64
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 6
//CHECK: getelementptr i8, i8* %{{.*}}, i32 80
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 7
//CHECK: getelementptr i8, i8* %{{.*}}, i32 96
//CHECK: bitcast i8* %{{.*}} to <2 x i64>*
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 1{{$}}
//CHECK: extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 0
return _mm_encodekey256_u32(htype, key_lo, key_hi, h);
}
unsigned char test_mm_aesenc256kl_u8(__m128i *odata, __m128i idata, const void *h) {
//CHECK-LABEL: @test_mm_aesenc256kl_u8
//CHECK: call { i8, <2 x i64> } @llvm.x86.aesenc256kl(<2 x i64> %{{.*}}, i8* %{{.*}})
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 0
return _mm_aesenc256kl_u8(odata, idata, h);
}
unsigned char test_mm_aesdec256kl_u8(__m128i *odata, __m128i idata, const void *h) {
//CHECK-LABEL: @test_mm_aesdec256kl_u8
//CHECK: call { i8, <2 x i64> } @llvm.x86.aesdec256kl(<2 x i64> %{{.*}}, i8* %{{.*}})
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 0
return _mm_aesdec256kl_u8(odata, idata, h);
}
unsigned char test_mm_aesenc128kl_u8(__m128i *odata, __m128i idata, const void *h) {
//CHECK-LABEL: @test_mm_aesenc128kl_u8
//CHECK: call { i8, <2 x i64> } @llvm.x86.aesenc128kl(<2 x i64> %{{.*}}, i8* %{{.*}})
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 0
return _mm_aesenc128kl_u8(odata, idata, h);
}
unsigned char test_mm_aesdec128kl_u8(__m128i *odata, __m128i idata, const void *h) {
//CHECK-LABEL: @test_mm_aesdec128kl_u8
//CHECK: call { i8, <2 x i64> } @llvm.x86.aesdec128kl(<2 x i64> %{{.*}}, i8* %{{.*}})
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64> } %{{.*}}, 0
return _mm_aesdec128kl_u8(odata, idata, h);
}
unsigned char test__mm_aesencwide128kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {
//CHECK-LABEL: @test__mm_aesencwide128kl
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide128kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 2
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 3
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 4
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 5
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 6
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 7
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 8
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 0
return _mm_aesencwide128kl_u8(odata, idata, h);
}
unsigned char test__mm_aesdecwide128kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {
//CHECK-LABEL: @test__mm_aesdecwide128kl
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesdecwide128kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 2
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 3
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 4
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 5
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 6
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 7
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 8
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 0
return _mm_aesdecwide128kl_u8(odata, idata, h);
}
unsigned char test__mm_aesencwide256kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {
//CHECK-LABEL: @test__mm_aesencwide256kl
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide256kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 2
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 3
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 4
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 5
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 6
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 7
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 8
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 0
return _mm_aesencwide256kl_u8(odata, idata, h);
}
unsigned char test__mm_aesdecwide256kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {
//CHECK-LABEL: @test__mm_aesdecwide256kl
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: load <2 x i64>, <2 x i64>* %{{.*}}, align 16
//CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesdecwide256kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 2
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 1
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 3
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 2
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 4
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 3
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 5
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 4
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 6
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 5
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 7
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 6
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 8
//CHECK: getelementptr <2 x i64>, <2 x i64>* %{{.*}}, i32 7
//CHECK: store <2 x i64> %{{.*}}, <2 x i64>* %{{.*}}, align 16
//CHECK: extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %{{.*}}, 0
return _mm_aesdecwide256kl_u8(odata, idata, h);
}