Skip to content

Commit

Permalink
Asm.fif improvements (#631) (#645)
Browse files Browse the repository at this point in the history
* Asm.fif improvements (#631)

Add missing opcodes, CUSTOMOP, disallow 256 PUSHPOW256, recursive PROGRAM, require-asm-fif-version

* Fix nested PROGRAM, add test

* Simplify require-asm-fif-version

---------

Co-authored-by: EmelyanenkoK <[email protected]>
  • Loading branch information
SpyCheese and EmelyanenkoK authored Mar 13, 2023
1 parent fbb1e54 commit 4d5ded5
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 1 deletion.
101 changes: 100 additions & 1 deletion crypto/fift/lib/Asm.fif
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ library TVM_Asm
// simple TVM Assembler
namespace Asm
Asm definitions
"0.4.3" constant asm-fif-version

variable @atend
variable @was-split
false @was-split !
Expand Down Expand Up @@ -253,7 +255,7 @@ x{7F} @Defop TRUE
} cond
} cond
@addopb } dup : PUSHINT : INT
{ <b x{83} s, swap 1- 8 u, @addopb } : PUSHPOW2
{ dup 256 = abort"use PUSHNAN instead of 256 PUSHPOW2" <b x{83} s, swap 1- 8 u, @addopb } : PUSHPOW2
x{83FF} @Defop PUSHNAN
{ <b x{84} s, swap 1- 8 u, @addopb } : PUSHPOW2DEC
{ <b x{85} s, swap 1- 8 u, @addopb } : PUSHNEGPOW2
Expand Down Expand Up @@ -326,38 +328,85 @@ x{A7} x{A8} @Defop(8i,alt) MULCONST
' SUBCONST : SUBINT
' MULCONST : MULINT
x{A8} @Defop MUL

x{A904} @Defop DIV
x{A905} @Defop DIVR
x{A906} @Defop DIVC
x{A908} @Defop MOD
x{A909} @Defop MODR
x{A90A} @Defop MODC
x{A90C} @Defop DIVMOD
x{A90D} @Defop DIVMODR
x{A90E} @Defop DIVMODC

x{A925} @Defop RSHIFTR
x{A926} @Defop RSHIFTC
x{A928} @Defop MODPOW2
x{A929} @Defop MODPOW2R
x{A92A} @Defop MODPOW2C
x{A92C} @Defop RSHIFTMOD
x{A92D} @Defop RSHIFTMODR
x{A92E} @Defop RSHIFTMODC

x{A935} @Defop(8u+1) RSHIFTR#
x{A936} @Defop(8u+1) RSHIFTC#
x{A938} @Defop(8u+1) MODPOW2#
x{A939} @Defop(8u+1) MODPOW2R#
x{A93A} @Defop(8u+1) MODPOW2C#
x{A93C} @Defop(8u+1) RSHIFT#MOD
x{A93D} @Defop(8u+1) RSHIFTR#MOD
x{A93E} @Defop(8u+1) RSHIFTC#MOD

x{A984} @Defop MULDIV
x{A985} @Defop MULDIVR
x{A986} @Defop MULDIVC
x{A988} @Defop MULMOD
x{A989} @Defop MULMODR
x{A98A} @Defop MULMODC
x{A98C} @Defop MULDIVMOD
x{A98D} @Defop MULDIVMODR
x{A98E} @Defop MULDIVMODC

x{A9A4} @Defop MULRSHIFT
x{A9A5} @Defop MULRSHIFTR
x{A9A6} @Defop MULRSHIFTC
x{A9A8} @Defop MULMODPOW2
x{A9A9} @Defop MULMODPOW2R
x{A9AA} @Defop MULMODPOW2C
x{A9AC} @Defop MULRSHIFTMOD
x{A9AD} @Defop MULRSHIFTRMOD
x{A9AE} @Defop MULRSHIFTCMOD

x{A9B4} @Defop(8u+1) MULRSHIFT#
x{A9B5} @Defop(8u+1) MULRSHIFTR#
x{A9B6} @Defop(8u+1) MULRSHIFTC#
x{A9B8} @Defop(8u+1) MULMODPOW2#
x{A9B9} @Defop(8u+1) MULMODPOW2R#
x{A9BA} @Defop(8u+1) MULMODPOW2C#
x{A9BC} @Defop(8u+1) MULRSHIFT#MOD
x{A9BD} @Defop(8u+1) MULRSHIFTR#MOD
x{A9BE} @Defop(8u+1) MULRSHIFTC#MOD

x{A9C4} @Defop LSHIFTDIV
x{A9C5} @Defop LSHIFTDIVR
x{A9C6} @Defop LSHIFTDIVC
x{A9C8} @Defop LSHIFTMOD
x{A9C9} @Defop LSHIFTMODR
x{A9CA} @Defop LSHIFTMODC
x{A9CC} @Defop LSHIFTDIVMOD
x{A9CD} @Defop LSHIFTDIVMODR
x{A9CE} @Defop LSHIFTDIVMODC

