diff --git a/basis/math/vectors/vectors-docs.factor b/basis/math/vectors/vectors-docs.factor index 4d944ac56d..0c239a0f6b 100644 --- a/basis/math/vectors/vectors-docs.factor +++ b/basis/math/vectors/vectors-docs.factor @@ -39,6 +39,8 @@ ARTICLE: "math-vectors-arithmetic" "Vector arithmetic" { $subsection v~ } ; ARTICLE: "math-vectors-logic" "Vector componentwise logic" +"See " { $link "math-vectors-simd-logic" } " for notes about using comparison and logical operations with SIMD vector types." +$nl "Element comparisons:" { $subsection v< } { $subsection v<= } @@ -55,12 +57,15 @@ ARTICLE: "math-vectors-logic" "Vector componentwise logic" { $subsection vbitandn } { $subsection vbitor } { $subsection vbitxor } +{ $subsection vbitnot } { $subsection vlshift } { $subsection vrshift } "Element logical operations:" { $subsection vand } +{ $subsection vandn } { $subsection vor } { $subsection vxor } +{ $subsection vnot } { $subsection v? } "Entire vector tests:" { $subsection vall? } @@ -76,6 +81,63 @@ ARTICLE: "math-vectors-misc" "Miscellaneous vector functions" { $subsection vnlerp } { $subsection vbilerp } ; +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 }""" +} +"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 } +uchar-16{ 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 } v< +[ . ] bi@""" +"""int-4{ -1 0 -1 0 } +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 }""" } +"However, extracting an element from a boolean SIMD vector with " { $link nth } " will not yield a valid Factor boolean. This is not generally a problem, since the results of vector comparisons are meant to be consumed by subsequent vector logical and test operations, which will accept SIMD values in the native boolean format." +$nl +"Also note that providing SIMD vectors with element values other than true or false as inputs to logical or test operations is undefined." +$nl +"These notes apply to the output of the following element comparison words: " +{ $list +{ $link v< } +{ $link v<= } +{ $link v= } +{ $link v>= } +{ $link v> } +{ $link vunordered? } +} +"They likewise apply to the " { $snippet "mask" } " argument of " { $link v? } " and the inputs and outputs of the following element logic words:" +{ $list +{ $link vand } +{ $link vandn } +{ $link vor } +{ $link vxor } +{ $link vnot } +} +"Finally, the inputs of these vector test words is affected:" +{ $list +{ $link vall? } +{ $link vany? } +{ $link vnone? } +} ; ARTICLE: "math-vectors" "Vector operations" "Any Factor sequence can be used to represent a mathematical vector, however for best performance, the sequences defined by the " { $vocab-link "specialized-arrays" } " and " { $vocab-link "math.vectors.simd" } " vocabularies should be used." @@ -303,63 +365,78 @@ HELP: set-axis HELP: v< { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of booleans" } } -{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is less than the latter or " { $link f } " otherwise." } ; +{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is less than the latter or " { $link f } " otherwise." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean results when using SIMD types." } ; HELP: v<= { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of booleans" } } -{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is less than or equal to the latter or " { $link f } " otherwise." } ; +{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is less than or equal to the latter or " { $link f } " otherwise." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean results when using SIMD types." } ; HELP: v= { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of booleans" } } -{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when they are equal or " { $link f } " otherwise." } ; +{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when they are equal or " { $link f } " otherwise." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean results when using SIMD types." } ; HELP: v> { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of booleans" } } -{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is greater than the latter or " { $link f } " otherwise." } ; +{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is greater than the latter or " { $link f } " otherwise." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean results when using SIMD types." } ; HELP: v>= { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of booleans" } } -{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is greater than or equal to the latter or " { $link f } " otherwise." } ; +{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when the former is greater than or equal to the latter or " { $link f } " otherwise." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean results when using SIMD types." } ; HELP: vunordered? { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of booleans" } } -{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when either value is Not-a-Number or " { $link f } " otherwise." } ; +{ $description "Compares each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", returning " { $link t } " in the result vector when either value is Not-a-Number or " { $link f } " otherwise." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean results when using SIMD types." } ; HELP: vand { $values { "u" "a sequence of booleans" } { "v" "a sequence of booleans" } { "w" "a sequence of booleans" } } -{ $description "Takes the logical AND of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } ; +{ $description "Takes the logical AND of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs and results when using SIMD types." } ; HELP: vandn { $values { "u" "a sequence of booleans" } { "v" "a sequence of booleans" } { "w" "a sequence of booleans" } } -{ $description "Takes the logical AND-NOT of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", where " { $snippet "x AND-NOT y" } " is defined as " { $snippet "NOT(x) AND y" } "." } ; +{ $description "Takes the logical AND-NOT of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", where " { $snippet "x AND-NOT y" } " is defined as " { $snippet "NOT(x) AND y" } "." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs and results when using SIMD types." } ; HELP: vor { $values { "u" "a sequence of booleans" } { "v" "a sequence of booleans" } { "w" "a sequence of booleans" } } -{ $description "Takes the logical OR of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } ; +{ $description "Takes the logical OR of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs and results when using SIMD types." } ; HELP: vxor { $values { "u" "a sequence of booleans" } { "v" "a sequence of booleans" } { "w" "a sequence of booleans" } } -{ $description "Takes the logical XOR of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } ; +{ $description "Takes the logical XOR of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs and results when using SIMD types." } ; HELP: vnot { $values { "u" "a sequence of booleans" } { "w" "a sequence of booleans" } } -{ $description "Takes the logical NOT of each element of " { $snippet "u" } "." } ; +{ $description "Takes the logical NOT of each element of " { $snippet "u" } "." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs and results when using SIMD types." } ; HELP: v? { $values { "mask" "a sequence of booleans" } { "true" "a sequence of numbers" } { "false" "a sequence of numbers" } { "w" "a sequence of numbers" } } -{ $description "Creates a new sequence by selecting elements from the " { $snippet "true" } " and " { $snippet "false" } " sequences based on whether the corresponding bits of the " { $snippet "mask" } " sequence are set or not." } ; +{ $description "Creates a new sequence by selecting elements from the " { $snippet "true" } " and " { $snippet "false" } " sequences based on whether the corresponding bits of the " { $snippet "mask" } " sequence are set or not." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs and results when using SIMD types." } ; HELP: vany? { $values { "v" "a sequence of booleans" } { "?" "a boolean" } } -{ $description "Returns true if any element of " { $snippet "v" } " is true." } ; +{ $description "Returns true if any element of " { $snippet "v" } " is true." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs when using SIMD types." } ; HELP: vall? { $values { "v" "a sequence of booleans" } { "?" "a boolean" } } -{ $description "Returns true if every element of " { $snippet "v" } " is true." } ; +{ $description "Returns true if every element of " { $snippet "v" } " is true." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs when using SIMD types." } ; HELP: vnone? { $values { "v" "a sequence of booleans" } { "?" "a boolean" } } -{ $description "Returns true if every element of " { $snippet "v" } " is false." } ; +{ $description "Returns true if every element of " { $snippet "v" } " is false." } +{ $notes "See " { $link "math-vectors-simd-logic" } " for notes on dealing with vector boolean inputs when using SIMD types." } ; { 2map v+ v- v* v/ } related-words