top | item 47089762

(no title)

rep_lodsb | 10 days ago

    const diff = if (order == .asc) b_int - a_int else a_int - b_int;
    const sign_bit: u1 = @truncate(@as(UWInt, @bitCast(diff)) >> @intCast(bits));
    var mask_word = @as(usize, 0) -% @as(usize, sign_bit);
This code in the fallback path (when no constant-time @min/@max is available) will only work if the subtraction doesn't overflow. Or is this not a problem for some reason?

discuss

order

jedisct1|10 days ago

a_int and b_int are signed values.

rep_lodsb|10 days ago

It makes no difference whether they're signed or unsigned. Unless the subtraction is checking for overflow, or using a wider integer type than the numbers being compared, the high bit will not in every case indicate which number is smaller.

e.g.

    0x8000_0000 < 0x0000_0001 for signed numbers
    0x8000_0000 - 0x0000_0001 = 0x7fff_ffff, high bit clear