]> gitweb.factorcode.org Git - factor.git/commitdiff
math.vectors: add v+- word which is accelerated by SSE3
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 20 Sep 2009 22:43:16 +0000 (17:43 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 20 Sep 2009 22:43:16 +0000 (17:43 -0500)
16 files changed:
basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/intrinsics/intrinsics.factor
basis/compiler/cfg/two-operand/two-operand.factor
basis/compiler/codegen/codegen.factor
basis/compiler/tree/propagation/simd/simd.factor
basis/cpu/architecture/architecture.factor
basis/cpu/x86/32/32.factor
basis/cpu/x86/64/64.factor
basis/cpu/x86/x86.factor
basis/math/vectors/simd/functor/functor.factor
basis/math/vectors/simd/intrinsics/intrinsics.factor
basis/math/vectors/simd/simd-docs.factor
basis/math/vectors/specialization/specialization.factor
basis/math/vectors/vectors-docs.factor
basis/math/vectors/vectors-tests.factor
basis/math/vectors/vectors.factor

index 32e5d46c61469c77165e1c4cbf875354ad779db4..63297b9bdfe80158bbaa51bf819c8d7539fd3912 100644 (file)
@@ -310,6 +310,11 @@ def: dst
 use: src1 src2
 literal: rep ;
 
+PURE-INSN: ##add-sub-vector
+def: dst
+use: src1 src2
+literal: rep ;
+
 PURE-INSN: ##mul-vector
 def: dst
 use: src1 src2
index 0daab823955172b8bd6150f405c3c8cd23140982..5b3fd1b324186807089e37f8e341a518f8af9ea2 100644 (file)
@@ -155,6 +155,7 @@ IN: compiler.cfg.intrinsics
     {
         { math.vectors.simd.intrinsics:assert-positive [ drop ] }
         { math.vectors.simd.intrinsics:(simd-v+) [ [ ^^add-vector ] emit-binary-vector-op ] }
+        { math.vectors.simd.intrinsics:(simd-v+-) [ [ ^^add-sub-vector ] emit-binary-vector-op ] }
         { math.vectors.simd.intrinsics:(simd-v-) [ [ ^^sub-vector ] emit-binary-vector-op ] }
         { math.vectors.simd.intrinsics:(simd-v*) [ [ ^^mul-vector ] emit-binary-vector-op ] }
         { math.vectors.simd.intrinsics:(simd-v/) [ [ ^^div-vector ] emit-binary-vector-op ] }
index 20fa1d0b18cded946be07ed647e76c674521b6d7..c275756046989cea0ade0e4c63efdf4f221647c9 100644 (file)
@@ -48,6 +48,7 @@ UNION: two-operand-insn
     ##max-float
     ##add-vector
     ##sub-vector
+    ##add-sub-vector
     ##mul-vector
     ##div-vector
     ##min-vector
index ddf5aa0e02d8c07897d881440df300880e237fb9..14246a3fbfc253032256b3cf2b8fcf18019ea1e3 100755 (executable)
@@ -170,6 +170,7 @@ CODEGEN: ##gather-vector-4 %gather-vector-4
 CODEGEN: ##box-vector %box-vector
 CODEGEN: ##add-vector %add-vector
 CODEGEN: ##sub-vector %sub-vector
+CODEGEN: ##add-sub-vector %add-sub-vector
 CODEGEN: ##mul-vector %mul-vector
 CODEGEN: ##div-vector %div-vector
 CODEGEN: ##min-vector %min-vector
index 42c1f35617203a4c23ff11543937832e66d934e3..db39985c940440fe48cde6d103e9d1793abbda52 100644 (file)
@@ -1,23 +1,24 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors byte-arrays combinators fry
+USING: accessors byte-arrays combinators fry sequences
 compiler.tree.propagation.info cpu.architecture kernel words math
 math.intervals math.vectors.simd.intrinsics ;
 IN: compiler.tree.propagation.simd
 
-\ (simd-v+) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-v-) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-v*) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-v/) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-vmin) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-vmax) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-vsqrt) { byte-array } "default-output-classes" set-word-prop
+{
+    (simd-v+)
+    (simd-v-)
+    (simd-v+-)
+    (simd-v*)
+    (simd-v/)
+    (simd-vmin)
+    (simd-vmax)
+    (simd-vsqrt)
+    (simd-broadcast)
+    (simd-gather-2)
+    (simd-gather-4)
+    alien-vector
+} [ { byte-array } "default-output-classes" set-word-prop ] each
 
 \ (simd-sum) [
     nip dup literal?>> [
@@ -30,18 +31,10 @@ IN: compiler.tree.propagation.simd
     <class-info>
 ] "outputs" set-word-prop
 
-\ (simd-broadcast) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-gather-2) { byte-array } "default-output-classes" set-word-prop
-
-\ (simd-gather-4) { byte-array } "default-output-classes" set-word-prop
-
 \ assert-positive [
     real [0,inf] <class/interval-info> value-info-intersect
 ] "outputs" set-word-prop
 
