From 645164188df1c45ec235cde4eb83bfac6fc19e99 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 16 May 2010 00:49:12 -0700 Subject: [PATCH 1/2] compiler.cfg.instructions: ##select-vector instruction mapping to SSE4 PEXTR* --- .../cfg/instructions/instructions.factor | 5 +++ basis/compiler/codegen/codegen.factor | 1 + basis/cpu/architecture/architecture.factor | 3 ++ basis/cpu/x86/x86.factor | 45 +++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index 2c1ac7aadb..71408b2810 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -310,6 +310,11 @@ def: dst use: src1/int-rep src2/int-rep src3/int-rep src4/int-rep literal: rep ; +PURE-INSN: ##select-vector +def: dst/int-rep +use: src +literal: n rep ; + PURE-INSN: ##shuffle-vector def: dst use: src shuffle diff --git a/basis/compiler/codegen/codegen.factor b/basis/compiler/codegen/codegen.factor index 81e14bd68e..fc02c429f8 100755 --- a/basis/compiler/codegen/codegen.factor +++ b/basis/compiler/codegen/codegen.factor @@ -184,6 +184,7 @@ CODEGEN: ##gather-vector-2 %gather-vector-2 CODEGEN: ##gather-vector-4 %gather-vector-4 CODEGEN: ##gather-int-vector-2 %gather-int-vector-2 CODEGEN: ##gather-int-vector-4 %gather-int-vector-4 +CODEGEN: ##select-vector %select-vector CODEGEN: ##shuffle-vector-imm %shuffle-vector-imm CODEGEN: ##shuffle-vector-halves-imm %shuffle-vector-halves-imm CODEGEN: ##shuffle-vector %shuffle-vector diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index fb4876d95f..694c77336f 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -297,6 +297,7 @@ HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- ) HOOK: %gather-int-vector-2 cpu ( dst src1 src2 rep -- ) HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- ) HOOK: %gather-int-vector-4 cpu ( dst src1 src2 src3 src4 rep -- ) +HOOK: %select-vector cpu ( dst src n rep -- ) HOOK: %shuffle-vector cpu ( dst src shuffle rep -- ) HOOK: %shuffle-vector-imm cpu ( dst src shuffle rep -- ) HOOK: %shuffle-vector-halves-imm cpu ( dst src1 src2 shuffle rep -- ) @@ -354,6 +355,7 @@ HOOK: %gather-vector-2-reps cpu ( -- reps ) HOOK: %gather-int-vector-2-reps cpu ( -- reps ) HOOK: %gather-vector-4-reps cpu ( -- reps ) HOOK: %gather-int-vector-4-reps cpu ( -- reps ) +HOOK: %select-vector-reps cpu ( -- reps ) HOOK: %alien-vector-reps cpu ( -- reps ) HOOK: %shuffle-vector-reps cpu ( -- reps ) HOOK: %shuffle-vector-imm-reps cpu ( -- reps ) @@ -405,6 +407,7 @@ M: object %gather-vector-2-reps { } ; M: object %gather-int-vector-2-reps { } ; M: object %gather-vector-4-reps { } ; M: object %gather-int-vector-4-reps { } ; +M: object %select-vector-reps { } ; M: object %alien-vector-reps { } ; M: object %shuffle-vector-reps { } ; M: object %shuffle-vector-imm-reps { } ; diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 8208a87f3a..3806ccca9b 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -781,6 +781,51 @@ M: x86.64 %gather-int-vector-2-reps { sse4.1? { longlong-2-rep ulonglong-2-rep } } } available-reps ; +:: %select-vector-32 ( dst src n rep -- ) + rep { + { char-16-rep [ + dst 32-bit-version-of src n PEXTRB + dst dst 8-bit-version-of MOVSX + ] } + { uchar-16-rep [ + dst 32-bit-version-of src n PEXTRB + ] } + { short-8-rep [ + dst 32-bit-version-of src n PEXTRW + dst dst 16-bit-version-of MOVSX + ] } + { ushort-8-rep [ + dst 32-bit-version-of src n PEXTRW + ] } + { int-4-rep [ + dst 32-bit-version-of src n PEXTRD + dst dst 32-bit-version-of 2dup = [ 2drop ] [ MOVSX ] if + ] } + { uint-4-rep [ + dst 32-bit-version-of src n PEXTRD + ] } + } case ; + +M: x86.32 %select-vector + %select-vector-32 ; + +M: x86.32 %select-vector-reps + { + { sse4.1? { uchar-16-rep char-16-rep ushort-8-rep short-8-rep uint-4-rep int-4-rep } } + } available-reps ; + +M: x86.64 %select-vector + { + { longlong-2-rep [ PEXTRQ ] } + { ulonglong-2-rep [ PEXTRQ ] } + [ %select-vector-32 ] + } case ; + +M: x86.64 %select-vector-reps + { + { sse4.1? { uchar-16-rep char-16-rep ushort-8-rep short-8-rep uint-4-rep int-4-rep ulonglong-2-rep longlong-2-rep } } + } available-reps ; + : sse1-float-4-shuffle ( dst shuffle -- ) { { { 0 1 2 3 } [ drop ] } From 67ea40ade33a706020c1145e9ec1a00b71d7e466 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 16 May 2010 00:49:55 -0700 Subject: [PATCH 2/2] compiler.cfg.intrinsics.simd: use ^^select-vector for simd constant nth when available --- basis/compiler/cfg/intrinsics/simd/backend/backend.factor | 1 + basis/compiler/cfg/intrinsics/simd/simd.factor | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/basis/compiler/cfg/intrinsics/simd/backend/backend.factor b/basis/compiler/cfg/intrinsics/simd/backend/backend.factor index cb4ff536dc..f84e826f19 100644 --- a/basis/compiler/cfg/intrinsics/simd/backend/backend.factor +++ b/basis/compiler/cfg/intrinsics/simd/backend/backend.factor @@ -21,6 +21,7 @@ M: ##gather-vector-2 insn-available? rep>> %gather-vector-2-reps member? ; M: ##gather-vector-4 insn-available? rep>> %gather-vector-4-reps member? ; M: ##gather-int-vector-2 insn-available? rep>> %gather-int-vector-2-reps member? ; M: ##gather-int-vector-4 insn-available? rep>> %gather-int-vector-4-reps member? ; +M: ##select-vector insn-available? rep>> %select-vector-reps member? ; M: ##store-memory-imm insn-available? rep>> %alien-vector-reps member? ; M: ##shuffle-vector insn-available? rep>> %shuffle-vector-reps member? ; M: ##shuffle-vector-imm insn-available? rep>> %shuffle-vector-imm-reps member? ; diff --git a/basis/compiler/cfg/intrinsics/simd/simd.factor b/basis/compiler/cfg/intrinsics/simd/simd.factor index 0cb7a21940..fc2cede8bc 100644 --- a/basis/compiler/cfg/intrinsics/simd/simd.factor +++ b/basis/compiler/cfg/intrinsics/simd/simd.factor @@ -303,7 +303,10 @@ PREDICATE: fixnum-vector-rep < int-vector-rep [ ^^scalar>vector ] keep [ 0 ] dip ^broadcast-vector ; : ^select-vector ( src n rep -- dst ) - [ ^broadcast-vector ] keep ^^vector>scalar ; + { + [ ^^select-vector ] + [ [ ^broadcast-vector ] keep ^^vector>scalar ] + } vl-vector-op ; ! intrinsic emitters