]>
git.proxmox.com Git - rustc.git/blob - src/stdarch/crates/core_arch/src/x86/adx.rs
2 use stdarch_test
::assert_instr
;
4 #[allow(improper_ctypes)]
6 #[link_name = "llvm.x86.addcarry.32"]
7 fn llvm_addcarry_u32(a
: u8, b
: u32, c
: u32) -> (u8, u32);
8 #[link_name = "llvm.x86.addcarryx.u32"]
9 fn llvm_addcarryx_u32(a
: u8, b
: u32, c
: u32, d
: *mut u8) -> u8;
10 #[link_name = "llvm.x86.subborrow.32"]
11 fn llvm_subborrow_u32(a
: u8, b
: u32, c
: u32) -> (u8, u32);
14 /// Adds unsigned 32-bit integers `a` and `b` with unsigned 8-bit carry-in `c_in`
15 /// (carry flag), and store the unsigned 32-bit result in `out`, and the carry-out
16 /// is returned (carry or overflow flag).
18 #[cfg_attr(test, assert_instr(adc))]
19 #[stable(feature = "simd_x86_adx", since = "1.33.0")]
20 pub unsafe fn _addcarry_u32(c_in
: u8, a
: u32, b
: u32, out
: &mut u32) -> u8 {
21 let (a
, b
) = llvm_addcarry_u32(c_in
, a
, b
);
26 /// Adds unsigned 32-bit integers `a` and `b` with unsigned 8-bit carry-in `c_in`
27 /// (carry or overflow flag), and store the unsigned 32-bit result in `out`, and
28 /// the carry-out is returned (carry or overflow flag).
30 #[target_feature(enable = "adx")]
31 #[cfg_attr(test, assert_instr(adc))]
32 #[stable(feature = "simd_x86_adx", since = "1.33.0")]
33 pub unsafe fn _addcarryx_u32(c_in
: u8, a
: u32, b
: u32, out
: &mut u32) -> u8 {
34 llvm_addcarryx_u32(c_in
, a
, b
, out
as *mut _
as *mut u8)
37 /// Adds unsigned 32-bit integers `a` and `b` with unsigned 8-bit carry-in `c_in`
38 /// (carry or overflow flag), and store the unsigned 32-bit result in `out`, and
39 /// the carry-out is returned (carry or overflow flag).
41 #[cfg_attr(test, assert_instr(sbb))]
42 #[stable(feature = "simd_x86_adx", since = "1.33.0")]
43 pub unsafe fn _subborrow_u32(c_in
: u8, a
: u32, b
: u32, out
: &mut u32) -> u8 {
44 let (a
, b
) = llvm_subborrow_u32(c_in
, a
, b
);
51 use stdarch_test
::simd_test
;
53 use crate::core_arch
::x86
::*;
56 fn test_addcarry_u32() {
61 let r
= _addcarry_u32(0, a
, 1, &mut out
);
65 let r
= _addcarry_u32(0, a
, 0, &mut out
);
69 let r
= _addcarry_u32(1, a
, 1, &mut out
);
73 let r
= _addcarry_u32(1, a
, 0, &mut out
);
77 let r
= _addcarry_u32(0, 3, 4, &mut out
);
81 let r
= _addcarry_u32(1, 3, 4, &mut out
);
87 #[simd_test(enable = "adx")]
88 unsafe fn test_addcarryx_u32() {
92 let r
= _addcarryx_u32(0, a
, 1, &mut out
);
96 let r
= _addcarryx_u32(0, a
, 0, &mut out
);
100 let r
= _addcarryx_u32(1, a
, 1, &mut out
);
104 let r
= _addcarryx_u32(1, a
, 0, &mut out
);
108 let r
= _addcarryx_u32(0, 3, 4, &mut out
);
112 let r
= _addcarryx_u32(1, 3, 4, &mut out
);
117 #[simd_test(enable = "adx")]
118 unsafe fn test_addcarryx_u32_2() {
119 unsafe fn add_1_2_3() -> u32 {
121 _addcarryx_u32(1, 2, 3, &mut out
);
124 assert_eq
!(6, add_1_2_3());
128 fn test_subborrow_u32() {
133 let r
= _subborrow_u32(0, 0, 1, &mut out
);
137 let r
= _subborrow_u32(0, 0, 0, &mut out
);
141 let r
= _subborrow_u32(1, 0, 1, &mut out
);
143 assert_eq
!(out
, a
- 1);
145 let r
= _subborrow_u32(1, 0, 0, &mut out
);
149 let r
= _subborrow_u32(0, 7, 3, &mut out
);
153 let r
= _subborrow_u32(1, 7, 3, &mut out
);