brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · dbce707 Raw
81 lines · c
1// RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \2// RUN:         -Werror -triple i686-windows-msvc -emit-llvm %s -o - | FileCheck %s --check-prefix=X863// RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \4// RUN:         -Werror -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck %s --check-prefix=X645 6// intrin.h needs size_t, but -ffreestanding prevents us from getting it from7// stddef.h.  Work around it with this typedef.8typedef __SIZE_TYPE__ size_t;9 10#include <intrin.h>11 12#pragma intrinsic(__cpuid)13 14void test__cpuid(int cpuInfo[4], int function_id) {15  __cpuid(cpuInfo, function_id);16}17// X86-LABEL: define {{.*}} @test__cpuid(ptr noundef %{{.*}}, i32 noundef %{{.*}})18// X86-DAG: [[ASMRESULTS:%[0-9]+]] = call { i32, i32, i32, i32 } asm "cpuid", "={ax},={bx},={cx},={dx},{ax},{cx}"19// X86-DAG: [[ADDRPTR0:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 020// X86-DAG: [[ADDRPTR1:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 121// X86-DAG: [[ADDRPTR2:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 222// X86-DAG: [[ADDRPTR3:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 323// X86-DAG: [[RESULT0:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 024// X86-DAG: [[RESULT1:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 125// X86-DAG: [[RESULT2:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 226// X86-DAG: [[RESULT3:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 327// X86-DAG: store i32 [[RESULT0]], ptr [[ADDRPTR0]], align 428// X86-DAG: store i32 [[RESULT1]], ptr [[ADDRPTR1]], align 429// X86-DAG: store i32 [[RESULT2]], ptr [[ADDRPTR2]], align 430// X86-DAG: store i32 [[RESULT3]], ptr [[ADDRPTR3]], align 431 32// X64-LABEL: define {{.*}} @test__cpuid(ptr noundef %{{.*}}, i32 noundef %{{.*}})33// X64-DAG: [[ASMRESULTS:%[0-9]+]] = call { i32, i32, i32, i32 } asm "xchgq %rbx, ${1:q}\0Acpuid\0Axchgq %rbx, ${1:q}", "={ax},=r,={cx},={dx},0,2"34// X64-DAG: [[ADDRPTR0:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 035// X64-DAG: [[ADDRPTR1:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 136// X64-DAG: [[ADDRPTR2:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 237// X64-DAG: [[ADDRPTR3:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 338// X64-DAG: [[RESULT0:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 039// X64-DAG: [[RESULT1:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 140// X64-DAG: [[RESULT2:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 241// X64-DAG: [[RESULT3:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 342// X64-DAG: store i32 [[RESULT0]], ptr [[ADDRPTR0]], align 443// X64-DAG: store i32 [[RESULT1]], ptr [[ADDRPTR1]], align 444// X64-DAG: store i32 [[RESULT2]], ptr [[ADDRPTR2]], align 445// X64-DAG: store i32 [[RESULT3]], ptr [[ADDRPTR3]], align 446 47#pragma intrinsic(__cpuidex)48 49void test__cpuidex(int cpuInfo[4], int function_id, int subfunction_id) {50  __cpuidex(cpuInfo, function_id, subfunction_id);51}52// X86-LABEL: define {{.*}} @test__cpuidex(ptr noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}})53// X86-DAG: [[ASMRESULTS:%[0-9]+]] = call { i32, i32, i32, i32 } asm "cpuid", "={ax},={bx},={cx},={dx},{ax},{cx}"54// X86-DAG: [[ADDRPTR0:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 055// X86-DAG: [[ADDRPTR1:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 156// X86-DAG: [[ADDRPTR2:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 257// X86-DAG: [[ADDRPTR3:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 358// X86-DAG: [[RESULT0:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 059// X86-DAG: [[RESULT1:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 160// X86-DAG: [[RESULT2:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 261// X86-DAG: [[RESULT3:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 362// X86-DAG: store i32 [[RESULT0]], ptr [[ADDRPTR0]], align 463// X86-DAG: store i32 [[RESULT1]], ptr [[ADDRPTR1]], align 464// X86-DAG: store i32 [[RESULT2]], ptr [[ADDRPTR2]], align 465// X86-DAG: store i32 [[RESULT3]], ptr [[ADDRPTR3]], align 466 67// X64-LABEL: define {{.*}} @test__cpuidex(ptr noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}})68// X64-DAG: [[ASMRESULTS:%[0-9]+]] = call { i32, i32, i32, i32 } asm "xchgq %rbx, ${1:q}\0Acpuid\0Axchgq %rbx, ${1:q}", "={ax},=r,={cx},={dx},0,2"69// X64-DAG: [[ADDRPTR0:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 070// X64-DAG: [[ADDRPTR1:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 171// X64-DAG: [[ADDRPTR2:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 272// X64-DAG: [[ADDRPTR3:%[0-9]+]] = getelementptr inbounds i32, ptr %{{.*}}, i32 373// X64-DAG: [[RESULT0:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 074// X64-DAG: [[RESULT1:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 175// X64-DAG: [[RESULT2:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 276// X64-DAG: [[RESULT3:%[0-9]+]] = extractvalue { i32, i32, i32, i32 } [[ASMRESULTS]], 377// X64-DAG: store i32 [[RESULT0]], ptr [[ADDRPTR0]], align 478// X64-DAG: store i32 [[RESULT1]], ptr [[ADDRPTR1]], align 479// X64-DAG: store i32 [[RESULT2]], ptr [[ADDRPTR2]], align 480// X64-DAG: store i32 [[RESULT3]], ptr [[ADDRPTR3]], align 481