factor/basis/compiler/cfg/intrinsics/intrinsics.factor

144 lines
6.9 KiB
Factor
Raw Normal View History

2010-04-21 03:08:52 -04:00
! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
2014-12-13 19:10:21 -05:00
USING: assocs compiler.cfg.comparisons compiler.cfg.hats
compiler.cfg.intrinsics.alien compiler.cfg.intrinsics.allot
compiler.cfg.intrinsics.fixnum compiler.cfg.intrinsics.float
compiler.cfg.intrinsics.misc compiler.cfg.intrinsics.slots
compiler.cfg.intrinsics.strings compiler.cfg.stacks
cpu.architecture kernel words ;
QUALIFIED: alien
QUALIFIED: alien.accessors
QUALIFIED: alien.c-types
2014-12-13 19:10:21 -05:00
QUALIFIED: alien.data.private
2008-10-20 21:46:47 -04:00
QUALIFIED: arrays
QUALIFIED: byte-arrays
QUALIFIED: classes.tuple.private
2014-12-13 19:10:21 -05:00
QUALIFIED: kernel.private
QUALIFIED: math.bitwise.private
QUALIFIED: math.floats.private
2014-12-13 19:10:21 -05:00
QUALIFIED: math.integers.private
QUALIFIED: math.libm
2014-12-13 19:10:21 -05:00
QUALIFIED: math.private
QUALIFIED: slots.private
QUALIFIED: strings.private
IN: compiler.cfg.intrinsics
ERROR: inline-intrinsics-not-supported word quot ;
: enable-intrinsics ( alist -- )
[
over inline? [ inline-intrinsics-not-supported ] when
"intrinsic" set-word-prop
] assoc-each ;
{
2017-12-29 02:31:02 -05:00
{ kernel.private::tag [ drop emit-tag ] }
{ kernel.private::context-object [ emit-context-object ] }
{ kernel.private::special-object [ emit-special-object ] }
{ kernel.private::set-special-object [ emit-set-special-object ] }
{ kernel.private::(identity-hashcode) [ drop emit-identity-hashcode ] }
{ math.private::both-fixnums? [ drop emit-both-fixnums? ] }
{ math.private::fixnum+ [ drop emit-fixnum+ ] }
{ math.private::fixnum- [ drop emit-fixnum- ] }
{ math.private::fixnum* [ drop emit-fixnum* ] }
{ math.private::fixnum+fast [ drop [ ^^add ] binary-op ] }
{ math.private::fixnum-fast [ drop [ ^^sub ] binary-op ] }
{ math.private::fixnum*fast [ drop [ ^^mul ] binary-op ] }
{ math.private::fixnum-bitand [ drop [ ^^and ] binary-op ] }
{ math.private::fixnum-bitor [ drop [ ^^or ] binary-op ] }
{ math.private::fixnum-bitxor [ drop [ ^^xor ] binary-op ] }
{ math.private::fixnum-shift-fast [ emit-fixnum-shift-fast ] }
{ math.private::fixnum-bitnot [ drop [ ^^not ] unary-op ] }
{ math.private::fixnum< [ drop cc< emit-fixnum-comparison ] }
{ math.private::fixnum<= [ drop cc<= emit-fixnum-comparison ] }
{ math.private::fixnum>= [ drop cc>= emit-fixnum-comparison ] }
{ math.private::fixnum> [ drop cc> emit-fixnum-comparison ] }
{ kernel::eq? [ emit-eq ] }
{ slots.private::slot [ emit-slot ] }
{ slots.private::set-slot [ emit-set-slot ] }
{ strings.private::string-nth-fast [ drop emit-string-nth-fast ] }
{ strings.private::set-string-nth-fast [ drop emit-set-string-nth-fast ] }
{ classes.tuple.private::<tuple-boa> [ emit-<tuple-boa> ] }
{ arrays::<array> [ emit-<array> ] }
{ byte-arrays::<byte-array> [ emit-<byte-array> ] }
{ byte-arrays::(byte-array) [ emit-(byte-array) ] }
{ kernel::<wrapper> [ emit-simple-allot ] }
{ alien.data.private::(local-allot) [ emit-local-allot ] }
{ alien.data.private::(cleanup-allot) [ emit-cleanup-allot ] }
{ alien::<displaced-alien> [ emit-<displaced-alien> ] }
{ alien.accessors::alien-unsigned-1 [ int-rep alien.c-types::uchar emit-load-memory ] }
{ alien.accessors::set-alien-unsigned-1 [ int-rep alien.c-types::uchar emit-store-memory ] }
{ alien.accessors::alien-signed-1 [ int-rep alien.c-types::char emit-load-memory ] }
{ alien.accessors::set-alien-signed-1 [ int-rep alien.c-types::char emit-store-memory ] }
{ alien.accessors::alien-unsigned-2 [ int-rep alien.c-types::ushort emit-load-memory ] }
{ alien.accessors::set-alien-unsigned-2 [ int-rep alien.c-types::ushort emit-store-memory ] }
{ alien.accessors::alien-signed-2 [ int-rep alien.c-types::short emit-load-memory ] }
{ alien.accessors::set-alien-signed-2 [ int-rep alien.c-types::short emit-store-memory ] }
{ alien.accessors::alien-cell [ emit-alien-cell ] }
{ alien.accessors::set-alien-cell [ emit-set-alien-cell ] }
} enable-intrinsics
: enable-alien-4-intrinsics ( -- )
{
2017-12-29 02:31:02 -05:00
{ alien.accessors::alien-signed-4 [ int-rep alien.c-types::int emit-load-memory ] }
{ alien.accessors::set-alien-signed-4 [ int-rep alien.c-types::int emit-store-memory ] }
{ alien.accessors::alien-unsigned-4 [ int-rep alien.c-types::uint emit-load-memory ] }
{ alien.accessors::set-alien-unsigned-4 [ int-rep alien.c-types::uint emit-store-memory ] }
} enable-intrinsics ;
: enable-float-intrinsics ( -- )
{
2017-12-29 02:31:02 -05:00
{ math.private::float+ [ drop [ ^^add-float ] binary-op ] }
{ math.private::float- [ drop [ ^^sub-float ] binary-op ] }
{ math.private::float* [ drop [ ^^mul-float ] binary-op ] }
{ math.private::float/f [ drop [ ^^div-float ] binary-op ] }
{ math.private::float< [ drop cc< emit-float-ordered-comparison ] }
{ math.private::float<= [ drop cc<= emit-float-ordered-comparison ] }
{ math.private::float>= [ drop cc>= emit-float-ordered-comparison ] }
{ math.private::float> [ drop cc> emit-float-ordered-comparison ] }
{ math.private::float-u< [ drop cc< emit-float-unordered-comparison ] }
{ math.private::float-u<= [ drop cc<= emit-float-unordered-comparison ] }
{ math.private::float-u>= [ drop cc>= emit-float-unordered-comparison ] }
{ math.private::float-u> [ drop cc> emit-float-unordered-comparison ] }
{ math.private::float= [ drop cc= emit-float-unordered-comparison ] }
{ math.private::float>fixnum [ drop [ ^^float>integer ] unary-op ] }
{ math.private::fixnum>float [ drop [ ^^integer>float ] unary-op ] }
{ math.floats.private::float-unordered? [ drop cc/<>= emit-float-unordered-comparison ] }
{ alien.accessors::alien-float [ float-rep f emit-load-memory ] }
{ alien.accessors::set-alien-float [ float-rep f emit-store-memory ] }
{ alien.accessors::alien-double [ double-rep f emit-load-memory ] }
{ alien.accessors::set-alien-double [ double-rep f emit-store-memory ] }
} enable-intrinsics ;
: enable-fsqrt ( -- )
{
2017-12-29 02:31:02 -05:00
{ math.libm::fsqrt [ drop [ ^^sqrt ] unary-op ] }
} enable-intrinsics ;
: enable-float-min/max ( -- )
{
2017-12-29 02:31:02 -05:00
{ math.floats.private::float-min [ drop [ ^^min-float ] binary-op ] }
{ math.floats.private::float-max [ drop [ ^^max-float ] binary-op ] }
} enable-intrinsics ;
: enable-min/max ( -- )
{
2017-12-29 02:31:02 -05:00
{ math.integers.private::fixnum-min [ drop [ ^^min ] binary-op ] }
{ math.integers.private::fixnum-max [ drop [ ^^max ] binary-op ] }
} enable-intrinsics ;
2010-04-21 03:08:52 -04:00
: enable-log2 ( -- )
{
2017-12-29 02:31:02 -05:00
{ math.integers.private::fixnum-log2 [ drop [ ^^log2 ] unary-op ] }
} enable-intrinsics ;
: enable-bit-count ( -- )
{
2017-12-29 02:31:02 -05:00
{ math.bitwise.private::fixnum-bit-count [ drop [ ^^bit-count ] unary-op ] }
} enable-intrinsics ;
: enable-bit-test ( -- )
{
2017-12-29 02:31:02 -05:00
{ math.integers.private::fixnum-bit? [ drop [ ^^bit-test ] binary-op ] }
} enable-intrinsics ;