    .text
_start:
    li x2,  0xdead00000        # +59774074880
    li x3,  0              # zero
    li x4,  1              # one
    li x5, -1              # -1
    li x6,  0xdead00000        # duplicate of x2
    li x7, -235555555555           # negative
    li x8,  123456789         # positive
    li x9, -765432000000         # negative
    li x10, 0x7fffffffffffffff  # max positive 64b
    li x11, 0x8000000000000000  # min negative 64b

    # --------------------------------------------------------------
    # 1. MULH : a * 0
    mulh x31, x2, x3
    # expected: 0000000000000000

    # 2. MULH : a * 1
    mulh x31, x2, x4
    # expected: 0000000000000000

    # 3. MULH : a * a
    mulh x31, x2, x6
    # expected: 00000000000000c1

    # 4. MULH : -1 * a
    mulh x31, x5, x2
    # expected: ffffffffffffffff

    # 5. MULH : negative * negative
    mulh x31, x7, x7
    # expected: 0000000000000bbf

    # 6. MULH : negative * positive
    mulh x31, x7, x8
    # expected: fffffffffffffffe

    # 7. MULH : positive * negative
    mulh x31, x8, x9
    # expected: fffffffffffffffa

    # 8. MULH : overflow example (max * 2)
    li x12, 2
    mulh x31, x10, x12
    # expected: 0000000000000000

    # 9. MULH : max * max
    mulh x31, x10, x10
    # expected: 3fffffffffffffff

    # 10. MULH : min * min
    mulh x31, x11, x11
    # expected: 4000000000000000
