more PowerPC work done; overflow checks remain
parent
1abf62487d
commit
a76f7107c3
|
@ -130,7 +130,7 @@ sequences words ;
|
||||||
: binary-op-reg ( op out -- )
|
: binary-op-reg ( op out -- )
|
||||||
>r in-2
|
>r in-2
|
||||||
1 %dec-d ,
|
1 %dec-d ,
|
||||||
1 <vreg> 0 <vreg> rot execute ,
|
>r 1 <vreg> 0 <vreg> 0 <vreg> r> execute ,
|
||||||
r> 0 %replace-d , ;
|
r> 0 %replace-d , ;
|
||||||
|
|
||||||
: literal-fixnum? ( value -- ? )
|
: literal-fixnum? ( value -- ? )
|
||||||
|
@ -141,7 +141,7 @@ sequences words ;
|
||||||
>r >r node-peek dup literal-fixnum? [
|
>r >r node-peek dup literal-fixnum? [
|
||||||
1 %dec-d ,
|
1 %dec-d ,
|
||||||
in-1
|
in-1
|
||||||
literal-value 0 <vreg> r> execute ,
|
literal-value 0 <vreg> 0 <vreg> r> execute ,
|
||||||
r> 0 %replace-d ,
|
r> 0 %replace-d ,
|
||||||
] [
|
] [
|
||||||
drop
|
drop
|
||||||
|
@ -172,7 +172,7 @@ sequences words ;
|
||||||
literal-value dup power-of-2? [
|
literal-value dup power-of-2? [
|
||||||
1 %dec-d ,
|
1 %dec-d ,
|
||||||
in-1
|
in-1
|
||||||
log2 0 <vreg> %fixnum<< ,
|
log2 0 <vreg> 0 <vreg> %fixnum<< ,
|
||||||
0 0 %replace-d ,
|
0 0 %replace-d ,
|
||||||
] [
|
] [
|
||||||
drop slow-fixnum*
|
drop slow-fixnum*
|
||||||
|
@ -186,7 +186,11 @@ sequences words ;
|
||||||
! This is not clever. Because of x86, %fixnum-mod is
|
! This is not clever. Because of x86, %fixnum-mod is
|
||||||
! hard-coded to put its output in vreg 2, which happends to
|
! hard-coded to put its output in vreg 2, which happends to
|
||||||
! be EDX there.
|
! be EDX there.
|
||||||
drop \ %fixnum-mod 2 binary-op-reg
|
drop
|
||||||
|
in-2
|
||||||
|
1 %dec-d ,
|
||||||
|
1 <vreg> 0 <vreg> 2 <vreg> %fixnum-mod ,
|
||||||
|
2 0 %replace-d ,
|
||||||
] "intrinsic" set-word-prop
|
] "intrinsic" set-word-prop
|
||||||
|
|
||||||
\ fixnum/i t "intrinsic" set-word-prop
|
\ fixnum/i t "intrinsic" set-word-prop
|
||||||
|
@ -199,7 +203,9 @@ sequences words ;
|
||||||
! See the remark on fixnum-mod for vreg usage
|
! See the remark on fixnum-mod for vreg usage
|
||||||
drop
|
drop
|
||||||
in-2
|
in-2
|
||||||
0 <vreg> 1 <vreg> %fixnum/mod ,
|
[ << vreg f 1 >> << vreg f 0 >> ]
|
||||||
|
[ << vreg f 2 >> << vreg f 0 >> ]
|
||||||
|
%fixnum/mod ,
|
||||||
2 0 %replace-d ,
|
2 0 %replace-d ,
|
||||||
0 1 %replace-d ,
|
0 1 %replace-d ,
|
||||||
] "intrinsic" set-word-prop
|
] "intrinsic" set-word-prop
|
||||||
|
@ -217,10 +223,10 @@ sequences words ;
|
||||||
1 %dec-d ,
|
1 %dec-d ,
|
||||||
in-1
|
in-1
|
||||||
dup cell -8 * <= [
|
dup cell -8 * <= [
|
||||||
drop 0 <vreg> 2 <vreg> %fixnum-sgn ,
|
drop 0 <vreg> 2 <vreg> 2 <vreg> %fixnum-sgn ,
|
||||||
2 0 %replace-d ,
|
2 0 %replace-d ,
|
||||||
] [
|
] [
|
||||||
neg 0 <vreg> %fixnum>> ,
|
neg 0 <vreg> 0 <vreg> %fixnum>> ,
|
||||||
out-1
|
out-1
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
|
@ -228,7 +234,7 @@ sequences words ;
|
||||||
dup cell 8 * tag-bits - <= [
|
dup cell 8 * tag-bits - <= [
|
||||||
1 %dec-d ,
|
1 %dec-d ,
|
||||||
in-1
|
in-1
|
||||||
0 <vreg> %fixnum<< ,
|
0 <vreg> 0 <vreg> %fixnum<< ,
|
||||||
out-1
|
out-1
|
||||||
] [
|
] [
|
||||||
drop slow-shift
|
drop slow-shift
|
||||||
|
|
|
@ -31,6 +31,7 @@ USING: compiler errors kernel math memory words ;
|
||||||
r> bitor r> bitor r> bitor r> bitor r> bitor ;
|
r> bitor r> bitor r> bitor r> bitor r> bitor ;
|
||||||
|
|
||||||
: x-form ( a s b xo rc -- n )
|
: x-form ( a s b xo rc -- n )
|
||||||
|
swap
|
||||||
>r 1 shift >r 11 shift >r swap 16 shift >r 21 shift
|
>r 1 shift >r 11 shift >r swap 16 shift >r 21 shift
|
||||||
r> bitor r> bitor r> bitor r> bitor ;
|
r> bitor r> bitor r> bitor r> bitor ;
|
||||||
|
|
||||||
|
@ -38,6 +39,7 @@ USING: compiler errors kernel math memory words ;
|
||||||
1 shift >r 11 shift >r 21 shift r> bitor r> bitor ;
|
1 shift >r 11 shift >r 21 shift r> bitor r> bitor ;
|
||||||
|
|
||||||
: xo-form ( d a b oe xo rc -- n )
|
: xo-form ( d a b oe xo rc -- n )
|
||||||
|
swap
|
||||||
>r 1 shift >r 10 shift >r 11 shift >r 16 shift >r 21 shift
|
>r 1 shift >r 10 shift >r 11 shift >r 16 shift >r 21 shift
|
||||||
r> bitor r> bitor r> bitor r> bitor r> bitor ;
|
r> bitor r> bitor r> bitor r> bitor r> bitor ;
|
||||||
|
|
||||||
|
@ -48,19 +50,19 @@ USING: compiler errors kernel math memory words ;
|
||||||
|
|
||||||
: ADDIC. d-form 13 insn ; : SUBIC. neg ADDIC. ;
|
: ADDIC. d-form 13 insn ; : SUBIC. neg ADDIC. ;
|
||||||
|
|
||||||
: (ADD) 266 swap xo-form 31 insn ;
|
: (ADD) 266 xo-form 31 insn ;
|
||||||
: ADD 0 0 (ADD) ;
|
: ADD 0 0 (ADD) ;
|
||||||
: ADD. 0 1 (ADD) ;
|
: ADD. 0 1 (ADD) ;
|
||||||
: ADDO 1 0 (ADD) ;
|
: ADDO 1 0 (ADD) ;
|
||||||
: ADDO. 1 1 (ADD) ;
|
: ADDO. 1 1 (ADD) ;
|
||||||
|
|
||||||
: (ADDC) 10 swap xo-form 31 insn ;
|
: (ADDC) 10 xo-form 31 insn ;
|
||||||
: ADDC 0 0 (ADDC) ;
|
: ADDC 0 0 (ADDC) ;
|
||||||
: ADDC. 0 1 (ADDC) ;
|
: ADDC. 0 1 (ADDC) ;
|
||||||
: ADDCO 1 0 (ADDC) ;
|
: ADDCO 1 0 (ADDC) ;
|
||||||
: ADDCO. 1 1 (ADDC) ;
|
: ADDCO. 1 1 (ADDC) ;
|
||||||
|
|
||||||
: (ADDE) 138 swap xo-form 31 insn ;
|
: (ADDE) 138 xo-form 31 insn ;
|
||||||
: ADDE 0 0 (ADDE) ;
|
: ADDE 0 0 (ADDE) ;
|
||||||
: ADDE. 0 1 (ADDE) ;
|
: ADDE. 0 1 (ADDE) ;
|
||||||
: ADDEO 1 0 (ADDE) ;
|
: ADDEO 1 0 (ADDE) ;
|
||||||
|
@ -69,31 +71,31 @@ USING: compiler errors kernel math memory words ;
|
||||||
: ANDI d-form 28 insn ;
|
: ANDI d-form 28 insn ;
|
||||||
: ANDIS d-form 29 insn ;
|
: ANDIS d-form 29 insn ;
|
||||||
|
|
||||||
: (AND) 28 swap x-form 31 insn ;
|
: (AND) 28 x-form 31 insn ;
|
||||||
: AND 0 (AND) ;
|
: AND 0 (AND) ;
|
||||||
: AND. 0 (AND) ;
|
: AND. 0 (AND) ;
|
||||||
|
|
||||||
: (DIVW) 491 swap xo-form 31 insn ;
|
: (DIVW) 491 xo-form 31 insn ;
|
||||||
: DIVW 0 0 (DIVW) ;
|
: DIVW 0 0 (DIVW) ;
|
||||||
: DIVW. 0 1 (DIVW) ;
|
: DIVW. 0 1 (DIVW) ;
|
||||||
: DIVWO 1 0 (DIVW) ;
|
: DIVWO 1 0 (DIVW) ;
|
||||||
: DIVWO 1 1 (DIVW) ;
|
: DIVWO 1 1 (DIVW) ;
|
||||||
|
|
||||||
: (DIVWU) 459 swap xo-form 31 insn ;
|
: (DIVWU) 459 xo-form 31 insn ;
|
||||||
: DIVWU 0 0 (DIVWU) ;
|
: DIVWU 0 0 (DIVWU) ;
|
||||||
: DIVWU. 0 1 (DIVWU) ;
|
: DIVWU. 0 1 (DIVWU) ;
|
||||||
: DIVWUO 1 0 (DIVWU) ;
|
: DIVWUO 1 0 (DIVWU) ;
|
||||||
: DIVWUO. 1 1 (DIVWU) ;
|
: DIVWUO. 1 1 (DIVWU) ;
|
||||||
|
|
||||||
: (EQV) 284 swap x-form 31 insn ;
|
: (EQV) 284 x-form 31 insn ;
|
||||||
: EQV 0 (EQV) ;
|
: EQV 0 (EQV) ;
|
||||||
: EQV. 1 (EQV) ;
|
: EQV. 1 (EQV) ;
|
||||||
|
|
||||||
: (NAND) 476 swap x-form 31 insn ;
|
: (NAND) 476 x-form 31 insn ;
|
||||||
: NAND 0 (NAND) ;
|
: NAND 0 (NAND) ;
|
||||||
: NAND. 1 (NAND) ;
|
: NAND. 1 (NAND) ;
|
||||||
|
|
||||||
: (NOR) 124 swap x-form 31 insn ;
|
: (NOR) 124 x-form 31 insn ;
|
||||||
: NOR 0 (NOR) ;
|
: NOR 0 (NOR) ;
|
||||||
: NOR. 1 (NOR) ;
|
: NOR. 1 (NOR) ;
|
||||||
|
|
||||||
|
@ -103,44 +105,60 @@ USING: compiler errors kernel math memory words ;
|
||||||
: ORI d-form 24 insn ;
|
: ORI d-form 24 insn ;
|
||||||
: ORIS d-form 25 insn ;
|
: ORIS d-form 25 insn ;
|
||||||
|
|
||||||
: (OR) 444 swap x-form 31 insn ;
|
: (OR) 444 x-form 31 insn ;
|
||||||
: OR 0 (OR) ;
|
: OR 0 (OR) ;
|
||||||
: OR. 1 (OR) ;
|
: OR. 1 (OR) ;
|
||||||
|
|
||||||
: (ORC) 412 swap x-form 31 insn ;
|
: (ORC) 412 x-form 31 insn ;
|
||||||
: ORC 0 (ORC) ;
|
: ORC 0 (ORC) ;
|
||||||
: ORC. 1 (ORC) ;
|
: ORC. 1 (ORC) ;
|
||||||
|
|
||||||
: MR over OR ;
|
: MR dup OR ;
|
||||||
: MR. over OR. ;
|
: MR. dup OR. ;
|
||||||
|
|
||||||
: (SLW) 24 swap x-form 31 insn ;
|
: (MULHW) 75 xo-form 31 insn ;
|
||||||
|
: MULHW 0 0 (MULHW) ;
|
||||||
|
: MULHW. 0 1 (MULHW) ;
|
||||||
|
|
||||||
|
: MULLI d-form 7 insn ;
|
||||||
|
|
||||||
|
: (MULHWU) 11 xo-form 31 insn ;
|
||||||
|
: MULHWU 0 0 (MULHWU) ;
|
||||||
|
: MULHWU. 0 1 (MULHWU) ;
|
||||||
|
|
||||||
|
: (MULLW) 235 xo-form 31 insn ;
|
||||||
|
: MULLW 0 0 (MULLW) ;
|
||||||
|
: MULLW. 0 1 (MULLW) ;
|
||||||
|
: MULLWC 1 0 (MULLW) ;
|
||||||
|
: MULLWC. 1 1 (MULLW) ;
|
||||||
|
|
||||||
|
: (SLW) 24 x-form 31 insn ;
|
||||||
: SLW 0 (SLW) ;
|
: SLW 0 (SLW) ;
|
||||||
: SLW. 1 (SLW) ;
|
: SLW. 1 (SLW) ;
|
||||||
|
|
||||||
: (SRAW) 792 swap x-form 31 insn ;
|
: (SRAW) 792 x-form 31 insn ;
|
||||||
: SRAW 0 (SRAW) ;
|
: SRAW 0 (SRAW) ;
|
||||||
: SRAW. 1 (SRAW) ;
|
: SRAW. 1 (SRAW) ;
|
||||||
|
|
||||||
: (SRW) 536 swap x-form 31 insn ;
|
: (SRW) 536 x-form 31 insn ;
|
||||||
: SRW 0 (SRW) ;
|
: SRW 0 (SRW) ;
|
||||||
: SRW. 1 (SRW) ;
|
: SRW. 1 (SRW) ;
|
||||||
|
|
||||||
: SRAWI 824 0 x-form 31 insn ;
|
: SRAWI 0 824 x-form 31 insn ;
|
||||||
|
|
||||||
: (SUBF) 40 swap xo-form 31 insn ;
|
: (SUBF) 40 xo-form 31 insn ;
|
||||||
: SUBF 0 0 (SUBF) ;
|
: SUBF 0 0 (SUBF) ;
|
||||||
: SUBF. 0 1 (SUBF) ;
|
: SUBF. 0 1 (SUBF) ;
|
||||||
: SUBFO 1 0 (SUBF) ;
|
: SUBFO 1 0 (SUBF) ;
|
||||||
: SUBFO. 1 1 (SUBF) ;
|
: SUBFO. 1 1 (SUBF) ;
|
||||||
|
|
||||||
: (SUBFC) 8 swap xo-form 31 insn ;
|
: (SUBFC) 8 xo-form 31 insn ;
|
||||||
: SUBFC 0 0 (SUBFC) ;
|
: SUBFC 0 0 (SUBFC) ;
|
||||||
: SUBFC. 0 1 (SUBFC) ;
|
: SUBFC. 0 1 (SUBFC) ;
|
||||||
: SUBFCO 1 0 (SUBFC) ;
|
: SUBFCO 1 0 (SUBFC) ;
|
||||||
: SUBFCO. 1 1 (SUBFC) ;
|
: SUBFCO. 1 1 (SUBFC) ;
|
||||||
|
|
||||||
: (SUBFE) 136 swap xo-form 31 insn ;
|
: (SUBFE) 136 xo-form 31 insn ;
|
||||||
: SUBFE 0 0 (SUBFE) ;
|
: SUBFE 0 0 (SUBFE) ;
|
||||||
: SUBFE. 0 1 (SUBFE) ;
|
: SUBFE. 0 1 (SUBFE) ;
|
||||||
: SUBFEO 1 0 (SUBFE) ;
|
: SUBFEO 1 0 (SUBFE) ;
|
||||||
|
@ -149,7 +167,7 @@ USING: compiler errors kernel math memory words ;
|
||||||
: XORI d-form 26 insn ;
|
: XORI d-form 26 insn ;
|
||||||
: XORIS d-form 27 insn ;
|
: XORIS d-form 27 insn ;
|
||||||
|
|
||||||
: (XOR) 316 swap x-form 31 insn ;
|
: (XOR) 316 x-form 31 insn ;
|
||||||
: XOR 0 (XOR) ;
|
: XOR 0 (XOR) ;
|
||||||
: XOR. 1 (XOR) ;
|
: XOR. 1 (XOR) ;
|
||||||
|
|
||||||
|
@ -157,7 +175,7 @@ USING: compiler errors kernel math memory words ;
|
||||||
: CMPLI d-form 10 insn ;
|
: CMPLI d-form 10 insn ;
|
||||||
|
|
||||||
: CMP 0 0 x-form 31 insn ;
|
: CMP 0 0 x-form 31 insn ;
|
||||||
: CMPL 32 0 x-form 31 insn ;
|
: CMPL 0 32 x-form 31 insn ;
|
||||||
|
|
||||||
: (RLWINM) m-form 21 insn ;
|
: (RLWINM) m-form 21 insn ;
|
||||||
: RLWINM 0 (RLWINM) ;
|
: RLWINM 0 (RLWINM) ;
|
||||||
|
|
|
@ -1,13 +1,19 @@
|
||||||
! Copyright (C) 2005 Slava Pestov.
|
! Copyright (C) 2005 Slava Pestov.
|
||||||
! See http://factor.sf.net/license.txt for BSD license.
|
! See http://factor.sf.net/license.txt for BSD license.
|
||||||
IN: compiler-backend
|
IN: compiler-backend
|
||||||
USING: assembler compiler kernel math memory namespaces words ;
|
USING: assembler compiler kernel math math-internals memory
|
||||||
|
namespaces words ;
|
||||||
|
|
||||||
|
: >3-vop< ( vop -- out1 in2 in1 )
|
||||||
|
[ vop-out-1 v>operand ] keep
|
||||||
|
[ vop-in-2 v>operand ] keep
|
||||||
|
vop-in-1 ;
|
||||||
|
|
||||||
: maybe-immediate ( vop imm comp -- )
|
: maybe-immediate ( vop imm comp -- )
|
||||||
pick vop-in-1 integer? [
|
pick vop-in-1 integer? [
|
||||||
>r >r dest/src dupd r> execute r> drop
|
>r >r >3-vop< v>operand r> execute r> drop
|
||||||
] [
|
] [
|
||||||
>r >r dest/src over r> drop r> execute
|
>r >r >3-vop< v>operand swap r> drop r> execute
|
||||||
] ifte ; inline
|
] ifte ; inline
|
||||||
|
|
||||||
M: %fixnum+ generate-node ( vop -- )
|
M: %fixnum+ generate-node ( vop -- )
|
||||||
|
@ -16,6 +22,33 @@ M: %fixnum+ generate-node ( vop -- )
|
||||||
M: %fixnum- generate-node ( vop -- )
|
M: %fixnum- generate-node ( vop -- )
|
||||||
\ SUBI \ SUBF maybe-immediate ;
|
\ SUBI \ SUBF maybe-immediate ;
|
||||||
|
|
||||||
|
M: %fixnum* generate-node ( vop -- )
|
||||||
|
dup \ MULLI \ MULLW maybe-immediate
|
||||||
|
vop-out-1 v>operand dup tag-bits SRAWI ;
|
||||||
|
|
||||||
|
M: %fixnum/i generate-node ( vop -- )
|
||||||
|
dup >3-vop< v>operand DIVW
|
||||||
|
vop-out-1 v>operand dup tag-fixnum ;
|
||||||
|
|
||||||
|
: generate-fixnum/mod ( -- )
|
||||||
|
#! The same code is used for %fixnum/i and %fixnum/mod.
|
||||||
|
#! mdest is vreg where to put the modulus. Note this has
|
||||||
|
#! precise vreg requirements.
|
||||||
|
20 17 18 DIVW ! divide in2 by in1, store result in out1
|
||||||
|
18 20 18 MULLW ! multiply out1 by in1, store result in in1
|
||||||
|
19 18 17 SUBF ! subtract in2 from in1, store result in out1.
|
||||||
|
;
|
||||||
|
|
||||||
|
M: %fixnum-mod generate-node ( vop -- )
|
||||||
|
#! This has specific vreg requirements.
|
||||||
|
drop generate-fixnum/mod ;
|
||||||
|
|
||||||
|
M: %fixnum/mod generate-node ( vop -- )
|
||||||
|
#! This has specific vreg requirements.
|
||||||
|
drop generate-fixnum/mod
|
||||||
|
17 20 MR
|
||||||
|
17 17 tag-fixnum ;
|
||||||
|
|
||||||
M: %fixnum-bitand generate-node ( vop -- )
|
M: %fixnum-bitand generate-node ( vop -- )
|
||||||
\ ANDI \ AND maybe-immediate ;
|
\ ANDI \ AND maybe-immediate ;
|
||||||
|
|
||||||
|
@ -26,15 +59,28 @@ M: %fixnum-bitxor generate-node ( vop -- )
|
||||||
\ XORI \ XOR maybe-immediate ;
|
\ XORI \ XOR maybe-immediate ;
|
||||||
|
|
||||||
M: %fixnum-bitnot generate-node ( vop -- )
|
M: %fixnum-bitnot generate-node ( vop -- )
|
||||||
dup vop-in-1 swap vop-out-1 NOT ;
|
dup vop-in-1 v>operand swap vop-out-1 v>operand
|
||||||
|
2dup NOT untag ;
|
||||||
|
|
||||||
M: %fixnum<< generate-node ( vop -- )
|
M: %fixnum<< generate-node ( vop -- )
|
||||||
dup vop-in-1 20 LI
|
dup vop-in-1 20 LI
|
||||||
dup vop-out-1 v>operand swap vop-in-2 v>operand 20 SLW ;
|
dup vop-out-1 v>operand swap vop-in-2 v>operand 20 SLW ;
|
||||||
|
|
||||||
M: %fixnum>> generate-node ( vop -- )
|
M: %fixnum>> generate-node ( vop -- )
|
||||||
dup vop-out-1 v>operand over vop-in-2 v>operand
|
>3-vop< >r 2dup r> SRAWI untag ;
|
||||||
rot vop-in-1 >r 2dup r> SRAWI untag ;
|
|
||||||
|
M: %fixnum-sgn generate-node ( vop -- )
|
||||||
|
>3-vop< >r 2dup r> drop 31 SRAWI untag ;
|
||||||
|
|
||||||
|
: MULLW 0 0 (MULLW) ;
|
||||||
|
: MULLW. 0 1 (MULLW) ;
|
||||||
|
|
||||||
|
: compare ( vop -- )
|
||||||
|
dup vop-in-2 v>operand swap vop-in-1 dup integer? [
|
||||||
|
0 -rot address CMPI
|
||||||
|
] [
|
||||||
|
0 swap v>operand CMP
|
||||||
|
] ifte ;
|
||||||
|
|
||||||
: load-boolean ( dest cond -- )
|
: load-boolean ( dest cond -- )
|
||||||
#! Compile this after a conditional jump to store f or t
|
#! Compile this after a conditional jump to store f or t
|
||||||
|
@ -48,22 +94,21 @@ M: %fixnum>> generate-node ( vop -- )
|
||||||
t load-indirect
|
t load-indirect
|
||||||
"end" get save-xt ; inline
|
"end" get save-xt ; inline
|
||||||
|
|
||||||
: fixnum-compare ( vop -- dest )
|
: fixnum-pred ( vop word -- dest )
|
||||||
dup vop-out-1 v>operand
|
>r [ compare ] keep vop-out-1 v>operand r> load-boolean ;
|
||||||
dup rot vop-in-1 v>operand
|
inline
|
||||||
0 swap CMP ;
|
|
||||||
|
|
||||||
M: %fixnum< generate-node ( vop -- )
|
M: %fixnum< generate-node ( vop -- ) \ BLT fixnum-pred ;
|
||||||
fixnum-compare \ BLT load-boolean ;
|
M: %fixnum<= generate-node ( vop -- ) \ BLE fixnum-pred ;
|
||||||
|
M: %fixnum> generate-node ( vop -- ) \ BGT fixnum-pred ;
|
||||||
|
M: %fixnum>= generate-node ( vop -- ) \ BGE fixnum-pred ;
|
||||||
|
M: %eq? generate-node ( vop -- ) \ BEQ fixnum-pred ;
|
||||||
|
|
||||||
M: %fixnum<= generate-node ( vop -- )
|
: fixnum-jump ( vop -- label )
|
||||||
fixnum-compare \ BLE load-boolean ;
|
[ compare ] keep vop-label ;
|
||||||
|
|
||||||
M: %fixnum> generate-node ( vop -- )
|
M: %jump-fixnum< generate-node ( vop -- ) fixnum-jump BLT ;
|
||||||
fixnum-compare \ BGT load-boolean ;
|
M: %jump-fixnum<= generate-node ( vop -- ) fixnum-jump BLE ;
|
||||||
|
M: %jump-fixnum> generate-node ( vop -- ) fixnum-jump BGT ;
|
||||||
M: %fixnum>= generate-node ( vop -- )
|
M: %jump-fixnum>= generate-node ( vop -- ) fixnum-jump BGE ;
|
||||||
fixnum-compare \ BGE load-boolean ;
|
M: %jump-eq? generate-node ( vop -- ) fixnum-jump BEQ ;
|
||||||
|
|
||||||
M: %eq? generate-node ( vop -- )
|
|
||||||
fixnum-compare \ BEQ load-boolean ;
|
|
||||||
|
|
|
@ -84,10 +84,11 @@ M: %untag generate-node ( vop -- )
|
||||||
M: %untag-fixnum generate-node ( vop -- )
|
M: %untag-fixnum generate-node ( vop -- )
|
||||||
dest/src tag-bits SRAWI ;
|
dest/src tag-bits SRAWI ;
|
||||||
|
|
||||||
|
: tag-fixnum ( dest src -- ) 3 21 LI 21 SLW ;
|
||||||
|
|
||||||
M: %tag-fixnum generate-node ( vop -- )
|
M: %tag-fixnum generate-node ( vop -- )
|
||||||
! todo: formalize scratch register usage
|
! todo: formalize scratch register usage
|
||||||
3 19 LI
|
dest/src tag-fixnum ;
|
||||||
dest/src 19 SLW ;
|
|
||||||
|
|
||||||
M: %dispatch generate-node ( vop -- )
|
M: %dispatch generate-node ( vop -- )
|
||||||
0 <vreg> check-src
|
0 <vreg> check-src
|
||||||
|
@ -123,7 +124,7 @@ M: %type generate-node ( vop -- )
|
||||||
! The pointer is equal to 3. Load F_TYPE (9).
|
! The pointer is equal to 3. Load F_TYPE (9).
|
||||||
f type 18 LI
|
f type 18 LI
|
||||||
"end" get save-xt
|
"end" get save-xt
|
||||||
18 17 MR ;
|
17 18 MR ;
|
||||||
|
|
||||||
M: %arithmetic-type generate-node ( vop -- )
|
M: %arithmetic-type generate-node ( vop -- )
|
||||||
0 <vreg> check-dest
|
0 <vreg> check-dest
|
||||||
|
|
|
@ -26,7 +26,8 @@ TUPLE: vop inputs outputs label ;
|
||||||
: vop-in-1 ( vop -- input ) vop-inputs first ;
|
: vop-in-1 ( vop -- input ) vop-inputs first ;
|
||||||
: vop-in-2 ( vop -- input ) vop-inputs second ;
|
: vop-in-2 ( vop -- input ) vop-inputs second ;
|
||||||
: vop-in-3 ( vop -- input ) vop-inputs third ;
|
: vop-in-3 ( vop -- input ) vop-inputs third ;
|
||||||
: vop-out-1 ( vop -- output ) vop-outputs car ;
|
: vop-out-1 ( vop -- output ) vop-outputs first ;
|
||||||
|
: vop-out-2 ( vop -- output ) vop-outputs second ;
|
||||||
|
|
||||||
GENERIC: basic-block? ( vop -- ? )
|
GENERIC: basic-block? ( vop -- ? )
|
||||||
M: vop basic-block? drop f ;
|
M: vop basic-block? drop f ;
|
||||||
|
@ -50,10 +51,10 @@ M: vop calls-label? vop-label = ;
|
||||||
: src-vop ( src) unit f f ;
|
: src-vop ( src) unit f f ;
|
||||||
: dest-vop ( dest) unit dup f ;
|
: dest-vop ( dest) unit dup f ;
|
||||||
: src/dest-vop ( src dest) >r unit r> unit f ;
|
: src/dest-vop ( src dest) >r unit r> unit f ;
|
||||||
: binary-vop ( src dest) [ 2list ] keep unit f ;
|
|
||||||
: 2-in-vop ( in1 in2) 2list f f ;
|
: 2-in-vop ( in1 in2) 2list f f ;
|
||||||
: 2-in/label-vop ( in1 in2 label) >r 2list f r> ;
|
: 2-in/label-vop ( in1 in2 label) >r 2list f r> ;
|
||||||
: ternary-vop ( in1 in2 dest) >r 2list r> unit f ;
|
: 2-vop ( in dest) [ 2list ] keep unit f ;
|
||||||
|
: 3-vop ( in1 in2 dest) >r 2list r> unit f ;
|
||||||
|
|
||||||
! miscellanea
|
! miscellanea
|
||||||
VOP: %prologue
|
VOP: %prologue
|
||||||
|
@ -153,7 +154,7 @@ VOP: %untag
|
||||||
M: %untag basic-block? drop t ;
|
M: %untag basic-block? drop t ;
|
||||||
|
|
||||||
VOP: %slot
|
VOP: %slot
|
||||||
: %slot ( n vreg ) >r <vreg> r> <vreg> binary-vop <%slot> ;
|
: %slot ( n vreg ) >r <vreg> r> <vreg> 2-vop <%slot> ;
|
||||||
M: %slot basic-block? drop t ;
|
M: %slot basic-block? drop t ;
|
||||||
|
|
||||||
VOP: %set-slot
|
VOP: %set-slot
|
||||||
|
@ -167,7 +168,7 @@ M: %set-slot basic-block? drop t ;
|
||||||
! known at compile time, so these become a single instruction
|
! known at compile time, so these become a single instruction
|
||||||
VOP: %fast-slot
|
VOP: %fast-slot
|
||||||
: %fast-slot ( vreg n )
|
: %fast-slot ( vreg n )
|
||||||
swap <vreg> binary-vop <%fast-slot> ;
|
swap <vreg> 2-vop <%fast-slot> ;
|
||||||
M: %fast-slot basic-block? drop t ;
|
M: %fast-slot basic-block? drop t ;
|
||||||
|
|
||||||
VOP: %fast-set-slot
|
VOP: %fast-set-slot
|
||||||
|
@ -178,22 +179,22 @@ VOP: %fast-set-slot
|
||||||
M: %fast-set-slot basic-block? drop t ;
|
M: %fast-set-slot basic-block? drop t ;
|
||||||
|
|
||||||
! fixnum intrinsics
|
! fixnum intrinsics
|
||||||
VOP: %fixnum+ : %fixnum+ binary-vop <%fixnum+> ;
|
VOP: %fixnum+ : %fixnum+ 3-vop <%fixnum+> ;
|
||||||
VOP: %fixnum- : %fixnum- binary-vop <%fixnum-> ;
|
VOP: %fixnum- : %fixnum- 3-vop <%fixnum-> ;
|
||||||
VOP: %fixnum* : %fixnum* binary-vop <%fixnum*> ;
|
VOP: %fixnum* : %fixnum* 3-vop <%fixnum*> ;
|
||||||
VOP: %fixnum-mod : %fixnum-mod binary-vop <%fixnum-mod> ;
|
VOP: %fixnum-mod : %fixnum-mod 3-vop <%fixnum-mod> ;
|
||||||
VOP: %fixnum/i : %fixnum/i binary-vop <%fixnum/i> ;
|
VOP: %fixnum/i : %fixnum/i 3-vop <%fixnum/i> ;
|
||||||
VOP: %fixnum/mod : %fixnum/mod binary-vop <%fixnum/mod> ;
|
VOP: %fixnum/mod : %fixnum/mod f <%fixnum/mod> ;
|
||||||
VOP: %fixnum-bitand : %fixnum-bitand binary-vop <%fixnum-bitand> ;
|
VOP: %fixnum-bitand : %fixnum-bitand 3-vop <%fixnum-bitand> ;
|
||||||
VOP: %fixnum-bitor : %fixnum-bitor binary-vop <%fixnum-bitor> ;
|
VOP: %fixnum-bitor : %fixnum-bitor 3-vop <%fixnum-bitor> ;
|
||||||
VOP: %fixnum-bitxor : %fixnum-bitxor binary-vop <%fixnum-bitxor> ;
|
VOP: %fixnum-bitxor : %fixnum-bitxor 3-vop <%fixnum-bitxor> ;
|
||||||
VOP: %fixnum-bitnot : %fixnum-bitnot <vreg> dest-vop <%fixnum-bitnot> ;
|
VOP: %fixnum-bitnot : %fixnum-bitnot <vreg> dest-vop <%fixnum-bitnot> ;
|
||||||
|
|
||||||
VOP: %fixnum<= : %fixnum<= binary-vop <%fixnum<=> ;
|
VOP: %fixnum<= : %fixnum<= 3-vop <%fixnum<=> ;
|
||||||
VOP: %fixnum< : %fixnum< binary-vop <%fixnum<> ;
|
VOP: %fixnum< : %fixnum< 3-vop <%fixnum<> ;
|
||||||
VOP: %fixnum>= : %fixnum>= binary-vop <%fixnum>=> ;
|
VOP: %fixnum>= : %fixnum>= 3-vop <%fixnum>=> ;
|
||||||
VOP: %fixnum> : %fixnum> binary-vop <%fixnum>> ;
|
VOP: %fixnum> : %fixnum> 3-vop <%fixnum>> ;
|
||||||
VOP: %eq? : %eq? binary-vop <%eq?> ;
|
VOP: %eq? : %eq? 3-vop <%eq?> ;
|
||||||
|
|
||||||
! At the VOP level, the 'shift' operation is split into five
|
! At the VOP level, the 'shift' operation is split into five
|
||||||
! distinct operations:
|
! distinct operations:
|
||||||
|
@ -203,11 +204,11 @@ VOP: %eq? : %eq? binary-vop <%eq?> ;
|
||||||
! - shifts with a small negative count: %fixnum>>
|
! - shifts with a small negative count: %fixnum>>
|
||||||
! - shifts with a small negative count: %fixnum>>
|
! - shifts with a small negative count: %fixnum>>
|
||||||
! - shifts with a large negative count: %fixnum-sgn
|
! - shifts with a large negative count: %fixnum-sgn
|
||||||
VOP: %fixnum<< : %fixnum<< binary-vop <%fixnum<<> ;
|
VOP: %fixnum<< : %fixnum<< 3-vop <%fixnum<<> ;
|
||||||
VOP: %fixnum>> : %fixnum>> binary-vop <%fixnum>>> ;
|
VOP: %fixnum>> : %fixnum>> 3-vop <%fixnum>>> ;
|
||||||
! due to x86 limitations the destination of this VOP must be
|
! due to x86 limitations the destination of this VOP must be
|
||||||
! vreg 2 (EDX), and the source must be vreg 0 (EAX).
|
! vreg 2 (EDX), and the source must be vreg 0 (EAX).
|
||||||
VOP: %fixnum-sgn : %fixnum-sgn binary-vop <%fixnum-sgn> ;
|
VOP: %fixnum-sgn : %fixnum-sgn 3-vop <%fixnum-sgn> ;
|
||||||
|
|
||||||
! Integer comparison followed by a conditional branch is
|
! Integer comparison followed by a conditional branch is
|
||||||
! optimized
|
! optimized
|
||||||
|
|
|
@ -187,21 +187,12 @@ M: %fixnum>= generate-node ( vop -- )
|
||||||
M: %eq? generate-node ( vop -- )
|
M: %eq? generate-node ( vop -- )
|
||||||
fixnum-compare \ JE load-boolean ;
|
fixnum-compare \ JE load-boolean ;
|
||||||
|
|
||||||
: fixnum-branch ( vop -- label )
|
: fixnum-jump ( vop -- label )
|
||||||
dup vop-in-2 v>operand over vop-in-1 v>operand CMP
|
dup vop-in-2 v>operand over vop-in-1 v>operand CMP
|
||||||
vop-label ;
|
vop-label ;
|
||||||
|
|
||||||
M: %jump-fixnum< generate-node ( vop -- )
|
M: %jump-fixnum< generate-node ( vop -- ) fixnum-jump JL ;
|
||||||
fixnum-branch JL ;
|
M: %jump-fixnum<= generate-node ( vop -- ) fixnum-jump JLE ;
|
||||||
|
M: %jump-fixnum> generate-node ( vop -- ) fixnum-jump JG ;
|
||||||
M: %jump-fixnum<= generate-node ( vop -- )
|
M: %jump-fixnum>= generate-node ( vop -- ) fixnum-jump JGE ;
|
||||||
fixnum-branch JLE ;
|
M: %jump-eq? generate-node ( vop -- ) fixnum-jump JE ;
|
||||||
|
|
||||||
M: %jump-fixnum> generate-node ( vop -- )
|
|
||||||
fixnum-branch JG ;
|
|
||||||
|
|
||||||
M: %jump-fixnum>= generate-node ( vop -- )
|
|
||||||
fixnum-branch JGE ;
|
|
||||||
|
|
||||||
M: %jump-eq? generate-node ( vop -- )
|
|
||||||
fixnum-branch JE ;
|
|
||||||
|
|
|
@ -97,15 +97,41 @@ math-internals test words ;
|
||||||
[ -1 ] [ 0 [ fixnum-bitnot ] compile-1 ] unit-test
|
[ -1 ] [ 0 [ fixnum-bitnot ] compile-1 ] unit-test
|
||||||
[ -1 ] [ [ 0 fixnum-bitnot ] compile-1 ] unit-test
|
[ -1 ] [ [ 0 fixnum-bitnot ] compile-1 ] unit-test
|
||||||
|
|
||||||
[ HEX: 10000000 ] [ HEX: -10000000 >fixnum [ 0 swap fixnum- ] compile-1 ] unit-test
|
[ 3 ] [ 13 10 [ fixnum-mod ] compile-1 ] unit-test
|
||||||
[ HEX: 10000000 ] [ HEX: -fffffff >fixnum [ 1 swap fixnum- ] compile-1 ] unit-test
|
[ 3 ] [ 13 [ 10 fixnum-mod ] compile-1 ] unit-test
|
||||||
|
[ 3 ] [ [ 13 10 fixnum-mod ] compile-1 ] unit-test
|
||||||
|
[ -3 ] [ -13 10 [ fixnum-mod ] compile-1 ] unit-test
|
||||||
|
[ -3 ] [ -13 [ 10 fixnum-mod ] compile-1 ] unit-test
|
||||||
|
[ -3 ] [ [ -13 10 fixnum-mod ] compile-1 ] unit-test
|
||||||
|
|
||||||
[ 4294967296 ] [ 1 32 [ fixnum-shift ] compile-1 ] unit-test
|
[ 2 ] [ 4 2 [ fixnum/i ] compile-1 ] unit-test
|
||||||
[ 4294967296 ] [ 1 [ 32 fixnum-shift ] compile-1 ] unit-test
|
[ 2 ] [ 4 [ 2 fixnum/i ] compile-1 ] unit-test
|
||||||
[ 4294967296 ] [ 1 [ 16 fixnum-shift 16 fixnum-shift ] compile-1 ] unit-test
|
[ -2 ] [ 4 [ -2 fixnum/i ] compile-1 ] unit-test
|
||||||
[ -4294967296 ] [ -1 32 [ fixnum-shift ] compile-1 ] unit-test
|
[ 3 1 ] [ 10 3 [ fixnum/mod ] compile-1 ] unit-test
|
||||||
[ -4294967296 ] [ -1 [ 32 fixnum-shift ] compile-1 ] unit-test
|
|
||||||
[ -4294967296 ] [ -1 [ 16 fixnum-shift 16 fixnum-shift ] compile-1 ] unit-test
|
[ 4 ] [ 1 3 [ fixnum+ ] compile-1 ] unit-test
|
||||||
|
[ 4 ] [ 1 [ 3 fixnum+ ] compile-1 ] unit-test
|
||||||
|
[ 4 ] [ [ 1 3 fixnum+ ] compile-1 ] unit-test
|
||||||
|
|
||||||
|
[ 6 ] [ 2 3 [ fixnum* ] compile-1 ] unit-test
|
||||||
|
[ 6 ] [ 2 [ 3 fixnum* ] compile-1 ] unit-test
|
||||||
|
[ 6 ] [ [ 2 3 fixnum* ] compile-1 ] unit-test
|
||||||
|
[ -6 ] [ 2 -3 [ fixnum* ] compile-1 ] unit-test
|
||||||
|
[ -6 ] [ 2 [ -3 fixnum* ] compile-1 ] unit-test
|
||||||
|
[ -6 ] [ [ 2 -3 fixnum* ] compile-1 ] unit-test
|
||||||
|
|
||||||
|
[ t ] [ 3 type 3 [ type ] compile-1 eq? ] unit-test
|
||||||
|
[ t ] [ 3 >bignum type 3 >bignum [ type ] compile-1 eq? ] unit-test
|
||||||
|
[ t ] [ "hey" type "hey" [ type ] compile-1 eq? ] unit-test
|
||||||
|
[ t ] [ f type f [ type ] compile-1 eq? ] unit-test
|
||||||
|
|
||||||
|
[ 1 1 0 ] [ 1 1 [ arithmetic-type ] compile-1 ] unit-test
|
||||||
|
[ 1.0 1.0 5 ] [ 1.0 1 [ arithmetic-type ] compile-1 ] unit-test
|
||||||
|
|
||||||
|
[ 5 ] [ 1 2 [ eq? [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
||||||
|
[ 3 ] [ 2 2 [ eq? [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
||||||
|
[ 3 ] [ 1 2 [ fixnum< [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
||||||
|
[ 5 ] [ 2 2 [ fixnum< [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
||||||
|
|
||||||
[ 8 ] [ 1 3 [ fixnum-shift ] compile-1 ] unit-test
|
[ 8 ] [ 1 3 [ fixnum-shift ] compile-1 ] unit-test
|
||||||
[ 8 ] [ 1 [ 3 fixnum-shift ] compile-1 ] unit-test
|
[ 8 ] [ 1 [ 3 fixnum-shift ] compile-1 ] unit-test
|
||||||
|
@ -122,47 +148,21 @@ math-internals test words ;
|
||||||
[ -1 ] [ [ -123 -64 fixnum-shift ] compile-1 ] unit-test
|
[ -1 ] [ [ -123 -64 fixnum-shift ] compile-1 ] unit-test
|
||||||
[ -1 ] [ -123 -64 [ fixnum-shift ] compile-1 ] unit-test
|
[ -1 ] [ -123 -64 [ fixnum-shift ] compile-1 ] unit-test
|
||||||
|
|
||||||
[ 3 ] [ 13 10 [ fixnum-mod ] compile-1 ] unit-test
|
[ HEX: 10000000 ] [ HEX: -10000000 >fixnum [ 0 swap fixnum- ] compile-1 ] unit-test
|
||||||
[ 3 ] [ 13 [ 10 fixnum-mod ] compile-1 ] unit-test
|
[ HEX: 10000000 ] [ HEX: -fffffff >fixnum [ 1 swap fixnum- ] compile-1 ] unit-test
|
||||||
[ 3 ] [ [ 13 10 fixnum-mod ] compile-1 ] unit-test
|
|
||||||
[ -3 ] [ -13 10 [ fixnum-mod ] compile-1 ] unit-test
|
|
||||||
[ -3 ] [ -13 [ 10 fixnum-mod ] compile-1 ] unit-test
|
|
||||||
[ -3 ] [ [ -13 10 fixnum-mod ] compile-1 ] unit-test
|
|
||||||
|
|
||||||
[ 4 ] [ 1 3 [ fixnum+ ] compile-1 ] unit-test
|
[ 4294967296 ] [ 1 32 [ fixnum-shift ] compile-1 ] unit-test
|
||||||
[ 4 ] [ 1 [ 3 fixnum+ ] compile-1 ] unit-test
|
[ 4294967296 ] [ 1 [ 32 fixnum-shift ] compile-1 ] unit-test
|
||||||
[ 4 ] [ [ 1 3 fixnum+ ] compile-1 ] unit-test
|
[ 4294967296 ] [ 1 [ 16 fixnum-shift 16 fixnum-shift ] compile-1 ] unit-test
|
||||||
|
[ -4294967296 ] [ -1 32 [ fixnum-shift ] compile-1 ] unit-test
|
||||||
|
[ -4294967296 ] [ -1 [ 32 fixnum-shift ] compile-1 ] unit-test
|
||||||
|
[ -4294967296 ] [ -1 [ 16 fixnum-shift 16 fixnum-shift ] compile-1 ] unit-test
|
||||||
|
|
||||||
[ t ] [ 1 27 fixnum-shift dup [ fixnum+ ] compile-1 1 28 fixnum-shift = ] unit-test
|
[ t ] [ 1 27 fixnum-shift dup [ fixnum+ ] compile-1 1 28 fixnum-shift = ] unit-test
|
||||||
[ -268435457 ] [ 1 28 shift neg >fixnum [ -1 fixnum+ ] compile-1 ] unit-test
|
[ -268435457 ] [ 1 28 shift neg >fixnum [ -1 fixnum+ ] compile-1 ] unit-test
|
||||||
|
|
||||||
[ 6 ] [ 2 3 [ fixnum* ] compile-1 ] unit-test
|
|
||||||
[ 6 ] [ 2 [ 3 fixnum* ] compile-1 ] unit-test
|
|
||||||
[ 6 ] [ [ 2 3 fixnum* ] compile-1 ] unit-test
|
|
||||||
[ -6 ] [ 2 -3 [ fixnum* ] compile-1 ] unit-test
|
|
||||||
[ -6 ] [ 2 [ -3 fixnum* ] compile-1 ] unit-test
|
|
||||||
[ -6 ] [ [ 2 -3 fixnum* ] compile-1 ] unit-test
|
|
||||||
|
|
||||||
[ t ] [ 1 20 shift 1 20 shift [ fixnum* ] compile-1 1 40 shift = ] unit-test
|
[ t ] [ 1 20 shift 1 20 shift [ fixnum* ] compile-1 1 40 shift = ] unit-test
|
||||||
[ t ] [ 1 20 shift neg 1 20 shift [ fixnum* ] compile-1 1 40 shift neg = ] unit-test
|
[ t ] [ 1 20 shift neg 1 20 shift [ fixnum* ] compile-1 1 40 shift neg = ] unit-test
|
||||||
[ t ] [ 1 20 shift neg 1 20 shift neg [ fixnum* ] compile-1 1 40 shift = ] unit-test
|
[ t ] [ 1 20 shift neg 1 20 shift neg [ fixnum* ] compile-1 1 40 shift = ] unit-test
|
||||||
|
|
||||||
[ 2 ] [ 4 2 [ fixnum/i ] compile-1 ] unit-test
|
|
||||||
[ 2 ] [ 4 [ 2 fixnum/i ] compile-1 ] unit-test
|
|
||||||
[ -2 ] [ 4 [ -2 fixnum/i ] compile-1 ] unit-test
|
|
||||||
[ 268435456 ] [ -268435456 >fixnum -1 [ fixnum/i ] compile-1 ] unit-test
|
[ 268435456 ] [ -268435456 >fixnum -1 [ fixnum/i ] compile-1 ] unit-test
|
||||||
|
|
||||||
[ 3 1 ] [ 10 3 [ fixnum/mod ] compile-1 ] unit-test
|
|
||||||
|
|
||||||
[ t ] [ 3 type 3 [ type ] compile-1 eq? ] unit-test
|
|
||||||
[ t ] [ 3 >bignum type 3 >bignum [ type ] compile-1 eq? ] unit-test
|
|
||||||
[ t ] [ "hey" type "hey" [ type ] compile-1 eq? ] unit-test
|
|
||||||
[ t ] [ f type f [ type ] compile-1 eq? ] unit-test
|
|
||||||
|
|
||||||
[ 1 1 0 ] [ 1 1 [ arithmetic-type ] compile-1 ] unit-test
|
|
||||||
[ 1.0 1.0 5 ] [ 1.0 1 [ arithmetic-type ] compile-1 ] unit-test
|
|
||||||
|
|
||||||
[ 5 ] [ 1 2 [ eq? [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
|
||||||
[ 3 ] [ 2 2 [ eq? [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
|
||||||
[ 3 ] [ 1 2 [ fixnum< [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
|
||||||
[ 5 ] [ 2 2 [ fixnum< [ 3 ] [ 5 ] ifte ] compile-1 ] unit-test
|
|
||||||
|
|
Loading…
Reference in New Issue