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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: namespaces accessors math.order assocs kernel sequences
|
USING: namespaces accessors math.order assocs kernel sequences
|
||||||
combinators make classes words cpu.architecture layouts
|
combinators make classes words cpu.architecture layouts
|
||||||
|
|
@ -17,6 +17,7 @@ GENERIC: compute-stack-frame* ( insn -- )
|
||||||
UNION: stack-frame-insn
|
UNION: stack-frame-insn
|
||||||
##alien-invoke
|
##alien-invoke
|
||||||
##alien-indirect
|
##alien-indirect
|
||||||
|
##alien-assembly
|
||||||
##alien-callback ;
|
##alien-callback ;
|
||||||
|
|
||||||
M: stack-frame-insn compute-stack-frame*
|
M: stack-frame-insn compute-stack-frame*
|
||||||
|
|
|
||||||
|
|
@ -236,6 +236,9 @@ M: #alien-invoke emit-node
|
||||||
M: #alien-indirect emit-node
|
M: #alien-indirect emit-node
|
||||||
[ ##alien-indirect ] emit-alien-node ;
|
[ ##alien-indirect ] emit-alien-node ;
|
||||||
|
|
||||||
|
M: #alien-assembly emit-node
|
||||||
|
[ ##alien-assembly ] emit-alien-node ;
|
||||||
|
|
||||||
M: #alien-callback emit-node
|
M: #alien-callback emit-node
|
||||||
dup params>> xt>> dup
|
dup params>> xt>> dup
|
||||||
[
|
[
|
||||||
|
|
|
||||||
|
|
@ -671,6 +671,9 @@ literal: params stack-frame ;
|
||||||
INSN: ##alien-indirect
|
INSN: ##alien-indirect
|
||||||
literal: params stack-frame ;
|
literal: params stack-frame ;
|
||||||
|
|
||||||
|
INSN: ##alien-assembly
|
||||||
|
literal: params stack-frame ;
|
||||||
|
|
||||||
INSN: ##alien-callback
|
INSN: ##alien-callback
|
||||||
literal: params stack-frame ;
|
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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors combinators.short-circuit
|
USING: accessors combinators.short-circuit
|
||||||
compiler.cfg.instructions compiler.cfg.registers
|
compiler.cfg.instructions compiler.cfg.registers
|
||||||
|
|
@ -14,6 +14,7 @@ IN: compiler.cfg.save-contexts
|
||||||
[ ##binary-float-function? ]
|
[ ##binary-float-function? ]
|
||||||
[ ##alien-invoke? ]
|
[ ##alien-invoke? ]
|
||||||
[ ##alien-indirect? ]
|
[ ##alien-indirect? ]
|
||||||
|
[ ##alien-assembly? ]
|
||||||
} 1||
|
} 1||
|
||||||
] any? ;
|
] any? ;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -436,6 +436,16 @@ M: ##alien-invoke generate-insn
|
||||||
dup %cleanup
|
dup %cleanup
|
||||||
box-return* ;
|
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
|
! ##alien-indirect
|
||||||
M: ##alien-indirect generate-insn
|
M: ##alien-indirect generate-insn
|
||||||
params>>
|
params>>
|
||||||
|
|
|
||||||
|
|
@ -591,3 +591,8 @@ FUNCTION: short ffi_test_48 ( bool-field-test x ) ;
|
||||||
FUNCTION: void this_does_not_exist ( ) ;
|
FUNCTION: void this_does_not_exist ( ) ;
|
||||||
|
|
||||||
[ this_does_not_exist ] [ { "kernel-error" 9 f f } = ] must-fail-with
|
[ 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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel assocs match fry accessors namespaces make effects
|
USING: kernel assocs match fry accessors namespaces make effects
|
||||||
sequences sequences.private quotations generic macros arrays
|
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-indirect node>quot params>> , \ #alien-indirect , ;
|
||||||
|
|
||||||
|
M: #alien-assembly node>quot params>> , \ #alien-assembly , ;
|
||||||
|
|
||||||
M: #alien-callback node>quot params>> , \ #alien-callback , ;
|
M: #alien-callback node>quot params>> , \ #alien-callback , ;
|
||||||
|
|
||||||
M: node node>quot drop ;
|
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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: fry arrays generic assocs kernel math namespaces parser
|
USING: fry arrays generic assocs kernel math namespaces parser
|
||||||
sequences words vectors math.intervals classes
|
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 ( params -- node )
|
||||||
\ #alien-indirect new-alien-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 ;
|
TUPLE: #alien-callback < node params ;
|
||||||
|
|
||||||
: #alien-callback ( params -- node )
|
: #alien-callback ( params -- node )
|
||||||
|
|
@ -187,4 +192,5 @@ M: vector #recursive, #recursive node, ;
|
||||||
M: vector #copy, #copy node, ;
|
M: vector #copy, #copy node, ;
|
||||||
M: vector #alien-invoke, #alien-invoke node, ;
|
M: vector #alien-invoke, #alien-invoke node, ;
|
||||||
M: vector #alien-indirect, #alien-indirect node, ;
|
M: vector #alien-indirect, #alien-indirect node, ;
|
||||||
|
M: vector #alien-assembly, #alien-assembly node, ;
|
||||||
M: vector #alien-callback, #alien-callback node, ;
|
M: vector #alien-callback, #alien-callback node, ;
|
||||||
|
|
|
||||||
|
|
@ -375,6 +375,7 @@ PRIVATE>
|
||||||
: NOP ( -- ) HEX: 90 , ;
|
: NOP ( -- ) HEX: 90 , ;
|
||||||
: PAUSE ( -- ) HEX: f3 , HEX: 90 , ;
|
: PAUSE ( -- ) HEX: f3 , HEX: 90 , ;
|
||||||
|
|
||||||
|
: RDTSC ( -- ) HEX: 0f , HEX: 31 , ;
|
||||||
: RDPMC ( -- ) HEX: 0f , HEX: 33 , ;
|
: RDPMC ( -- ) HEX: 0f , HEX: 33 , ;
|
||||||
|
|
||||||
! x87 Floating Point Unit
|
! x87 Floating Point Unit
|
||||||
|
|
@ -386,8 +387,10 @@ PRIVATE>
|
||||||
: FLDL ( operand -- ) { BIN: 000 f HEX: dd } 1-operand ;
|
: FLDL ( operand -- ) { BIN: 000 f HEX: dd } 1-operand ;
|
||||||
|
|
||||||
: FNSTCW ( operand -- ) { BIN: 111 f HEX: d9 } 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 ;
|
: FLDCW ( operand -- ) { BIN: 101 f HEX: d9 } 1-operand ;
|
||||||
|
|
||||||
|
: FNCLEX ( -- ) HEX: db , HEX: e2 , ;
|
||||||
: FNINIT ( -- ) HEX: db , HEX: e3 , ;
|
: FNINIT ( -- ) HEX: db , HEX: e3 , ;
|
||||||
|
|
||||||
! SSE multimedia instructions
|
! 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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: system kernel memoize math math.order math.parser
|
USING: accessors alien alien.c-types combinators compiler
|
||||||
namespaces alien.c-types alien.syntax combinators locals init io
|
compiler.codegen.fixup compiler.units cpu.architecture
|
||||||
compiler compiler.units accessors ;
|
cpu.x86.assembler cpu.x86.assembler.operands init io kernel
|
||||||
|
locals math math.order math.parser memoize namespaces system ;
|
||||||
IN: cpu.x86.features
|
IN: cpu.x86.features
|
||||||
|
|
||||||
<PRIVATE
|
<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>
|
PRIVATE>
|
||||||
|
|
||||||
MEMO: sse-version ( -- n )
|
MEMO: sse-version ( -- n )
|
||||||
sse_version
|
(sse-version) "sse-version" get string>number [ min ] when* ;
|
||||||
"sse-version" get string>number [ min ] when* ;
|
|
||||||
|
|
||||||
[ \ sse-version reset-memoized ] "cpu.x86.features" add-startup-hook
|
[ \ sse-version reset-memoized ] "cpu.x86.features" add-startup-hook
|
||||||
|
|
||||||
|
|
@ -39,7 +96,18 @@ MEMO: sse-version ( -- n )
|
||||||
|
|
||||||
HOOK: instruction-count cpu ( -- 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 )
|
: 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
|
USING: accessors alien alien.c-types alien.syntax arrays assocs
|
||||||
biassocs classes.struct combinators cpu.x86.features kernel
|
biassocs classes.struct combinators cpu.x86.64
|
||||||
literals math math.bitwise math.floats.env
|
cpu.x86.assembler cpu.x86.assembler.operands cpu.x86.features
|
||||||
|
kernel literals math math.bitwise math.floats.env
|
||||||
math.floats.env.private system ;
|
math.floats.env.private system ;
|
||||||
IN: math.floats.env.x86
|
IN: math.floats.env.x86
|
||||||
|
|
||||||
|
|
@ -11,24 +12,73 @@ STRUCT: x87-env
|
||||||
{ status ushort }
|
{ status ushort }
|
||||||
{ control ushort } ;
|
{ control ushort } ;
|
||||||
|
|
||||||
! defined in the vm, cpu-x86*.S
|
HOOK: get-sse-env cpu ( sse-env -- )
|
||||||
FUNCTION: void get_sse_env ( sse-env* env ) ;
|
HOOK: set-sse-env cpu ( sse-env -- )
|
||||||
FUNCTION: void set_sse_env ( sse-env* env ) ;
|
|
||||||
|
|
||||||
FUNCTION: void get_x87_env ( x87-env* env ) ;
|
HOOK: get-x87-env cpu ( x87-env -- )
|
||||||
FUNCTION: void set_x87_env ( x87-env* 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> ( -- sse-env )
|
||||||
sse-env (struct) [ get_sse_env ] keep ;
|
sse-env (struct) [ get-sse-env ] keep ;
|
||||||
|
|
||||||
M: sse-env (set-fp-env-register)
|
M: sse-env (set-fp-env-register)
|
||||||
set_sse_env ;
|
set-sse-env ;
|
||||||
|
|
||||||
: <x87-env> ( -- x87-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)
|
M: x87-env (set-fp-env-register)
|
||||||
set_x87_env ;
|
set-x87-env ;
|
||||||
|
|
||||||
M: x86 (fp-env-registers)
|
M: x86 (fp-env-registers)
|
||||||
sse2? [ <sse-env> <x87-env> 2array ] [ <x87-env> 1array ] if ;
|
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-indirect-params < alien-node-params ;
|
||||||
|
|
||||||
|
TUPLE: alien-assembly-params < alien-node-params quot ;
|
||||||
|
|
||||||
TUPLE: alien-callback-params < alien-node-params quot xt ;
|
TUPLE: alien-callback-params < alien-node-params quot xt ;
|
||||||
|
|
||||||
: param-prep-quot ( node -- quot )
|
: 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
|
! Quotation which coerces return value to required type
|
||||||
return-prep-quot infer-quot-here ;
|
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 )
|
: callback-xt ( word return-rewind -- alien )
|
||||||
[ callbacks get ] dip '[ _ <callback> ] cache ;
|
[ 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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: fry accessors alien alien.accessors arrays byte-arrays
|
USING: fry accessors alien alien.accessors arrays byte-arrays
|
||||||
classes continuations.private effects generic hashtables
|
classes continuations.private effects generic hashtables
|
||||||
|
|
@ -228,6 +228,7 @@ M: bad-executable summary
|
||||||
|
|
||||||
\ alien-invoke [ infer-alien-invoke ] "special" set-word-prop
|
\ alien-invoke [ infer-alien-invoke ] "special" set-word-prop
|
||||||
\ alien-indirect [ infer-alien-indirect ] "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
|
\ alien-callback [ infer-alien-callback ] "special" set-word-prop
|
||||||
|
|
||||||
: infer-special ( word -- )
|
: 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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: stack-checker.visitor kernel ;
|
USING: stack-checker.visitor kernel ;
|
||||||
IN: stack-checker.visitor.dummy
|
IN: stack-checker.visitor.dummy
|
||||||
|
|
@ -24,4 +24,5 @@ M: f #copy, 2drop ;
|
||||||
M: f #drop, drop ;
|
M: f #drop, drop ;
|
||||||
M: f #alien-invoke, drop ;
|
M: f #alien-invoke, drop ;
|
||||||
M: f #alien-indirect, drop ;
|
M: f #alien-indirect, drop ;
|
||||||
|
M: f #alien-assembly, drop ;
|
||||||
M: f #alien-callback, 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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel arrays namespaces ;
|
USING: kernel arrays namespaces ;
|
||||||
IN: stack-checker.visitor
|
IN: stack-checker.visitor
|
||||||
|
|
@ -29,4 +29,5 @@ HOOK: #recursive, stack-visitor ( label inputs visitor -- )
|
||||||
HOOK: #copy, stack-visitor ( inputs outputs -- )
|
HOOK: #copy, stack-visitor ( inputs outputs -- )
|
||||||
HOOK: #alien-invoke, stack-visitor ( params -- )
|
HOOK: #alien-invoke, stack-visitor ( params -- )
|
||||||
HOOK: #alien-indirect, stack-visitor ( params -- )
|
HOOK: #alien-indirect, stack-visitor ( params -- )
|
||||||
|
HOOK: #alien-assembly, stack-visitor ( params -- )
|
||||||
HOOK: #alien-callback, 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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors assocs kernel math namespaces sequences system
|
USING: accessors assocs kernel math namespaces sequences system
|
||||||
kernel.private byte-arrays arrays init ;
|
kernel.private byte-arrays arrays init ;
|
||||||
|
|
@ -49,7 +49,7 @@ ERROR: alien-callback-error ;
|
||||||
|
|
||||||
ERROR: alien-indirect-error ;
|
ERROR: alien-indirect-error ;
|
||||||
|
|
||||||
: alien-indirect ( ... funcptr return parameters abi -- )
|
: alien-indirect ( ... funcptr return parameters abi -- ... )
|
||||||
alien-indirect-error ;
|
alien-indirect-error ;
|
||||||
|
|
||||||
ERROR: alien-invoke-error library symbol ;
|
ERROR: alien-invoke-error library symbol ;
|
||||||
|
|
@ -57,6 +57,11 @@ ERROR: alien-invoke-error library symbol ;
|
||||||
: alien-invoke ( ... return library function parameters -- ... )
|
: alien-invoke ( ... return library function parameters -- ... )
|
||||||
2over alien-invoke-error ;
|
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
|
! Callbacks are registered in a global hashtable. Note that they
|
||||||
! are also pinned in a special callback area, so clearing this
|
! are also pinned in a special callback area, so clearing this
|
||||||
! hashtable will not reclaim callbacks. It should only be
|
! 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
|
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