@@ -50,8 +50,8 @@ pragma(inline, true)
50
50
int adds (int x, int y, ref bool overflow)
51
51
{
52
52
const r = x + y;
53
- if ( ~ x._differentSign(y) // x and y has the same sign
54
- & x._differentSign(r)) // result has different sign
53
+ if ( ! x._differentSign(y) // x and y has the same sign
54
+ && x._differentSign(r)) // result has different sign
55
55
overflow = true ;
56
56
return r;
57
57
}
@@ -79,8 +79,8 @@ pragma(inline, true)
79
79
long adds (long x, long y, ref bool overflow)
80
80
{
81
81
const r = x + y;
82
- if ( ~ x._differentSign(y) // x and y has the same sign
83
- & x._differentSign(r)) // result has different sign
82
+ if ( ! x._differentSign(y) // x and y has the same sign
83
+ && x._differentSign(r)) // result has different sign
84
84
overflow = true ;
85
85
return r;
86
86
}
@@ -190,8 +190,8 @@ pragma(inline, true)
190
190
int subs (int x, int y, ref bool overflow)
191
191
{
192
192
const r = x - y;
193
- if ( x._differentSign(y) // x and y has different sign
194
- & x._differentSign(r)) // result and x has different sign
193
+ if ( x._differentSign(y) // x and y has different sign
194
+ && x._differentSign(r)) // result and x has different sign
195
195
overflow = true ;
196
196
return r;
197
197
}
@@ -219,8 +219,8 @@ pragma(inline, true)
219
219
long subs (long x, long y, ref bool overflow)
220
220
{
221
221
const r = x - y;
222
- if ( x._differentSign(y) // x and y has different sign
223
- & x._differentSign(r)) // result and x has different sign
222
+ if ( x._differentSign(y) // x and y has different sign
223
+ && x._differentSign(r)) // result and x has different sign
224
224
overflow = true ;
225
225
return r;
226
226
}
@@ -418,8 +418,8 @@ pragma(inline, true)
418
418
long muls (long x, long y, ref bool overflow)
419
419
{
420
420
const r = x * y;
421
- if ( ~ x._differentSign(y) // x and y has the same sign
422
- & r._signBit // and result is negative (covers min * -1)
421
+ if ( ! x._differentSign(y) // x and y has the same sign
422
+ && r < 0 // and result is negative (covers min * -1)
423
423
|| x && r / x != y) // or perform simple check for x != 0
424
424
overflow = true ;
425
425
return r;
@@ -525,15 +525,8 @@ unittest
525
525
private :
526
526
527
527
pragma (inline, true )
528
- @property size_t _signBit (T)(in T n )
528
+ bool _differentSign (T)(in T a, in T b )
529
529
if (is (T == int ) || is (T == long ))
530
530
{
531
- return cast (size_t ) (n >>> T.sizeof * 8 - 1 );
532
- }
533
-
534
- pragma (inline, true )
535
- size_t _differentSign (T)(in T a, in T b)
536
- if (is (T == int ) || is (T == long ))
537
- {
538
- return (a ^ b)._signBit;
531
+ return (a < 0 ) != (b < 0 );
539
532
}
0 commit comments