]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://factorcode.org/git/factor
authorDoug Coleman <doug.coleman@gmail.com>
Sun, 6 Dec 2009 08:28:46 +0000 (02:28 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Sun, 6 Dec 2009 08:28:46 +0000 (02:28 -0600)
23 files changed:
basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/intrinsics/simd/simd-tests.factor
basis/compiler/cfg/intrinsics/simd/simd.factor
basis/compiler/codegen/codegen.factor
basis/compiler/tree/propagation/simd/simd.factor
basis/cpu/architecture/architecture.factor
basis/cpu/x86/x86.factor
basis/math/combinatorics/combinatorics.factor
basis/math/vectors/simd/intrinsics/intrinsics.factor
basis/math/vectors/simd/simd-tests.factor
basis/math/vectors/simd/simd.factor
basis/math/vectors/vectors-docs.factor
basis/math/vectors/vectors.factor
basis/specialized-arrays/specialized-arrays-tests.factor
basis/specialized-arrays/specialized-arrays.factor
basis/tools/deploy/shaker/shaker.factor
vm/contexts.hpp
vm/data_heap.cpp
vm/data_heap.hpp
vm/full_collector.cpp
vm/gc.cpp
vm/master.hpp
vm/stacks.hpp [deleted file]

index 00ded636acd01479a775c3b69ba64d978ae44bd1..93b960c576713e6a972fe441d70163ac59281270 100644 (file)
@@ -382,6 +382,16 @@ def: dst
 use: src1 src2
 literal: rep ;
 
+PURE-INSN: ##mul-high-vector
+def: dst
+use: src1 src2
+literal: rep ;
+
+PURE-INSN: ##mul-horizontal-add-vector
+def: dst
+use: src1 src2
+literal: rep ;
+
 PURE-INSN: ##saturated-mul-vector
 def: dst
 use: src1 src2
@@ -402,11 +412,21 @@ def: dst
 use: src1 src2
 literal: rep ;
 
+PURE-INSN: ##avg-vector
+def: dst
+use: src1 src2
+literal: rep ;
+
 PURE-INSN: ##dot-vector
 def: dst/scalar-rep
 use: src1 src2
 literal: rep ;
 
+PURE-INSN: ##sad-vector
+def: dst
+use: src1 src2
+literal: rep ;
+
 PURE-INSN: ##horizontal-add-vector
 def: dst
 use: src1 src2
index c2e233902e204d0f120d679acd696b7ed9c86b26..8bd936c4f6f33d6a255357cc81d0c4124aea8696 100644 (file)
@@ -273,14 +273,6 @@ unit-test
 [ horizontal-cpu float-4-rep [ emit-simd-sum ] test-emit ]
 unit-test
 
-[ {
-    ##unpack-vector-head ##unpack-vector-tail ##add-vector
-    ##horizontal-add-vector
-    ##vector>scalar
-} ]
-[ horizontal-cpu int-4-rep [ emit-simd-sum ] test-emit ]
-unit-test
-
 [ {
     ##unpack-vector-head ##unpack-vector-tail ##add-vector
     ##horizontal-add-vector ##horizontal-add-vector
@@ -514,22 +506,22 @@ unit-test
 
 ! with
 [ { ##scalar>vector ##shuffle-vector-imm } ]
-[ shuffle-imm-cpu int-4-rep [ emit-simd-with ] test-emit ]
+[ shuffle-imm-cpu float-4-rep [ emit-simd-with ] test-emit ]
 unit-test
 
 ! gather-2
 [ { ##gather-vector-2 } ]
-[ simple-ops-cpu longlong-2-rep [ emit-simd-gather-2 ] test-emit ]
+[ simple-ops-cpu double-2-rep [ emit-simd-gather-2 ] test-emit ]
 unit-test
 
 ! gather-4
 [ { ##gather-vector-4 } ]
-[ simple-ops-cpu int-4-rep [ emit-simd-gather-4 ] test-emit ]
+[ simple-ops-cpu float-4-rep [ emit-simd-gather-4 ] test-emit ]
 unit-test
 
 ! select
 [ { ##shuffle-vector-imm ##vector>scalar } ]
-[ shuffle-imm-cpu 1 int-4-rep [ emit-simd-select ] test-emit-literal ]
+[ shuffle-imm-cpu 1 float-4-rep [ emit-simd-select ] test-emit-literal ]
 unit-test
 
 ! test with nonliteral/invalid reps
index ab5e3e1d1d20fe2ed925403f34dfde21513f1967..c75e890c27e2d0279315b300ffec44b7efb83d5f 100644 (file)
@@ -57,6 +57,12 @@ IN: compiler.cfg.intrinsics.simd
         { longlong-2-rep [ longlong-array{ -1 0 } underlying>> ^^load-constant ] }
     } case ;
 
+: ^load-half-vector ( rep -- dst )
+    {
+        { float-4-rep  [ float-array{  0.5 0.5 0.5 0.5 } underlying>> ^^load-constant ] }
+        { double-2-rep [ double-array{ 0.5 0.5 }         underlying>> ^^load-constant ] }
+    } case ;
+
 : >variable-shuffle ( shuffle rep -- shuffle' )
     rep-component-type heap-size
     [ dup <repetition> >byte-array ]
@@ -336,6 +342,16 @@ PREDICATE: fixnum-vector-rep < int-vector-rep
         [ ^^mul-vector ]
     } emit-vv-vector-op ;
 
+: emit-simd-v*high ( node -- )
+    {
+        [ ^^mul-high-vector ]
+    } emit-vv-vector-op ;
+
+: emit-simd-v*hs+ ( node -- )
+    {
+        [ ^^mul-horizontal-add-vector ]
+    } emit-vv-vector-op ;
+
 : emit-simd-v/ ( node -- )
     {
         [ ^^div-vector ]
@@ -359,12 +375,29 @@ PREDICATE: fixnum-vector-rep < int-vector-rep
         ]
     } emit-vv-vector-op ;
 
+: emit-simd-vavg ( node -- )
+    {
+        [ ^^avg-vector ]
+        { float-vector-rep [| src1 src2 rep |
+            src1 src2 rep ^^add-vector
+            rep ^load-half-vector rep ^^mul-vector
+        ] }
+    } emit-vv-vector-op ;
+
 : emit-simd-v. ( node -- )
     {
         [ ^^dot-vector ]
         { float-vector-rep [ [ ^^mul-vector ] [ ^sum-vector ] bi ] }
     } emit-vv-vector-op ;
 
+: emit-simd-vsad ( node -- )
+    {
+        [
+            [ ^^sad-vector dup { 2 3 0 1 } int-4-rep ^^shuffle-vector-imm int-4-rep ^^add-vector ]
+            [ widen-vector-rep ^^vector>scalar ] bi
+        ]
+    } emit-vv-vector-op ;
+
 : emit-simd-vsqrt ( node -- )
     {
         [ ^^sqrt-vector ]
@@ -580,10 +613,14 @@ PREDICATE: fixnum-vector-rep < int-vector-rep
         { (simd-vs-)               [ emit-simd-vs-                 ] }
         { (simd-vs*)               [ emit-simd-vs*                 ] }
         { (simd-v*)                [ emit-simd-v*                  ] }
+        { (simd-v*high)            [ emit-simd-v*high              ] }
+        { (simd-v*hs+)             [ emit-simd-v*hs+               ] }
         { (simd-v/)                [ emit-simd-v/                  ] }
         { (simd-vmin)              [ emit-simd-vmin                ] }
         { (simd-vmax)              [ emit-simd-vmax                ] }
+        { (simd-vavg)              [ emit-simd-vavg                ] }
         { (simd-v.)                [ emit-simd-v.                  ] }
+        { (simd-vsad)              [ emit-simd-vsad                ] }
         { (simd-vsqrt)             [ emit-simd-vsqrt               ] }
         { (simd-sum)               [ emit-simd-sum                 ] }
         { (simd-vabs)              [ emit-simd-vabs                ] }
index dde0d6ef9f7966d0da572a049be066d6adaf63f1..8d976193e1c0520f4f2982d56f6f95f1f0a141ce 100644 (file)
@@ -173,11 +173,15 @@ CODEGEN: ##add-sub-vector %add-sub-vector
 CODEGEN: ##sub-vector %sub-vector
 CODEGEN: ##saturated-sub-vector %saturated-sub-vector
 CODEGEN: ##mul-vector %mul-vector
+CODEGEN: ##mul-high-vector %mul-high-vector
+CODEGEN: ##mul-horizontal-add-vector %mul-horizontal-add-vector
 CODEGEN: ##saturated-mul-vector %saturated-mul-vector
 CODEGEN: ##div-vector %div-vector
 CODEGEN: ##min-vector %min-vector
 CODEGEN: ##max-vector %max-vector
+CODEGEN: ##avg-vector %avg-vector
 CODEGEN: ##dot-vector %dot-vector
+CODEGEN: ##sad-vector %sad-vector
 CODEGEN: ##sqrt-vector %sqrt-vector
 CODEGEN: ##horizontal-add-vector %horizontal-add-vector
 CODEGEN: ##horizontal-sub-vector %horizontal-sub-vector
index 9aab173d7ceada7f95b4912a992ee52e28439ff0..250a9379e87b299e17a44676feccaa68c30bb304 100644 (file)
@@ -16,9 +16,12 @@ CONSTANT: vector>vector-intrinsics
         (simd-vs-)
         (simd-vs*)
         (simd-v*)
+        (simd-v*high)
+        (simd-v*hs+)
         (simd-v/)
         (simd-vmin)
         (simd-vmax)
+        (simd-vavg)
         (simd-vsqrt)
         (simd-vabs)
         (simd-vbitand)
@@ -60,6 +63,7 @@ CONSTANT: vector>vector-intrinsics
 CONSTANT: vector-other-intrinsics
     {
         (simd-v.)
+        (simd-vsad)
         (simd-sum)
         (simd-vany?)
         (simd-vall?)
index 0d2ad132825a941d44cf266cb4ac6e876f844952..0a4db25d351f5947ef8c1d284a0931da71dedb77 100644 (file)
@@ -283,11 +283,15 @@ HOOK: %add-sub-vector cpu ( dst src1 src2 rep -- )
 HOOK: %sub-vector cpu ( dst src1 src2 rep -- )
 HOOK: %saturated-sub-vector cpu ( dst src1 src2 rep -- )
 HOOK: %mul-vector cpu ( dst src1 src2 rep -- )
+HOOK: %mul-high-vector cpu ( dst src1 src2 rep -- )
+HOOK: %mul-horizontal-add-vector cpu ( dst src1 src2 rep -- )
 HOOK: %saturated-mul-vector cpu ( dst src1 src2 rep -- )
 HOOK: %div-vector cpu ( dst src1 src2 rep -- )
 HOOK: %min-vector cpu ( dst src1 src2 rep -- )
 HOOK: %max-vector cpu ( dst src1 src2 rep -- )
+HOOK: %avg-vector cpu ( dst src1 src2 rep -- )
 HOOK: %dot-vector cpu ( dst src1 src2 rep -- )
+HOOK: %sad-vector cpu ( dst src1 src2 rep -- )
 HOOK: %sqrt-vector cpu ( dst src rep -- )
 HOOK: %horizontal-add-vector cpu ( dst src1 src2 rep -- )
 HOOK: %horizontal-sub-vector cpu ( dst src1 src2 rep -- )
@@ -332,11 +336,15 @@ HOOK: %add-sub-vector-reps cpu ( -- reps )
 HOOK: %sub-vector-reps cpu ( -- reps )
 HOOK: %saturated-sub-vector-reps cpu ( -- reps )
 HOOK: %mul-vector-reps cpu ( -- reps )
+HOOK: %mul-high-vector-reps cpu ( -- reps )
+HOOK: %mul-horizontal-add-vector-reps cpu ( -- reps )
 HOOK: %saturated-mul-vector-reps cpu ( -- reps )
 HOOK: %div-vector-reps cpu ( -- reps )
 HOOK: %min-vector-reps cpu ( -- reps )
 HOOK: %max-vector-reps cpu ( -- reps )
+HOOK: %avg-vector-reps cpu ( -- reps )
 HOOK: %dot-vector-reps cpu ( -- reps )
+HOOK: %sad-vector-reps cpu ( -- reps )
 HOOK: %sqrt-vector-reps cpu ( -- reps )
 HOOK: %horizontal-add-vector-reps cpu ( -- reps )
 HOOK: %horizontal-sub-vector-reps cpu ( -- reps )
index 1a5cc6b850b1a73061e21b33465790376fd26b1c..36711f7122a449a848ef65003e51423e87fbd2e7 100644 (file)
@@ -1106,6 +1106,32 @@ M: x86 %mul-vector-reps
         { sse4.1? { int-4-rep uint-4-rep } }
     } available-reps ;
 
+M: x86 %mul-high-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { short-8-rep  [ PMULHW ] }
+        { ushort-8-rep [ PMULHUW ] }
+    } case ;
+
+M: x86 %mul-high-vector-reps
+    {
+        { sse2? { short-8-rep ushort-8-rep } }
+    } available-reps ;
+
+M: x86 %mul-horizontal-add-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { char-16-rep  [ PMADDUBSW ] }
+        { uchar-16-rep [ PMADDUBSW ] }
+        { short-8-rep  [ PMADDWD ] }
+    } case ;
+
+M: x86 %mul-horizontal-add-vector-reps
+    {
+        { sse2?  { short-8-rep } }
+        { ssse3? { char-16-rep uchar-16-rep } }
+    } available-reps ;
+
 M: x86 %div-vector ( dst src1 src2 rep -- )
     [ two-operand ] keep
     {
@@ -1159,6 +1185,18 @@ M: x86 %max-vector-reps
         { sse4.1? { char-16-rep ushort-8-rep int-4-rep uint-4-rep } }
     } available-reps ;
 
+M: x86 %avg-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { uchar-16-rep [ PAVGB ] }
+        { ushort-8-rep [ PAVGW ] }
+    } case ;
+
+M: x86 %avg-vector-reps
+    {
+        { sse2? { uchar-16-rep ushort-8-rep } }
+    } available-reps ;
+
 M: x86 %dot-vector
     [ two-operand ] keep
     {
@@ -1171,6 +1209,17 @@ M: x86 %dot-vector-reps
         { sse4.1? { float-4-rep double-2-rep } }
     } available-reps ;
 
+M: x86 %sad-vector
+    [ two-operand ] keep
+    {
+        { uchar-16-rep [ PSADBW ] }
+    } case ;
+
+M: x86 %sad-vector-reps
+    {
+        { sse2? { uchar-16-rep } }
+    } available-reps ;
+
 M: x86 %horizontal-add-vector ( dst src1 src2 rep -- )
     [ two-operand ] keep
     signed-rep {
@@ -1323,7 +1372,7 @@ M: x86 %shr-vector-imm-reps %shr-vector-reps ;
 
 M: x86 %integer>scalar drop MOVD ;
 
-M:: x86 %scalar>integer ( dst src rep -- )
+:: %scalar>integer-32 ( dst src rep -- )
     rep {
         { int-scalar-rep [
             dst 32-bit-version-of src MOVD
@@ -1359,6 +1408,14 @@ M:: x86 %scalar>integer ( dst src rep -- )
         ] }
     } case ;
 
+M: x86.32 %scalar>integer ( dst src rep -- ) %scalar>integer-32 ;
+M: x86.64 %scalar>integer ( dst src rep -- )
+    {
+        { longlong-scalar-rep  [ MOVD ] }
+        { ulonglong-scalar-rep [ MOVD ] }
+        [ %scalar>integer-32 ]
+    } case ;
+
 M: x86 %vector>scalar %copy ;
 M: x86 %scalar>vector %copy ;
 
index 7908c2a801edb059ded2f034a7f5b4237946c6c4..36b62ddcc06d0cbe53417a81d50a8a5714433af3 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (c) 2007-2009 Slava Pestov, Doug Coleman, Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs binary-search fry kernel locals math math.order
-    math.ranges mirrors namespaces sequences sorting ;
+    math.ranges namespaces sequences sorting ;
 IN: math.combinatorics
 
 <PRIVATE
index eb0e7b1dc8f21228b108d931eeea8b2bb87d733a..658d9b270c8eaffe1f6e3ab792ab771a2b05ab38 100644 (file)
@@ -1,8 +1,9 @@
 ! (c)2009 Slava Pestov, Joe Groff bsd license
 USING: accessors alien alien.c-types alien.data combinators
-sequences.cords cpu.architecture fry generalizations kernel
-libc locals math math.libm math.order math.ranges math.vectors
-sequences sequences.private specialized-arrays vocabs.loader ;
+sequences.cords cpu.architecture fry generalizations grouping
+kernel libc locals math math.libm math.order math.ranges
+math.vectors sequences sequences.private specialized-arrays
+vocabs.loader ;
 QUALIFIED-WITH: alien.c-types c
 SPECIALIZED-ARRAYS:
     c:char c:short c:int c:longlong
@@ -141,13 +142,31 @@ PRIVATE>
 : (simd-vs*)               ( a b rep -- c )
     dup rep-component-type '[ * _ c-type-clamp ] components-2map ;
 : (simd-v*)                ( a b rep -- c ) [ * ] components-2map ;
+: (simd-v*high)            ( a b rep -- c )
+    dup rep-component-type heap-size -8 * '[ * _ shift ] components-2map ;
+:: (simd-v*hs+)            ( a b rep -- c )
+    rep { char-16-rep uchar-16-rep } member-eq?
+    [ uchar-16-rep char-16-rep ]
+    [ rep rep ] if :> ( a-rep b-rep )
+    b-rep widen-vector-rep signed-rep :> wide-rep
+    wide-rep rep-component-type :> wide-type
+    a a-rep >rep-array 2 <groups> :> a'
+    b b-rep >rep-array 2 <groups> :> b'
+    a' b' [
+        [ [ first  ] bi@ * ]
+        [ [ second ] bi@ * ] 2bi +
+        wide-type c-type-clamp
+    ] wide-rep <rep-array> 2map-as underlying>> ;
 : (simd-v/)                ( a b rep -- c ) [ / ] components-2map ;
+: (simd-vavg)              ( a b rep -- c )
+    [ + dup integer? [ 1 + -1 shift ] [ 0.5 * ] if ] components-2map ;
 : (simd-vmin)              ( a b rep -- c ) [ min ] components-2map ;
 : (simd-vmax)              ( a b rep -- c ) [ max ] components-2map ;
 : (simd-v.)                ( a b rep -- n )
     [ 2>rep-array [ [ first ] bi@ * ] 2keep ] keep
     1 swap rep-length [a,b) [ '[ _ swap nth-unsafe ] bi@ * + ] with with each ;
 : (simd-vsqrt)             ( a   rep -- c ) [ fsqrt ] components-map ;
+: (simd-vsad)              ( a b rep -- c ) 2>rep-array [ - abs ] [ + ] 2map-reduce ;
 : (simd-sum)               ( a   rep -- n ) [ + ] components-reduce ;
 : (simd-vabs)              ( a   rep -- c ) [ abs ] components-map ;
 : (simd-vbitand)           ( a b rep -- c ) [ bitand ] bitwise-components-2map ;
index 98ed68a906447811f46f6b243c314887b1e8fcce..aaa55078640749b3135a48489b0e075be1ab1c75 100644 (file)
@@ -69,6 +69,8 @@ CONSTANT: vector-words
         { v* { +vector+ +vector+ -> +vector+ } }
         { vs* { +vector+ +vector+ -> +vector+ } }
         { v*n { +vector+ +scalar+ -> +vector+ } }
+        { v*high { +vector+ +vector+ -> +vector+ } }
+        { v*hs+ { +vector+ +vector+ -> +vector+ } }
         { v+ { +vector+ +vector+ -> +vector+ } }
         { vs+ { +vector+ +vector+ -> +vector+ } }
         { v+- { +vector+ +vector+ -> +vector+ } }
@@ -78,12 +80,14 @@ CONSTANT: vector-words
         { vs- { +vector+ +vector+ -> +vector+ } }
         { v-n { +vector+ +scalar+ -> +vector+ } }
         { v. { +vector+ +vector+ -> +scalar+ } }
+        { vsad { +vector+ +vector+ -> +scalar+ } }
         { v/ { +vector+ +vector+ -> +vector+ } }
         { v/n { +vector+ +scalar+ -> +vector+ } }
         { vceiling { +vector+ -> +vector+ } }
         { vfloor { +vector+ -> +vector+ } }
         { vmax { +vector+ +vector+ -> +vector+ } }
         { vmin { +vector+ +vector+ -> +vector+ } }
+        { vavg { +vector+ +vector+ -> +vector+ } }
         { vneg { +vector+ -> +vector+ } }
         { vtruncate { +vector+ -> +vector+ } }
         { sum { +vector+ -> +scalar+ } }
@@ -197,7 +201,7 @@ CONSTANT: vector-words
     { vsqrt n/v v/n v/ normalize } unique assoc-diff ;
 
 : remove-integer-words ( alist -- alist' )
-    { vlshift vrshift } unique assoc-diff ;
+    { vlshift vrshift v*high v*hs+ } unique assoc-diff ;
 
 : boolean-ops ( -- words )
     { vand vandn vor vxor vnot } ;
index 036ff22f781ab9ae473c5d5d04a25aa92b7eab35..905737c266c283cca9ec43534888cbde7f3931bf 100644 (file)
@@ -9,6 +9,8 @@ IN: math.vectors.simd
 
 ERROR: bad-simd-length got expected ;
 
+ERROR: bad-simd-vector obj ;
+
 <<
 <PRIVATE
 ! Primitive SIMD constructors
@@ -48,6 +50,7 @@ TUPLE: simd-128
 
 GENERIC: simd-element-type ( obj -- c-type )
 GENERIC: simd-rep ( simd -- rep )
+GENERIC: simd-with ( n exemplar -- v )
 
 M: object simd-element-type drop f ;
 M: object simd-rep drop f ;
@@ -99,6 +102,131 @@ PRIVATE>
 >>
 
 <<
+
+! SIMD vectors as sequences
+
+M: simd-128 hashcode* underlying>> hashcode* ; inline
+M: simd-128 clone [ clone ] change-underlying ; inline
+M: simd-128 c:byte-length drop 16 ; inline
+
+M: simd-128 new-sequence
+    2dup length =
+    [ nip [ 16 (byte-array) ] make-underlying ]
+    [ length bad-simd-length ] if ; inline
+
+M: simd-128 equal?
+    dup simd-rep [ drop v= vall? ] [ 3drop f ] if-both-vectors-match ; inline
+
+! SIMD primitive operations
+
+M: simd-128 v+
+    dup simd-rep [ (simd-v+)                ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v-
+    dup simd-rep [ (simd-v-)                ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vneg
+    dup simd-rep [ (simd-vneg)              ] [ call-next-method ] v->v-op  ; inline
+M: simd-128 v+-
+    dup simd-rep [ (simd-v+-)               ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vs+
+    dup simd-rep [ (simd-vs+)               ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vs-
+    dup simd-rep [ (simd-vs-)               ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vs*
+    dup simd-rep [ (simd-vs*)               ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v*
+    dup simd-rep [ (simd-v*)                ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v*high
+    dup simd-rep [ (simd-v*high)            ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v/
+    dup simd-rep [ (simd-v/)                ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vavg
+    dup simd-rep [ (simd-vavg)              ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vmin
+    dup simd-rep [ (simd-vmin)              ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vmax
+    dup simd-rep [ (simd-vmax)              ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v.
+    dup simd-rep [ (simd-v.)                ] [ call-next-method ] vv->n-op ; inline
+M: simd-128 vsad
+    dup simd-rep [ (simd-vsad)              ] [ call-next-method ] vv->n-op ; inline
+M: simd-128 vsqrt
+    dup simd-rep [ (simd-vsqrt)             ] [ call-next-method ] v->v-op  ; inline
+M: simd-128 sum
+    dup simd-rep [ (simd-sum)               ] [ call-next-method ] v->n-op  ; inline
+M: simd-128 vabs
+    dup simd-rep [ (simd-vabs)              ] [ call-next-method ] v->v-op  ; inline
+M: simd-128 vbitand
+    dup simd-rep [ (simd-vbitand)           ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vbitandn
+    dup simd-rep [ (simd-vbitandn)          ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vbitor
+    dup simd-rep [ (simd-vbitor)            ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vbitxor
+    dup simd-rep [ (simd-vbitxor)           ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vbitnot
+    dup simd-rep [ (simd-vbitnot)           ] [ call-next-method ] v->v-op  ; inline
+M: simd-128 vand
+    dup simd-rep [ (simd-vand)              ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vandn
+    dup simd-rep [ (simd-vandn)             ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vor
+    dup simd-rep [ (simd-vor)               ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vxor
+    dup simd-rep [ (simd-vxor)              ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vnot
+    dup simd-rep [ (simd-vnot)              ] [ call-next-method ] v->v-op  ; inline
+M: simd-128 vlshift
+    over simd-rep [ (simd-vlshift)           ] [ call-next-method ] vn->v-op ; inline
+M: simd-128 vrshift
+    over simd-rep [ (simd-vrshift)           ] [ call-next-method ] vn->v-op ; inline
+M: simd-128 hlshift
+    over simd-rep [ (simd-hlshift)           ] [ call-next-method ] vn->v-op ; inline
+M: simd-128 hrshift
+    over simd-rep [ (simd-hrshift)           ] [ call-next-method ] vn->v-op ; inline
+M: simd-128 vshuffle-elements
+    over simd-rep [ (simd-vshuffle-elements) ] [ call-next-method ] vn->v-op ; inline
+M: simd-128 vshuffle-bytes
+    dup simd-rep [ (simd-vshuffle-bytes)    ] [ call-next-method ] vv'->v-op ; inline
+M: simd-128 (vmerge-head)
+    dup simd-rep [ (simd-vmerge-head)       ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 (vmerge-tail)
+    dup simd-rep [ (simd-vmerge-tail)       ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v<=
+    dup simd-rep [ (simd-v<=)               ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v<
+    dup simd-rep [ (simd-v<)                ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v=
+    dup simd-rep [ (simd-v=)                ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v>
+    dup simd-rep [ (simd-v>)                ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 v>=
+    dup simd-rep [ (simd-v>=)               ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vunordered?
+    dup simd-rep [ (simd-vunordered?)       ] [ call-next-method ] vv->v-op ; inline
+M: simd-128 vany?
+    dup simd-rep [ (simd-vany?)             ] [ call-next-method ] v->n-op  ; inline
+M: simd-128 vall?
+    dup simd-rep [ (simd-vall?)             ] [ call-next-method ] v->n-op  ; inline
+M: simd-128 vnone?
+    dup simd-rep [ (simd-vnone?)            ] [ call-next-method ] v->n-op  ; inline
+
+! SIMD high-level specializations
+
+M: simd-128 vbroadcast swap [ nth ] [ simd-with ] bi ; inline
+M: simd-128 n+v [ simd-with ] keep v+ ; inline
+M: simd-128 n-v [ simd-with ] keep v- ; inline
+M: simd-128 n*v [ simd-with ] keep v* ; inline
+M: simd-128 n/v [ simd-with ] keep v/ ; inline
+M: simd-128 v+n over simd-with v+ ; inline
+M: simd-128 v-n over simd-with v- ; inline
+M: simd-128 v*n over simd-with v* ; inline
+M: simd-128 v/n over simd-with v/ ; inline
+M: simd-128 norm-sq dup v. assert-positive ; inline
+M: simd-128 distance v- norm ; inline
+
+M: simd-128 >pprint-sequence ;
+M: simd-128 pprint* pprint-object ;
+
 <PRIVATE
 
 ! SIMD concrete type functor
@@ -128,7 +256,10 @@ TUPLE: A < simd-128 ;
 M: A new-underlying    drop \ A boa ; inline
 M: A simd-rep          drop A-rep ; inline
 M: A simd-element-type drop ELT ; inline
+M: A simd-with         drop A-with ; inline
 
+M: A nth-unsafe
+    swap \ A-rep [ (simd-select) ] [ call-next-method ] vn->n-op ; inline
 M: A set-nth-unsafe
     [ ELT boolean>element ] 2dip
     underlying>> SET-NTH call ; inline
@@ -140,84 +271,7 @@ M: A like drop dup \ A instance? [ >A ] unless ; inline
 : A-with ( n -- v ) COERCER call \ A-rep (simd-with) \ A boa ; inline
 : A-cast ( v -- v' ) underlying>> \ A boa ; inline
 
-! SIMD vectors as sequences
-
-M: A hashcode* underlying>> hashcode* ; inline
-M: A clone [ clone ] change-underlying ; inline
 M: A length drop N ; inline
-M: A nth-unsafe
-    swap \ A-rep [ (simd-select) ] [ call-next-method ] vn->n-op ; inline
-M: A c:byte-length drop 16 ; inline
-
-M: A new-sequence
-    2dup length =
-    [ nip [ 16 (byte-array) ] make-underlying ]
-    [ length bad-simd-length ] if ; inline
-
-M: A equal?
-    \ A-rep [ drop v= vall? ] [ 3drop f ] if-both-vectors-match ; inline
-
-! SIMD primitive operations
-
-M: A v+                \ A-rep [ (simd-v+)                ] [ call-next-method ] vv->v-op ; inline
-M: A v-                \ A-rep [ (simd-v-)                ] [ call-next-method ] vv->v-op ; inline
-M: A vneg              \ A-rep [ (simd-vneg)              ] [ call-next-method ] v->v-op  ; inline
-M: A v+-               \ A-rep [ (simd-v+-)               ] [ call-next-method ] vv->v-op ; inline
-M: A vs+               \ A-rep [ (simd-vs+)               ] [ call-next-method ] vv->v-op ; inline
-M: A vs-               \ A-rep [ (simd-vs-)               ] [ call-next-method ] vv->v-op ; inline
-M: A vs*               \ A-rep [ (simd-vs*)               ] [ call-next-method ] vv->v-op ; inline
-M: A v*                \ A-rep [ (simd-v*)                ] [ call-next-method ] vv->v-op ; inline
-M: A v/                \ A-rep [ (simd-v/)                ] [ call-next-method ] vv->v-op ; inline
-M: A vmin              \ A-rep [ (simd-vmin)              ] [ call-next-method ] vv->v-op ; inline
-M: A vmax              \ A-rep [ (simd-vmax)              ] [ call-next-method ] vv->v-op ; inline
-M: A v.                \ A-rep [ (simd-v.)                ] [ call-next-method ] vv->n-op ; inline
-M: A vsqrt             \ A-rep [ (simd-vsqrt)             ] [ call-next-method ] v->v-op  ; inline
-M: A sum               \ A-rep [ (simd-sum)               ] [ call-next-method ] v->n-op  ; inline
-M: A vabs              \ A-rep [ (simd-vabs)              ] [ call-next-method ] v->v-op  ; inline
-M: A vbitand           \ A-rep [ (simd-vbitand)           ] [ call-next-method ] vv->v-op ; inline
-M: A vbitandn          \ A-rep [ (simd-vbitandn)          ] [ call-next-method ] vv->v-op ; inline
-M: A vbitor            \ A-rep [ (simd-vbitor)            ] [ call-next-method ] vv->v-op ; inline
-M: A vbitxor           \ A-rep [ (simd-vbitxor)           ] [ call-next-method ] vv->v-op ; inline
-M: A vbitnot           \ A-rep [ (simd-vbitnot)           ] [ call-next-method ] v->v-op  ; inline
-M: A vand              \ A-rep [ (simd-vand)              ] [ call-next-method ] vv->v-op ; inline
-M: A vandn             \ A-rep [ (simd-vandn)             ] [ call-next-method ] vv->v-op ; inline
-M: A vor               \ A-rep [ (simd-vor)               ] [ call-next-method ] vv->v-op ; inline
-M: A vxor              \ A-rep [ (simd-vxor)              ] [ call-next-method ] vv->v-op ; inline
-M: A vnot              \ A-rep [ (simd-vnot)              ] [ call-next-method ] v->v-op  ; inline
-M: A vlshift           \ A-rep [ (simd-vlshift)           ] [ call-next-method ] vn->v-op ; inline
-M: A vrshift           \ A-rep [ (simd-vrshift)           ] [ call-next-method ] vn->v-op ; inline
-M: A hlshift           \ A-rep [ (simd-hlshift)           ] [ call-next-method ] vn->v-op ; inline
-M: A hrshift           \ A-rep [ (simd-hrshift)           ] [ call-next-method ] vn->v-op ; inline
-M: A vshuffle-elements \ A-rep [ (simd-vshuffle-elements) ] [ call-next-method ] vn->v-op ; inline
-M: A vshuffle-bytes    \ A-rep [ (simd-vshuffle-bytes)    ] [ call-next-method ] vv'->v-op ; inline
-M: A (vmerge-head)     \ A-rep [ (simd-vmerge-head)       ] [ call-next-method ] vv->v-op ; inline
-M: A (vmerge-tail)     \ A-rep [ (simd-vmerge-tail)       ] [ call-next-method ] vv->v-op ; inline
-M: A v<=               \ A-rep [ (simd-v<=)               ] [ call-next-method ] vv->v-op ; inline
-M: A v<                \ A-rep [ (simd-v<)                ] [ call-next-method ] vv->v-op ; inline
-M: A v=                \ A-rep [ (simd-v=)                ] [ call-next-method ] vv->v-op ; inline
-M: A v>                \ A-rep [ (simd-v>)                ] [ call-next-method ] vv->v-op ; inline
-M: A v>=               \ A-rep [ (simd-v>=)               ] [ call-next-method ] vv->v-op ; inline
-M: A vunordered?       \ A-rep [ (simd-vunordered?)       ] [ call-next-method ] vv->v-op ; inline
-M: A vany?             \ A-rep [ (simd-vany?)             ] [ call-next-method ] v->n-op  ; inline
-M: A vall?             \ A-rep [ (simd-vall?)             ] [ call-next-method ] v->n-op  ; inline
-M: A vnone?            \ A-rep [ (simd-vnone?)            ] [ call-next-method ] v->n-op  ; inline
-
-! SIMD high-level specializations
-
-M: A vbroadcast swap nth A-with ; inline
-M: A n+v [ A-with ] dip v+ ; inline
-M: A n-v [ A-with ] dip v- ; inline
-M: A n*v [ A-with ] dip v* ; inline
-M: A n/v [ A-with ] dip v/ ; inline
-M: A v+n A-with v+ ; inline
-M: A v-n A-with v- ; inline
-M: A v*n A-with v* ; inline
-M: A v/n A-with v/ ; inline
-M: A norm-sq dup v. assert-positive ; inline
-M: A distance v- norm ; inline
-
-M: A >pprint-sequence ;
-M: A pprint* pprint-object ;
 
 \ A-boa
 [ COERCER N napply ] N {
@@ -230,11 +284,16 @@ BOA-EFFECT define-inline
 M: A pprint-delims drop \ A{ \ } ;
 SYNTAX: A{ \ } [ >A ] parse-literal ;
 
+INSTANCE: A sequence
+
 c:<c-type>
     byte-array >>class
     A >>boxed-class
     { A-rep alien-vector A boa } >quotation >>getter
-    { [ underlying>> ] 2dip A-rep set-alien-vector } >quotation >>setter
+    {
+        [ dup simd-128? [ bad-simd-vector ] unless underlying>> ] 2dip
+        A-rep set-alien-vector
+    } >quotation >>setter
     16 >>size
     16 >>align
     A-rep >>rep
@@ -249,8 +308,6 @@ PRIVATE>
 
 >>
 
-INSTANCE: simd-128 sequence
-
 ! SIMD instances
 
 SIMD-128: char-16
@@ -269,6 +326,19 @@ SIMD-128: double-2
 M: simd-128 vshuffle ( u perm -- v )
     vshuffle-bytes ; inline
 
+M: uchar-16 v*hs+
+    uchar-16-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op short-8-cast ; inline
+M: ushort-8 v*hs+
+    ushort-8-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op uint-4-cast ; inline
+M: uint-4 v*hs+
+    uint-4-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op ulonglong-2-cast ; inline
+M: char-16 v*hs+
+    char-16-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op short-8-cast ; inline
+M: short-8 v*hs+
+    short-8-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op int-4-cast ; inline
+M: int-4 v*hs+
+    int-4-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op longlong-2-cast ; inline
+
 "mirrors" vocab [
     "math.vectors.simd.mirrors" require
 ] when
index 6ef7f9ca500b99417d993c95473c968052a0f88f..59246a6e64503c169b07b50fd46009fbb23b39ef 100644 (file)
@@ -125,8 +125,6 @@ ARTICLE: "math-vectors-simd-logic" "Componentwise logic with SIMD vectors"
 "Processor SIMD units supported by the " { $vocab-link "math.vectors.simd" } " vocabulary represent boolean values as bitmasks, where a true result's binary representation is all ones and a false representation is all zeroes. This is the format in which results from comparison words such as " { $link v= } " return their results and in which logic and test words such as " { $link vand } " and " { $link vall? } " take their inputs when working with SIMD types. For a float vector, false will manifest itself as " { $snippet "0.0" } " and true as a " { $link POSTPONE: NAN: } " literal with a string of set bits in its payload:"
 { $example
 """USING: math.vectors math.vectors.simd prettyprint ;
-FROM: alien.c-types => float ;
-SIMD: float
 
 float-4{ 1.0 2.0 3.0 0/0. } float-4{ 1.0 -2.0 3.0 0/0. } v= ."""
 """float-4{ NAN: fffffe0000000 0.0 NAN: fffffe0000000 0.0 }"""
@@ -134,8 +132,6 @@ float-4{ 1.0 2.0 3.0 0/0. } float-4{ 1.0 -2.0 3.0 0/0. } v= ."""
 "For an integer vector, false will manifest as " { $snippet "0" } " and true as " { $snippet "-1" } " (for signed vectors) or the largest representable value of the element type (for unsigned vectors):"
 { $example
 """USING: math.vectors math.vectors.simd prettyprint alien.c-types ;
-SIMD: int
-SIMD: uchar
 
 int-4{ 1 2 3 0 } int-4{ 1 -2 3 4 } v=
 uchar-16{  0  1  2  3  4  5 6 7 8 9 10 11 12 13 14 15 }
@@ -147,7 +143,6 @@ uchar-16{ 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 }"""
 "This differs from Factor's native representation of boolean values, where " { $link f } " is false and every other value (including " { $snippet "0" } " and " { $snippet "0.0" } ") is true. To make it easy to construct literal SIMD masks, " { $link t } " and " { $link f } " are accepted inside SIMD literal syntax and expand to the proper true or false representation for the underlying type:"
 { $example
 """USING: math.vectors math.vectors.simd prettyprint alien.c-types ;
-SIMD: int
 
 int-4{ f f t f } ."""
 """int-4{ 0 0 -1 0 }""" }
@@ -216,36 +211,36 @@ HELP: vtruncate
 { $description "Truncates each element of " { $snippet "u" } "." } ;
 
 HELP: n+v
-{ $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
+{ $values { "n" "a number" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
 { $description "Adds " { $snippet "n" } " to each element of " { $snippet "u" } "." } ;
 
 HELP: v+n
-{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
+{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "w" "a sequence of numbers" } }
 { $description "Adds " { $snippet "n" } " to each element of " { $snippet "u" } "." } ;
 
 HELP: n-v
-{ $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
+{ $values { "n" "a number" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
 { $description "Subtracts each element of " { $snippet "u" } " from " { $snippet "n" } "." } ;
 
 HELP: v-n
-{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
+{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "w" "a sequence of numbers" } }
 { $description "Subtracts " { $snippet "n" } " from each element of " { $snippet "u" } "." } ;
 
 HELP: n*v
-{ $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
+{ $values { "n" "a number" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
 { $description "Multiplies each element of " { $snippet "u" } " by " { $snippet "n" } "." } ;
 
 HELP: v*n
-{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
+{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "w" "a sequence of numbers" } }
 { $description "Multiplies each element of " { $snippet "u" } " by " { $snippet "n" } "." } ;
 
 HELP: n/v
-{ $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
+{ $values { "n" "a number" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
 { $description "Divides " { $snippet "n" } " by each element of " { $snippet "u" } "." }
 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
 
 HELP: v/n
-{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
+{ $values { "u" "a sequence of numbers" } { "n" "a number" } { "w" "a sequence of numbers" } }
 { $description "Divides each element of " { $snippet "u" } " by " { $snippet "n" } "." }
 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
 
@@ -259,7 +254,7 @@ HELP: v-
 
 HELP: v+-
 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
-{ $description "Adds and subtracts alternate elements of " { $snippet "v" } " and " { $snippet "u" } " component-wise." }
+{ $description "Adds and subtracts alternate elements of " { $snippet "v" } " and " { $snippet "u" } " component-wise. Elements at even indexes are subtracted, while elements at odd indexes are added." }
 { $examples
     { $example
         "USING: math.vectors prettyprint ;"
@@ -413,7 +408,6 @@ HELP: vbroadcast
 { $examples
     { $example
         "USING: alien.c-types math.vectors math.vectors.simd" "prettyprint ;"
-        "SIMD: int"
         "int-4{ 69 42 911 13 } 2 vbroadcast ."
         "int-4{ 911 911 911 911 }"
     }
@@ -429,7 +423,6 @@ HELP: vshuffle
 { $examples
     { $example
         "USING: alien.c-types math.vectors math.vectors.simd" "prettyprint ;"
-        "SIMD: int"
         "int-4{ 69 42 911 13 } { 1 3 2 3 } vshuffle ."
         "int-4{ 42 13 911 13 }"
     }
index a69a99c64bfa5b2b096bd93747fc3b5f0256dcd5..311abf50af1d474076d23e6b589f0d9ee039812a 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays alien.c-types assocs kernel sequences math math.functions
-hints math.order math.libm math.floats.private fry combinators
+grouping hints math.order math.libm math.floats.private fry combinators
 byte-arrays accessors locals ;
 QUALIFIED-WITH: alien.c-types c
 IN: math.vectors
@@ -9,7 +9,7 @@ IN: math.vectors
 GENERIC: vneg ( u -- v )
 M: object vneg [ neg ] map ;
 
-GENERIC# v+n 1 ( u n -- v )
+GENERIC# v+n 1 ( u n -- w )
 M: object v+n [ + ] curry map ;
 
 GENERIC: n+v ( n v -- w )
@@ -21,13 +21,13 @@ M: object v-n [ - ] curry map ;
 GENERIC: n-v ( n v -- w )
 M: object n-v [ - ] with map ;
 
-GENERIC# v*n 1 ( u n -- v )
+GENERIC# v*n 1 ( u n -- w )
 M: object v*n [ * ] curry map ;
 
 GENERIC: n*v ( n v -- w )
 M: object n*v [ * ] with map ;
 
-GENERIC# v/n 1 ( u n -- v )
+GENERIC# v/n 1 ( u n -- w )
 M: object v/n [ / ] curry map ;
 
 GENERIC: n/v ( n v -- w )
@@ -45,6 +45,16 @@ M: object [v-] [ [-] ] 2map ;
 GENERIC: v* ( u v -- w )
 M: object v* [ * ] 2map ;
 
+GENERIC: v*high ( u v -- w )
+
+<PRIVATE
+: (h+) ( u -- w ) 2 <groups> [ first2 + ] map ;
+: (h-) ( u -- w ) 2 <groups> [ first2 - ] map ;
+PRIVATE>
+
+GENERIC: v*hs+ ( u v -- w )
+M: object v*hs+ [ * ] 2map (h+) ;
+
 GENERIC: v/ ( u v -- w )
 M: object v/ [ / ] 2map ;
 
@@ -55,6 +65,9 @@ M: object v/ [ / ] 2map ;
 
 PRIVATE>
 
+GENERIC: vavg ( u v -- w )
+M: object vavg [ + 2 / ] 2map ;
+
 GENERIC: vmax ( u v -- w )
 M: object vmax [ [ float-max ] [ max ] if-both-floats ] 2map ;
 
@@ -82,6 +95,9 @@ M: object vabs [ abs ] map ;
 GENERIC: vsqrt ( u -- v )
 M: object vsqrt [ >float fsqrt ] map ;
 
+GENERIC: vsad ( u v -- n )
+M: object vsad [ - abs ] [ + ] 2map-reduce ;
+
 <PRIVATE
 
 : bitandn ( x y -- z ) [ bitnot ] dip bitand ; inline
index ef2654be4506bc8628c10a45eba3b1f39cf1d534..c7e1285689a60e3023f1fec764004c98b1f86b4c 100644 (file)
@@ -10,8 +10,6 @@ FROM: alien.c-types => float ;
 SPECIALIZED-ARRAY: int
 SPECIALIZED-ARRAYS: bool ushort char uint float ulonglong ;
 
-[ ulonglong ] [ ulonglong-array{ } element-type ] unit-test
-
 [ t ] [ { 1 2 3 } >int-array int-array? ] unit-test
 
 [ t ] [ int-array{ 1 2 3 } int-array? ] unit-test
index b6f7209cc6324e4ae2c4ee2b35ca936c623ccb6c..40d5d4c6a3733084f078befced7517b9b4f804a7 100644 (file)
@@ -104,6 +104,12 @@ SYNTAX: A@ scan-object scan-object <direct-A> suffix! ;
 
 INSTANCE: A specialized-array
 
+M: A vs+ [ + \ T c-type-clamp ] 2map ;
+M: A vs- [ - \ T c-type-clamp ] 2map ;
+M: A vs* [ * \ T c-type-clamp ] 2map ;
+
+M: A v*high [ * \ T heap-size neg shift ] 2map ;
+
 ;FUNCTOR
 
 GENERIC: (underlying-type) ( c-type -- c-type' )
index 4e117e11b5dd66a3c4755c4b483cf6b52cc5582f..ea02aa03c9d6327ca0ccc683339cf12d3711aaac 100644 (file)
@@ -180,7 +180,6 @@ IN: tools.deploy.shaker
                 "slots"
                 "special"
                 "specializer"
-                "specializations"
                 "struct-slots"
                 ! UI needs this
                 ! "superclass"
index ddbae5de78baefbaa212c1d862e09f95ce66ffc7..5b9ac3b6154380bfd658ac9fc484452962f9823a 100644 (file)
@@ -55,11 +55,30 @@ struct context {
 #define rs_bot (ctx->retainstack_region->start)
 #define rs_top (ctx->retainstack_region->end)
 
-DEFPUSHPOP(d,ds)
-DEFPUSHPOP(r,rs)
+inline cell dpeek()
+{
+       return *(cell *)ds;
+}
+
+inline void drepl(cell tagged)
+{
+       *(cell *)ds = tagged;
+}
+
+inline cell dpop()
+{
+       cell value = dpeek();
+       ds -= sizeof(cell);
+       return value;
+}
+
+inline void dpush(cell tagged)
+{
+       ds += sizeof(cell);
+       drepl(tagged);
+}
 
 VM_C_API void nest_stacks(stack_frame *magic_frame, factor_vm *vm);
 VM_C_API void unnest_stacks(factor_vm *vm);
 
 }
-
index 7234ffb775aa4173dc4cf7847b021d4a15455285..aa7e3eb51a15fe38b5c88518cd703e272e2fc5a2 100755 (executable)
@@ -98,11 +98,16 @@ void data_heap::reset_generation(tenured_space *gen)
        clear_decks(gen);
 }
 
-bool data_heap::low_memory_p()
+bool data_heap::high_fragmentation_p()
 {
        return (tenured->largest_free_block() <= nursery->size + aging->size);
 }
 
+bool data_heap::low_memory_p()
+{
+       return (tenured->free_space() <= nursery->size + aging->size);
+}
+
 void data_heap::mark_all_cards()
 {
        memset(cards,-1,cards_end - cards);
index ce156696b8a3d0109f5057b5ad63ea5e32009550..cef43ef5fe9a03d5863e78ce6240759f2e4460aa 100755 (executable)
@@ -29,6 +29,7 @@ struct data_heap {
        void reset_generation(nursery_space *gen);
        void reset_generation(aging_space *gen);
        void reset_generation(tenured_space *gen);
+       bool high_fragmentation_p();
        bool low_memory_p();
        void mark_all_cards();
 };
index 14c7f093327fca7708a6f994407d7d0785cbdfce..da7da4a95125f048f5a1d045e5b8784fb3134c14 100644 (file)
@@ -143,12 +143,20 @@ void factor_vm::collect_full(bool trace_contexts_p)
 {
        collect_mark_impl(trace_contexts_p);
        collect_sweep_impl();
+
        if(data->low_memory_p())
+       {
+               current_gc->op = collect_growing_heap_op;
+               current_gc->event->op = collect_growing_heap_op;
+               collect_growing_heap(0,trace_contexts_p);
+       }
+       else if(data->high_fragmentation_p())
        {
                current_gc->op = collect_compact_op;
                current_gc->event->op = collect_compact_op;
                collect_compact_impl(trace_contexts_p);
        }
+
        code->flush_icache();
 }
 
index f90ad58f231408427908524b5885413c37aee21d..f8a9fd45b8d0c7553ff0ba031c50a0538964af54 100755 (executable)
--- a/vm/gc.cpp
+++ b/vm/gc.cpp
@@ -152,7 +152,7 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
                break;
        case collect_aging_op:
                collect_aging();
-               if(data->low_memory_p())
+               if(data->high_fragmentation_p())
                {
                        current_gc->op = collect_full_op;
                        current_gc->event->op = collect_full_op;
@@ -161,7 +161,7 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
                break;
        case collect_to_tenured_op:
                collect_to_tenured();
-               if(data->low_memory_p())
+               if(data->high_fragmentation_p())
                {
                        current_gc->op = collect_full_op;
                        current_gc->event->op = collect_full_op;
index 3059ea8b42a3102d645cbaf4b9e1132fe8f6fe4c..80c2f1050d5e71644929c1b2f1e49028491c7e78 100755 (executable)
@@ -40,7 +40,6 @@ namespace factor
 #include "layouts.hpp"
 #include "platform.hpp"
 #include "primitives.hpp"
-#include "stacks.hpp"
 #include "segments.hpp"
 #include "contexts.hpp"
 #include "run.hpp"
diff --git a/vm/stacks.hpp b/vm/stacks.hpp
deleted file mode 100644 (file)
index 4906d10..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace factor
-{
-
-#define DEFPUSHPOP(prefix,ptr) \
-       inline cell prefix##peek() { return *(cell *)ptr; } \
-       inline void prefix##repl(cell tagged) { *(cell *)ptr = tagged; } \
-       inline cell prefix##pop() \
-       { \
-               cell value = prefix##peek(); \
-               ptr -= sizeof(cell); \
-               return value; \
-       } \
-       inline void prefix##push(cell tagged) \
-       { \
-               ptr += sizeof(cell); \
-               prefix##repl(tagged); \
-       }
-
-}