compiler.cfg.intrinsics.simd: refactoring to use assocs instead of case-s for lookups + tests
							parent
							
								
									745d3f29b2
								
							
						
					
					
						commit
						6c6f85428c
					
				| 
						 | 
				
			
			@ -2,8 +2,8 @@
 | 
			
		|||
USING: arrays assocs biassocs byte-arrays byte-arrays.hex
 | 
			
		||||
classes compiler.cfg compiler.cfg.comparisons compiler.cfg.instructions
 | 
			
		||||
compiler.cfg.intrinsics.simd compiler.cfg.intrinsics.simd.backend
 | 
			
		||||
compiler.cfg.registers compiler.cfg.stacks.height
 | 
			
		||||
compiler.cfg.stacks.local compiler.tree compiler.tree.propagation.info
 | 
			
		||||
compiler.cfg.registers compiler.cfg.stacks.height compiler.cfg.stacks.local
 | 
			
		||||
compiler.test compiler.tree compiler.tree.propagation.info
 | 
			
		||||
cpu.architecture fry hashtables kernel locals make namespaces sequences
 | 
			
		||||
system tools.test words ;
 | 
			
		||||
IN: compiler.cfg.intrinsics.simd.tests
 | 
			
		||||
| 
						 | 
				
			
			@ -525,6 +525,104 @@ unit-test
 | 
			
		|||
[ shuffle-imm-cpu 1 float-4-rep [ emit-simd-select ] test-emit-literal ]
 | 
			
		||||
unit-test
 | 
			
		||||
 | 
			
		||||
! ^load-neg-zero-vector
 | 
			
		||||
{
 | 
			
		||||
    V{
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 1 }
 | 
			
		||||
           { obj B{ 0 0 0 128 0 0 0 128 0 0 0 128 0 0 0 128 } }
 | 
			
		||||
        }
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 2 }
 | 
			
		||||
           { obj B{ 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 128 } }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
} [
 | 
			
		||||
    [
 | 
			
		||||
        { float-4-rep double-2-rep } [ ^load-neg-zero-vector drop ] each
 | 
			
		||||
    ] V{ } make
 | 
			
		||||
] cfg-unit-test
 | 
			
		||||
 | 
			
		||||
! ^load-add-sub-vector
 | 
			
		||||
{
 | 
			
		||||
    V{
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 1 }
 | 
			
		||||
           { obj B{ 0 0 0 128 0 0 0 0 0 0 0 128 0 0 0 0 } }
 | 
			
		||||
        }
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 2 }
 | 
			
		||||
           { obj B{ 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 } }
 | 
			
		||||
        }
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 3 }
 | 
			
		||||
           { obj
 | 
			
		||||
             B{ 255 0 255 0 255 0 255 0 255 0 255 0 255 0 255 0 }
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 4 }
 | 
			
		||||
           { obj
 | 
			
		||||
             B{ 255 255 0 0 255 255 0 0 255 255 0 0 255 255 0 0 }
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 5 }
 | 
			
		||||
           { obj
 | 
			
		||||
             B{ 255 255 255 255 0 0 0 0 255 255 255 255 0 0 0 0 }
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 6 }
 | 
			
		||||
           { obj
 | 
			
		||||
             B{ 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 }
 | 
			
		||||
           }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
} [
 | 
			
		||||
    [
 | 
			
		||||
        {
 | 
			
		||||
            float-4-rep
 | 
			
		||||
            double-2-rep
 | 
			
		||||
            char-16-rep
 | 
			
		||||
            short-8-rep
 | 
			
		||||
            int-4-rep
 | 
			
		||||
            longlong-2-rep
 | 
			
		||||
        } [ ^load-add-sub-vector drop ] each
 | 
			
		||||
    ] V{ } make
 | 
			
		||||
] cfg-unit-test
 | 
			
		||||
 | 
			
		||||
