// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include IMPL_COND(sgn); IMPL_COND(inc); IMPL_COND(dec); IMPL_COND(add); IMPL_COND(sub); IMPL_COND(mul); IMPL_COND(div); IMPL_COND(mod); IMPL_COND(mul2); IMPL_COND(div2); // // Unsigned arithmetic instructions // IMPL_START_2(add) { v1 += v2; } IMPL_OUT; IMPL_START_2(sub) { v1 -= v2; } IMPL_OUT; IMPL_START_2(mul) { v1 *= v2; } IMPL_OUT; IMPL_START_1(mul2) { // Adapted from www.codeproject.com/Tips/618570/UInt-Multiplication-Squaring ulong v2 = v1; v1 = rax; ulong u1 = (v1 & 0xffffffff); ulong u2 = (v2 & 0xffffffff); ulong t = (u1 * u2); ulong w3 = (t & 0xffffffff); ulong k = (t >> 32); v1 >>= 32; t = (v1 * u2) + k; k = (t & 0xffffffff); ulong w1 = (t >> 32); v2 >>= 32; t = (u1 * v2) + k; k = (t >> 32); rdx = (v1 * v2) + w1 + k; rax = (t << 32) + w3; } IMPL_END; IMPL_START_2(div) { v1 /= v2; } IMPL_OUT; IMPL_START_2(mod) { v1 %= v2; } IMPL_OUT; IMPL_START_1(div2) { rdx = rax % v1; rax = rax / v1; } IMPL_END; IMPL_START_1(inc) { v1++; } IMPL_OUT; IMPL_START_1(dec) { v1--; } IMPL_OUT; IMPL_START_2(sgn) { v1 = (v2 ? ((long)v2 > 0 ? 1 : (ulong)-1L) : 0); } IMPL_OUT;