in kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/common/FastHiveDecimalImpl.java [8245:8353]
public static boolean fastMultiply5x6HalfWords(
long left0, long left1, long left2, long right0, long right1, long right2, long[] result) {
if (result.length != 6) {
throw new RuntimeException("Expecting result array length = 6");
}
long product;
final long halfRight0 = right0 % MULTIPLER_INTWORD_DECIMAL;
final long halfRight1 = right0 / MULTIPLER_INTWORD_DECIMAL;
final long halfRight2 = right1 % MULTIPLER_INTWORD_DECIMAL;
final long halfRight3 = right1 / MULTIPLER_INTWORD_DECIMAL;
final long halfRight4 = right2 % MULTIPLER_INTWORD_DECIMAL;
final long halfRight5 = right2 / MULTIPLER_INTWORD_DECIMAL;
final long halfLeft0 = left0 % MULTIPLER_INTWORD_DECIMAL;
final long halfLeft1 = left0 / MULTIPLER_INTWORD_DECIMAL;
final long halfLeft2 = left1 % MULTIPLER_INTWORD_DECIMAL;
final long halfLeft3 = left1 / MULTIPLER_INTWORD_DECIMAL;
final long halfLeft4 = left2 % MULTIPLER_INTWORD_DECIMAL;
// v[0]
product = halfRight0 * halfLeft0;
final int z0 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[1] where (product % MULTIPLER_INTWORD_DECIMAL) is the carry from v[0].
product =
halfRight0 * halfLeft1 + halfRight1 * halfLeft0 + (product / MULTIPLER_INTWORD_DECIMAL);
final int z1 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[2]
product =
halfRight0 * halfLeft2
+ halfRight1 * halfLeft1
+ halfRight2 * halfLeft0
+ (product / MULTIPLER_INTWORD_DECIMAL);
final int z2 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[3]
product =
halfRight0 * halfLeft3
+ halfRight1 * halfLeft2
+ halfRight2 * halfLeft1
+ halfRight3 * halfLeft0
+ (product / MULTIPLER_INTWORD_DECIMAL);
final int z3 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[4]
product =
halfRight0 * halfLeft4
+ halfRight1 * halfLeft3
+ halfRight2 * halfLeft2
+ halfRight3 * halfLeft1
+ halfRight4 * halfLeft0
+ (product / MULTIPLER_INTWORD_DECIMAL);
final int z4 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[5] -- since left integer #5 is always 0, some products here are not included.
product =
halfRight1 * halfLeft4
+ halfRight2 * halfLeft3
+ halfRight3 * halfLeft2
+ halfRight4 * halfLeft1
+ halfRight5 * halfLeft0
+ (product / MULTIPLER_INTWORD_DECIMAL);
final int z5 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[6] -- since left integer #5 is always 0, some products here are not included.
product =
halfRight2 * halfLeft4
+ halfRight3 * halfLeft3
+ halfRight4 * halfLeft2
+ halfRight5 * halfLeft1
+ (product / MULTIPLER_INTWORD_DECIMAL);
final int z6 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[7] -- since left integer #5 is always 0, some products here are not included.
product =
halfRight3 * halfLeft4
+ halfRight4 * halfLeft3
+ halfRight5 * halfLeft2
+ (product / MULTIPLER_INTWORD_DECIMAL);
final int z7 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[8] -- since left integer #5 is always 0, some products here are not included.
product =
halfRight4 * halfLeft4 + halfRight5 * halfLeft3 + (product / MULTIPLER_INTWORD_DECIMAL);
final int z8 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[9] -- since left integer #5 is always 0, some products here are not included.
product = halfRight5 * halfLeft4 + (product / MULTIPLER_INTWORD_DECIMAL);
final int z9 = (int) (product % MULTIPLER_INTWORD_DECIMAL);
// v[10] -- since left integer #5 is always 0, some products here are not included.
product = +(product / MULTIPLER_INTWORD_DECIMAL);
if (product > MULTIPLER_INTWORD_DECIMAL) {
return false;
}
result[0] = (long) z1 * MULTIPLER_INTWORD_DECIMAL + (long) z0;
result[1] = (long) z3 * MULTIPLER_INTWORD_DECIMAL + (long) z2;
result[2] = (long) z5 * MULTIPLER_INTWORD_DECIMAL + (long) z4;
result[3] = (long) z7 * MULTIPLER_INTWORD_DECIMAL + (long) z6;
result[4] = (long) z9 * MULTIPLER_INTWORD_DECIMAL + (long) z8;
result[5] = product;
return true;
}