! ^load-half-vector
 | 
			
		||||
{
 | 
			
		||||
    V{
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 1 }
 | 
			
		||||
           { obj B{ 0 0 0 63 0 0 0 63 0 0 0 63 0 0 0 63 } }
 | 
			
		||||
        }
 | 
			
		||||
        T{ ##load-reference
 | 
			
		||||
           { dst 2 }
 | 
			
		||||
           { obj B{ 0 0 0 0 0 0 224 63 0 0 0 0 0 0 224 63 } }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
} [
 | 
			
		||||
    [
 | 
			
		||||
        { float-4-rep double-2-rep } [ ^load-half-vector drop ] each
 | 
			
		||||
    ] V{ } make
 | 
			
		||||
] cfg-unit-test
 | 
			
		||||
 | 
			
		||||
! sign-bit-mask
 | 
			
		||||
{
 | 
			
		||||
    {
 | 
			
		||||
        B{ 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 }
 | 
			
		||||
        B{ 0 128 0 128 0 128 0 128 0 128 0 128 0 128 0 128 }
 | 
			
		||||
        B{ 0 0 0 128 0 0 0 128 0 0 0 128 0 0 0 128 }
 | 
			
		||||
        B{ 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 128 }
 | 
			
		||||
    }
 | 
			
		||||
} [
 | 
			
		||||
    { char-16-rep short-8-rep int-4-rep longlong-2-rep } [ sign-bit-mask ] map
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
! test with nonliteral/invalid reps
 | 
			
		||||
[ simple-ops-cpu [ emit-simd-v+ ] test-emit-nonliteral-rep ]
 | 
			
		||||
[ bad-simd-intrinsic? ] must-fail-with
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
! Copyright (C) 2009 Slava Pestov, Joe Groff.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors alien.c-types arrays byte-arrays combinators
 | 
			
		||||
USING: accessors alien.c-types arrays assocs byte-arrays combinators
 | 
			
		||||
combinators.short-circuit compiler.cfg.comparisons
 | 
			
		||||
compiler.cfg.hats compiler.cfg.instructions
 | 
			
		||||
compiler.cfg.intrinsics compiler.cfg.intrinsics.alien
 | 
			
		||||
| 
						 | 
				
			
			@ -13,49 +13,65 @@ IN: compiler.cfg.intrinsics.simd
 | 
			
		|||
 | 
			
		||||
! compound vector ops
 | 
			
		||||
 | 
			
		||||
CONSTANT: rep>bit-mask {
 | 
			
		||||
    {
 | 
			
		||||
        char-16-rep uchar-array{
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    {
 | 
			
		||||
        short-8-rep ushort-array{
 | 
			
		||||
            0x8000 0x8000 0x8000 0x8000
 | 
			
		||||
            0x8000 0x8000 0x8000 0x8000
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    {
 | 
			
		||||
        int-4-rep uint-array{
 | 
			
		||||
            0x8000,0000 0x8000,0000
 | 
			
		||||
            0x8000,0000 0x8000,0000
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    {
 | 
			
		||||
        longlong-2-rep ulonglong-array{
 | 
			
		||||
            0x8000,0000,0000,0000
 | 
			
		||||
            0x8000,0000,0000,0000
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
: sign-bit-mask ( rep -- byte-array )
 | 
			
		||||
    signed-rep {
 | 
			
		||||
        { char-16-rep [ uchar-array{
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
            0x80 0x80 0x80 0x80
 | 
			
		||||
        } underlying>> ] }
 | 
			
		||||
        { short-8-rep [ ushort-array{
 | 
			
		||||
            0x8000 0x8000 0x8000 0x8000
 | 
			
		||||
            0x8000 0x8000 0x8000 0x8000
 | 
			
		||||
        } underlying>> ] }
 | 
			
		||||
        { int-4-rep [ uint-array{
 | 
			
		||||
            0x8000,0000 0x8000,0000
 | 
			
		||||
            0x8000,0000 0x8000,0000
 | 
			
		||||
        } underlying>> ] }
 | 
			
		||||
        { longlong-2-rep [ ulonglong-array{
 | 
			
		||||
            0x8000,0000,0000,0000
 | 
			
		||||
            0x8000,0000,0000,0000
 | 
			
		||||
        } underlying>> ] }
 | 
			
		||||
    } case ;
 | 
			
		||||
    signed-rep rep>bit-mask at underlying>> ;
 | 
			
		||||
 | 
			
		||||
CONSTANT: rep>neg-zero {
 | 
			
		||||
    { float-4-rep float-array{ -0.0 -0.0 -0.0 -0.0 } }
 | 
			
		||||
    { double-2-rep double-array{ -0.0 -0.0 } }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
: ^load-neg-zero-vector ( rep -- dst )
 | 
			
		||||
    {
 | 
			
		||||
        { float-4-rep [ float-array{ -0.0 -0.0 -0.0 -0.0 } underlying>> ^^load-literal ] }
 | 
			
		||||
        { double-2-rep [ double-array{ -0.0 -0.0 } underlying>> ^^load-literal ] }
 | 
			
		||||
    } case ;
 | 
			
		||||
    rep>neg-zero at underlying>> ^^load-literal ;
 | 
			
		||||
 | 
			
		||||
CONSTANT: rep>add-sub {
 | 
			
		||||
    { float-4-rep float-array{ -0.0  0.0 -0.0  0.0 } }
 | 
			
		||||
    { double-2-rep double-array{ -0.0  0.0 } }
 | 
			
		||||
    { char-16-rep char-array{ -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 } }
 | 
			
		||||
    { short-8-rep short-array{ -1 0 -1 0 -1 0 -1 0 } }
 | 
			
		||||
    { int-4-rep int-array{ -1 0 -1 0 } }
 | 
			
		||||
    { longlong-2-rep longlong-array{ -1 0 } }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
: ^load-add-sub-vector ( rep -- dst )
 | 
			
		||||
    signed-rep {
 | 
			
		||||
        { float-4-rep    [ float-array{ -0.0  0.0 -0.0  0.0 } underlying>> ^^load-literal ] }
 | 
			
		||||
        { double-2-rep   [ double-array{ -0.0  0.0 } underlying>> ^^load-literal ] }
 | 
			
		||||
        { char-16-rep    [ char-array{ -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 } underlying>> ^^load-literal ] }
 | 
			
		||||
        { short-8-rep    [ short-array{ -1 0 -1 0 -1 0 -1 0 } underlying>> ^^load-literal ] }
 | 
			
		||||
        { int-4-rep      [ int-array{ -1 0 -1 0 } underlying>> ^^load-literal ] }
 | 
			
		||||
        { longlong-2-rep [ longlong-array{ -1 0 } underlying>> ^^load-literal ] }
 | 
			
		||||
    } case ;
 | 
			
		||||
    signed-rep rep>add-sub at underlying>> ^^load-literal ;
 | 
			
		||||
 | 
			
		||||
CONSTANT: rep>half {
 | 
			
		||||
    { float-4-rep float-array{  0.5 0.5 0.5 0.5 } }
 | 
			
		||||
    { double-2-rep double-array{ 0.5 0.5 } }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
: ^load-half-vector ( rep -- dst )
 | 
			
		||||
    {
 | 
			
		||||
        { float-4-rep  [ float-array{  0.5 0.5 0.5 0.5 } underlying>> ^^load-literal ] }
 | 
			
		||||
        { double-2-rep [ double-array{ 0.5 0.5 }         underlying>> ^^load-literal ] }
 | 
			
		||||
    } case ;
 | 
			
		||||
    rep>half at underlying>> ^^load-literal ;
 | 
			
		||||
 | 
			
		||||
: >variable-shuffle ( shuffle rep -- shuffle' )
 | 
			
		||||
    rep-component-type heap-size
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue