From b9577e2b0ea677d18a6914cdcbb101439ef0ece6 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 1 Oct 2009 18:07:50 -0500 Subject: [PATCH] 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 --- .../cfg/gc-checks/gc-checks-tests.factor | 2 +- basis/compiler/cfg/hats/hats.factor | 15 ----------- .../cfg/instructions/instructions.factor | 23 ---------------- .../cfg/intrinsics/alien/alien.factor | 8 ++++-- .../cfg/intrinsics/allot/allot.factor | 9 +++++++ .../cfg/intrinsics/slots/slots.factor | 3 +++ .../representations/representations.factor | 27 ++++++++++++------- .../value-numbering-tests.factor | 10 +++---- basis/compiler/codegen/codegen.factor | 4 --- basis/compiler/tests/low-level-ir.factor | 14 ---------- basis/cpu/architecture/architecture.factor | 6 ----- basis/cpu/ppc/ppc.factor | 6 ----- basis/cpu/x86/x86.factor | 17 ------------ 13 files changed, 40 insertions(+), 104 deletions(-) diff --git a/basis/compiler/cfg/gc-checks/gc-checks-tests.factor b/basis/compiler/cfg/gc-checks/gc-checks-tests.factor index 5580de9a47..27d37b115f 100644 --- a/basis/compiler/cfg/gc-checks/gc-checks-tests.factor +++ b/basis/compiler/cfg/gc-checks/gc-checks-tests.factor @@ -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 diff --git a/basis/compiler/cfg/hats/hats.factor b/basis/compiler/cfg/hats/hats.factor index cf5c0095ca..42aa5512bc 100644 --- a/basis/compiler/cfg/hats/hats.factor +++ b/basis/compiler/cfg/hats/hats.factor @@ -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 ; diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index aefa155ec5..e69516dded 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -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 ; diff --git a/basis/compiler/cfg/intrinsics/alien/alien.factor b/basis/compiler/cfg/intrinsics/alien/alien.factor index bc6baa21b7..a37e100c3e 100644 --- a/basis/compiler/cfg/intrinsics/alien/alien.factor +++ b/basis/compiler/cfg/intrinsics/alien/alien.factor @@ -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-? ( 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 ; diff --git a/basis/compiler/cfg/intrinsics/allot/allot.factor b/basis/compiler/cfg/intrinsics/allot/allot.factor index d4aa2750c0..6ad5450bfc 100644 --- a/basis/compiler/cfg/intrinsics/allot/allot.factor +++ b/basis/compiler/cfg/intrinsics/allot/allot.factor @@ -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- ( node -- ) dup node-input-infos last literal>> dup array? [ @@ -36,6 +39,9 @@ IN: compiler.cfg.intrinsics.allot : expand-? ( obj -- ? ) dup integer? [ 0 8 between? ] [ drop f ] if ; +: ^^allot-array ( n -- dst ) + 2 + cells array ^^allot ; + :: emit- ( node -- ) [let | len [ node node-input-infos first literal>> ] | len expand-? [ @@ -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 diff --git a/basis/compiler/cfg/intrinsics/slots/slots.factor b/basis/compiler/cfg/intrinsics/slots/slots.factor index 07202ae60b..8ee1c41cfb 100644 --- a/basis/compiler/cfg/intrinsics/slots/slots.factor +++ b/basis/compiler/cfg/intrinsics/slots/slots.factor @@ -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 ; diff --git a/basis/compiler/cfg/representations/representations.factor b/basis/compiler/cfg/representations/representations.factor index 423f415742..f31184cecf 100644 --- a/basis/compiler/cfg/representations/representations.factor +++ b/basis/compiler/cfg/representations/representations.factor @@ -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 diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index b2750da3fa..f81a672108 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -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 diff --git a/basis/compiler/codegen/codegen.factor b/basis/compiler/codegen/codegen.factor index b0307f685d..7689862347 100755 --- a/basis/compiler/codegen/codegen.factor +++ b/basis/compiler/codegen/codegen.factor @@ -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 diff --git a/basis/compiler/tests/low-level-ir.factor b/basis/compiler/tests/low-level-ir.factor index 0b2da64636..e508b55b8d 100644 --- a/basis/compiler/tests/low-level-ir.factor +++ b/basis/compiler/tests/low-level-ir.factor @@ -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 ] [ diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index 3b1f57d08e..dc1c2eeb0c 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -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 -- ) diff --git a/basis/cpu/ppc/ppc.factor b/basis/cpu/ppc/ppc.factor index 11dbc27ac0..67a65b8ecd 100644 --- a/basis/cpu/ppc/ppc.factor +++ b/basis/cpu/ppc/ppc.factor @@ -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 ; diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 3c20064313..71d76a1ce5 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -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