-\ alien-vector { byte-array } "default-output-classes" set-word-prop
-
 ! If SIMD is not available, inline alien-vector and set-alien-vector
 ! to get a speedup
 : inline-unless-intrinsic ( word -- )
index 61e4e2df372e0fdf18ecb358f537f15c84cb0192..331d459adffbee65e067683072736b9b09be51f3 100644 (file)
@@ -182,6 +182,7 @@ HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
 HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
 HOOK: %add-vector cpu ( dst src1 src2 rep -- )
 HOOK: %sub-vector cpu ( dst src1 src2 rep -- )
+HOOK: %add-sub-vector cpu ( dst src1 src2 rep -- )
 HOOK: %mul-vector cpu ( dst src1 src2 rep -- )
 HOOK: %div-vector cpu ( dst src1 src2 rep -- )
 HOOK: %min-vector cpu ( dst src1 src2 rep -- )
@@ -194,6 +195,7 @@ HOOK: %gather-vector-2-reps cpu ( -- reps )
 HOOK: %gather-vector-4-reps cpu ( -- reps )
 HOOK: %add-vector-reps cpu ( -- reps )
 HOOK: %sub-vector-reps cpu ( -- reps )
+HOOK: %add-sub-vector-reps cpu ( -- reps )
 HOOK: %mul-vector-reps cpu ( -- reps )
 HOOK: %div-vector-reps cpu ( -- reps )
 HOOK: %min-vector-reps cpu ( -- reps )
index 99391545128adaa9b29b3fb4b523a68216872f44..172b500cd5a359a6874d105c81b6d8ff0ab0c2f7 100755 (executable)
@@ -295,4 +295,4 @@ os windows? [
     4 "double" c-type (>>align)
 ] unless
 
-"cpu.x86.features" require
+check-sse
index f4018b1508d8d5b7127c1bc1ba20f9808010a70b..3958ba5ec86904af0aafadcebea9422e951477f2 100644 (file)
@@ -228,4 +228,4 @@ USE: vocabs.loader
     { [ os winnt? ] [ "cpu.x86.64.winnt" require ] }
 } cond
 
-"cpu.x86.features" require
+check-sse
index 322b123d990ccfe8ea1c61c963189b7396c83b0f..a132947cf167c7dadf6a227e7c20658a4a0d67b7 100644 (file)
@@ -341,6 +341,17 @@ M: x86 %sub-vector-reps
         { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep } }
     } available-reps ;
 
+M: x86 %add-sub-vector ( dst src1 src2 rep -- )
+    {
+        { float-4-rep [ ADDSUBPS ] }
+        { double-2-rep [ ADDSUBPD ] }
+    } case drop ;
+
+M: x86 %add-sub-vector-reps
+    {
+        { sse3? { float-4-rep double-2-rep } }
+    } available-reps ;
+
 M: x86 %mul-vector ( dst src1 src2 rep -- )
     {
         { float-4-rep [ MULPS ] }
@@ -879,9 +890,10 @@ enable-min/max
         { 42 [ enable-sse3 ] }
     } case ;
 
-[ { sse_version } compile ] with-optimizer
+: check-sse ( -- )
+    [ { sse_version } compile ] with-optimizer
 
