From 7fe04fa8ee8ac14e1ba0ce83343a0300344c0863 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 1 Jun 2010 00:34:50 -0700 Subject: [PATCH] compiler.cfg.intrinsics.simd: intrinsic support for double-2>float-4 conversion --- basis/compiler/cfg/instructions/instructions.factor | 5 +++++ basis/compiler/cfg/intrinsics/simd/backend/backend.factor | 1 + basis/compiler/cfg/intrinsics/simd/simd.factor | 7 ++++++- basis/compiler/codegen/codegen.factor | 1 + basis/cpu/architecture/architecture.factor | 3 +++ basis/cpu/x86/sse/sse.factor | 8 ++++++++ 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index 174743fdfd..e05335b06c 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -345,6 +345,11 @@ def: dst use: src1 src2 literal: rep ; +PURE-INSN: ##float-pack-vector +def: dst +use: src +literal: rep ; + PURE-INSN: ##signed-pack-vector def: dst use: src1 src2 diff --git a/basis/compiler/cfg/intrinsics/simd/backend/backend.factor b/basis/compiler/cfg/intrinsics/simd/backend/backend.factor index bc1e04a2f3..84ffc208d5 100644 --- a/basis/compiler/cfg/intrinsics/simd/backend/backend.factor +++ b/basis/compiler/cfg/intrinsics/simd/backend/backend.factor @@ -28,6 +28,7 @@ M: ##shuffle-vector-imm insn-available? rep>> %shuffle-vector-imm-reps member? ; M: ##shuffle-vector-halves-imm insn-available? rep>> %shuffle-vector-halves-imm-reps member? ; M: ##merge-vector-head insn-available? rep>> %merge-vector-reps member? ; M: ##merge-vector-tail insn-available? rep>> %merge-vector-reps member? ; +M: ##float-pack-vector insn-available? rep>> %float-pack-vector-reps member? ; M: ##signed-pack-vector insn-available? rep>> %signed-pack-vector-reps member? ; M: ##unsigned-pack-vector insn-available? rep>> %unsigned-pack-vector-reps member? ; M: ##unpack-vector-head insn-available? rep>> %unpack-vector-head-reps member? ; diff --git a/basis/compiler/cfg/intrinsics/simd/simd.factor b/basis/compiler/cfg/intrinsics/simd/simd.factor index fc2cede8bc..9d15feb96f 100644 --- a/basis/compiler/cfg/intrinsics/simd/simd.factor +++ b/basis/compiler/cfg/intrinsics/simd/simd.factor @@ -570,7 +570,12 @@ PREDICATE: fixnum-vector-rep < int-vector-rep : emit-simd-vpack-signed ( node -- ) { - [ ^^signed-pack-vector ] + { double-2-rep [| src1 src2 rep | + src1 double-2-rep ^^float-pack-vector :> dst-head + src2 double-2-rep ^^float-pack-vector :> dst-tail + dst-head dst-tail { 0 1 0 1 } float-4-rep ^^shuffle-vector-halves-imm + ] } + { int-vector-rep [ ^^signed-pack-vector ] } } emit-vv-vector-op ; : emit-simd-vpack-unsigned ( node -- ) diff --git a/basis/compiler/codegen/codegen.factor b/basis/compiler/codegen/codegen.factor index db694112c0..68b01beed9 100755 --- a/basis/compiler/codegen/codegen.factor +++ b/basis/compiler/codegen/codegen.factor @@ -191,6 +191,7 @@ CODEGEN: ##shuffle-vector %shuffle-vector CODEGEN: ##tail>head-vector %tail>head-vector CODEGEN: ##merge-vector-head %merge-vector-head CODEGEN: ##merge-vector-tail %merge-vector-tail +CODEGEN: ##float-pack-vector %float-pack-vector CODEGEN: ##signed-pack-vector %signed-pack-vector CODEGEN: ##unsigned-pack-vector %unsigned-pack-vector CODEGEN: ##unpack-vector-head %unpack-vector-head diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index 53f86d8e5c..e2a7bdab10 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -314,6 +314,7 @@ HOOK: %shuffle-vector-halves-imm cpu ( dst src1 src2 shuffle rep -- ) HOOK: %tail>head-vector cpu ( dst src rep -- ) HOOK: %merge-vector-head cpu ( dst src1 src2 rep -- ) HOOK: %merge-vector-tail cpu ( dst src1 src2 rep -- ) +HOOK: %float-pack-vector cpu ( dst src rep -- ) HOOK: %signed-pack-vector cpu ( dst src1 src2 rep -- ) HOOK: %unsigned-pack-vector cpu ( dst src1 src2 rep -- ) HOOK: %unpack-vector-head cpu ( dst src rep -- ) @@ -371,6 +372,7 @@ HOOK: %shuffle-vector-reps cpu ( -- reps ) HOOK: %shuffle-vector-imm-reps cpu ( -- reps ) HOOK: %shuffle-vector-halves-imm-reps cpu ( -- reps ) HOOK: %merge-vector-reps cpu ( -- reps ) +HOOK: %float-pack-vector-reps cpu ( -- reps ) HOOK: %signed-pack-vector-reps cpu ( -- reps ) HOOK: %unsigned-pack-vector-reps cpu ( -- reps ) HOOK: %unpack-vector-head-reps cpu ( -- reps ) @@ -423,6 +425,7 @@ M: object %shuffle-vector-reps { } ; M: object %shuffle-vector-imm-reps { } ; M: object %shuffle-vector-halves-imm-reps { } ; M: object %merge-vector-reps { } ; +M: object %float-pack-vector-reps { } ; M: object %signed-pack-vector-reps { } ; M: object %unsigned-pack-vector-reps { } ; M: object %unpack-vector-head-reps { } ; diff --git a/basis/cpu/x86/sse/sse.factor b/basis/cpu/x86/sse/sse.factor index f12c1df970..4d667b8821 100644 --- a/basis/cpu/x86/sse/sse.factor +++ b/basis/cpu/x86/sse/sse.factor @@ -298,6 +298,14 @@ M: x86 %merge-vector-reps { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } } } available-reps ; +M: x86 %float-pack-vector + drop CVTPD2PS ; + +M: x86 %float-pack-vector-reps + { + { sse2? { double-2-rep } } + } available-reps ; + M: x86 %signed-pack-vector [ two-operand ] keep {