Skip to content

Commit

Permalink
Asm.fif improvements (ton-blockchain#631)
Browse files Browse the repository at this point in the history
Add missing opcodes, CUSTOMOP, disallow 256 PUSHPOW256, recursive PROGRAM, require-asm-fif-version
  • Loading branch information
SpyCheese committed Mar 10, 2023
1 parent c74c997 commit b2c149f
Showing 1 changed file with 85 additions and 1 deletion.
86 changes: 85 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
"1.0.0" 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@
7 tuple @parent-state !
current@ @ box 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 } {
7 untuple
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,28 @@ forget @proclist forget @proccnt
// ( c -- c' )
{ hash hash>libref } : >libref

{
"." $+
{ dup "." $pos dup -1 = abort"invalid version" $| 1 $| nip swap (number) drop swap } 3 times
"" $= not abort"invalid version" 3 tuple
} : parse-asm-fif-version
{
dup =: required-version parse-asm-fif-version
asm-fif-version parse-asm-fif-version
0 =: idx
{
over @' idx [] over @' idx [] cmp
dup 1 = {
"Required Asm.fif version: " @' required-version "; actual Asm.fif version: " asm-fif-version $+ $+ $+ abort
} if
{ 1 } { @' idx 1+ =: idx @' idx 3 = } cond
} until
2drop
} : require-asm-fif-version

Fift definitions Asm
' <{ : <{
' PROGRAM{ : PROGRAM{
' asm-fif-version : asm-fif-version
' require-asm-fif-version : require-asm-fif-version
Fift

0 comments on commit b2c149f

Please sign in to comment.