-"Checking for multimedia extensions: " write sse-version 30 min
-[ sse-string write " detected" print ]
-[ install-sse-check ]
-[ enable-sse ] tri
+    "Checking for multimedia extensions: " write sse-version 30 min
+    [ sse-string write " detected" print ]
+    [ install-sse-check ]
+    [ enable-sse ] tri ;
index 57126f1bf8146dc4cc7a0041e0c4994347c5635f..2141914d1c7425d21b69fb7c395ad085846a38f5 100644 (file)
@@ -42,6 +42,7 @@ MACRO: simd-boa ( rep class -- simd-array )
         {
             { v+ (simd-v+) }
             { v- (simd-v-) }
+            { v+- (simd-v+-) }
             { v* (simd-v*) }
             { v/ (simd-v/) }
             { vmin (simd-vmin) }
@@ -171,6 +172,7 @@ INSTANCE: A sequence
 
 \ A \ A-with \ A-rep H{
     { v+ [ [ (simd-v+) ] \ A-vv->v-op execute ] }
+    { v+- [ [ (simd-v+-) ] \ A-vv->v-op execute ] }
     { v- [ [ (simd-v-) ] \ A-vv->v-op execute ] }
     { v* [ [ (simd-v*) ] \ A-vv->v-op execute ] }
     { v/ [ [ (simd-v/) ] \ A-vv->v-op execute ] }
@@ -297,6 +299,7 @@ INSTANCE: A sequence
 \ A \ A-with \ A-rep H{
     { v+ [ [ (simd-v+) ] \ A-vv->v-op execute ] }
     { v- [ [ (simd-v-) ] \ A-vv->v-op execute ] }
+    { v+- [ [ (simd-v+-) ] \ A-vv->v-op execute ] }
     { v* [ [ (simd-v*) ] \ A-vv->v-op execute ] }
     { v/ [ [ (simd-v/) ] \ A-vv->v-op execute ] }
     { vmin [ [ (simd-vmin) ] \ A-vv->v-op execute ] }
index a7d019af81d8823a03152dd31536dd88e8b74d68..6d39b9e70aa9eba05c9cb767facee7315a94a334 100644 (file)
@@ -8,6 +8,7 @@ IN: math.vectors.simd.intrinsics
 ERROR: bad-simd-call ;
 
 : (simd-v+) ( v1 v2 rep -- v3 ) bad-simd-call ;
+: (simd-v+-) ( v1 v2 rep -- v3 ) bad-simd-call ;
 : (simd-v-) ( v1 v2 rep -- v3 ) bad-simd-call ;
 : (simd-v*) ( v1 v2 rep -- v3 ) bad-simd-call ;
 : (simd-v/) ( v1 v2 rep -- v3 ) bad-simd-call ;
@@ -67,6 +68,7 @@ GENERIC# supported-simd-op? 1 ( rep intrinsic -- ? )
 M: vector-rep supported-simd-op?
     {
         { \ (simd-v+)        [ %add-vector-reps            ] }
+        { \ (simd-v+-)       [ %add-sub-vector-reps        ] }
         { \ (simd-v-)        [ %sub-vector-reps            ] }
         { \ (simd-v*)        [ %mul-vector-reps            ] }
         { \ (simd-v/)        [ %div-vector-reps            ] }
index 42512feb6f6bd766dacbedd0a281eeffd3b1685d..d108d70b26053a58a280e499d8a929301faa0702 100644 (file)
@@ -162,6 +162,7 @@ $nl
 "It is best to avoid calling these primitives directly. To write efficient high-level code that compiles down to primitives and avoids memory allocation, see " { $link "math.vectors.simd.efficiency" } "."
 { $subsection (simd-v+) }
 { $subsection (simd-v-) }
+{ $subsection (simd-v+-) }
 { $subsection (simd-v/) }
 { $subsection (simd-vmin) }
 { $subsection (simd-vmax) }
index 21ec9f64f3c03757b61a2a48a1fa41e50ec676b1..1a85f5ade7f1be913a2a2ea3689edb8a4d3b3b7e 100644 (file)
@@ -55,6 +55,7 @@ H{
     { v* { +vector+ +vector+ -> +vector+ } }
     { v*n { +vector+ +scalar+ -> +vector+ } }
     { v+ { +vector+ +vector+ -> +vector+ } }
+    { v+- { +vector+ +vector+ -> +vector+ } }
     { v+n { +vector+ +scalar+ -> +vector+ } }
     { v- { +vector+ +vector+ -> +vector+ } }
     { v-n { +vector+ +scalar+ -> +vector+ } }
index 74565972787127d5ea10ad76313dcd93c0c7bff6..4f2f093216915345af8899202252e8f03c4b502e 100644 (file)
@@ -17,6 +17,7 @@ $nl
 "Combining two vectors to form another vector with " { $link 2map } ":"
 { $subsection v+ }
 { $subsection v- }
+{ $subsection v+- }
 { $subsection v* }
 { $subsection v/ }
 { $subsection vmax }
@@ -57,6 +58,17 @@ HELP: v-
 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise." } ;
 
+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." }
+{ $examples
+    { $example
+        "USING: math.vectors prettyprint ;"
+        "{ 1 2 3 } { 2 3 2 } v+- ."
+        "{ -1 5 1 }"
+    }
+} ;
+
 HELP: [v-]
 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise; any components which become negative are set to zero." } ;
index 3e56644d3e9e18c222155a91a168204b263f55d1..fc482815a985def9fb62a94d519ff7f0df85f902 100644 (file)
@@ -17,4 +17,6 @@ USING: math.vectors tools.test ;
 
 [ 1.125 ] [ 0.0 1.0 2.0 4.0 { 0.5 0.25 } bilerp ] unit-test
 
-[ 17 ] [ 0 1 2 3 4 5 6 7 { 1 2 3 } trilerp ] unit-test
\ No newline at end of file
+[ 17 ] [ 0 1 2 3 4 5 6 7 { 1 2 3 } trilerp ] unit-test
+
+[ { 0 3 2 5 4 } ] [ { 1 2 3 4 5 } { 1 1 1 1 1 } v+- ] unit-test
\ No newline at end of file
index dd48525b53a1fe271896469a708b0b5054d8b959..deda1dc5050b85f0d6c36e0bd41e0d08fa729743 100644 (file)
@@ -24,6 +24,11 @@ IN: math.vectors
 : vmax ( u v -- w ) [ max ] 2map ;
 : vmin ( u v -- w ) [ min ] 2map ;
 
+: v+- ( u v -- w )
+    [ t ] 2dip
+    [ [ not ] 2dip pick [ + ] [ - ] if ] 2map
+    nip ;
+
 : vfloor    ( v -- _v_ ) [ floor    ] map ;
 : vceiling  ( v -- ^v^ ) [ ceiling  ] map ;
 : vtruncate ( v -- -v- ) [ truncate ] map ;