mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
move cpuid functions into separate assembly file
This commit is contained in:
parent
b899b54354
commit
a745b57fb2
2 changed files with 54 additions and 56 deletions
53
crates/compiler/builtins/bitcode/src/libc/cpuid.S
Normal file
53
crates/compiler/builtins/bitcode/src/libc/cpuid.S
Normal file
|
@ -0,0 +1,53 @@
|
|||
// Check if AVX2 is supported.
|
||||
// Returns 1 if AVX2 is supported, 0 otherwise.
|
||||
.global {[function_prefix]s}supports_avx2;
|
||||
{[function_prefix]s}supports_avx2:
|
||||
// Save the EBX register.
|
||||
push %rbx
|
||||
|
||||
// Call the CPUID instruction with the EAX register set to 7 and ECX set to 0.
|
||||
// This will get the CPUID information for the current CPU.
|
||||
mov $7, %eax
|
||||
mov $0, %ecx
|
||||
cpuid
|
||||
|
||||
// The AVX2 feature flag is located in the EBX register at bit 5.
|
||||
bt $5, %ebx
|
||||
jc .avx2_supported
|
||||
|
||||
// AVX2 is not supported.
|
||||
pop %rbx
|
||||
mov $0, %eax
|
||||
ret
|
||||
|
||||
.avx2_supported:
|
||||
pop %rbx
|
||||
mov $1, %eax
|
||||
ret
|
||||
|
||||
// Check if prefetchw is supported.
|
||||
// Returns 1 if the prefetchw instruction is supported, 0 otherwise.
|
||||
.global {[function_prefix]s}supports_prefetchw;
|
||||
{[function_prefix]s}supports_prefetchw:
|
||||
// Save the EBX register.
|
||||
push %rbx
|
||||
|
||||
// Call the CPUID instruction with the EAX register set to 0x80000001 and ECX set to 0.
|
||||
// This will get the CPUID information for the current CPU.
|
||||
mov $0x80000001, %eax
|
||||
mov $0, %ecx
|
||||
cpuid
|
||||
|
||||
// The prefetchw feature flag is located in the ECX register at bit 8.
|
||||
bt $8, %ecx
|
||||
jc .prefetchw_supported
|
||||
|
||||
// AVX2 is not supported.
|
||||
pop %rbx
|
||||
mov $0, %eax
|
||||
ret
|
||||
|
||||
.prefetchw_supported:
|
||||
pop %rbx
|
||||
mov $1, %eax
|
||||
ret
|
|
@ -8,62 +8,7 @@ const function_prefix = @import("assembly_util.zig").function_prefix;
|
|||
comptime {
|
||||
switch (arch) {
|
||||
.x86_64 => {
|
||||
asm (std.fmt.comptimePrint(
|
||||
\\ // Check if AVX2 is supported.
|
||||
\\ // Returns 1 if AVX2 is supported, 0 otherwise.
|
||||
\\ .global {[function_prefix]s}supports_avx2;
|
||||
\\ {[function_prefix]s}supports_avx2:
|
||||
\\ // Save the EBX register.
|
||||
\\ push %rbx
|
||||
\\
|
||||
\\ // Call the CPUID instruction with the EAX register set to 7 and ECX set to 0.
|
||||
\\ // This will get the CPUID information for the current CPU.
|
||||
\\ mov $7, %eax
|
||||
\\ mov $0, %ecx
|
||||
\\ cpuid
|
||||
\\
|
||||
\\ // The AVX2 feature flag is located in the EBX register at bit 5.
|
||||
\\ bt $5, %ebx
|
||||
\\ jc .avx2_supported
|
||||
\\
|
||||
\\ // AVX2 is not supported.
|
||||
\\ pop %rbx
|
||||
\\ mov $0, %eax
|
||||
\\ ret
|
||||
\\
|
||||
\\ .avx2_supported:
|
||||
\\ pop %rbx
|
||||
\\ mov $1, %eax
|
||||
\\ ret
|
||||
, .{ .function_prefix = function_prefix }));
|
||||
asm (std.fmt.comptimePrint(
|
||||
\\ // Check if prefetchw is supported.
|
||||
\\ // Returns 1 if the prefetchw instruction is supported, 0 otherwise.
|
||||
\\ .global {[function_prefix]s}supports_prefetchw;
|
||||
\\ {[function_prefix]s}supports_prefetchw:
|
||||
\\ // Save the EBX register.
|
||||
\\ push %rbx
|
||||
\\
|
||||
\\ // Call the CPUID instruction with the EAX register set to 0x80000001 and ECX set to 0.
|
||||
\\ // This will get the CPUID information for the current CPU.
|
||||
\\ mov $0x80000001, %eax
|
||||
\\ mov $0, %ecx
|
||||
\\ cpuid
|
||||
\\
|
||||
\\ // The prefetchw feature flag is located in the ECX register at bit 8.
|
||||
\\ bt $8, %ecx
|
||||
\\ jc .prefetchw_supported
|
||||
\\
|
||||
\\ // AVX2 is not supported.
|
||||
\\ pop %rbx
|
||||
\\ mov $0, %eax
|
||||
\\ ret
|
||||
\\
|
||||
\\ .prefetchw_supported:
|
||||
\\ pop %rbx
|
||||
\\ mov $1, %eax
|
||||
\\ ret
|
||||
, .{ .function_prefix = function_prefix }));
|
||||
asm (std.fmt.comptimePrint(@embedFile("cpuid.S"), .{ .function_prefix = function_prefix }));
|
||||
},
|
||||
else => unreachable,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue