use more useful defaults for -O, fix an utoa issue

This commit is contained in:
dcode
2019-05-24 14:45:27 +02:00
parent c41c57e6d6
commit af00bdeefe
42 changed files with 6210 additions and 7097 deletions

View File

@ -107,28 +107,19 @@ const FRC_POWERS: u64[] = [
// Count number of decimals for u32 values
// In our case input value always non-zero so we can simplify some parts
export function decimalCount32(value: u32): u32 {
if (ASC_SHRINK_LEVEL >= 1) {
let l: u32 = 32 - clz<u32>(value); // log2
let t = l * 1233 >>> 12; // log10
let power = unchecked(POWERS10[t]);
t -= u32(value < power);
return t + 1;
} else {
if (value < 100000) {
if (value < 100) {
return select<u32>(1, 2, value < 10);
} else {
let m = select<u32>(4, 5, value < 10000);
return select<u32>(3, m, value < 1000);
}
if (value < 100000) {
if (value < 100) {
return select<u32>(1, 2, value < 10);
} else {
if (value < 10000000) {
return select<u32>(6, 7, value < 1000000);
} else {
let m = select<u32>(9, 10, value < 1000000000);
return select<u32>(8, m, value < 100000000);
}
let m = select<u32>(4, 5, value < 10000);
return select<u32>(3, m, value < 1000);
}
} else {
if (value < 10000000) {
return select<u32>(6, 7, value < 1000000);
} else {
let m = select<u32>(9, 10, value < 1000000000);
return select<u32>(8, m, value < 100000000);
}
}
}
@ -136,28 +127,19 @@ export function decimalCount32(value: u32): u32 {
// Count number of decimals for u64 values
// In our case input value always greater than 2^32-1 so we can skip some parts
export function decimalCount64(value: u64): u32 {
if (ASC_SHRINK_LEVEL >= 1) {
let l: u32 = 64 - <u32>clz<u64>(value); // log2
let t = l * 1233 >>> 12; // log10
let power = unchecked(<u64>POWERS10[t]);
t -= u32(value < 10000000000 * power);
return t + 1;
} else {
if (value < 1000000000000000) {
if (value < 1000000000000) {
return select<u32>(11, 12, value < 100000000000);
} else {
let m = select<u32>(14, 15, value < 100000000000000);
return select<u32>(13, m, value < 10000000000000);
}
if (value < 1000000000000000) {
if (value < 1000000000000) {
return select<u32>(11, 12, value < 100000000000);
} else {
if (value < 100000000000000000) {
return select<u32>(16, 17, value < 10000000000000000);
} else {
let m = select<u32>(19, 20, value < 10000000000000000000);
return select<u32>(18, m, value < 1000000000000000000);
}
let m = select<u32>(14, 15, value < 100000000000000);
return select<u32>(13, m, value < 10000000000000);
}
} else {
if (value < 100000000000000000) {
return select<u32>(16, 17, value < 10000000000000000);
} else {
let m = select<u32>(19, 20, value < 10000000000000000000);
return select<u32>(18, m, value < 1000000000000000000);
}
}
}