mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
vm
This commit is contained in:
parent
16a46dd8e7
commit
108faf9269
@ -38,7 +38,7 @@ ltostr:
|
|||||||
sgn rx8, ax1 ; extract ax1 sign
|
sgn rx8, ax1 ; extract ax1 sign
|
||||||
|
|
||||||
cmp rx8, -1 ; negative?
|
cmp rx8, -1 ; negative?
|
||||||
neg.z ax1
|
neg.z ax1, ax1
|
||||||
|
|
||||||
; main loop
|
; main loop
|
||||||
.conv:
|
.conv:
|
||||||
|
@ -147,7 +147,7 @@ strtoq:
|
|||||||
ret.z
|
ret.z
|
||||||
|
|
||||||
; yes
|
; yes
|
||||||
neg rax
|
neg rax, rax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.bad:
|
.bad:
|
||||||
|
65
vm/in/ARITH
65
vm/in/ARITH
@ -36,14 +36,14 @@ sgnf rm rim
|
|||||||
#
|
#
|
||||||
# Arithmetical NEG operation
|
# Arithmetical NEG operation
|
||||||
#
|
#
|
||||||
# $1 = NOT($1) + 1
|
# $1 = NOT($2) + 1
|
||||||
#
|
#
|
||||||
# Sets CF if $1 == 0; clears it otherwise
|
# Sets CF if $2 == 0; clears it otherwise
|
||||||
# Sets OF if $1 == $LONG_MIN; clears it otherwise
|
# Sets OF if $2 == $LONG_MIN; clears it otherwise
|
||||||
# Sets ZF and SF according to the result
|
# Sets ZF and SF according to the result
|
||||||
#
|
#
|
||||||
neg rm
|
neg rm rim
|
||||||
negf rm
|
negf rm rim
|
||||||
|
|
||||||
#
|
#
|
||||||
# Arithmetical INC operation
|
# Arithmetical INC operation
|
||||||
@ -81,6 +81,17 @@ decf rm
|
|||||||
add rm rim
|
add rm rim
|
||||||
addf rm rim
|
addf rm rim
|
||||||
|
|
||||||
|
#
|
||||||
|
# Atomic exchange and add (XADD)
|
||||||
|
#
|
||||||
|
# $tmp = $1
|
||||||
|
# $1 = $1 + $2
|
||||||
|
# $2 = $1
|
||||||
|
#
|
||||||
|
# Preserves all flags
|
||||||
|
#
|
||||||
|
xadd rm rm
|
||||||
|
|
||||||
#
|
#
|
||||||
# Arithmetical ADD operation, with carry
|
# Arithmetical ADD operation, with carry
|
||||||
#
|
#
|
||||||
@ -116,6 +127,18 @@ subf rm rim
|
|||||||
mul rm rim
|
mul rm rim
|
||||||
mulf rm rim
|
mulf rm rim
|
||||||
|
|
||||||
|
#
|
||||||
|
# Arithmetical unsigned 128-bit MUL operation
|
||||||
|
#
|
||||||
|
# $1 = HI($2 * $3)
|
||||||
|
# $2 = LO($2 * $3)
|
||||||
|
#
|
||||||
|
# Sets CF and OF if HI($2 * $3) > 0, clears them otherwise
|
||||||
|
# Preserves ZF and SF
|
||||||
|
#
|
||||||
|
mulx rm rm rim
|
||||||
|
mulfx rm rm rim
|
||||||
|
|
||||||
#
|
#
|
||||||
# Arithmetical unsigned DIV operation
|
# Arithmetical unsigned DIV operation
|
||||||
#
|
#
|
||||||
@ -125,6 +148,16 @@ mulf rm rim
|
|||||||
#
|
#
|
||||||
div rm rim
|
div rm rim
|
||||||
|
|
||||||
|
#
|
||||||
|
# Arithmetical unsigned combined DIV and MOD operations
|
||||||
|
#
|
||||||
|
# $1 = ($2 MOD $3)
|
||||||
|
# $2 = ($2 DIV $3)
|
||||||
|
#
|
||||||
|
# Preserves all flags
|
||||||
|
#
|
||||||
|
|
||||||
|
divx rm rm rim
|
||||||
#
|
#
|
||||||
# Arithmetical unsigned modulo operation (REM)
|
# Arithmetical unsigned modulo operation (REM)
|
||||||
#
|
#
|
||||||
@ -134,25 +167,3 @@ div rm rim
|
|||||||
#
|
#
|
||||||
rem rm rim
|
rem rm rim
|
||||||
|
|
||||||
#
|
|
||||||
# Arithmetical unsigned 128-bit MUL operation
|
|
||||||
#
|
|
||||||
# RDX = HI(RAX * $1)
|
|
||||||
# RAX = LO(RAX * $1)
|
|
||||||
#
|
|
||||||
# Sets CF and OF if HI($1 * $2) > 0, clears them otherwise
|
|
||||||
# Preserves ZF and SF
|
|
||||||
#
|
|
||||||
mul2 rim
|
|
||||||
mul2f rim
|
|
||||||
|
|
||||||
#
|
|
||||||
# Arithmetical unsigned combined DIV and MOD operations
|
|
||||||
#
|
|
||||||
# RDX = (RAX MOD $1)
|
|
||||||
# RAX = (RAX DIV $1)
|
|
||||||
#
|
|
||||||
# Preserves all flags
|
|
||||||
#
|
|
||||||
div2 rim
|
|
||||||
|
|
||||||
|
8
vm/in/BITMP
Normal file
8
vm/in/BITMP
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# The OS/K Team licenses this file to you under the MIT license.
|
||||||
|
# See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------#
|
||||||
|
# Bit manipulation instructions #
|
||||||
|
#---------------------------------------------------------------------------#
|
||||||
|
|
||||||
|
|
@ -11,6 +11,7 @@ include "JUMPS"
|
|||||||
include "STACK"
|
include "STACK"
|
||||||
include "FLAGS"
|
include "FLAGS"
|
||||||
include "INOUT"
|
include "INOUT"
|
||||||
|
include "BITMP"
|
||||||
include "DEBUG"
|
include "DEBUG"
|
||||||
include "STRING"
|
include "STRING"
|
||||||
include "TERNARY"
|
include "TERNARY"
|
||||||
|
@ -18,11 +18,11 @@ test rim rim
|
|||||||
#
|
#
|
||||||
# Bitwise NOT operation
|
# Bitwise NOT operation
|
||||||
#
|
#
|
||||||
# $1 = NOT($1)
|
# $1 = NOT($2)
|
||||||
#
|
#
|
||||||
# Preserves all flags
|
# Preserves all flags
|
||||||
#
|
#
|
||||||
not rm
|
not rm rim
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bitwise OR operation
|
# Bitwise OR operation
|
||||||
|
@ -5,11 +5,19 @@
|
|||||||
# 3-operand instructions #
|
# 3-operand instructions #
|
||||||
#---------------------------------------------------------------------------#
|
#---------------------------------------------------------------------------#
|
||||||
|
|
||||||
|
#
|
||||||
|
# 3-operand rotation (KROTd)
|
||||||
|
#
|
||||||
|
# $3 -> $2 -> $1 -> $3 (KROTL)
|
||||||
|
# $1 -> $2 -> $3 -> $1 (KROTR)
|
||||||
|
#
|
||||||
|
krotr rm rm rm
|
||||||
|
krotl rm rm rm
|
||||||
|
|
||||||
#
|
#
|
||||||
# 2-sources logical & arithmetical operations
|
# 2-sources logical & arithmetical operations
|
||||||
#
|
#
|
||||||
# Preserves CF and OF
|
# Preserves all flags
|
||||||
# Sets ZF and SF according to the result
|
|
||||||
#
|
#
|
||||||
kor rm rim rim
|
kor rm rim rim
|
||||||
kand rm rim rim
|
kand rm rim rim
|
||||||
@ -22,6 +30,8 @@ kxnor rm rim rim
|
|||||||
kxorn rm rim rim
|
kxorn rm rim rim
|
||||||
kshl rm rim rim
|
kshl rm rim rim
|
||||||
kshr rm rim rim
|
kshr rm rim rim
|
||||||
|
ksal rm rim rim
|
||||||
|
ksar rm rim rim
|
||||||
kadd rm rim rim
|
kadd rm rim rim
|
||||||
kadc rm rim rim
|
kadc rm rim rim
|
||||||
kado rm rim rim
|
kado rm rim rim
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include <in/instrs.h>
|
#include <in/instrs.h>
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_2(sgn)
|
IMPL_START_2(sgn)
|
||||||
{
|
{
|
||||||
@ -18,28 +18,31 @@ IMPL_START_2(sgnf)
|
|||||||
}
|
}
|
||||||
IMPL_OUT_ZSF;
|
IMPL_OUT_ZSF;
|
||||||
|
|
||||||
IMPL_START_1(neg)
|
IMPL_START_2(neg)
|
||||||
{
|
{
|
||||||
v1 = ~v1 + 1;
|
v1 = ~v2 + 1;
|
||||||
}
|
}
|
||||||
IMPL_OUT;
|
IMPL_OUT;
|
||||||
|
|
||||||
IMPL_START_1(negf)
|
IMPL_START_2(negf)
|
||||||
{
|
{
|
||||||
if (v1 == 0) flg |= CF;
|
if (v2 == 0) {
|
||||||
|
flg |= CF;
|
||||||
|
flg &= ~OF;
|
||||||
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
flg &= ~CF;
|
flg &= ~CF;
|
||||||
|
|
||||||
if (v1 == LONG_MIN) flg |= OF;
|
if (v2 == LONG_MIN) flg |= OF;
|
||||||
else flg &= ~OF;
|
else flg &= ~OF;
|
||||||
}
|
}
|
||||||
|
|
||||||
v1 = ~v1 + 1;
|
v1 = ~v2 + 1;
|
||||||
}
|
}
|
||||||
IMPL_OUT_ZSF;
|
IMPL_OUT_ZSF;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_1(inc)
|
IMPL_START_1(inc)
|
||||||
{
|
{
|
||||||
@ -71,7 +74,7 @@ IMPL_START_1(decf)
|
|||||||
}
|
}
|
||||||
IMPL_OUT_ZSF;
|
IMPL_OUT_ZSF;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_2(add)
|
IMPL_START_2(add)
|
||||||
{
|
{
|
||||||
@ -79,6 +82,14 @@ IMPL_START_2(add)
|
|||||||
}
|
}
|
||||||
IMPL_OUT;
|
IMPL_OUT;
|
||||||
|
|
||||||
|
IMPL_START_2(xadd)
|
||||||
|
{
|
||||||
|
ulong tmp = v1;
|
||||||
|
v1 += v2;
|
||||||
|
v2 = tmp;
|
||||||
|
}
|
||||||
|
IMPL_OUT_2;
|
||||||
|
|
||||||
IMPL_START_2(addf)
|
IMPL_START_2(addf)
|
||||||
{
|
{
|
||||||
if (v1 + v2 < v1) flg |= OF;
|
if (v1 + v2 < v1) flg |= OF;
|
||||||
@ -115,7 +126,7 @@ IMPL_START_2(adcf)
|
|||||||
}
|
}
|
||||||
IMPL_OUT_ZSF;
|
IMPL_OUT_ZSF;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_2(sub)
|
IMPL_START_2(sub)
|
||||||
{
|
{
|
||||||
@ -139,7 +150,7 @@ IMPL_START_2(cmp)
|
|||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
//
|
//
|
||||||
// www.codeproject.com/Tips/618570/UInt-Multiplication-Squaring
|
// www.codeproject.com/Tips/618570/UInt-Multiplication-Squaring
|
||||||
@ -190,17 +201,17 @@ IMPL_START_2(mulf)
|
|||||||
}
|
}
|
||||||
IMPL_OUT;
|
IMPL_OUT;
|
||||||
|
|
||||||
IMPL_START_1(mul2)
|
IMPL_START_3(mulx)
|
||||||
{
|
{
|
||||||
multiply(rax, v1, &rdx, &rax);
|
multiply(v2, v3, &v1, &v2);
|
||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_OUT_2;
|
||||||
|
|
||||||
IMPL_START_1(mul2f)
|
IMPL_START_3(mulfx)
|
||||||
{
|
{
|
||||||
multiply(rax, v1, &rdx, &rax);
|
multiply(v2, v3, &v1, &v2);
|
||||||
|
|
||||||
if (rdx > 0) {
|
if (v1 > 0) {
|
||||||
flg |= CF;
|
flg |= CF;
|
||||||
flg |= OF;
|
flg |= OF;
|
||||||
}
|
}
|
||||||
@ -210,9 +221,9 @@ IMPL_START_1(mul2f)
|
|||||||
flg &= ~OF;
|
flg &= ~OF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_OUT_2;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_2(div)
|
IMPL_START_2(div)
|
||||||
{
|
{
|
||||||
@ -226,10 +237,12 @@ IMPL_START_2(rem)
|
|||||||
}
|
}
|
||||||
IMPL_OUT;
|
IMPL_OUT;
|
||||||
|
|
||||||
IMPL_START_1(div2)
|
IMPL_START_3(divx)
|
||||||
{
|
{
|
||||||
rdx = rax % v1;
|
v1 = v2 % v3;
|
||||||
rax = rax / v1;
|
v2 = v2 / v3;
|
||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_OUT_2;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
0
vm/in/bitmp.c
Normal file
0
vm/in/bitmp.c
Normal file
@ -3,13 +3,15 @@
|
|||||||
|
|
||||||
#include <in/instrs.h>
|
#include <in/instrs.h>
|
||||||
|
|
||||||
IMPL_START_1(not)
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
IMPL_START_2(not)
|
||||||
{
|
{
|
||||||
v1 = ~v1;
|
v1 = ~v2;
|
||||||
}
|
}
|
||||||
IMPL_OUT;
|
IMPL_OUT;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_2(test)
|
IMPL_START_2(test)
|
||||||
{
|
{
|
||||||
@ -33,7 +35,7 @@ IMPL_START_2(andf)
|
|||||||
}
|
}
|
||||||
IMPL_OUT_ZSF;
|
IMPL_OUT_ZSF;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_2(or)
|
IMPL_START_2(or)
|
||||||
{
|
{
|
||||||
@ -63,7 +65,7 @@ IMPL_START_2(xorf)
|
|||||||
}
|
}
|
||||||
IMPL_OUT_ZSF;
|
IMPL_OUT_ZSF;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
IMPL_START_2(shl)
|
IMPL_START_2(shl)
|
||||||
{
|
{
|
||||||
@ -135,5 +137,5 @@ IMPL_START_2(sarf)
|
|||||||
}
|
}
|
||||||
IMPL_OUT_ZSF;
|
IMPL_OUT_ZSF;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
@ -5,23 +5,43 @@
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
IMPL_START_3(krotl)
|
||||||
|
{
|
||||||
|
ulong tmp = v1;
|
||||||
|
v1 = v2;
|
||||||
|
v2 = v3;
|
||||||
|
v3 = tmp;
|
||||||
|
}
|
||||||
|
IMPL_OUT_3;
|
||||||
|
|
||||||
|
IMPL_START_3(krotr)
|
||||||
|
{
|
||||||
|
ulong tmp = v3;
|
||||||
|
v3 = v2;
|
||||||
|
v2 = v1;
|
||||||
|
v1 = tmp;
|
||||||
|
}
|
||||||
|
IMPL_OUT_3;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#define K_IMPL_ALU(name, expr) \
|
#define K_IMPL_ALU(name, expr) \
|
||||||
IMPL_START_3(k##name) \
|
IMPL_START_3(k##name) \
|
||||||
{ \
|
{ \
|
||||||
v1 = (expr); \
|
v1 = (expr); \
|
||||||
} \
|
} \
|
||||||
IMPL_OUT_ZSF
|
IMPL_OUT
|
||||||
|
|
||||||
K_IMPL_ALU(or, v2 | v3);
|
K_IMPL_ALU(or, v2 | v3);
|
||||||
K_IMPL_ALU(and, v2 & v3);
|
K_IMPL_ALU(and, v2 & v3);
|
||||||
K_IMPL_ALU(xor, v2 ^ v3);
|
K_IMPL_ALU(xor, v2 ^ v3);
|
||||||
|
|
||||||
K_IMPL_ALU(nor, ~(v2 | v3));
|
K_IMPL_ALU(nor, ~(v2 | v3));
|
||||||
K_IMPL_ALU(orn, ~v2 | v3);
|
K_IMPL_ALU(orn, v2 | ~v3);
|
||||||
K_IMPL_ALU(nand, ~(v2 & v3));
|
K_IMPL_ALU(nand, ~(v2 & v3));
|
||||||
K_IMPL_ALU(andn, ~v2 & v3);
|
K_IMPL_ALU(andn, v2 & ~v3);
|
||||||
K_IMPL_ALU(xnor, ~(v2 ^ v3));
|
K_IMPL_ALU(xnor, ~(v2 ^ v3));
|
||||||
K_IMPL_ALU(xorn, ~v2 ^ v3);
|
K_IMPL_ALU(xorn, v2 ^ ~v3);
|
||||||
|
|
||||||
K_IMPL_ALU(shl, v2 << v3);
|
K_IMPL_ALU(shl, v2 << v3);
|
||||||
K_IMPL_ALU(shr, v2 >> v3);
|
K_IMPL_ALU(shr, v2 >> v3);
|
||||||
@ -38,3 +58,25 @@ K_IMPL_ALU(rem, v2 % v3);
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
IMPL_START_3(ksal)
|
||||||
|
{
|
||||||
|
long w2 = v2;
|
||||||
|
long w3 = v3;
|
||||||
|
|
||||||
|
w2 <<= w3;
|
||||||
|
v1 = (ulong)w2;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
||||||
|
IMPL_START_3(ksar)
|
||||||
|
{
|
||||||
|
long w2 = v2;
|
||||||
|
long w3 = v3;
|
||||||
|
|
||||||
|
w2 >>= w3;
|
||||||
|
v1 = (ulong)w2;
|
||||||
|
}
|
||||||
|
IMPL_OUT;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user