%compare-vector instruction (only does v= for now)
							parent
							
								
									0c8a4717f2
								
							
						
					
					
						commit
						987ced4070
					
				| 
						 | 
					@ -297,6 +297,11 @@ def: dst
 | 
				
			||||||
use: src
 | 
					use: src
 | 
				
			||||||
literal: shuffle rep ;
 | 
					literal: shuffle rep ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PURE-INSN: ##compare-vector
 | 
				
			||||||
 | 
					def: dst
 | 
				
			||||||
 | 
					use: src1 src2
 | 
				
			||||||
 | 
					literal: rep cc ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PURE-INSN: ##add-vector
 | 
					PURE-INSN: ##add-vector
 | 
				
			||||||
def: dst
 | 
					def: dst
 | 
				
			||||||
use: src1 src2
 | 
					use: src1 src2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,6 +171,7 @@ IN: compiler.cfg.intrinsics
 | 
				
			||||||
        { math.vectors.simd.intrinsics:(simd-vbitandn) [ [ ^^andn-vector ] emit-binary-vector-op ] }
 | 
					        { math.vectors.simd.intrinsics:(simd-vbitandn) [ [ ^^andn-vector ] emit-binary-vector-op ] }
 | 
				
			||||||
        { math.vectors.simd.intrinsics:(simd-vbitor) [ [ ^^or-vector ] emit-binary-vector-op ] }
 | 
					        { math.vectors.simd.intrinsics:(simd-vbitor) [ [ ^^or-vector ] emit-binary-vector-op ] }
 | 
				
			||||||
        { math.vectors.simd.intrinsics:(simd-vbitxor) [ [ ^^xor-vector ] emit-binary-vector-op ] }
 | 
					        { math.vectors.simd.intrinsics:(simd-vbitxor) [ [ ^^xor-vector ] emit-binary-vector-op ] }
 | 
				
			||||||
 | 
					        { math.vectors.simd.intrinsics:(simd-v=) [ [ cc= ^^compare-vector ] emit-binary-vector-op ] }
 | 
				
			||||||
        { math.vectors.simd.intrinsics:(simd-vlshift) [ [ ^^shl-vector ] emit-binary-vector-op ] }
 | 
					        { math.vectors.simd.intrinsics:(simd-vlshift) [ [ ^^shl-vector ] emit-binary-vector-op ] }
 | 
				
			||||||
        { math.vectors.simd.intrinsics:(simd-vrshift) [ [ ^^shr-vector ] emit-binary-vector-op ] }
 | 
					        { math.vectors.simd.intrinsics:(simd-vrshift) [ [ ^^shr-vector ] emit-binary-vector-op ] }
 | 
				
			||||||
        { math.vectors.simd.intrinsics:(simd-hlshift) [ [ ^^horizontal-shl-vector ] emit-horizontal-shift ] }
 | 
					        { math.vectors.simd.intrinsics:(simd-hlshift) [ [ ^^horizontal-shl-vector ] emit-horizontal-shift ] }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -166,6 +166,7 @@ CODEGEN: ##zero-vector %zero-vector
 | 
				
			||||||
CODEGEN: ##gather-vector-2 %gather-vector-2
 | 
					CODEGEN: ##gather-vector-2 %gather-vector-2
 | 
				
			||||||
CODEGEN: ##gather-vector-4 %gather-vector-4
 | 
					CODEGEN: ##gather-vector-4 %gather-vector-4
 | 
				
			||||||
CODEGEN: ##shuffle-vector %shuffle-vector
 | 
					CODEGEN: ##shuffle-vector %shuffle-vector
 | 
				
			||||||
 | 
					CODEGEN: ##compare-vector %compare-vector
 | 
				
			||||||
CODEGEN: ##box-vector %box-vector
 | 
					CODEGEN: ##box-vector %box-vector
 | 
				
			||||||
CODEGEN: ##add-vector %add-vector
 | 
					CODEGEN: ##add-vector %add-vector
 | 
				
			||||||
CODEGEN: ##saturated-add-vector %saturated-add-vector
 | 
					CODEGEN: ##saturated-add-vector %saturated-add-vector
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ IN: compiler.tree.propagation.simd
 | 
				
			||||||
    (simd-hlshift)
 | 
					    (simd-hlshift)
 | 
				
			||||||
    (simd-hrshift)
 | 
					    (simd-hrshift)
 | 
				
			||||||
    (simd-vshuffle)
 | 
					    (simd-vshuffle)
 | 
				
			||||||
 | 
					    (simd-v=)
 | 
				
			||||||
    (simd-with)
 | 
					    (simd-with)
 | 
				
			||||||
    (simd-gather-2)
 | 
					    (simd-gather-2)
 | 
				
			||||||
    (simd-gather-4)
 | 
					    (simd-gather-4)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -223,6 +223,7 @@ HOOK: %zero-vector cpu ( dst rep -- )
 | 
				
			||||||
HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
 | 
					HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
 | 
				
			||||||
HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
 | 
					HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
 | 
				
			||||||
HOOK: %shuffle-vector cpu ( dst src shuffle rep -- )
 | 
					HOOK: %shuffle-vector cpu ( dst src shuffle rep -- )
 | 
				
			||||||
 | 
					HOOK: %compare-vector cpu ( dst src1 src2 rep cc -- )
 | 
				
			||||||
HOOK: %add-vector cpu ( dst src1 src2 rep -- )
 | 
					HOOK: %add-vector cpu ( dst src1 src2 rep -- )
 | 
				
			||||||
HOOK: %saturated-add-vector cpu ( dst src1 src2 rep -- )
 | 
					HOOK: %saturated-add-vector cpu ( dst src1 src2 rep -- )
 | 
				
			||||||
HOOK: %add-sub-vector cpu ( dst src1 src2 rep -- )
 | 
					HOOK: %add-sub-vector cpu ( dst src1 src2 rep -- )
 | 
				
			||||||
| 
						 | 
					@ -256,6 +257,7 @@ HOOK: %zero-vector-reps cpu ( -- reps )
 | 
				
			||||||
HOOK: %gather-vector-2-reps cpu ( -- reps )
 | 
					HOOK: %gather-vector-2-reps cpu ( -- reps )
 | 
				
			||||||
HOOK: %gather-vector-4-reps cpu ( -- reps )
 | 
					HOOK: %gather-vector-4-reps cpu ( -- reps )
 | 
				
			||||||
HOOK: %shuffle-vector-reps cpu ( -- reps )
 | 
					HOOK: %shuffle-vector-reps cpu ( -- reps )
 | 
				
			||||||
 | 
					HOOK: %compare-vector-reps cpu ( -- reps )
 | 
				
			||||||
HOOK: %add-vector-reps cpu ( -- reps )
 | 
					HOOK: %add-vector-reps cpu ( -- reps )
 | 
				
			||||||
HOOK: %saturated-add-vector-reps cpu ( -- reps )
 | 
					HOOK: %saturated-add-vector-reps cpu ( -- reps )
 | 
				
			||||||
HOOK: %add-sub-vector-reps cpu ( -- reps )
 | 
					HOOK: %add-sub-vector-reps cpu ( -- reps )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -267,6 +267,7 @@ M: ppc %zero-vector-reps { } ;
 | 
				
			||||||
M: ppc %gather-vector-2-reps { } ;
 | 
					M: ppc %gather-vector-2-reps { } ;
 | 
				
			||||||
M: ppc %gather-vector-4-reps { } ;
 | 
					M: ppc %gather-vector-4-reps { } ;
 | 
				
			||||||
M: ppc %shuffle-vector-reps { } ;
 | 
					M: ppc %shuffle-vector-reps { } ;
 | 
				
			||||||
 | 
					M: ppc %compare-vector-reps { } ;
 | 
				
			||||||
M: ppc %add-vector-reps { } ;
 | 
					M: ppc %add-vector-reps { } ;
 | 
				
			||||||
M: ppc %saturated-add-vector-reps { } ;
 | 
					M: ppc %saturated-add-vector-reps { } ;
 | 
				
			||||||
