diff --git a/basis/compiler/cfg/intrinsics/intrinsics.factor b/basis/compiler/cfg/intrinsics/intrinsics.factor index 124aac5b18..bf65b50897 100644 --- a/basis/compiler/cfg/intrinsics/intrinsics.factor +++ b/basis/compiler/cfg/intrinsics/intrinsics.factor @@ -194,8 +194,8 @@ IN: compiler.cfg.intrinsics { math.vectors.simd.intrinsics:(simd-gather-2) [ emit-gather-vector-2 ] } { math.vectors.simd.intrinsics:(simd-gather-4) [ emit-gather-vector-4 ] } { math.vectors.simd.intrinsics:(simd-vshuffle) [ emit-shuffle-vector ] } - { math.vectors.simd.intrinsics:(simd-vmerge-head) [ [ ^^merge-vector-head ] emit-binary-vector-op ] } - { math.vectors.simd.intrinsics:(simd-vmerge-tail) [ [ ^^merge-vector-tail ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-(vmerge-head)) [ [ ^^merge-vector-head ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-(vmerge-tail)) [ [ ^^merge-vector-tail ] emit-binary-vector-op ] } { math.vectors.simd.intrinsics:(simd-select) [ emit-select-vector ] } { math.vectors.simd.intrinsics:(simd-sum) [ [ ^^horizontal-add-vector ] emit-unary-vector-op ] } { math.vectors.simd.intrinsics:alien-vector [ emit-alien-vector ] } diff --git a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor index 2f49bf7fae..3a9a7ac0a1 100644 --- a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor +++ b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor @@ -1465,7 +1465,7 @@ V{ [ ] [ { 1 2 3 } test-linear-scan-on-cfg ] unit-test -[ { 1 } ] [ 1 get instructions>> first tagged-values>> ] unit-test +[ { { 0 1 } } ] [ 1 get instructions>> first tagged-values>> ] unit-test V{ T{ ##peek f 0 D 0 } @@ -1487,4 +1487,4 @@ V{ [ ] [ { 1 2 3 } test-linear-scan-on-cfg ] unit-test -[ { 1 } ] [ 1 get instructions>> first tagged-values>> ] unit-test +[ { { 0 1 } } ] [ 1 get instructions>> first tagged-values>> ] unit-test diff --git a/basis/compiler/tree/propagation/simd/simd.factor b/basis/compiler/tree/propagation/simd/simd.factor index 462e5d6e0b..ba319d5f85 100644 --- a/basis/compiler/tree/propagation/simd/simd.factor +++ b/basis/compiler/tree/propagation/simd/simd.factor @@ -31,8 +31,8 @@ IN: compiler.tree.propagation.simd (simd-hlshift) (simd-hrshift) (simd-vshuffle) - (simd-vmerge-head) - (simd-vmerge-tail) + (simd-(vmerge-head)) + (simd-(vmerge-tail)) (simd-v<=) (simd-v<) (simd-v=) diff --git a/basis/math/vectors/simd/functor/functor.factor b/basis/math/vectors/simd/functor/functor.factor index fb8326fde2..1c4c77133e 100644 --- a/basis/math/vectors/simd/functor/functor.factor +++ b/basis/math/vectors/simd/functor/functor.factor @@ -424,15 +424,15 @@ INSTANCE: A sequence : A-vmerge-head-op ( v1 v2 quot -- v ) drop [ underlying1>> ] bi@ - [ A-rep (simd-vmerge-head) ] - [ A-rep (simd-vmerge-tail) ] 2bi + [ A-rep (simd-(vmerge-head)) ] + [ A-rep (simd-(vmerge-tail)) ] 2bi \ A boa ; : A-vmerge-tail-op ( v1 v2 quot -- v ) drop [ underlying2>> ] bi@ - [ A-rep (simd-vmerge-head) ] - [ A-rep (simd-vmerge-tail) ] 2bi + [ A-rep (simd-(vmerge-head)) ] + [ A-rep (simd-(vmerge-tail)) ] 2bi \ A boa ; simd new @@ -445,8 +445,8 @@ simd new { vnone? A-vany-op } { vany? A-vany-op } { vall? A-vall-op } - { vmerge-head A-vmerge-head-op } - { vmerge-tail A-vmerge-tail-op } + { (vmerge-head) A-vmerge-head-op } + { (vmerge-tail) A-vmerge-tail-op } } >>special-wrappers { { { +vector+ +vector+ -> +vector+ } A-vv->v-op } diff --git a/basis/math/vectors/simd/intrinsics/intrinsics.factor b/basis/math/vectors/simd/intrinsics/intrinsics.factor index dd87d4aaa9..0fd0d13f84 100644 --- a/basis/math/vectors/simd/intrinsics/intrinsics.factor +++ b/basis/math/vectors/simd/intrinsics/intrinsics.factor @@ -55,8 +55,8 @@ SIMD-OP: vrshift SIMD-OP: hlshift SIMD-OP: hrshift SIMD-OP: vshuffle -SIMD-OP: vmerge-head -SIMD-OP: vmerge-tail +SIMD-OP: (vmerge-head) +SIMD-OP: (vmerge-tail) SIMD-OP: v<= SIMD-OP: v< SIMD-OP: v= @@ -120,46 +120,46 @@ GENERIC# supported-simd-op? 1 ( rep intrinsic -- ? ) M: vector-rep supported-simd-op? { - { \ (simd-v+) [ %add-vector-reps ] } - { \ (simd-vs+) [ %saturated-add-vector-reps ] } - { \ (simd-v+-) [ %add-sub-vector-reps ] } - { \ (simd-v-) [ %sub-vector-reps ] } - { \ (simd-vs-) [ %saturated-sub-vector-reps ] } - { \ (simd-v*) [ %mul-vector-reps ] } - { \ (simd-vs*) [ %saturated-mul-vector-reps ] } - { \ (simd-v/) [ %div-vector-reps ] } - { \ (simd-vmin) [ %min-vector-reps ] } - { \ (simd-vmax) [ %max-vector-reps ] } - { \ (simd-v.) [ %dot-vector-reps ] } - { \ (simd-vsqrt) [ %sqrt-vector-reps ] } - { \ (simd-sum) [ %horizontal-add-vector-reps ] } - { \ (simd-vabs) [ %abs-vector-reps ] } - { \ (simd-vbitand) [ %and-vector-reps ] } - { \ (simd-vbitandn) [ %andn-vector-reps ] } - { \ (simd-vbitor) [ %or-vector-reps ] } - { \ (simd-vbitxor) [ %xor-vector-reps ] } - { \ (simd-vbitnot) [ %not-vector-reps ] } - { \ (simd-vand) [ %and-vector-reps ] } - { \ (simd-vandn) [ %andn-vector-reps ] } - { \ (simd-vor) [ %or-vector-reps ] } - { \ (simd-vxor) [ %xor-vector-reps ] } - { \ (simd-vnot) [ %not-vector-reps ] } - { \ (simd-vlshift) [ %shl-vector-reps ] } - { \ (simd-vrshift) [ %shr-vector-reps ] } - { \ (simd-hlshift) [ %horizontal-shl-vector-reps ] } - { \ (simd-hrshift) [ %horizontal-shr-vector-reps ] } - { \ (simd-vshuffle) [ %shuffle-vector-reps ] } - { \ (simd-vmerge-head) [ %merge-vector-reps ] } - { \ (simd-vmerge-tail) [ %merge-vector-reps ] } - { \ (simd-v<=) [ cc<= %compare-vector-reps ] } - { \ (simd-v<) [ cc< %compare-vector-reps ] } - { \ (simd-v=) [ cc= %compare-vector-reps ] } - { \ (simd-v>) [ cc> %compare-vector-reps ] } - { \ (simd-v>=) [ cc>= %compare-vector-reps ] } - { \ (simd-vunordered?) [ cc/<>= %compare-vector-reps ] } - { \ (simd-gather-2) [ %gather-vector-2-reps ] } - { \ (simd-gather-4) [ %gather-vector-4-reps ] } - { \ (simd-vany?) [ %test-vector-reps ] } - { \ (simd-vall?) [ %test-vector-reps ] } - { \ (simd-vnone?) [ %test-vector-reps ] } + { \ (simd-v+) [ %add-vector-reps ] } + { \ (simd-vs+) [ %saturated-add-vector-reps ] } + { \ (simd-v+-) [ %add-sub-vector-reps ] } + { \ (simd-v-) [ %sub-vector-reps ] } + { \ (simd-vs-) [ %saturated-sub-vector-reps ] } + { \ (simd-v*) [ %mul-vector-reps ] } + { \ (simd-vs*) [ %saturated-mul-vector-reps ] } + { \ (simd-v/) [ %div-vector-reps ] } + { \ (simd-vmin) [ %min-vector-reps ] } + { \ (simd-vmax) [ %max-vector-reps ] } + { \ (simd-v.) [ %dot-vector-reps ] } + { \ (simd-vsqrt) [ %sqrt-vector-reps ] } + { \ (simd-sum) [ %horizontal-add-vector-reps ] } + { \ (simd-vabs) [ %abs-vector-reps ] } + { \ (simd-vbitand) [ %and-vector-reps ] } + { \ (simd-vbitandn) [ %andn-vector-reps ] } + { \ (simd-vbitor) [ %or-vector-reps ] } + { \ (simd-vbitxor) [ %xor-vector-reps ] } + { \ (simd-vbitnot) [ %not-vector-reps ] } + { \ (simd-vand) [ %and-vector-reps ] } + { \ (simd-vandn) [ %andn-vector-reps ] } + { \ (simd-vor) [ %or-vector-reps ] } + { \ (simd-vxor) [ %xor-vector-reps ] } + { \ (simd-vnot) [ %not-vector-reps ] } + { \ (simd-vlshift) [ %shl-vector-reps ] } + { \ (simd-vrshift) [ %shr-vector-reps ] } + { \ (simd-hlshift) [ %horizontal-shl-vector-reps ] } + { \ (simd-hrshift) [ %horizontal-shr-vector-reps ] } + { \ (simd-vshuffle) [ %shuffle-vector-reps ] } + { \ (simd-(vmerge-head)) [ %merge-vector-reps ] } + { \ (simd-(vmerge-tail)) [ %merge-vector-reps ] } + { \ (simd-v<=) [ cc<= %compare-vector-reps ] } + { \ (simd-v<) [ cc< %compare-vector-reps ] } + { \ (simd-v=) [ cc= %compare-vector-reps ] } + { \ (simd-v>) [ cc> %compare-vector-reps ] } + { \ (simd-v>=) [ cc>= %compare-vector-reps ] } + { \ (simd-vunordered?) [ cc/<>= %compare-vector-reps ] } + { \ (simd-gather-2) [ %gather-vector-2-reps ] } + { \ (simd-gather-4) [ %gather-vector-4-reps ] } + { \ (simd-vany?) [ %test-vector-reps ] } + { \ (simd-vall?) [ %test-vector-reps ] } + { \ (simd-vnone?) [ %test-vector-reps ] } } case member? ; diff --git a/basis/math/vectors/specialization/specialization.factor b/basis/math/vectors/specialization/specialization.factor index 8d9d1b49cb..bed8a71f2c 100644 --- a/basis/math/vectors/specialization/specialization.factor +++ b/basis/math/vectors/specialization/specialization.factor @@ -98,8 +98,8 @@ H{ { hrshift { +vector+ +literal+ -> +vector+ } } { vshuffle { +vector+ +literal+ -> +vector+ } } { vbroadcast { +vector+ +literal+ -> +vector+ } } - { vmerge-head { +vector+ +vector+ -> +vector+ } } - { vmerge-tail { +vector+ +vector+ -> +vector+ } } + { (vmerge-head) { +vector+ +vector+ -> +vector+ } } + { (vmerge-tail) { +vector+ +vector+ -> +vector+ } } { v<= { +vector+ +vector+ -> +vector+ } } { v< { +vector+ +vector+ -> +vector+ } } { v= { +vector+ +vector+ -> +vector+ } } diff --git a/basis/math/vectors/vectors-docs.factor b/basis/math/vectors/vectors-docs.factor index 82bb037186..7a9aff49b6 100644 --- a/basis/math/vectors/vectors-docs.factor +++ b/basis/math/vectors/vectors-docs.factor @@ -59,7 +59,8 @@ $nl { $subsection vbroadcast } { $subsection hlshift } { $subsection hrshift } -{ $subsection vmerge } ; +{ $subsection vmerge } +{ $subsection (vmerge) } ; ARTICLE: "math-vectors-logic" "Vector component- and bit-wise logic" { $notes @@ -357,37 +358,50 @@ HELP: hrshift { $description "Shifts the entire SIMD array to the right by " { $snippet "n" } " bytes, filling the vacated left-hand bits with zeroes. This word may only be used in a context where the compiler can statically infer that the input is a SIMD array." } ; HELP: vmerge -{ $values { "u" "a sequence" } { "v" "a sequence" } { "h" "a sequence" } { "t" "a sequence" } } -{ $description "Creates two new sequences of the same type and size as " { $snippet "u" } " and " { $snippet "v" } " by interleaving the elements of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $values { "u" "a sequence" } { "v" "a sequence" } { "w" "a sequence" } } +{ $description "Creates a new sequence of the same type as and twice the length of " { $snippet "u" } " and " { $snippet "v" } " by interleaving the elements of " { $snippet "u" } " and " { $snippet "v" } "." } { $examples { $example """USING: kernel math.vectors prettyprint ; -{ "A" "B" "C" "D" } { "1" "2" "3" "4" } vmerge [ . ] bi@""" +{ "A" "B" "C" "D" } { "1" "2" "3" "4" } vmerge .""" +"""{ "A" "1" "B" "2" "C" "3" "D" "4" }""" +} } ; + +HELP: (vmerge) +{ $values { "u" "a sequence" } { "v" "a sequence" } { "h" "a sequence" } { "t" "a sequence" } } +{ $description "Creates two new sequences of the same type and size as " { $snippet "u" } " and " { $snippet "v" } " by interleaving the elements of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $notes "For hardware-supported SIMD vector types this word compiles to a single instruction per output value." } +{ $examples +{ $example """USING: kernel math.vectors prettyprint ; + +{ "A" "B" "C" "D" } { "1" "2" "3" "4" } (vmerge) [ . ] bi@""" """{ "A" "1" "B" "2" } { "C" "3" "D" "4" }""" } } ; -HELP: vmerge-head +HELP: (vmerge-head) { $values { "u" "a sequence" } { "v" "a sequence" } { "h" "a sequence" } } -{ $description "Creates two new sequences of the same type and size as " { $snippet "u" } " and " { $snippet "v" } " by interleaving the elements from the first half of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $description "Creates a new sequence of the same type and size as " { $snippet "u" } " and " { $snippet "v" } " by interleaving the elements from the first half of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $notes "For hardware-supported SIMD vector types this word compiles to a single instruction." } { $examples { $example """USING: kernel math.vectors prettyprint ; -{ "A" "B" "C" "D" } { "1" "2" "3" "4" } vmerge-head .""" +{ "A" "B" "C" "D" } { "1" "2" "3" "4" } (vmerge-head) .""" """{ "A" "1" "B" "2" }""" } } ; -HELP: vmerge-tail +HELP: (vmerge-tail) { $values { "u" "a sequence" } { "v" "a sequence" } { "t" "a sequence" } } -{ $description "Creates two new sequences of the same type and size as " { $snippet "u" } " and " { $snippet "v" } " by interleaving the elements from the tail half of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $description "Creates a new sequence of the same type and size as " { $snippet "u" } " and " { $snippet "v" } " by interleaving the elements from the tail half of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $notes "For hardware-supported SIMD vector types this word compiles to a single instruction." } { $examples { $example """USING: kernel math.vectors prettyprint ; -{ "A" "B" "C" "D" } { "1" "2" "3" "4" } vmerge-tail .""" +{ "A" "B" "C" "D" } { "1" "2" "3" "4" } (vmerge-tail) .""" """{ "C" "3" "D" "4" }""" } } ; -{ vmerge vmerge-head vmerge-tail } related-words +{ vmerge (vmerge) (vmerge-head) (vmerge-tail) } related-words HELP: vbroadcast { $values { "u" "a SIMD array" } { "n" "a non-negative integer" } { "v" "a SIMD array" } } diff --git a/basis/math/vectors/vectors.factor b/basis/math/vectors/vectors.factor index 3f4fe4c7b6..c65009950d 100644 --- a/basis/math/vectors/vectors.factor +++ b/basis/math/vectors/vectors.factor @@ -91,10 +91,15 @@ PRIVATE> : hlshift ( u n -- w ) '[ _ prepend 16 head ] change-underlying ; : hrshift ( u n -- w ) '[ _ append 16 tail* ] change-underlying ; -: vmerge-head ( u v -- h ) over length 2 / '[ _ head-slice ] bi@ [ zip ] keep concat-as ; -: vmerge-tail ( u v -- t ) over length 2 / '[ _ tail-slice ] bi@ [ zip ] keep concat-as ; +: (vmerge-head) ( u v -- h ) + over length 2 /i '[ _ head-slice ] bi@ [ zip ] keep concat-as ; +: (vmerge-tail) ( u v -- t ) + over length 2 /i '[ _ tail-slice ] bi@ [ zip ] keep concat-as ; -: vmerge ( u v -- h t ) [ vmerge-head ] [ vmerge-tail ] 2bi ; inline +: (vmerge) ( u v -- h t ) + [ (vmerge-head) ] [ (vmerge-tail) ] 2bi ; inline + +: vmerge ( u v -- w ) [ zip ] keep concat-as ; : vand ( u v -- w ) over '[ [ _ element>bool ] bi@ and ] 2map ; : vandn ( u v -- w ) over '[ [ _ element>bool ] bi@ [ not ] dip and ] 2map ; diff --git a/extra/math/matrices/simd/simd.factor b/extra/math/matrices/simd/simd.factor index 1fdb4f6d56..da1149dfec 100644 --- a/extra/math/matrices/simd/simd.factor +++ b/extra/math/matrices/simd/simd.factor @@ -120,7 +120,7 @@ TYPED:: m4^n ( m: matrix4 n: fixnum -- m^n: matrix4 ) identity-matrix4 n [ m m4. ] times ; : vmerge-diagonal* ( x y -- h t ) - [ vmerge-head ] [ swap vmerge-tail ] 2bi ; inline + [ (vmerge-head) ] [ swap (vmerge-tail) ] 2bi ; inline : vmerge-diagonal ( x -- h t ) 0.0 float-4-with vmerge-diagonal* ; inline @@ -128,7 +128,7 @@ TYPED: diagonal-matrix4 ( diagonal: float-4 -- matrix: matrix4 ) [ vmerge-diagonal [ vmerge-diagonal ] bi@ ] make-matrix4 ; : vmerge-transpose ( a b c d -- a' b' c' d' ) - [ vmerge ] bi-curry@ bi* ; inline + [ (vmerge) ] bi-curry@ bi* ; inline TYPED: transpose-matrix4 ( matrix: matrix4 -- matrix: matrix4 ) [ rows vmerge-transpose vmerge-transpose ] make-matrix4 ; @@ -144,8 +144,8 @@ TYPED:: translation-matrix4 ( offset: float-4 -- matrix: matrix4 ) [ float-4{ 1.0 1.0 1.0 1.0 } :> diagonal - offset 0 float-4-with vmerge - [ 0 float-4-with swap vmerge ] bi@ drop :> z :> y :> x + offset 0 float-4-with (vmerge) + [ 0 float-4-with swap (vmerge) ] bi@ drop :> z :> y :> x diagonal y vmerge-diagonal* [ x vmerge-diagonal* ] @@ -194,7 +194,7 @@ TYPED:: frustum-matrix4 ( xy: float-4 near: float far: float -- matrix: matrix4 float-4{ t t f f } xy near far - float-4-with v? ! denom v/ :> fov - fov 0.0 float-4-with vmerge-head vmerge-diagonal + fov 0.0 float-4-with (vmerge-head) vmerge-diagonal fov float-4{ f f t t } vand float-4{ 0.0 0.0 -1.0 0.0 } ] make-matrix4 ; diff --git a/vm/os-genunix.cpp b/vm/os-genunix.cpp index 7bbe388ff2..065f0dfd40 100644 --- a/vm/os-genunix.cpp +++ b/vm/os-genunix.cpp @@ -30,6 +30,7 @@ const char *default_image_path() char *new_path = new char[PATH_MAX + SUFFIX_LEN + 1]; memcpy(new_path,path,len + 1); memcpy(new_path + len,SUFFIX,SUFFIX_LEN + 1); + free(const_cast(path)); return new_path; } diff --git a/vm/os-linux.cpp b/vm/os-linux.cpp index 2d26fba390..352467d379 100644 --- a/vm/os-linux.cpp +++ b/vm/os-linux.cpp @@ -3,7 +3,7 @@ namespace factor { -/* Snarfed from SBCL linux-so.c. You must delete[] the result yourself. */ +/* Snarfed from SBCL linux-so.c. You must free() the result yourself. */ const char *vm_executable_path() { char *path = new char[PATH_MAX + 1]; @@ -17,7 +17,10 @@ const char *vm_executable_path() else { path[size] = '\0'; - return safe_strdup(path); + + const char *ret = safe_strdup(path); + delete[] path; + return ret; } }