x{A9D4} @Defop(8u+1) LSHIFT#DIV
x{A9D5} @Defop(8u+1) LSHIFT#DIVR
x{A9D6} @Defop(8u+1) LSHIFT#DIVC
x{A9D8} @Defop(8u+1) LSHIFT#MOD
x{A9D9} @Defop(8u+1) LSHIFT#MODR
x{A9DA} @Defop(8u+1) LSHIFT#MODC
x{A9DC} @Defop(8u+1) LSHIFT#DIVMOD
x{A9DD} @Defop(8u+1) LSHIFT#DIVMODR
x{A9DE} @Defop(8u+1) LSHIFT#DIVMODC

x{AA} @Defop(8u+1) LSHIFT#
x{AB} @Defop(8u+1) RSHIFT#
x{AC} @Defop LSHIFT
Expand Down Expand Up @@ -506,6 +555,7 @@ x{CF1E} @Defop STSLICERQ
x{CF1F} dup @Defop STBRQ @Defop BCONCATQ
x{CF20} @Defop(ref) STREFCONST
{ <b x{CF21} s, rot ref, swap ref, @addopb } : STREF2CONST
x{CF23} @Defop ENDXC
x{CF28} @Defop STILE4
x{CF29} @Defop STULE4
x{CF2A} @Defop STILE8
Expand Down Expand Up @@ -608,6 +658,9 @@ x{D733} @Defop SSKIPLAST
x{D734} @Defop SUBSLICE
x{D736} @Defop SPLIT
x{D737} @Defop SPLITQ
x{D739} @Defop XCTOS
x{D73A} @Defop XLOAD
x{D73B} @Defop XLOADQ
x{D741} @Defop SCHKBITS
x{D742} @Defop SCHKREFS
x{D743} @Defop SCHKBITREFS
Expand Down Expand Up @@ -1194,6 +1247,8 @@ x{FFF0} @Defop SETCPX
255 and <b x{FF} s, swap 8 u, @addopb
} : SETCP

' @addop : CUSTOMOP

//
// provisions for defining programs consisting of several mutually-recursive procedures
//
Expand All @@ -1202,6 +1257,7 @@ variable @proclist
variable @procdict
variable @procinfo
variable @gvarcnt
variable @parent-state
variable asm-mode 1 asm-mode !
19 constant @procdictkeylen
32 constant @zcount
Expand All @@ -1224,6 +1280,9 @@ variable asm-mode 1 asm-mode !
variable @oldcurrent variable @oldctx
Fift-wordlist dup @oldcurrent ! @oldctx !
{ current@ @oldcurrent ! context@ @oldctx ! Asm definitions
@proccnt @ @proclist @ @procdict @ @procinfo @ @gvarcnt @ @parent-state @ current@ @oldcurrent @ @oldctx @
9 tuple @parent-state !
hole current!
0 =: main @proclist null! @proccnt 0! @gvarcnt 0!
{ bl word @newproc } : NEWPROC
{ bl word dup (def?) ' drop ' @newproc cond } : DECLPROC
Expand Down Expand Up @@ -1298,6 +1357,10 @@ Fift-wordlist dup @oldcurrent ! @oldctx !
} while
drop @proclist null! @procinfo null! @proccnt 0!
@procdict dup @ swap null!
@parent-state @ dup null? { drop } {
9 untuple
@oldctx ! @oldcurrent ! current! @parent-state ! @gvarcnt ! @procinfo ! @procdict ! @proclist ! @proccnt !
} cond
@oldctx @ context! @oldcurrent @ current!
} : }END
forget @proclist forget @proccnt
Expand Down Expand Up @@ -1326,7 +1389,43 @@ forget @proclist forget @proccnt
// ( c -- c' )
{ hash hash>libref } : >libref

{ dup "." $pos dup -1 =
{ drop 0 }
{ $| 1 $| nip swap (number) 1- abort"invalid version"
dup dup 0 < swap 999 > or abort"invalid version"
}
cond
} : parse-version-level

{
0 swap
"." $+
{ swap 1000 * swap parse-version-level rot + swap } 3 times
"" $= not abort"invalid version"
} : parse-asm-fif-version

{
dup =: required-version parse-asm-fif-version
asm-fif-version parse-asm-fif-version
= 1+ {
"Required Asm.fif version: " @' required-version "; actual Asm.fif version: " asm-fif-version $+ $+ $+ abort
} if
} : require-asm-fif-version

{
dup =: required-version parse-asm-fif-version
asm-fif-version parse-asm-fif-version
swap
>= 1+ {
"Required Asm.fif version: " @' required-version "; actual Asm.fif version: " asm-fif-version $+ $+ $+ abort
} if
} : require-asm-fif-version>=


