From 97ab9dc4ab3bb4e6ff9a7326dca12c3d2f66dd64 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 10 Oct 2009 12:53:10 -0500 Subject: [PATCH] only emit ##alien-vector/##set-alien-vector insns if the rep is available --- basis/compiler/cfg/intrinsics/simd/simd.factor | 7 +++++-- basis/cpu/architecture/architecture.factor | 2 ++ basis/cpu/x86/x86.factor | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/basis/compiler/cfg/intrinsics/simd/simd.factor b/basis/compiler/cfg/intrinsics/simd/simd.factor index e608cf999c..bd851199ca 100644 --- a/basis/compiler/cfg/intrinsics/simd/simd.factor +++ b/basis/compiler/cfg/intrinsics/simd/simd.factor @@ -128,6 +128,9 @@ MACRO: if-literals-match ( quots -- ) [ ^^select-vector ] [unary/param] { [ integer? ] [ representation? ] } if-literals-match ; inline +: emit-alien-vector-op ( node quot: ( rep -- ) -- ) + { [ %alien-vector-reps member? ] } if-literals-match ; inline + : emit-alien-vector ( node -- ) dup [ '[ @@ -135,7 +138,7 @@ MACRO: if-literals-match ( quots -- ) _ ^^alien-vector ds-push ] [ inline-alien-getter? ] inline-alien - ] with emit-vector-op ; + ] with emit-alien-vector-op ; : emit-set-alien-vector ( node -- ) dup [ @@ -145,7 +148,7 @@ MACRO: if-literals-match ( quots -- ) ] [ byte-array inline-alien-setter? ] inline-alien - ] with emit-vector-op ; + ] with emit-alien-vector-op ; : generate-not-vector ( src rep -- dst ) dup %not-vector-reps member? diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index 85a43e99fd..19b38fd8f8 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -289,6 +289,7 @@ HOOK: %zero-vector-reps cpu ( -- reps ) HOOK: %fill-vector-reps cpu ( -- reps ) HOOK: %gather-vector-2-reps cpu ( -- reps ) HOOK: %gather-vector-4-reps cpu ( -- reps ) +HOOK: %alien-vector-reps cpu ( -- reps ) HOOK: %shuffle-vector-reps cpu ( -- reps ) HOOK: %shuffle-vector-imm-reps cpu ( -- reps ) HOOK: %merge-vector-reps cpu ( -- reps ) @@ -330,6 +331,7 @@ M: object %zero-vector-reps { } ; M: object %fill-vector-reps { } ; M: object %gather-vector-2-reps { } ; M: object %gather-vector-4-reps { } ; +M: object %alien-vector-reps { } ; M: object %shuffle-vector-reps { } ; M: object %shuffle-vector-imm-reps { } ; M: object %merge-vector-reps { } ; diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index c1acf92246..a163ba6482 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -562,6 +562,12 @@ MACRO: available-reps ( alist -- ) reverse [ { } ] suffix '[ _ cond ] ; +M: x86 %alien-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 longlong-2-rep ulonglong-2-rep } } + } available-reps ; + M: x86 %zero-vector { { double-2-rep [ dup XORPD ] }