189 lines · c
1// RUN: %clang_cc1 %s -DTEST_XSAVE -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVE2// RUN: %clang_cc1 %s -DTEST_XSAVE -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -fno-signed-char -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVE3 4// RUN: %clang_cc1 %s -DTEST_XGETBV -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XGETBV5// RUN: %clang_cc1 %s -DTEST_XSETBV -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -fno-signed-char -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSETBV6 7// RUN: %clang_cc1 %s -DTEST_XSAVEOPT -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaveopt -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVEOPT8// RUN: %clang_cc1 %s -DTEST_XSAVEOPT -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaveopt -fno-signed-char -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVEOPT9 10// RUN: %clang_cc1 %s -DTEST_XSAVEC -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsavec -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVEC11// RUN: %clang_cc1 %s -DTEST_XSAVEC -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsavec -fno-signed-char -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVEC12 13// RUN: %clang_cc1 %s -DTEST_XSAVES -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaves -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVES14// RUN: %clang_cc1 %s -DTEST_XSAVES -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaves -fno-signed-char -emit-llvm -o - -Wall -Wno-unused-but-set-variable -Werror | FileCheck %s --check-prefix=XSAVES15 16// Don't include mm_malloc.h, it's system specific.17#define __MM_MALLOC_H18#include <x86intrin.h>19 20 21void test(void) {22 unsigned long long tmp_ULLi;23 unsigned int tmp_Ui;24 void* tmp_vp;25 tmp_ULLi = 0; tmp_Ui = 0; tmp_vp = 0;26 27#ifdef TEST_XSAVE28// XSAVE: [[tmp_vp_1:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 829// XSAVE: [[tmp_ULLi_1:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 830// XSAVE: [[high64_1:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_1]], 3231// XSAVE: [[high32_1:%[0-9a-zA-Z]+]] = trunc i64 [[high64_1]] to i3232// XSAVE: [[low32_1:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_1]] to i3233// XSAVE: call void @llvm.x86.xsave(ptr [[tmp_vp_1]], i32 [[high32_1]], i32 [[low32_1]])34 (void)__builtin_ia32_xsave(tmp_vp, tmp_ULLi);35 36// XSAVE: [[tmp_vp_2:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 837// XSAVE: [[tmp_ULLi_2:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 838// XSAVE: [[high64_2:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_2]], 3239// XSAVE: [[high32_2:%[0-9a-zA-Z]+]] = trunc i64 [[high64_2]] to i3240// XSAVE: [[low32_2:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_2]] to i3241// XSAVE: call void @llvm.x86.xsave64(ptr [[tmp_vp_2]], i32 [[high32_2]], i32 [[low32_2]])42 (void)__builtin_ia32_xsave64(tmp_vp, tmp_ULLi);43 44// XSAVE: [[tmp_vp_3:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 845// XSAVE: [[tmp_ULLi_3:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 846// XSAVE: [[high64_3:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_3]], 3247// XSAVE: [[high32_3:%[0-9a-zA-Z]+]] = trunc i64 [[high64_3]] to i3248// XSAVE: [[low32_3:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_3]] to i3249// XSAVE: call void @llvm.x86.xrstor(ptr [[tmp_vp_3]], i32 [[high32_3]], i32 [[low32_3]])50 (void)__builtin_ia32_xrstor(tmp_vp, tmp_ULLi);51 52// XSAVE: [[tmp_vp_4:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 853// XSAVE: [[tmp_ULLi_4:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 854// XSAVE: [[high64_4:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_4]], 3255// XSAVE: [[high32_4:%[0-9a-zA-Z]+]] = trunc i64 [[high64_4]] to i3256// XSAVE: [[low32_4:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_4]] to i3257// XSAVE: call void @llvm.x86.xrstor64(ptr [[tmp_vp_4]], i32 [[high32_4]], i32 [[low32_4]])58 (void)__builtin_ia32_xrstor64(tmp_vp, tmp_ULLi);59 60// XSAVE: call void @llvm.x86.xsave61 (void)_xsave(tmp_vp, tmp_ULLi);62 63// XSAVE: call void @llvm.x86.xsave6464 (void)_xsave64(tmp_vp, tmp_ULLi);65 66// XSAVE: call void @llvm.x86.xrstor67 (void)_xrstor(tmp_vp, tmp_ULLi);68 69// XSAVE: call void @llvm.x86.xrstor6470 (void)_xrstor64(tmp_vp, tmp_ULLi);71#endif72 73#ifdef TEST_XSAVEOPT74// XSAVEOPT: [[tmp_vp_1:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 875// XSAVEOPT: [[tmp_ULLi_1:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 876// XSAVEOPT: [[high64_1:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_1]], 3277// XSAVEOPT: [[high32_1:%[0-9a-zA-Z]+]] = trunc i64 [[high64_1]] to i3278// XSAVEOPT: [[low32_1:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_1]] to i3279// XSAVEOPT: call void @llvm.x86.xsaveopt(ptr [[tmp_vp_1]], i32 [[high32_1]], i32 [[low32_1]])80 (void)__builtin_ia32_xsaveopt(tmp_vp, tmp_ULLi);81 82// XSAVEOPT: [[tmp_vp_2:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 883// XSAVEOPT: [[tmp_ULLi_2:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 884// XSAVEOPT: [[high64_2:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_2]], 3285// XSAVEOPT: [[high32_2:%[0-9a-zA-Z]+]] = trunc i64 [[high64_2]] to i3286// XSAVEOPT: [[low32_2:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_2]] to i3287// XSAVEOPT: call void @llvm.x86.xsaveopt64(ptr [[tmp_vp_2]], i32 [[high32_2]], i32 [[low32_2]])88 (void)__builtin_ia32_xsaveopt64(tmp_vp, tmp_ULLi);89 90// XSAVEOPT: call void @llvm.x86.xsaveopt91 (void)_xsaveopt(tmp_vp, tmp_ULLi);92 93// XSAVEOPT: call void @llvm.x86.xsaveopt6494 (void)_xsaveopt64(tmp_vp, tmp_ULLi);95#endif96 97#ifdef TEST_XSAVEC98// XSAVEC: [[tmp_vp_1:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 899// XSAVEC: [[tmp_ULLi_1:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 8100// XSAVEC: [[high64_1:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_1]], 32101// XSAVEC: [[high32_1:%[0-9a-zA-Z]+]] = trunc i64 [[high64_1]] to i32102// XSAVEC: [[low32_1:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_1]] to i32103// XSAVEC: call void @llvm.x86.xsavec(ptr [[tmp_vp_1]], i32 [[high32_1]], i32 [[low32_1]])104 (void)__builtin_ia32_xsavec(tmp_vp, tmp_ULLi);105 106// XSAVEC: [[tmp_vp_2:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 8107// XSAVEC: [[tmp_ULLi_2:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 8108// XSAVEC: [[high64_2:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_2]], 32109// XSAVEC: [[high32_2:%[0-9a-zA-Z]+]] = trunc i64 [[high64_2]] to i32110// XSAVEC: [[low32_2:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_2]] to i32111// XSAVEC: call void @llvm.x86.xsavec64(ptr [[tmp_vp_2]], i32 [[high32_2]], i32 [[low32_2]])112 (void)__builtin_ia32_xsavec64(tmp_vp, tmp_ULLi);113 114// XSAVEC: call void @llvm.x86.xsavec 115 (void)_xsavec(tmp_vp, tmp_ULLi);116 117// XSAVEC: call void @llvm.x86.xsavec64118 (void)_xsavec64(tmp_vp, tmp_ULLi);119#endif120 121#ifdef TEST_XSAVES122// XSAVES: [[tmp_vp_1:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 8123// XSAVES: [[tmp_ULLi_1:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 8124// XSAVES: [[high64_1:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_1]], 32125// XSAVES: [[high32_1:%[0-9a-zA-Z]+]] = trunc i64 [[high64_1]] to i32126// XSAVES: [[low32_1:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_1]] to i32127// XSAVES: call void @llvm.x86.xsaves(ptr [[tmp_vp_1]], i32 [[high32_1]], i32 [[low32_1]])128 (void)__builtin_ia32_xsaves(tmp_vp, tmp_ULLi);129 130// XSAVES: [[tmp_vp_2:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 8131// XSAVES: [[tmp_ULLi_2:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 8132// XSAVES: [[high64_2:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_2]], 32133// XSAVES: [[high32_2:%[0-9a-zA-Z]+]] = trunc i64 [[high64_2]] to i32134// XSAVES: [[low32_2:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_2]] to i32135// XSAVES: call void @llvm.x86.xsaves64(ptr [[tmp_vp_2]], i32 [[high32_2]], i32 [[low32_2]])136 (void)__builtin_ia32_xsaves64(tmp_vp, tmp_ULLi);137 138// XSAVES: [[tmp_vp_3:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 8139// XSAVES: [[tmp_ULLi_3:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 8140// XSAVES: [[high64_3:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_3]], 32141// XSAVES: [[high32_3:%[0-9a-zA-Z]+]] = trunc i64 [[high64_3]] to i32142// XSAVES: [[low32_3:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_3]] to i32143// XSAVES: call void @llvm.x86.xrstors(ptr [[tmp_vp_3]], i32 [[high32_3]], i32 [[low32_3]])144 (void)__builtin_ia32_xrstors(tmp_vp, tmp_ULLi);145 146// XSAVES: [[tmp_vp_4:%[0-9a-zA-Z]+]] = load ptr, ptr %tmp_vp, align 8147// XSAVES: [[tmp_ULLi_4:%[0-9a-zA-Z]+]] = load i64, ptr %tmp_ULLi, align 8148// XSAVES: [[high64_4:%[0-9a-zA-Z]+]] = lshr i64 [[tmp_ULLi_4]], 32149// XSAVES: [[high32_4:%[0-9a-zA-Z]+]] = trunc i64 [[high64_4]] to i32150// XSAVES: [[low32_4:%[0-9a-zA-Z]+]] = trunc i64 [[tmp_ULLi_4]] to i32151// XSAVES: call void @llvm.x86.xrstors64(ptr [[tmp_vp_4]], i32 [[high32_4]], i32 [[low32_4]])152 (void)__builtin_ia32_xrstors64(tmp_vp, tmp_ULLi);153 154// XSAVES: call void @llvm.x86.xsaves155 (void)_xsaves(tmp_vp, tmp_ULLi); 156 157// XSAVES: call void @llvm.x86.xsaves64158 (void)_xsaves64(tmp_vp, tmp_ULLi); 159 160// XSAVES: call void @llvm.x86.xrstors161 (void)_xrstors(tmp_vp, tmp_ULLi);162 163// XSAVES: call void @llvm.x86.xrstors64164 (void)_xrstors64(tmp_vp, tmp_ULLi);165#endif166 167#ifdef TEST_XGETBV168// XGETBV: [[tmp_Ui:%[0-9a-zA-z]+]] = load i32, ptr %tmp_Ui, align 4169// XGETBV: call i64 @llvm.x86.xgetbv(i32 [[tmp_Ui]])170 tmp_ULLi = __builtin_ia32_xgetbv(tmp_Ui);171 172// XGETBV: call i64 @llvm.x86.xgetbv173 tmp_ULLi = _xgetbv(tmp_Ui);174#endif175 176#ifdef TEST_XSETBV177// XSETBV: [[tmp_Ui:%[0-9a-zA-z]+]] = load i32, ptr %tmp_Ui, align 4178// XSETBV: [[tmp_ULLi_3:%[0-9a-zA-z]+]] = load i64, ptr %tmp_ULLi, align 8179// XSETBV: [[high64_3:%[0-9a-zA-z]+]] = lshr i64 [[tmp_ULLi_3]], 32180// XSETBV: [[high32_3:%[0-9a-zA-z]+]] = trunc i64 [[high64_3]] to i32181// XSETBV: [[low32_3:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_3]] to i32182// XSETBV: call void @llvm.x86.xsetbv(i32 [[tmp_Ui]], i32 [[high32_3]], i32 [[low32_3]])183 (void)__builtin_ia32_xsetbv(tmp_Ui, tmp_ULLi);184 185 // XSETBV: call void @llvm.x86.xsetbv186 (void)_xsetbv(tmp_Ui, tmp_ULLi);187#endif188}189