M: ppc %add-sub-vector-reps { } ;
 | 
					M: ppc %add-sub-vector-reps { } ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -725,6 +725,28 @@ M: x86 %shuffle-vector-reps
 | 
				
			||||||
        { sse2? { double-2-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
 | 
					        { sse2? { double-2-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
 | 
				
			||||||
    } available-reps ;
 | 
					    } available-reps ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: %compare-vector-equal ( dst src rep -- )
 | 
				
			||||||
 | 
					    unsign-rep {
 | 
				
			||||||
 | 
					        { double-2-rep   [ CMPEQPD ] }
 | 
				
			||||||
 | 
					        { float-4-rep    [ CMPEQPS ] }
 | 
				
			||||||
 | 
					        { longlong-2-rep [ PCMPEQQ ] }
 | 
				
			||||||
 | 
					        { int-4-rep      [ PCMPEQD ] }
 | 
				
			||||||
 | 
					        { short-8-rep    [ PCMPEQW ] }
 | 
				
			||||||
 | 
					        { char-16-rep    [ PCMPEQB ] }
 | 
				
			||||||
 | 
					    } case ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: x86 %compare-vector ( dst src1 src2 rep cc -- )
 | 
				
			||||||
 | 
					    [ [ two-operand ] keep ] dip {
 | 
				
			||||||
 | 
					        { cc= [ %compare-vector-equal ] }
 | 
				
			||||||
 | 
					    } case ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: x86 %compare-vector-reps
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        { sse? { float-4-rep } }
 | 
				
			||||||
 | 
					        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep } }
 | 
				
			||||||
 | 
					        { sse4.1? { longlong-2-rep ulonglong-2-rep } }
 | 
				
			||||||
 | 
					    } available-reps ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: x86 %add-vector ( dst src1 src2 rep -- )
 | 
					M: x86 %add-vector ( dst src1 src2 rep -- )
 | 
				
			||||||
    [ two-operand ] keep
 | 
					    [ two-operand ] keep
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,6 +49,7 @@ SIMD-OP: vrshift
 | 
				
			||||||
SIMD-OP: hlshift
 | 
					SIMD-OP: hlshift
 | 
				
			||||||
SIMD-OP: hrshift
 | 
					SIMD-OP: hrshift
 | 
				
			||||||
SIMD-OP: vshuffle
 | 
					SIMD-OP: vshuffle
 | 
				
			||||||
 | 
					SIMD-OP: v=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: (simd-with) ( x rep -- v ) bad-simd-call ;
 | 
					: (simd-with) ( x rep -- v ) bad-simd-call ;
 | 
				
			||||||
: (simd-gather-2) ( a b rep -- v ) bad-simd-call ;
 | 
					: (simd-gather-2) ( a b rep -- v ) bad-simd-call ;
 | 
				
			||||||
| 
						 | 
					@ -126,6 +127,7 @@ M: vector-rep supported-simd-op?
 | 
				
			||||||
        { \ (simd-hlshift)  [ %horizontal-shl-vector-reps ] }
 | 
					        { \ (simd-hlshift)  [ %horizontal-shl-vector-reps ] }
 | 
				
			||||||
        { \ (simd-hrshift)  [ %horizontal-shr-vector-reps ] }
 | 
					        { \ (simd-hrshift)  [ %horizontal-shr-vector-reps ] }
 | 
				
			||||||
        { \ (simd-vshuffle) [ %shuffle-vector-reps        ] }
 | 
					        { \ (simd-vshuffle) [ %shuffle-vector-reps        ] }
 | 
				
			||||||
 | 
					        { \ (simd-v=)       [ %compare-vector-reps        ] }
 | 
				
			||||||
        { \ (simd-gather-2) [ %gather-vector-2-reps       ] }
 | 
					        { \ (simd-gather-2) [ %gather-vector-2-reps       ] }
 | 
				
			||||||
        { \ (simd-gather-4) [ %gather-vector-4-reps       ] }
 | 
					        { \ (simd-gather-4) [ %gather-vector-4-reps       ] }
 | 
				
			||||||
    } case member? ;
 | 
					    } case member? ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -92,6 +92,7 @@ H{
 | 
				
			||||||
    { hrshift { +vector+ +literal+ -> +vector+ } }
 | 
					    { hrshift { +vector+ +literal+ -> +vector+ } }
 | 
				
			||||||
    { vshuffle { +vector+ +literal+ -> +vector+ } }
 | 
					    { vshuffle { +vector+ +literal+ -> +vector+ } }
 | 
				
			||||||
    { vbroadcast { +vector+ +literal+ -> +vector+ } }
 | 
					    { vbroadcast { +vector+ +literal+ -> +vector+ } }
 | 
				
			||||||
 | 
					    { v= { +vector+ +vector+ -> +vector+ } }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PREDICATE: vector-word < word vector-words key? ;
 | 
					PREDICATE: vector-word < word vector-words key? ;
 | 
				
			||||||
| 
						 | 
					@ -162,4 +163,4 @@ ERROR: bad-vector-word word ;
 | 
				
			||||||
vector-words keys [
 | 
					vector-words keys [
 | 
				
			||||||
    [ vector-word-custom-inlining ]
 | 
					    [ vector-word-custom-inlining ]
 | 
				
			||||||
    "custom-inlining" set-word-prop
 | 
					    "custom-inlining" set-word-prop
 | 
				
			||||||
] each
 | 
					] each
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue