1 /* 2 * Signed 64-bit integer multiply. 3 * 4 * For JIT: op1 in r0/r1, op2 in r2/r3, return in r0/r1 5 * 6 * Consider WXxYZ (r1r0 x r3r2) with a long multiply: 7 * WX 8 * x YZ 9 * -------- 10 * ZW ZX 11 * YW YX 12 * 13 * The low word of the result holds ZX, the high word holds 14 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because 15 * it doesn't fit in the low 64 bits. 16 * 17 * Unlike most ARM math operations, multiply instructions have 18 * restrictions on using the same register more than once (Rd and Rm 19 * cannot be the same). 20 */ 21 /* mul-long vAA, vBB, vCC */ 22 mul ip, r2, r1 @ ip<- ZxW 23 umull r9, r10, r2, r0 @ r9/r10 <- ZxX 24 mla r2, r0, r3, ip @ r2<- YxX + (ZxW) 25 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX)) 26 mov r0,r9 27 mov r1,r10 28 bx lr 29