mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
99 lines
1.3 KiB
C
99 lines
1.3 KiB
C
// 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 <in/instrs.h>
|
|
|
|
IMPL_COND(inc);
|
|
IMPL_COND(dec);
|
|
IMPL_COND(add);
|
|
IMPL_COND(sub);
|
|
IMPL_COND(mul);
|
|
IMPL_COND(div);
|
|
IMPL_COND(sgn);
|
|
|
|
//
|
|
// 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;
|
|
|