public static boolean fastMultiply5x6HalfWords()

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;
  }