@@ -13,6 +13,14 @@ mod x86 {
13
13
( c_out, sum)
14
14
}
15
15
16
+ fn sbb ( b_in : u8 , a : u32 , b : u32 ) -> ( u8 , u32 ) {
17
+ let mut sum = 0 ;
18
+ // SAFETY: There are no safety requirements for calling `_subborrow_u32`.
19
+ // It's just unsafe for API consistency with other intrinsics.
20
+ let b_out = unsafe { arch:: _subborrow_u32 ( b_in, a, b, & mut sum) } ;
21
+ ( b_out, sum)
22
+ }
23
+
16
24
pub fn main ( ) {
17
25
assert_eq ! ( adc( 0 , 1 , 1 ) , ( 0 , 2 ) ) ;
18
26
assert_eq ! ( adc( 1 , 1 , 1 ) , ( 0 , 3 ) ) ;
@@ -22,6 +30,19 @@ mod x86 {
22
30
assert_eq ! ( adc( 1 , u32 :: MAX , u32 :: MAX ) , ( 1 , u32 :: MAX ) ) ;
23
31
assert_eq ! ( adc( 2 , u32 :: MAX , u32 :: MAX ) , ( 1 , u32 :: MAX ) ) ;
24
32
assert_eq ! ( adc( u8 :: MAX , u32 :: MAX , u32 :: MAX ) , ( 1 , u32 :: MAX ) ) ;
33
+
34
+ assert_eq ! ( sbb( 0 , 1 , 1 ) , ( 0 , 0 ) ) ;
35
+ assert_eq ! ( sbb( 1 , 1 , 1 ) , ( 1 , u32 :: MAX ) ) ;
36
+ assert_eq ! ( sbb( 2 , 1 , 1 ) , ( 1 , u32 :: MAX ) ) ; // any non-zero borrow acts as 1!
37
+ assert_eq ! ( sbb( u8 :: MAX , 1 , 1 ) , ( 1 , u32 :: MAX ) ) ;
38
+ assert_eq ! ( sbb( 0 , 2 , 1 ) , ( 0 , 1 ) ) ;
39
+ assert_eq ! ( sbb( 1 , 2 , 1 ) , ( 0 , 0 ) ) ;
40
+ assert_eq ! ( sbb( 2 , 2 , 1 ) , ( 0 , 0 ) ) ;
41
+ assert_eq ! ( sbb( u8 :: MAX , 2 , 1 ) , ( 0 , 0 ) ) ;
42
+ assert_eq ! ( sbb( 0 , 1 , 2 ) , ( 1 , u32 :: MAX ) ) ;
43
+ assert_eq ! ( sbb( 1 , 1 , 2 ) , ( 1 , u32 :: MAX - 1 ) ) ;
44
+ assert_eq ! ( sbb( 2 , 1 , 2 ) , ( 1 , u32 :: MAX - 1 ) ) ;
45
+ assert_eq ! ( sbb( u8 :: MAX , 1 , 2 ) , ( 1 , u32 :: MAX - 1 ) ) ;
25
46
}
26
47
}
27
48
@@ -37,6 +58,14 @@ mod x86_64 {
37
58
( c_out, sum)
38
59
}
39
60
61
+ fn sbb ( b_in : u8 , a : u64 , b : u64 ) -> ( u8 , u64 ) {
62
+ let mut sum = 0 ;
63
+ // SAFETY: There are no safety requirements for calling `_subborrow_u64`.
64
+ // It's just unsafe for API consistency with other intrinsics.
65
+ let b_out = unsafe { arch:: _subborrow_u64 ( b_in, a, b, & mut sum) } ;
66
+ ( b_out, sum)
67
+ }
68
+
40
69
pub fn main ( ) {
41
70
assert_eq ! ( adc( 0 , 1 , 1 ) , ( 0 , 2 ) ) ;
42
71
assert_eq ! ( adc( 1 , 1 , 1 ) , ( 0 , 3 ) ) ;
@@ -46,6 +75,19 @@ mod x86_64 {
46
75
assert_eq ! ( adc( 1 , u64 :: MAX , u64 :: MAX ) , ( 1 , u64 :: MAX ) ) ;
47
76
assert_eq ! ( adc( 2 , u64 :: MAX , u64 :: MAX ) , ( 1 , u64 :: MAX ) ) ;
48
77
assert_eq ! ( adc( u8 :: MAX , u64 :: MAX , u64 :: MAX ) , ( 1 , u64 :: MAX ) ) ;
78
+
79
+ assert_eq ! ( sbb( 0 , 1 , 1 ) , ( 0 , 0 ) ) ;
80
+ assert_eq ! ( sbb( 1 , 1 , 1 ) , ( 1 , u64 :: MAX ) ) ;
81
+ assert_eq ! ( sbb( 2 , 1 , 1 ) , ( 1 , u64 :: MAX ) ) ; // any non-zero borrow acts as 1!
82
+ assert_eq ! ( sbb( u8 :: MAX , 1 , 1 ) , ( 1 , u64 :: MAX ) ) ;
83
+ assert_eq ! ( sbb( 0 , 2 , 1 ) , ( 0 , 1 ) ) ;
84
+ assert_eq ! ( sbb( 1 , 2 , 1 ) , ( 0 , 0 ) ) ;
85
+ assert_eq ! ( sbb( 2 , 2 , 1 ) , ( 0 , 0 ) ) ;
86
+ assert_eq ! ( sbb( u8 :: MAX , 2 , 1 ) , ( 0 , 0 ) ) ;
87
+ assert_eq ! ( sbb( 0 , 1 , 2 ) , ( 1 , u64 :: MAX ) ) ;
88
+ assert_eq ! ( sbb( 1 , 1 , 2 ) , ( 1 , u64 :: MAX - 1 ) ) ;
89
+ assert_eq ! ( sbb( 2 , 1 , 2 ) , ( 1 , u64 :: MAX - 1 ) ) ;
90
+ assert_eq ! ( sbb( u8 :: MAX , 1 , 2 ) , ( 1 , u64 :: MAX - 1 ) ) ;
49
91
}
50
92
}
51
93
0 commit comments