compiler.cfg.instructions: remove ##box-float, ##unbox-float, ##box-vector, ##unbox-vector since they can be expressed in terms of ##alien-double, ##set-alien-double, ##alien-vector, ##set-alien-vector, and ##allot
							parent
							
								
									34c4bd6d8f
								
							
						
					
					
						commit
						b9577e2b0e
					
				| 
						 | 
				
			
			@ -16,7 +16,7 @@ V{
 | 
			
		|||
} 0 test-bb
 | 
			
		||||
 | 
			
		||||
V{
 | 
			
		||||
    T{ ##box-float f 0 1 }
 | 
			
		||||
    T{ ##box-alien f 0 1 }
 | 
			
		||||
} 1 test-bb
 | 
			
		||||
 | 
			
		||||
0 1 edge
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,24 +49,9 @@ insn-classes get [
 | 
			
		|||
        [ ##load-reference ]
 | 
			
		||||
    } cond ;
 | 
			
		||||
 | 
			
		||||
: ^^unbox-c-ptr ( src class -- dst )
 | 
			
		||||
    [ next-vreg dup ] 2dip next-vreg ##unbox-c-ptr ;
 | 
			
		||||
 | 
			
		||||
: ^^allot-tuple ( n -- dst )
 | 
			
		||||
    2 + cells tuple ^^allot ;
 | 
			
		||||
 | 
			
		||||
: ^^allot-array ( n -- dst )
 | 
			
		||||
    2 + cells array ^^allot ;
 | 
			
		||||
 | 
			
		||||
: ^^allot-byte-array ( n -- dst )
 | 
			
		||||
    2 cells + byte-array ^^allot ;
 | 
			
		||||
 | 
			
		||||
: ^^offset>slot ( slot -- vreg' )
 | 
			
		||||
    cell 4 = [ 1 ^^shr-imm ] [ any-rep ^^copy ] if ;
 | 
			
		||||
 | 
			
		||||
: ^^tag-offset>slot ( slot tag -- vreg' )
 | 
			
		||||
    [ ^^offset>slot ] dip ^^sub-imm ;
 | 
			
		||||
 | 
			
		||||
: ^^tag-fixnum ( src -- dst )
 | 
			
		||||
    tag-bits get ^^shl-imm ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -199,15 +199,6 @@ def: dst/int-rep
 | 
			
		|||
use: src/int-rep ;
 | 
			
		||||
 | 
			
		||||
! Float arithmetic
 | 
			
		||||
PURE-INSN: ##unbox-float
 | 
			
		||||
def: dst/double-rep
 | 
			
		||||
use: src/int-rep ;
 | 
			
		||||
 | 
			
		||||
PURE-INSN: ##box-float
 | 
			
		||||
def: dst/int-rep
 | 
			
		||||
use: src/double-rep
 | 
			
		||||
temp: temp/int-rep ;
 | 
			
		||||
 | 
			
		||||
PURE-INSN: ##add-float
 | 
			
		||||
def: dst/double-rep
 | 
			
		||||
use: src1/double-rep src2/double-rep ;
 | 
			
		||||
| 
						 | 
				
			
			@ -266,18 +257,6 @@ def: dst/double-rep
 | 
			
		|||
use: src/int-rep ;
 | 
			
		||||
 | 
			
		||||
! SIMD operations
 | 
			
		||||
 | 
			
		||||
PURE-INSN: ##box-vector
 | 
			
		||||
def: dst/int-rep
 | 
			
		||||
use: src
 | 
			
		||||
literal: rep
 | 
			
		||||
temp: temp/int-rep ;
 | 
			
		||||
 | 
			
		||||
PURE-INSN: ##unbox-vector
 | 
			
		||||
def: dst
 | 
			
		||||
use: src/int-rep
 | 
			
		||||
literal: rep ;
 | 
			
		||||
 | 
			
		||||
PURE-INSN: ##zero-vector
 | 
			
		||||
def: dst
 | 
			
		||||
literal: rep ;
 | 
			
		||||
| 
						 | 
				
			
			@ -738,8 +717,6 @@ literal: n ;
 | 
			
		|||
 | 
			
		||||
UNION: ##allocation
 | 
			
		||||
##allot
 | 
			
		||||
##box-float
 | 
			
		||||
##box-vector
 | 
			
		||||
##box-alien
 | 
			
		||||
##box-displaced-alien ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,9 @@
 | 
			
		|||
USING: accessors kernel sequences alien math classes.algebra fry
 | 
			
		||||
locals combinators combinators.short-circuit cpu.architecture
 | 
			
		||||
compiler.tree.propagation.info compiler.cfg.hats
 | 
			
		||||
compiler.cfg.stacks compiler.cfg.instructions
 | 
			
		||||
compiler.cfg.utilities compiler.cfg.builder.blocks ;
 | 
			
		||||
compiler.cfg.registers compiler.cfg.stacks
 | 
			
		||||
compiler.cfg.instructions compiler.cfg.utilities
 | 
			
		||||
compiler.cfg.builder.blocks ;
 | 
			
		||||
IN: compiler.cfg.intrinsics.alien
 | 
			
		||||
 | 
			
		||||
: emit-<displaced-alien>? ( node -- ? )
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +34,9 @@ IN: compiler.cfg.intrinsics.alien
 | 
			
		|||
    [ second class>> fixnum class<= ]
 | 
			
		||||
    bi and ;
 | 
			
		||||
 | 
			
		||||
: ^^unbox-c-ptr ( src class -- dst )
 | 
			
		||||
    [ next-vreg dup ] 2dip next-vreg ##unbox-c-ptr ;
 | 
			
		||||
 | 
			
		||||
: prepare-alien-accessor ( info -- ptr-vreg offset )
 | 
			
		||||
    class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add 0 ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,9 @@ IN: compiler.cfg.intrinsics.allot
 | 
			
		|||
: tuple-slot-regs ( layout -- vregs )
 | 
			
		||||
    [ second ds-load ] [ ^^load-literal ] bi prefix ;
 | 
			
		||||
 | 
			
		||||
: ^^allot-tuple ( n -- dst )
 | 
			
		||||
    2 + cells tuple ^^allot ;
 | 
			
		||||
 | 
			
		||||
: emit-<tuple-boa> ( node -- )
 | 
			
		||||
    dup node-input-infos last literal>>
 | 
			
		||||
    dup array? [
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +39,9 @@ IN: compiler.cfg.intrinsics.allot
 | 
			
		|||
: expand-<array>? ( obj -- ? )
 | 
			
		||||
    dup integer? [ 0 8 between? ] [ drop f ] if ;
 | 
			
		||||
 | 
			
		||||
: ^^allot-array ( n -- dst )
 | 
			
		||||
    2 + cells array ^^allot ;
 | 
			
		||||
 | 
			
		||||
:: emit-<array> ( node -- )
 | 
			
		||||
    [let | len [ node node-input-infos first literal>> ] |
 | 
			
		||||
        len expand-<array>? [
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +60,9 @@ IN: compiler.cfg.intrinsics.allot
 | 
			
		|||
 | 
			
		||||
: bytes>cells ( m -- n ) cell align cell /i ;
 | 
			
		||||
 | 
			
		||||
: ^^allot-byte-array ( n -- dst )
 | 
			
		||||
    2 cells + byte-array ^^allot ;
 | 
			
		||||
 | 
			
		||||
: emit-allot-byte-array ( len -- dst )
 | 
			
		||||
    ds-drop
 | 
			
		||||
    dup ^^allot-byte-array
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,9 @@ IN: compiler.cfg.intrinsics.slots
 | 
			
		|||
 | 
			
		||||
: value-tag ( info -- n ) class>> class-tag ; inline
 | 
			
		||||
 | 
			
		||||
: ^^tag-offset>slot ( slot tag -- vreg' )
 | 
			
		||||
    [ ^^offset>slot ] dip ^^sub-imm ;
 | 
			
		||||
 | 
			
		||||
: (emit-slot) ( infos -- dst )
 | 
			
		||||
    [ 2inputs ] [ first value-tag ] bi*
 | 
			
		||||
    ^^tag-offset>slot ^^slot ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,10 @@
 | 
			
		|||
! Copyright (C) 2009 Slava Pestov
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: kernel fry accessors sequences assocs sets namespaces
 | 
			
		||||
arrays combinators combinators.short-circuit make locals deques
 | 
			
		||||
dlists layouts cpu.architecture compiler.utilities
 | 
			
		||||
arrays combinators combinators.short-circuit math make locals
 | 
			
		||||
deques dlists layouts byte-arrays cpu.architecture
 | 
			
		||||
compiler.utilities
 | 
			
		||||
compiler.constants
 | 
			
		||||
compiler.cfg
 | 
			
		||||
compiler.cfg.rpo
 | 
			
		||||
compiler.cfg.hats
 | 
			
		||||
| 
						 | 
				
			
			@ -25,24 +27,31 @@ GENERIC: emit-unbox ( dst src rep -- )
 | 
			
		|||
M:: float-rep emit-box ( dst src rep -- )
 | 
			
		||||
    double-rep next-vreg-rep :> temp
 | 
			
		||||
    temp src ##single>double-float
 | 
			
		||||
    dst temp int-rep next-vreg-rep ##box-float ;
 | 
			
		||||
    dst temp double-rep emit-box ;
 | 
			
		||||
 | 
			
		||||
M:: float-rep emit-unbox ( dst src rep -- )
 | 
			
		||||
    double-rep next-vreg-rep :> temp
 | 
			
		||||
    temp src ##unbox-float
 | 
			
		||||
    temp src double-rep emit-unbox
 | 
			
		||||
    dst temp ##double>single-float ;
 | 
			
		||||
 | 
			
		||||
M: double-rep emit-box
 | 
			
		||||
    drop int-rep next-vreg-rep ##box-float ;
 | 
			
		||||
    drop
 | 
			
		||||
    [ drop 16 float int-rep next-vreg-rep ##allot ]
 | 
			
		||||
    [ float-offset swap ##set-alien-double ]
 | 
			
		||||
    2bi ;
 | 
			
		||||
 | 
			
		||||
M: double-rep emit-unbox
 | 
			
		||||
    drop ##unbox-float ;
 | 
			
		||||
    drop float-offset ##alien-double ;
 | 
			
		||||
 | 
			
		||||
M: vector-rep emit-box
 | 
			
		||||
    int-rep next-vreg-rep ##box-vector ;
 | 
			
		||||
M:: vector-rep emit-box ( dst src rep -- )
 | 
			
		||||
    int-rep next-vreg-rep :> temp
 | 
			
		||||
    dst 16 2 cells + byte-array int-rep next-vreg-rep ##allot
 | 
			
		||||
    temp 16 tag-fixnum ##load-immediate
 | 
			
		||||
    temp dst 1 byte-array tag-number ##set-slot-imm
 | 
			
		||||
    dst byte-array-offset src rep ##set-alien-vector ;
 | 
			
		||||
 | 
			
		||||
M: vector-rep emit-unbox
 | 
			
		||||
    ##unbox-vector ;
 | 
			
		||||
    byte-array-offset ##alien-vector ;
 | 
			
		||||
 | 
			
		||||
M:: scalar-rep emit-box ( dst src rep -- )
 | 
			
		||||
    int-rep next-vreg-rep :> temp
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,19 +107,15 @@ IN: compiler.cfg.value-numbering.tests
 | 
			
		|||
    {
 | 
			
		||||
        T{ ##peek f 8 D 0 }
 | 
			
		||||
        T{ ##peek f 9 D -1 }
 | 
			
		||||
        T{ ##unbox-float f 10 8 }
 | 
			
		||||
        T{ ##unbox-float f 11 9 }
 | 
			
		||||
        T{ ##compare-float-unordered f 12 10 11 cc< }
 | 
			
		||||
        T{ ##compare-float-unordered f 14 10 11 cc/< }
 | 
			
		||||
        T{ ##compare-float-unordered f 12 8 9 cc< }
 | 
			
		||||
        T{ ##compare-float-unordered f 14 8 9 cc/< }
 | 
			
		||||
        T{ ##replace f 14 D 0 }
 | 
			
		||||
    }
 | 
			
		||||
] [
 | 
			
		||||
    {
 | 
			
		||||
        T{ ##peek f 8 D 0 }
 | 
			
		||||
        T{ ##peek f 9 D -1 }
 | 
			
		||||
        T{ ##unbox-float f 10 8 }
 | 
			
		||||
        T{ ##unbox-float f 11 9 }
 | 
			
		||||
        T{ ##compare-float-unordered f 12 10 11 cc< }
 | 
			
		||||
        T{ ##compare-float-unordered f 12 8 9 cc< }
 | 
			
		||||
        T{ ##compare-imm f 14 12 5 cc= }
 | 
			
		||||
        T{ ##replace f 14 D 0 }
 | 
			
		||||
    } value-numbering-step trim-temps
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -146,8 +146,6 @@ CODEGEN: ##not %not
 | 
			
		|||
CODEGEN: ##neg %neg
 | 
			
		||||
CODEGEN: ##log2 %log2
 | 
			
		||||
CODEGEN: ##copy %copy
 | 
			
		||||
CODEGEN: ##unbox-float %unbox-float
 | 
			
		||||
CODEGEN: ##box-float %box-float
 | 
			
		||||
CODEGEN: ##add-float %add-float
 | 
			
		||||
CODEGEN: ##sub-float %sub-float
 | 
			
		||||
CODEGEN: ##mul-float %mul-float
 | 
			
		||||
| 
						 | 
				
			
			@ -161,12 +159,10 @@ CODEGEN: ##single>double-float %single>double-float
 | 
			
		|||
CODEGEN: ##double>single-float %double>single-float
 | 
			
		||||
CODEGEN: ##integer>float %integer>float
 | 
			
		||||
CODEGEN: ##float>integer %float>integer
 | 
			
		||||
CODEGEN: ##unbox-vector %unbox-vector
 | 
			
		||||
CODEGEN: ##zero-vector %zero-vector
 | 
			
		||||
CODEGEN: ##gather-vector-2 %gather-vector-2
 | 
			
		||||
CODEGEN: ##gather-vector-4 %gather-vector-4
 | 
			
		||||
CODEGEN: ##shuffle-vector %shuffle-vector
 | 
			
		||||
CODEGEN: ##box-vector %box-vector
 | 
			
		||||
CODEGEN: ##add-vector %add-vector
 | 
			
		||||
CODEGEN: ##saturated-add-vector %saturated-add-vector
 | 
			
		||||
CODEGEN: ##add-sub-vector %add-sub-vector
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,20 +46,6 @@ IN: compiler.tests.low-level-ir
 | 
			
		|||
    } compile-test-bb
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
! ##copy on floats. We can only run this test if float intrinsics
 | 
			
		||||
! are enabled.
 | 
			
		||||
\ float+ "intrinsic" word-prop [
 | 
			
		||||
    [ 1.5 ] [
 | 
			
		||||
        V{
 | 
			
		||||
            T{ ##load-reference f 4 1.5 }
 | 
			
		||||
            T{ ##unbox-float f 1 4 }
 | 
			
		||||
            T{ ##copy f 2 1 double-rep }
 | 
			
		||||
            T{ ##box-float f 3 2 }
 | 
			
		||||
            T{ ##copy f 0 3 int-rep }
 | 
			
		||||
        } compile-test-bb
 | 
			
		||||
    ] unit-test
 | 
			
		||||
] when
 | 
			
		||||
 | 
			
		||||
! make sure slot access works when the destination is
 | 
			
		||||
! one of the sources
 | 
			
		||||
[ t ] [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -197,9 +197,6 @@ HOOK: %fixnum-add cpu ( label dst src1 src2 -- )
 | 
			
		|||
HOOK: %fixnum-sub cpu ( label dst src1 src2 -- )
 | 
			
		||||
HOOK: %fixnum-mul cpu ( label dst src1 src2 -- )
 | 
			
		||||
 | 
			
		||||
HOOK: %unbox-float cpu ( dst src -- )
 | 
			
		||||
HOOK: %box-float cpu ( dst src temp -- )
 | 
			
		||||
 | 
			
		||||
HOOK: %add-float cpu ( dst src1 src2 -- )
 | 
			
		||||
HOOK: %sub-float cpu ( dst src1 src2 -- )
 | 
			
		||||
HOOK: %mul-float cpu ( dst src1 src2 -- )
 | 
			
		||||
| 
						 | 
				
			
			@ -216,9 +213,6 @@ HOOK: %double>single-float cpu ( dst src -- )
 | 
			
		|||
HOOK: %integer>float cpu ( dst src -- )
 | 
			
		||||
HOOK: %float>integer cpu ( dst src -- )
 | 
			
		||||
 | 
			
		||||
HOOK: %box-vector cpu ( dst src temp rep -- )
 | 
			
		||||
HOOK: %unbox-vector cpu ( dst src rep -- )
 | 
			
		||||
 | 
			
		||||
HOOK: %zero-vector cpu ( dst rep -- )
 | 
			
		||||
HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
 | 
			
		||||
HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -230,12 +230,6 @@ M: ppc %copy ( dst src rep -- )
 | 
			
		|||
        } case
 | 
			
		||||
    ] if ;
 | 
			
		||||
 | 
			
		||||
M: ppc %unbox-float ( dst src -- ) float-offset LFD ;
 | 
			
		||||
 | 
			
		||||
M:: ppc %box-float ( dst src temp -- )
 | 
			
		||||
    dst 16 float temp %allot
 | 
			
		||||
    src dst float-offset STFD ;
 | 
			
		||||
 | 
			
		||||
GENERIC: float-function-param* ( dst src -- )
 | 
			
		||||
 | 
			
		||||
M: spill-slot float-function-param* [ 1 ] dip n>> spill@ LFD ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -474,13 +474,6 @@ M: x86 %double>single-float CVTSD2SS ;
 | 
			
		|||
M: x86 %integer>float CVTSI2SD ;
 | 
			
		||||
M: x86 %float>integer CVTTSD2SI ;
 | 
			
		||||
 | 
			
		||||
M: x86 %unbox-float ( dst src -- )
 | 
			
		||||
    float-offset [+] MOVSD ;
 | 
			
		||||
 | 
			
		||||
M:: x86 %box-float ( dst src temp -- )
 | 
			
		||||
    dst 16 float temp %allot
 | 
			
		||||
    dst float-offset [+] src MOVSD ;
 | 
			
		||||
 | 
			
		||||
: %cmov-float= ( dst src -- )
 | 
			
		||||
    [
 | 
			
		||||
        "no-move" define-label
 | 
			
		||||
| 
						 | 
				
			
			@ -561,16 +554,6 @@ M: x86 %compare-float-ordered-branch ( label src1 src2 cc -- )
 | 
			
		|||
M: x86 %compare-float-unordered-branch ( label src1 src2 cc -- )
 | 
			
		||||
    \ UCOMISD (%compare-float-branch) ;
 | 
			
		||||
 | 
			
		||||
M:: x86 %box-vector ( dst src rep temp -- )
 | 
			
		||||
    dst rep rep-size 2 cells + byte-array temp %allot
 | 
			
		||||
    16 tag-fixnum dst 1 byte-array tag-number %set-slot-imm
 | 
			
		||||
    dst byte-array-offset [+]
 | 
			
		||||
    src rep %copy ;
 | 
			
		||||
 | 
			
		||||
M:: x86 %unbox-vector ( dst src rep -- )
 | 
			
		||||
    dst src byte-array-offset [+]
 | 
			
		||||
    rep %copy ;
 | 
			
		||||
 | 
			
		||||
MACRO: available-reps ( alist -- )
 | 
			
		||||
    ! Each SSE version adds new representations and supports
 | 
			
		||||
    ! all old ones
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue