Add alien-assembly form for inline assembler, works like alien-invoke except calls a user-supplied quotation instead of generating a subroutine call. Replaces FPU status control, SSE detection and read timestamp routines in vm/cpu-x86.*S
							parent
							
								
									44a604fdbe
								
							
						
					
					
						commit
						235f3238f5
					
				| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2008, 2009 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2008, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: namespaces accessors math.order assocs kernel sequences
 | 
			
		||||
combinators make classes words cpu.architecture layouts
 | 
			
		||||
| 
						 | 
				
			
			@ -17,6 +17,7 @@ GENERIC: compute-stack-frame* ( insn -- )
 | 
			
		|||
UNION: stack-frame-insn
 | 
			
		||||
    ##alien-invoke
 | 
			
		||||
    ##alien-indirect
 | 
			
		||||
    ##alien-assembly
 | 
			
		||||
    ##alien-callback ;
 | 
			
		||||
 | 
			
		||||
M: stack-frame-insn compute-stack-frame*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -236,6 +236,9 @@ M: #alien-invoke emit-node
 | 
			
		|||
M: #alien-indirect emit-node
 | 
			
		||||
    [ ##alien-indirect ] emit-alien-node ;
 | 
			
		||||
 | 
			
		||||
M: #alien-assembly emit-node
 | 
			
		||||
    [ ##alien-assembly ] emit-alien-node ;
 | 
			
		||||
 | 
			
		||||
M: #alien-callback emit-node
 | 
			
		||||
    dup params>> xt>> dup
 | 
			
		||||
    [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -671,6 +671,9 @@ literal: params stack-frame ;
 | 
			
		|||
INSN: ##alien-indirect
 | 
			
		||||
literal: params stack-frame ;
 | 
			
		||||
 | 
			
		||||
INSN: ##alien-assembly
 | 
			
		||||
literal: params stack-frame ;
 | 
			
		||||
 | 
			
		||||
INSN: ##alien-callback
 | 
			
		||||
literal: params stack-frame ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2009 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2009, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors combinators.short-circuit
 | 
			
		||||
compiler.cfg.instructions compiler.cfg.registers
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +14,7 @@ IN: compiler.cfg.save-contexts
 | 
			
		|||
            [ ##binary-float-function? ]
 | 
			
		||||
            [ ##alien-invoke? ]
 | 
			
		||||
            [ ##alien-indirect? ]
 | 
			
		||||
            [ ##alien-assembly? ]
 | 
			
		||||
        } 1||
 | 
			
		||||
    ] any? ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -436,6 +436,16 @@ M: ##alien-invoke generate-insn
 | 
			
		|||
    dup %cleanup
 | 
			
		||||
    box-return* ;
 | 
			
		||||
 | 
			
		||||
M: ##alien-assembly generate-insn
 | 
			
		||||
    params>>
 | 
			
		||||
    ! Unbox parameters
 | 
			
		||||
    dup objects>registers
 | 
			
		||||
    %prepare-var-args
 | 
			
		||||
    ! Generate assembly
 | 
			
		||||
    dup quot>> call( -- )
 | 
			
		||||
    ! Box return value
 | 
			
		||||
    box-return* ;
 | 
			
		||||
 | 
			
		||||
! ##alien-indirect
 | 
			
		||||
M: ##alien-indirect generate-insn
 | 
			
		||||
    params>>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -591,3 +591,8 @@ FUNCTION: short ffi_test_48 ( bool-field-test x ) ;
 | 
			
		|||
FUNCTION: void this_does_not_exist ( ) ;
 | 
			
		||||
 | 
			
		||||
[ this_does_not_exist ] [ { "kernel-error" 9 f f } = ] must-fail-with
 | 
			
		||||
 | 
			
		||||
! More alien-assembly tests are in cpu.* vocabs
 | 
			
		||||
: assembly-test-1 ( -- ) void { } "cdecl" [ ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
[ ] [ assembly-test-1 ] unit-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2006, 2009 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2006, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: kernel assocs match fry accessors namespaces make effects
 | 
			
		||||
sequences sequences.private quotations generic macros arrays
 | 
			
		||||
| 
						 | 
				
			
			@ -126,6 +126,8 @@ M: #alien-invoke node>quot params>> , \ #alien-invoke , ;
 | 
			
		|||
 | 
			
		||||
M: #alien-indirect node>quot params>> , \ #alien-indirect , ;
 | 
			
		||||
 | 
			
		||||
M: #alien-assembly node>quot params>> , \ #alien-assembly , ;
 | 
			
		||||
 | 
			
		||||
M: #alien-callback node>quot params>> , \ #alien-callback , ;
 | 
			
		||||
 | 
			
		||||
M: node node>quot drop ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2004, 2008 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2004, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: fry arrays generic assocs kernel math namespaces parser
 | 
			
		||||
sequences words vectors math.intervals classes
 | 
			
		||||
| 
						 | 
				
			
			@ -149,6 +149,11 @@ TUPLE: #alien-indirect < #alien-node in-d out-d ;
 | 
			
		|||
: #alien-indirect ( params -- node )
 | 
			
		||||
    \ #alien-indirect new-alien-node ;
 | 
			
		||||
 | 
			
		||||
TUPLE: #alien-assembly < #alien-node in-d out-d ;
 | 
			
		||||
 | 
			
		||||
: #alien-assembly ( params -- node )
 | 
			
		||||
    \ #alien-assembly new-alien-node ;
 | 
			
		||||
 | 
			
		||||
TUPLE: #alien-callback < node params ;
 | 
			
		||||
 | 
			
		||||
: #alien-callback ( params -- node )
 | 
			
		||||
| 
						 | 
				
			
			@ -187,4 +192,5 @@ M: vector #recursive, #recursive node, ;
 | 
			
		|||
M: vector #copy, #copy node, ;
 | 
			
		||||
M: vector #alien-invoke, #alien-invoke node, ;
 | 
			
		||||
M: vector #alien-indirect, #alien-indirect node, ;
 | 
			
		||||
M: vector #alien-assembly, #alien-assembly node, ;
 | 
			
		||||
M: vector #alien-callback, #alien-callback node, ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -375,6 +375,7 @@ PRIVATE>
 | 
			
		|||
: NOP ( -- ) HEX: 90 , ;
 | 
			
		||||
: PAUSE ( -- ) HEX: f3 , HEX: 90 , ;
 | 
			
		||||
 | 
			
		||||
: RDTSC ( -- ) HEX: 0f , HEX: 31 , ;
 | 
			
		||||
: RDPMC ( -- ) HEX: 0f , HEX: 33 , ;
 | 
			
		||||
 | 
			
		||||
! x87 Floating Point Unit
 | 
			
		||||
| 
						 | 
				
			
			@ -386,8 +387,10 @@ PRIVATE>
 | 
			
		|||
: FLDL ( operand -- ) { BIN: 000 f HEX: dd } 1-operand ;
 | 
			
		||||
 | 
			
		||||
: FNSTCW ( operand -- ) { BIN: 111 f HEX: d9 } 1-operand ;
 | 
			
		||||
: FNSTSW ( operand -- ) { BIN: 111 f HEX: dd } 1-operand ;
 | 
			
		||||
: FLDCW ( operand -- ) { BIN: 101 f HEX: d9 } 1-operand ;
 | 
			
		||||
 | 
			
		||||
: FNCLEX ( -- ) HEX: db , HEX: e2 , ;
 | 
			
		||||
: FNINIT ( -- ) HEX: db , HEX: e3 , ;
 | 
			
		||||
 | 
			
		||||
! SSE multimedia instructions
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,21 +1,78 @@
 | 
			
		|||
! Copyright (C) 2009 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2009, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: system kernel memoize math math.order math.parser
 | 
			
		||||
namespaces alien.c-types alien.syntax combinators locals init io
 | 
			
		||||
compiler compiler.units accessors ;
 | 
			
		||||
USING: accessors alien alien.c-types combinators compiler
 | 
			
		||||
compiler.codegen.fixup compiler.units cpu.architecture
 | 
			
		||||
cpu.x86.assembler cpu.x86.assembler.operands init io kernel
 | 
			
		||||
locals math math.order math.parser memoize namespaces system ;
 | 
			
		||||
IN: cpu.x86.features
 | 
			
		||||
 | 
			
		||||
<PRIVATE
 | 
			
		||||
 | 
			
		||||
FUNCTION: int sse_version ( ) ;
 | 
			
		||||
: (sse-version) ( -- n )
 | 
			
		||||
    int { } "cdecl" [
 | 
			
		||||
        "sse-42" define-label
 | 
			
		||||
        "sse-41" define-label
 | 
			
		||||
        "ssse-3" define-label
 | 
			
		||||
        "sse-3" define-label
 | 
			
		||||
        "sse-2" define-label
 | 
			
		||||
        "sse-1" define-label
 | 
			
		||||
        "end" define-label
 | 
			
		||||
 | 
			
		||||
FUNCTION: longlong read_timestamp_counter ( ) ;
 | 
			
		||||
        int-regs return-reg 1 MOV
 | 
			
		||||
 | 
			
		||||
        CPUID
 | 
			
		||||
 | 
			
		||||
        ECX HEX: 100000 TEST
 | 
			
		||||
        "sse-42" get JNE
 | 
			
		||||
 | 
			
		||||
        ECX HEX: 80000 TEST
 | 
			
		||||
        "sse-41" get JNE
 | 
			
		||||
 | 
			
		||||
        ECX HEX: 200 TEST
 | 
			
		||||
        "ssse-3" get JNE
 | 
			
		||||
 | 
			
		||||
        ECX HEX: 1 TEST
 | 
			
		||||
        "sse-3" get JNE
 | 
			
		||||
 | 
			
		||||
        EDX HEX: 4000000 TEST
 | 
			
		||||
        "sse-2" get JNE
 | 
			
		||||
 | 
			
		||||
        EDX HEX: 2000000 TEST
 | 
			
		||||
        "sse-1" get JNE
 | 
			
		||||
 | 
			
		||||
        int-regs return-reg 0 MOV
 | 
			
		||||
        "end" get JMP
 | 
			
		||||
 | 
			
		||||
        "sse-42" resolve-label
 | 
			
		||||
        int-regs return-reg 42 MOV
 | 
			
		||||
        "end" get JMP
 | 
			
		||||
 | 
			
		||||
        "sse-41" resolve-label
 | 
			
		||||
        int-regs return-reg 41 MOV
 | 
			
		||||
        "end" get JMP
 | 
			
		||||
 | 
			
		||||
        "ssse-3" resolve-label
 | 
			
		||||
        int-regs return-reg 33 MOV
 | 
			
		||||
        "end" get JMP
 | 
			
		||||
 | 
			
		||||
        "sse-3" resolve-label
 | 
			
		||||
        int-regs return-reg 30 MOV
 | 
			
		||||
        "end" get JMP
 | 
			
		||||
 | 
			
		||||
        "sse-2" resolve-label
 | 
			
		||||
        int-regs return-reg 20 MOV
 | 
			
		||||
        "end" get JMP
 | 
			
		||||
 | 
			
		||||
        "sse-1" resolve-label
 | 
			
		||||
        int-regs return-reg 10 MOV
 | 
			
		||||
 | 
			
		||||
        "end" resolve-label
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
PRIVATE>
 | 
			
		||||
 | 
			
		||||
MEMO: sse-version ( -- n )
 | 
			
		||||
    sse_version
 | 
			
		||||
    "sse-version" get string>number [ min ] when* ;
 | 
			
		||||
    (sse-version) "sse-version" get string>number [ min ] when* ;
 | 
			
		||||
 | 
			
		||||
[ \ sse-version reset-memoized ] "cpu.x86.features" add-startup-hook
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +96,18 @@ MEMO: sse-version ( -- n )
 | 
			
		|||
 | 
			
		||||
HOOK: instruction-count cpu ( -- n )
 | 
			
		||||
 | 
			
		||||
M: x86 instruction-count read_timestamp_counter ;
 | 
			
		||||
M: x86.32 instruction-count
 | 
			
		||||
    longlong { } "cdecl" [
 | 
			
		||||
        RDTSC
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
M: x86.64 instruction-count
 | 
			
		||||
    longlong { } "cdecl" [
 | 
			
		||||
        RAX 0 MOV
 | 
			
		||||
        RDTSC
 | 
			
		||||
        RDX 32 SHL
 | 
			
		||||
        RAX RDX OR
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
: count-instructions ( quot -- n )
 | 
			
		||||
    instruction-count [ call ] dip instruction-count swap - ; inline
 | 
			
		||||
    instruction-count [ call instruction-count ] dip - ; inline
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
USING: accessors alien.c-types alien.syntax arrays assocs
 | 
			
		||||
biassocs classes.struct combinators cpu.x86.features kernel
 | 
			
		||||
literals math math.bitwise math.floats.env
 | 
			
		||||
USING: accessors alien alien.c-types alien.syntax arrays assocs
 | 
			
		||||
biassocs classes.struct combinators cpu.x86.64
 | 
			
		||||
cpu.x86.assembler cpu.x86.assembler.operands cpu.x86.features
 | 
			
		||||
kernel literals math math.bitwise math.floats.env
 | 
			
		||||
math.floats.env.private system ;
 | 
			
		||||
IN: math.floats.env.x86
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -11,24 +12,73 @@ STRUCT: x87-env
 | 
			
		|||
    { status ushort }
 | 
			
		||||
    { control ushort } ;
 | 
			
		||||
 | 
			
		||||
! defined in the vm, cpu-x86*.S
 | 
			
		||||
FUNCTION: void get_sse_env ( sse-env* env ) ;
 | 
			
		||||
FUNCTION: void set_sse_env ( sse-env* env ) ;
 | 
			
		||||
HOOK: get-sse-env cpu ( sse-env -- )
 | 
			
		||||
HOOK: set-sse-env cpu ( sse-env -- )
 | 
			
		||||
 | 
			
		||||
FUNCTION: void get_x87_env ( x87-env* env ) ;
 | 
			
		||||
FUNCTION: void set_x87_env ( x87-env* env ) ;
 | 
			
		||||
HOOK: get-x87-env cpu ( x87-env -- )
 | 
			
		||||
HOOK: set-x87-env cpu ( x87-env -- )
 | 
			
		||||
 | 
			
		||||
! 32-bit
 | 
			
		||||
M: x86.32 get-sse-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        EAX ESP [] MOV
 | 
			
		||||
        EAX [] STMXCSR
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
M: x86.32 set-sse-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        EAX ESP [] MOV
 | 
			
		||||
        EAX [] LDMXCSR
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
M: x86.32 get-x87-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        EAX ESP [] MOV
 | 
			
		||||
        EAX [] FNSTSW
 | 
			
		||||
        EAX 2 [+] FNSTCW
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
M: x86.32 set-x87-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        EAX ESP [] MOV
 | 
			
		||||
        FNCLEX
 | 
			
		||||
        EAX 2 [+] FLDCW
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
! 64-bit
 | 
			
		||||
M: x86.64 get-sse-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        param-reg-0 [] STMXCSR
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
M: x86.64 set-sse-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        param-reg-0 [] LDMXCSR
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
M: x86.64 get-x87-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        param-reg-0 [] FNSTSW
 | 
			
		||||
        param-reg-0 2 [+] FNSTCW
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
M: x86.64 set-x87-env
 | 
			
		||||
    void { void* } "cdecl" [
 | 
			
		||||
        FNCLEX
 | 
			
		||||
        param-reg-0 2 [+] FLDCW
 | 
			
		||||
    ] alien-assembly ;
 | 
			
		||||
 | 
			
		||||
: <sse-env> ( -- sse-env )
 | 
			
		||||
    sse-env (struct) [ get_sse_env ] keep ;
 | 
			
		||||
    sse-env (struct) [ get-sse-env ] keep ;
 | 
			
		||||
 | 
			
		||||
M: sse-env (set-fp-env-register)
 | 
			
		||||
    set_sse_env ;
 | 
			
		||||
    set-sse-env ;
 | 
			
		||||
 | 
			
		||||
: <x87-env> ( -- x87-env )
 | 
			
		||||
    x87-env (struct) [ get_x87_env ] keep ;
 | 
			
		||||
    x87-env (struct) [ get-x87-env ] keep ;
 | 
			
		||||
 | 
			
		||||
M: x87-env (set-fp-env-register)
 | 
			
		||||
    set_x87_env ;
 | 
			
		||||
    set-x87-env ;
 | 
			
		||||
 | 
			
		||||
M: x86 (fp-env-registers)
 | 
			
		||||
    sse2? [ <sse-env> <x87-env> 2array ] [ <x87-env> 1array ] if ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,8 @@ TUPLE: alien-invoke-params < alien-node-params library function ;
 | 
			
		|||
 | 
			
		||||
TUPLE: alien-indirect-params < alien-node-params ;
 | 
			
		||||
 | 
			
		||||
TUPLE: alien-assembly-params < alien-node-params quot ;
 | 
			
		||||
 | 
			
		||||
TUPLE: alien-callback-params < alien-node-params quot xt ;
 | 
			
		||||
 | 
			
		||||
: param-prep-quot ( node -- quot )
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +60,22 @@ TUPLE: alien-callback-params < alien-node-params quot xt ;
 | 
			
		|||
    ! Quotation which coerces return value to required type
 | 
			
		||||
    return-prep-quot infer-quot-here ;
 | 
			
		||||
 | 
			
		||||
: infer-alien-assembly ( -- )
 | 
			
		||||
    alien-assembly-params new
 | 
			
		||||
    ! Compile-time parameters
 | 
			
		||||
    pop-literal nip >>quot
 | 
			
		||||
    pop-literal nip >>abi
 | 
			
		||||
    pop-literal nip >>parameters
 | 
			
		||||
    pop-literal nip >>return
 | 
			
		||||
    ! Quotation which coerces parameters to required types
 | 
			
		||||
    dup param-prep-quot infer-quot-here
 | 
			
		||||
    ! Magic #: consume exactly the number of inputs
 | 
			
		||||
    dup 0 alien-stack
 | 
			
		||||
    ! Add node to IR
 | 
			
		||||
    dup #alien-assembly,
 | 
			
		||||
    ! Quotation which coerces return value to required type
 | 
			
		||||
    return-prep-quot infer-quot-here ;
 | 
			
		||||
 | 
			
		||||
: callback-xt ( word return-rewind -- alien )
 | 
			
		||||
    [ callbacks get ] dip '[ _ <callback> ] cache ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2004, 2009 Slava Pestov, Daniel Ehrenberg.
 | 
			
		||||
! Copyright (C) 2004, 2010 Slava Pestov, Daniel Ehrenberg.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: fry accessors alien alien.accessors arrays byte-arrays
 | 
			
		||||
classes continuations.private effects generic hashtables
 | 
			
		||||
| 
						 | 
				
			
			@ -228,6 +228,7 @@ M: bad-executable summary
 | 
			
		|||
 | 
			
		||||
\ alien-invoke [ infer-alien-invoke ] "special" set-word-prop
 | 
			
		||||
\ alien-indirect [ infer-alien-indirect ] "special" set-word-prop
 | 
			
		||||
\ alien-assembly [ infer-alien-assembly ] "special" set-word-prop
 | 
			
		||||
\ alien-callback [ infer-alien-callback ] "special" set-word-prop
 | 
			
		||||
 | 
			
		||||
: infer-special ( word -- )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2008 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2008, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: stack-checker.visitor kernel ;
 | 
			
		||||
IN: stack-checker.visitor.dummy
 | 
			
		||||
| 
						 | 
				
			
			@ -24,4 +24,5 @@ M: f #copy, 2drop ;
 | 
			
		|||
M: f #drop, drop ;
 | 
			
		||||
M: f #alien-invoke, drop ;
 | 
			
		||||
M: f #alien-indirect, drop ;
 | 
			
		||||
M: f #alien-assembly, drop ;
 | 
			
		||||
M: f #alien-callback, drop ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2008 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2008, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: kernel arrays namespaces ;
 | 
			
		||||
IN: stack-checker.visitor
 | 
			
		||||
| 
						 | 
				
			
			@ -29,4 +29,5 @@ HOOK: #recursive, stack-visitor ( label inputs visitor -- )
 | 
			
		|||
HOOK: #copy, stack-visitor ( inputs outputs -- )
 | 
			
		||||
HOOK: #alien-invoke, stack-visitor ( params -- )
 | 
			
		||||
HOOK: #alien-indirect, stack-visitor ( params -- )
 | 
			
		||||
HOOK: #alien-assembly, stack-visitor ( params -- )
 | 
			
		||||
HOOK: #alien-callback, stack-visitor ( params -- )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
! Copyright (C) 2004, 2009 Slava Pestov.
 | 
			
		||||
! Copyright (C) 2004, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors assocs kernel math namespaces sequences system
 | 
			
		||||
kernel.private byte-arrays arrays init ;
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ ERROR: alien-callback-error ;
 | 
			
		|||
 | 
			
		||||
ERROR: alien-indirect-error ;
 | 
			
		||||
 | 
			
		||||
: alien-indirect ( ... funcptr return parameters abi -- )
 | 
			
		||||
: alien-indirect ( ... funcptr return parameters abi -- ... )
 | 
			
		||||
    alien-indirect-error ;
 | 
			
		||||
 | 
			
		||||
ERROR: alien-invoke-error library symbol ;
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +57,11 @@ ERROR: alien-invoke-error library symbol ;
 | 
			
		|||
: alien-invoke ( ... return library function parameters -- ... )
 | 
			
		||||
    2over alien-invoke-error ;
 | 
			
		||||
 | 
			
		||||
ERROR: alien-assembly-error code ;
 | 
			
		||||
 | 
			
		||||
: alien-assembly ( ... return library parameters abi quot -- ... )
 | 
			
		||||
    dup alien-assembly-error ;
 | 
			
		||||
 | 
			
		||||
! Callbacks are registered in a global hashtable. Note that they
 | 
			
		||||
! are also pinned in a special callback area, so clearing this
 | 
			
		||||
! hashtable will not reclaim callbacks. It should only be
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +1 @@
 | 
			
		|||
BOOT_ARCH = x86
 | 
			
		||||
PLAF_DLL_OBJS += vm/cpu-x86.32.o
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +1 @@
 | 
			
		|||
PLAF_DLL_OBJS += vm/cpu-x86.64.o
 | 
			
		||||
CFLAGS += -DFACTOR_64
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,40 +0,0 @@
 | 
			
		|||
#include "asm.h"
 | 
			
		||||
 | 
			
		||||
#define RETURN_REG %eax
 | 
			
		||||
 | 
			
		||||
DEF(long long,read_timestamp_counter,(void)):
 | 
			
		||||
	rdtsc
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,get_sse_env,(void*)):
 | 
			
		||||
	movl 4(%esp), %eax
 | 
			
		||||
	stmxcsr (%eax)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,set_sse_env,(const void*)):
 | 
			
		||||
	movl 4(%esp), %eax
 | 
			
		||||
	ldmxcsr (%eax)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,get_x87_env,(void*)):
 | 
			
		||||
	movl 4(%esp), %eax
 | 
			
		||||
	fnstsw (%eax)
 | 
			
		||||
	fnstcw 2(%eax)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,set_x87_env,(const void*)):
 | 
			
		||||
	movl 4(%esp), %eax
 | 
			
		||||
	fnclex
 | 
			
		||||
	fldcw 2(%eax)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
#include "cpu-x86.S"
 | 
			
		||||
 | 
			
		||||
#ifdef WINDOWS
 | 
			
		||||
	.section .drectve
 | 
			
		||||
	.ascii " -export:read_timestamp_counter"
 | 
			
		||||
	.ascii " -export:get_sse_env"
 | 
			
		||||
	.ascii " -export:set_sse_env"
 | 
			
		||||
	.ascii " -export:get_x87_env"
 | 
			
		||||
	.ascii " -export:set_x87_env"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,30 +0,0 @@
 | 
			
		|||
#include "asm.h"
 | 
			
		||||
 | 
			
		||||
DEF(long long,read_timestamp_counter,(void)):
 | 
			
		||||
	mov $0,%rax
 | 
			
		||||
	rdtsc
 | 
			
		||||
	shl $32,%rdx
 | 
			
		||||
	or %rdx,%rax
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,get_sse_env,(void*)):
 | 
			
		||||
	stmxcsr (%rdi)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,set_sse_env,(const void*)):
 | 
			
		||||
	ldmxcsr (%rdi)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,get_x87_env,(void*)):
 | 
			
		||||
	fnstsw (%rdi)
 | 
			
		||||
	fnstcw 2(%rdi)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
DEF(void,set_x87_env,(const void*)):
 | 
			
		||||
	fnclex
 | 
			
		||||
	fldcw 2(%rdi)
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
#define RETURN_REG %rax
 | 
			
		||||
	
 | 
			
		||||
#include "cpu-x86.S"
 | 
			
		||||
							
								
								
									
										41
									
								
								vm/cpu-x86.S
								
								
								
								
							
							
						
						
									
										41
									
								
								vm/cpu-x86.S
								
								
								
								
							| 
						 | 
				
			
			@ -1,41 +0,0 @@
 | 
			
		|||
/* cpu.x86.features calls this */
 | 
			
		||||
DEF(bool,sse_version,(void)):
 | 
			
		||||
	mov $0x1,RETURN_REG
 | 
			
		||||
	cpuid
 | 
			
		||||
	test $0x100000,%ecx
 | 
			
		||||
	jnz sse_42
 | 
			
		||||
	test $0x80000,%ecx
 | 
			
		||||
	jnz sse_41
 | 
			
		||||
	test $0x200,%ecx
 | 
			
		||||
	jnz ssse_3
 | 
			
		||||
	test $0x1,%ecx
 | 
			
		||||
	jnz sse_3
 | 
			
		||||
	test $0x4000000,%edx
 | 
			
		||||
	jnz sse_2
 | 
			
		||||
	test $0x2000000,%edx
 | 
			
		||||
	jnz sse_1
 | 
			
		||||
	mov $0,%eax
 | 
			
		||||
	ret
 | 
			
		||||
sse_42:
 | 
			
		||||
	mov $42,RETURN_REG
 | 
			
		||||
	ret
 | 
			
		||||
sse_41:
 | 
			
		||||
	mov $41,RETURN_REG
 | 
			
		||||
	ret
 | 
			
		||||
ssse_3:
 | 
			
		||||
	mov $33,RETURN_REG
 | 
			
		||||
	ret
 | 
			
		||||
sse_3:
 | 
			
		||||
	mov $30,RETURN_REG
 | 
			
		||||
	ret
 | 
			
		||||
sse_2:
 | 
			
		||||
	mov $20,RETURN_REG
 | 
			
		||||
	ret
 | 
			
		||||
sse_1:
 | 
			
		||||
	mov $10,RETURN_REG
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
#ifdef WINDOWS
 | 
			
		||||
	.section .drectve
 | 
			
		||||
	.ascii " -export:sse_version"
 | 
			
		||||
#endif
 | 
			
		||||
		Loading…
	
		Reference in New Issue