]> gitweb.factorcode.org Git - factor.git/commitdiff
math.vectors.simd: allow punning SIMD vectors between types
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 4 Sep 2009 07:35:58 +0000 (02:35 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 4 Sep 2009 07:35:58 +0000 (02:35 -0500)
basis/compiler/cfg/representations/representations.factor
basis/math/vectors/simd/simd-tests.factor

index 6fe28caf817682fb8f906fcdb8d508fedaefbcb2..ec2856f6476569d652288ef95a80cfc0e5b8353b 100644 (file)
@@ -51,10 +51,15 @@ M: vector-rep emit-unbox
         { [ dup int-rep eq? ] [ drop emit-unbox ] }
         { [ over int-rep eq? ] [ nip emit-box ] }
         [
-            2array {
-                { { double-rep float-rep } [ ##single>double-float ] }
-                { { float-rep double-rep } [ ##double>single-float ] }
-                [ first2 bad-conversion ]
+            2dup 2array {
+                { { double-rep float-rep } [ 2drop ##single>double-float ] }
+                { { float-rep double-rep } [ 2drop ##double>single-float ] }
+                ! Punning SIMD vector types? Naughty naughty! But
+                ! it is allowed... otherwise bail out.
+                [
+                    drop 2dup [ reg-class-of ] bi@ eq?
+                    [ drop ##copy ] [ bad-conversion ] if
+                ]
             } case
         ]
     } cond ;
index 532ec8476487e727c9248bc2985b870e383eff85..e847fcad74cf2180618cbb6b76388542aaae2183 100644 (file)
@@ -348,3 +348,14 @@ tools.test compiler.tree.debugger accessors kernel ;
     -2.0
     [ { float-8 float } declare v/n ] compile-call
 ] unit-test
+
+! Test puns
+[ double-2{ 4 1024 } ] [
+    float-4{ 0 1 0 2 }
+    [ { float-4 } declare dup v+ underlying>> double-2 boa dup v+ ] compile-call
+] unit-test
+
+[ 33.0 ] [
+    double-2{ 1 2 } double-2{ 10 20 }
+    [ { double-2 double-2 } declare v+ underlying>> 3.0 float* ] compile-call
+] unit-test