kvisc/vm/in/mov.c

83 lines
1.2 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_START_1(lea)
{
v1 = p2->addr;
}
IMPL_OUT;
//----------------------------------------------------------------------------//
IMPL_START_2(mov)
{
v1 = v2;
}
IMPL_OUT;
IMPL_START_1(movzx)
{
DECVZX(v2, p2);
v1 = v2;
}
IMPL_OUT;
//----------------------------------------------------------------------------//
IMPL_START_2(xchg)
{
ulong t = v1;
v1 = v2;
v2 = t;
}
IMPL_OUT_2;
IMPL_START_2(cmpxchg)
{
if (rax == v1) {
flg |= ZF;
v1 = v2;
}
else {
flg &= ~ZF;
rax = v1;
}
}
IMPL_OUT;
//----------------------------------------------------------------------------//
IMPL_START_2(ldarg)
{
if (v2 < 8)
v1 = R(AX0 + v2);
else if (v2 < 16)
v1 = R(LX0 + v2 - 8);
else
_except(ctx, E_ILL, "ldarg: value out of range: %lu", v1);
}
IMPL_OUT;
//----------------------------------------------------------------------------//
IMPL_START_1(gco)
{
v1 = cr1;
}
IMPL_OUT;
IMPL_START_1(gcd)
{
v1 = cr2;
}
IMPL_OUT;
//----------------------------------------------------------------------------//