1 ! Copyright (C) 2008, 2009 Slava Pestov, Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: sequences accessors layouts kernel math math.intervals
4 namespaces combinators fry arrays
5 compiler.tree.propagation.info
8 compiler.cfg.instructions
10 compiler.cfg.registers
11 compiler.cfg.comparisons ;
12 IN: compiler.cfg.intrinsics.fixnum
14 : emit-both-fixnums? ( -- )
17 tag-mask get ^^and-imm
21 : tag-literal ( n -- tagged )
22 literal>> [ tag-fixnum ] [ \ f tag-number ] if* ;
24 : emit-fixnum-op ( insn -- )
25 [ 2inputs ] dip call ds-push ; inline
27 : emit-fixnum-left-shift ( -- )
28 [ ^^untag-fixnum ^^shl ] emit-fixnum-op ;
30 : emit-fixnum-right-shift ( -- )
31 [ ^^untag-fixnum ^^neg ^^sar dup tag-mask get ^^and-imm ^^xor ] emit-fixnum-op ;
33 : emit-fixnum-shift-general ( -- )
34 D 0 ^^peek 0 cc> ##compare-imm-branch
35 [ emit-fixnum-left-shift ] with-branch
36 [ emit-fixnum-right-shift ] with-branch
37 2array emit-conditional ;
39 : emit-fixnum-shift-fast ( node -- )
40 node-input-infos second interval>> {
41 { [ dup 0 [a,inf] interval-subset? ] [ drop emit-fixnum-left-shift ] }
42 { [ dup 0 [-inf,a] interval-subset? ] [ drop emit-fixnum-right-shift ] }
43 [ drop emit-fixnum-shift-general ]
46 : emit-fixnum-bitnot ( -- )
47 ds-pop ^^not tag-mask get ^^xor-imm ds-push ;
49 : emit-fixnum-log2 ( -- )
50 ds-pop ^^log2 tag-bits get ^^sub-imm ^^tag-fixnum ds-push ;
52 : emit-fixnum*fast ( -- )
53 2inputs ^^untag-fixnum ^^mul ds-push ;
55 : emit-fixnum-comparison ( cc -- )
56 '[ _ ^^compare ] emit-fixnum-op ;
58 : emit-bignum>fixnum ( -- )
59 ds-pop ^^bignum>integer ^^tag-fixnum ds-push ;
61 : emit-fixnum>bignum ( -- )
62 ds-pop ^^untag-fixnum ^^integer>bignum ds-push ;
64 : emit-no-overflow-case ( dst -- final-bb )
65 [ -2 ##inc-d ds-push ] with-branch ;
67 : emit-overflow-case ( word -- final-bb )
68 [ -1 ##call ] with-branch ;
70 : emit-fixnum-overflow-op ( quot word -- )
71 [ [ D 1 ^^peek D 0 ^^peek ] dip call ] dip
72 [ emit-no-overflow-case ] [ emit-overflow-case ] bi* 2array
73 emit-conditional ; inline
75 : fixnum+overflow ( x y -- z ) [ >bignum ] bi@ + ;
77 : fixnum-overflow ( x y -- z ) [ >bignum ] bi@ - ;
79 : fixnum*overflow ( x y -- z ) [ >bignum ] bi@ * ;
82 [ ^^fixnum-add ] \ fixnum+overflow emit-fixnum-overflow-op ;
85 [ ^^fixnum-sub ] \ fixnum-overflow emit-fixnum-overflow-op ;
88 [ ^^untag-fixnum ^^fixnum-mul ] \ fixnum*overflow emit-fixnum-overflow-op ;