fix primitive emit fallback for simd intrinsics

db4
Joe Groff 2009-11-18 21:29:51 -08:00
parent a3e4ecfc7d
commit 59d85f7ad6
2 changed files with 49 additions and 5 deletions

View File

@ -3,7 +3,7 @@ USING: accessors arrays assocs classes combinators
combinators.short-circuit compiler.cfg.builder.blocks combinators.short-circuit compiler.cfg.builder.blocks
compiler.cfg.registers compiler.cfg.stacks compiler.cfg.registers compiler.cfg.stacks
compiler.cfg.stacks.local compiler.tree.propagation.info compiler.cfg.stacks.local compiler.tree.propagation.info
cpu.architecture effects fry generalizations help.lint.checks cpu.architecture effects fry generalizations
kernel locals macros math namespaces quotations sequences kernel locals macros math namespaces quotations sequences
splitting stack-checker words ; splitting stack-checker words ;
IN: compiler.cfg.intrinsics.simd.backend IN: compiler.cfg.intrinsics.simd.backend
@ -145,6 +145,12 @@ CONSTANT: can-has-words
! Intrinsic code emission ! Intrinsic code emission
MACRO: check-elements ( quots -- )
[ length '[ _ firstn ] ]
[ '[ _ spread ] ]
[ length 1 - \ and <repetition> [ ] like ]
tri 3append ;
MACRO: if-literals-match ( quots -- ) MACRO: if-literals-match ( quots -- )
[ length ] [ ] [ length ] tri [ length ] [ ] [ length ] tri
! n quots n ! n quots n

View File

@ -1,9 +1,9 @@
! (c)2009 Joe Groff bsd license ! (c)2009 Joe Groff bsd license
USING: arrays assocs biassocs byte-arrays byte-arrays.hex USING: arrays assocs biassocs byte-arrays byte-arrays.hex
classes compiler.cfg.comparisons compiler.cfg.instructions classes compiler.cfg compiler.cfg.comparisons compiler.cfg.instructions
compiler.cfg.intrinsics.simd compiler.cfg.registers compiler.cfg.intrinsics.simd compiler.cfg.registers
compiler.cfg.stacks.local compiler.tree compiler.cfg.stacks.height compiler.cfg.stacks.local compiler.tree
compiler.tree.propagation.info cpu.architecture fry kernel compiler.tree.propagation.info cpu.architecture fry hashtables kernel
locals make namespaces sequences system tools.test words ; locals make namespaces sequences system tools.test words ;
IN: compiler.cfg.intrinsics.simd.tests IN: compiler.cfg.intrinsics.simd.tests
@ -34,8 +34,25 @@ IN: compiler.cfg.intrinsics.simd.tests
} } } }
} ; } ;
: test-node-nonliteral-rep ( -- node )
T{ #call
{ in-d { 1 2 3 4 } }
{ out-d { 5 } }
{ info H{
{ 1 T{ value-info { class byte-array } } }
{ 2 T{ value-info { class byte-array } } }
{ 3 T{ value-info { class byte-array } } }
{ 4 T{ value-info { class object } } }
{ 5 T{ value-info { class byte-array } } }
} }
} ;
: test-compiler-env ( -- x ) : test-compiler-env ( -- x )
H{ } clone H{ } clone
T{ basic-block { id 0 } }
[ \ basic-block pick set-at ]
[ 0 swap associate \ ds-heights pick set-at ]
[ 0 swap associate \ rs-heights pick set-at ] tri
T{ current-height { d 0 } { r 0 } { emit-d 0 } { emit-r 0 } } \ current-height pick set-at T{ current-height { d 0 } { r 0 } { emit-d 0 } { emit-r 0 } } \ current-height pick set-at
H{ } clone \ local-peek-set pick set-at H{ } clone \ local-peek-set pick set-at
H{ } clone \ replace-mapping pick set-at H{ } clone \ replace-mapping pick set-at
@ -61,6 +78,13 @@ IN: compiler.cfg.intrinsics.simd.tests
] with-variable ] with-variable
] make-classes ; inline ] make-classes ; inline
: test-emit-nonliteral-rep ( cpu quot -- node )
[
[ new \ cpu ] dip '[
test-compiler-env [ test-node-nonliteral-rep @ ] bind
] with-variable
] make-classes ; inline
CONSTANT: signed-reps CONSTANT: signed-reps
{ char-16-rep short-8-rep int-4-rep longlong-2-rep float-4-rep double-2-rep } { char-16-rep short-8-rep int-4-rep longlong-2-rep float-4-rep double-2-rep }
CONSTANT: all-reps CONSTANT: all-reps
@ -504,5 +528,19 @@ unit-test
! select ! select
[ { ##shuffle-vector-imm ##vector>scalar } ] [ { ##shuffle-vector-imm ##vector>scalar } ]
[ shuffle-imm-cpu int-4-rep [ emit-simd-select ] test-emit ] [ shuffle-imm-cpu 1 int-4-rep [ emit-simd-select ] test-emit-literal ]
unit-test unit-test
! test with nonliteral/invalid reps
[ { ##inc-d ##branch } ]
[ simple-ops-cpu [ emit-simd-v+ ] test-emit-nonliteral-rep ]
unit-test
[ { ##branch } ]
[ simple-ops-cpu f [ emit-simd-v+ ] test-emit ]
unit-test
[ { ##branch } ]
[ simple-ops-cpu 3 [ emit-simd-v+ ] test-emit ]
unit-test