Fift definitions Asm
' <{ : <{
' PROGRAM{ : PROGRAM{
' asm-fif-version : asm-fif-version
' require-asm-fif-version : require-asm-fif-version
' require-asm-fif-version>= : require-asm-fif-version>=
Fift
4 changes: 4 additions & 0 deletions crypto/test/fift.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,7 @@ TEST(Fift, test_fiftext) {
TEST(Fift, test_namespaces) {
run_fift("namespaces.fif");
}

TEST(Fift, test_asm_nested_program) {
run_fift("asm-nested-program.fif");
}
93 changes: 93 additions & 0 deletions crypto/test/fift/asm-nested-program.fif
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
"Asm.fif" include

// Four programs:
// 4 contains 2 and 3, 2 contains 1

// Program #1
PROGRAM{
DECLPROC foo1
DECLPROC foo2
DECLPROC foo3
DECLPROC main
foo1 PROC:<{ MUL INC }>
foo2 PROCINLINE:<{ PLDREF }>
foo3 PROC:<{ CTOS foo2 INLINECALLDICT CTOS 32 PLDU }>
main PROC:<{ 0 PUSHINT }>
}END>c constant code-1

// Program #2
PROGRAM{
DECLPROC foo3
DECLPROC foo4
DECLPROC main
foo3 PROC:<{ code-1 PUSHREF }>
foo4 PROC:<{ CTOS 8 PLDU }>
main PROC:<{ foo3 CALLDICT foo4 CALLDICT NEWC ROT STUX }>
}END>c constant code-2

// Program #3
PROGRAM{
DECLPROC foo1
DECLPROC foo4
DECLPROC main
foo1 PROC:<{ DUP 137 PUSHINT MUL PAIR }>
foo4 PROC:<{ UNPAIR SWAP DIV }>
main PROC:<{ 70 PUSHINT DIV }>
}END>c constant code-3

// Program #4
PROGRAM{
DECLPROC foo2
DECLPROC foo3
DECLPROC foo5
DECLPROC main
foo2 PROC:<{ code-2 PUSHREF }>
foo3 PROC:<{ code-3 PUSHREF }>
foo5 PROC:<{ foo2 CALLDICT CTOS 8 PLDU 1 RSHIFT# }>
main PROC:<{ foo5 CALLDICT 5 MULCONST }>
}END>c

.dump cr

// Program #4, nested
PROGRAM{
DECLPROC foo2
DECLPROC foo3
DECLPROC foo5
DECLPROC main
foo2 PROC:<{
PROGRAM{
DECLPROC foo3
DECLPROC foo4
DECLPROC main
foo3 PROC:<{
PROGRAM{
DECLPROC foo1
DECLPROC foo2
DECLPROC foo3
DECLPROC main
foo1 PROC:<{ MUL INC }>
foo2 PROCINLINE:<{ PLDREF }>
foo3 PROC:<{ CTOS foo2 INLINECALLDICT CTOS 32 PLDU }>
main PROC:<{ 0 PUSHINT }>
}END>c PUSHREF
}>
foo4 PROC:<{ CTOS 8 PLDU }>
main PROC:<{ foo3 CALLDICT foo4 CALLDICT NEWC ROT STUX }>
}END>c PUSHREF
}>
foo3 PROC:<{
PROGRAM{
DECLPROC foo1
DECLPROC foo4
DECLPROC main
foo1 PROC:<{ DUP 137 PUSHINT MUL PAIR }>
foo4 PROC:<{ UNPAIR SWAP DIV }>
main PROC:<{ 70 PUSHINT DIV }>
}END>c PUSHREF
}>
foo5 PROC:<{ foo2 CALLDICT CTOS 8 PLDU 1 RSHIFT# }>
main PROC:<{ foo5 CALLDICT 5 MULCONST }>
}END>c

.dump cr
1 change: 1 addition & 0 deletions test/regression-tests.ans
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Test_Fift_bug_div_default 1ac42861ce96b2896001c587f65e9afe1617db48859f19c2f4e306
Test_Fift_bug_newlize_default e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Test_Fift_bug_ufits_default 51bf5a9f1ed7633a193f6fdd17a7a3af8e032dfe72a9669c85e8639aa8a7c195
Test_Fift_contfrac_default 09ebce5c91bcb70696c6fb6981d82dc3b9e3444dab608a7a1b044c0ddd778a96
Test_Fift_test_asm_nested_program_default 2a19decac67adb719c444ab42879a5d894447d450d1998848c469605531076ad
Test_Fift_test_default 4e44b3382963ec89f7b5c8f2ebd85da3bc8aebad5b49f5b11b14075061477b4d
Test_Fift_test_dict_default a9c8cbcfdece5573185022cea07f59f1bc404e5d879e5157a5745757f8ee0525
Test_Fift_test_disasm_default dacaa555f5f217b2373e01e3bcd59634e480f5759dcc43edbdef35273ae38492
Expand Down

0 comments on commit 4d5ded5

Please sign in to comment.