diff options
| author | gingerBill <bill@gingerbill.org> | 2022-05-29 13:40:16 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-05-29 13:40:16 +0100 |
| commit | 77d4409549d27b904676af5f33d8d034c6cae53e (patch) | |
| tree | 0fdcfb36ebae0e5d83ee26adf24c655e56be378e | |
| parent | 7f3540b7f541b75b1c4b4db558636d8295297c3f (diff) | |
Add adx.odin
| -rw-r--r-- | core/simd/x86/adx.odin | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/core/simd/x86/adx.odin b/core/simd/x86/adx.odin new file mode 100644 index 000000000..4de4324a2 --- /dev/null +++ b/core/simd/x86/adx.odin @@ -0,0 +1,53 @@ +//+build i386, amd64 +package simd_x86 + +import "core:intrinsics" + +_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 +} +_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) +} +_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 { + _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 + } + _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) + } + _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 + } +} + +@(default_calling_convention="c") +@(private) +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) --- +} |