lib/strconv: retire workarounds in f32todecf32 (#168)
The two local-binds were #168 dodges: a CSE before `% 10u32` to avoid the signed-IDIVQ-on-call-result shape that #168 has now fixed. Inline to the natural form, faithful to ftos_ryu.ha:418-421,444-445 — this exercises #168 in real ported code. The dividends are zero-extended u32 (always positive as 64-bit), so IDIVQ and DIVQ agree on the value; the fix is a cs==ww byte-id shape correction, not a value change. strconv is compiler-imported, so this regenerates the w6c/wwdump/smoke amalgamations.
This commit is contained in:
@@ -445,11 +445,8 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5inv_divpow2(mm, q, i);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
let l: u32 = (F32_POW5_INV_BITCOUNT: u32) + pow5bits(q - 1u32) - 1u32;
|
||||
// #168 dodge: div/mod on an inline N_CALL result emits a
|
||||
// signed IDIVQ in wwstage; bind the call to a local first.
|
||||
let lrd: u32 = mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32) % 10u32): u8;
|
||||
};
|
||||
if (q <= 9u32) {
|
||||
if (mv % 5u32 == 0u32) {
|
||||
@@ -471,9 +468,7 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5_divpow2(mm, i, j);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
j = (q: i32) - 1i32 - ((pow5bits(i + 1u32): i32) - (F32_POW5_BITCOUNT: i32));
|
||||
// #168 dodge (see above): local-bind before the % 10.
|
||||
let lrd: u32 = mulpow5_divpow2(mv, (i + 1u32), j);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5_divpow2(mv, (i + 1u32), j) % 10u32): u8;
|
||||
};
|
||||
if (q <= 1u32) {
|
||||
vr_trailing_zeroes = true;
|
||||
|
||||
@@ -3763,11 +3763,8 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5inv_divpow2(mm, q, i);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
let l: u32 = (F32_POW5_INV_BITCOUNT: u32) + pow5bits(q - 1u32) - 1u32;
|
||||
// #168 dodge: div/mod on an inline N_CALL result emits a
|
||||
// signed IDIVQ in wwstage; bind the call to a local first.
|
||||
let lrd: u32 = mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32) % 10u32): u8;
|
||||
};
|
||||
if (q <= 9u32) {
|
||||
if (mv % 5u32 == 0u32) {
|
||||
@@ -3789,9 +3786,7 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5_divpow2(mm, i, j);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
j = (q: i32) - 1i32 - ((pow5bits(i + 1u32): i32) - (F32_POW5_BITCOUNT: i32));
|
||||
// #168 dodge (see above): local-bind before the % 10.
|
||||
let lrd: u32 = mulpow5_divpow2(mv, (i + 1u32), j);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5_divpow2(mv, (i + 1u32), j) % 10u32): u8;
|
||||
};
|
||||
if (q <= 1u32) {
|
||||
vr_trailing_zeroes = true;
|
||||
|
||||
@@ -1786,11 +1786,8 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5inv_divpow2(mm, q, i);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
let l: u32 = (F32_POW5_INV_BITCOUNT: u32) + pow5bits(q - 1u32) - 1u32;
|
||||
// #168 dodge: div/mod on an inline N_CALL result emits a
|
||||
// signed IDIVQ in wwstage; bind the call to a local first.
|
||||
let lrd: u32 = mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32) % 10u32): u8;
|
||||
};
|
||||
if (q <= 9u32) {
|
||||
if (mv % 5u32 == 0u32) {
|
||||
@@ -1812,9 +1809,7 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5_divpow2(mm, i, j);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
j = (q: i32) - 1i32 - ((pow5bits(i + 1u32): i32) - (F32_POW5_BITCOUNT: i32));
|
||||
// #168 dodge (see above): local-bind before the % 10.
|
||||
let lrd: u32 = mulpow5_divpow2(mv, (i + 1u32), j);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5_divpow2(mv, (i + 1u32), j) % 10u32): u8;
|
||||
};
|
||||
if (q <= 1u32) {
|
||||
vr_trailing_zeroes = true;
|
||||
|
||||
@@ -1786,11 +1786,8 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5inv_divpow2(mm, q, i);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
let l: u32 = (F32_POW5_INV_BITCOUNT: u32) + pow5bits(q - 1u32) - 1u32;
|
||||
// #168 dodge: div/mod on an inline N_CALL result emits a
|
||||
// signed IDIVQ in wwstage; bind the call to a local first.
|
||||
let lrd: u32 = mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5inv_divpow2(mv, q - 1u32,
|
||||
-e2 + ((q + l): i32) - 1i32) % 10u32): u8;
|
||||
};
|
||||
if (q <= 9u32) {
|
||||
if (mv % 5u32 == 0u32) {
|
||||
@@ -1812,9 +1809,7 @@ fn f32todecf32(mantissa: u32, exponent: u32) decf32 = {
|
||||
vm = mulpow5_divpow2(mm, i, j);
|
||||
if (q != 0u32 && (vp - 1u32) / 10u32 <= vm / 10u32) {
|
||||
j = (q: i32) - 1i32 - ((pow5bits(i + 1u32): i32) - (F32_POW5_BITCOUNT: i32));
|
||||
// #168 dodge (see above): local-bind before the % 10.
|
||||
let lrd: u32 = mulpow5_divpow2(mv, (i + 1u32), j);
|
||||
last_removed_digit = (lrd % 10u32): u8;
|
||||
last_removed_digit = (mulpow5_divpow2(mv, (i + 1u32), j) % 10u32): u8;
|
||||
};
|
||||
if (q <= 1u32) {
|
||||
vr_trailing_zeroes = true;
|
||||
|
||||
Reference in New Issue
Block a user