aboutsummaryrefslogtreecommitdiff
path: root/core/simd/x86/fxsr.odin
blob: ab8cdca7dbe400453baaff6cf99132511d91b5d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#+build i386, amd64
package simd_x86

@(enable_target_feature="fxsr")
_fxsave :: #force_inline proc "c" (mem_addr: rawptr) {
	fxsave(mem_addr)
}
@(enable_target_feature="fxsr")
_fxrstor :: #force_inline proc "c" (mem_addr: rawptr) {
	fxrstor(mem_addr)
}

when ODIN_ARCH == .amd64 {
	@(enable_target_feature="fxsr")
	_fxsave64 :: #force_inline proc "c" (mem_addr: rawptr) {
		fxsave64(mem_addr)
	}
	@(enable_target_feature="fxsr")
	_fxrstor64 :: #force_inline proc "c" (mem_addr: rawptr) {
		fxrstor64(mem_addr)
	}
}

@(private, default_calling_convention="none")
foreign _ {
	@(link_name="llvm.x86.fxsave")
	fxsave    :: proc(p: rawptr) ---
	@(link_name="llvm.x86.fxrstor")
	fxrstor   :: proc(p: rawptr) ---

	// amd64 only
	@(link_name="llvm.x86.fxsave64")
	fxsave64  :: proc(p: rawptr) ---
	@(link_name="llvm.x86.fxrstor64")
	fxrstor64 :: proc(p: rawptr) ---
}