aboutsummaryrefslogtreecommitdiff
path: root/core/simd/x86/adx.odin
blob: 9c6ae063a5ea68a2ff07fdce593f5cf4e25a6047 (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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#+build i386, amd64
package simd_x86

@(require_results)
_addcarry_u32 :: #force_inline proc "c" (c_in: u8, a: u32, b: u32, out: ^u32) -> u8 {
	x, y := llvm_addcarry_u32(c_in, a, b)
	out^ = y
	return x
}
@(require_results)
_addcarryx_u32 :: #force_inline proc "c" (c_in: u8, a: u32, b: u32, out: ^u32) -> u8 {
	return llvm_addcarryx_u32(c_in, a, b, out)
}
@(require_results)
_subborrow_u32 :: #force_inline proc "c" (c_in: u8, a: u32, b: u32, out: ^u32) -> u8 {
	x, y := llvm_subborrow_u32(c_in, a, b)
	out^ = y
	return x
}

when ODIN_ARCH == .amd64 {
	@(require_results)
	_addcarry_u64 :: #force_inline proc "c" (c_in: u8, a: u64, b: u64, out: ^u64) -> u8 {
		x, y := llvm_addcarry_u64(c_in, a, b)
		out^ = y
		return x
	}
	@(require_results)
	_addcarryx_u64 :: #force_inline proc "c" (c_in: u8, a: u64, b: u64, out: ^u64) -> u8 {
		return llvm_addcarryx_u64(c_in, a, b, out)
	}
	@(require_results)
	_subborrow_u64 :: #force_inline proc "c" (c_in: u8, a: u64, b: u64, out: ^u64) -> u8 {
		x, y := llvm_subborrow_u64(c_in, a, b)
		out^ = y
		return x
	}
}

@(private, default_calling_convention="none")
foreign _ {
	@(link_name="llvm.x86.addcarry.32")
	llvm_addcarry_u32  :: proc(a: u8, b: u32, c: u32) -> (u8, u32) ---
	@(link_name="llvm.x86.addcarryx.u32")
	llvm_addcarryx_u32 :: proc(a: u8, b: u32, c: u32, d: rawptr) -> u8 ---
	@(link_name="llvm.x86.subborrow.32")
	llvm_subborrow_u32 :: proc(a: u8, b: u32, c: u32) -> (u8, u32) ---

	// amd64 only
	@(link_name="llvm.x86.addcarry.64")
	llvm_addcarry_u64  :: proc(a: u8, b: u64, c: u64) -> (u8, u64) ---
	@(link_name="llvm.x86.addcarryx.u64")
	llvm_addcarryx_u64 :: proc(a: u8, b: u64, c: u64, d: rawptr) -> u8 ---
	@(link_name="llvm.x86.subborrow.64")
	llvm_subborrow_u64 :: proc(a: u8, b: u64, c: u64) -> (u8, u64) ---
}