Use ##local-allot to simplify longlong unboxing
parent
0a0ebcd71d
commit
91cd3b854d
|
@ -114,12 +114,10 @@ M: #alien-invoke emit-node
|
||||||
M:: #alien-indirect emit-node ( node -- )
|
M:: #alien-indirect emit-node ( node -- )
|
||||||
node [
|
node [
|
||||||
D 0 ^^peek -1 ##inc-d ^^unbox-any-c-ptr :> src
|
D 0 ^^peek -1 ##inc-d ^^unbox-any-c-ptr :> src
|
||||||
{
|
[ caller-parameters src ##alien-indirect ]
|
||||||
[ caller-parameters ]
|
|
||||||
[ drop src ##alien-indirect ]
|
|
||||||
[ emit-stack-frame ]
|
[ emit-stack-frame ]
|
||||||
[ box-return* ]
|
[ box-return* ]
|
||||||
} cleave
|
tri
|
||||||
] emit-alien-block ;
|
] emit-alien-block ;
|
||||||
|
|
||||||
M: #alien-assembly emit-node
|
M: #alien-assembly emit-node
|
||||||
|
|
|
@ -49,7 +49,7 @@ M: c-type unbox
|
||||||
[ ^^unbox 1array ] [ nip f 2array 1array ] 2bi ;
|
[ ^^unbox 1array ] [ nip f 2array 1array ] 2bi ;
|
||||||
|
|
||||||
M: long-long-type unbox
|
M: long-long-type unbox
|
||||||
unboxer>> int-rep ^^unbox
|
[ 8 f ^^local-allot ] dip '[ _ unboxer>> ##unbox-long-long ] keep
|
||||||
0 cell [ int-rep f ^^load-memory-imm ] bi-curry@ bi 2array
|
0 cell [ int-rep f ^^load-memory-imm ] bi-curry@ bi 2array
|
||||||
int-rep long-long-on-stack? 2array dup 2array ;
|
int-rep long-long-on-stack? 2array dup 2array ;
|
||||||
|
|
||||||
|
|
|
@ -638,6 +638,10 @@ def: dst
|
||||||
use: src/tagged-rep
|
use: src/tagged-rep
|
||||||
literal: unboxer rep ;
|
literal: unboxer rep ;
|
||||||
|
|
||||||
|
INSN: ##unbox-long-long
|
||||||
|
use: src/tagged-rep out/int-rep
|
||||||
|
literal: unboxer ;
|
||||||
|
|
||||||
INSN: ##store-reg-param
|
INSN: ##store-reg-param
|
||||||
use: src
|
use: src
|
||||||
literal: reg rep ;
|
literal: reg rep ;
|
||||||
|
@ -870,6 +874,7 @@ hairy-clobber-insn
|
||||||
##unary-float-function
|
##unary-float-function
|
||||||
##binary-float-function
|
##binary-float-function
|
||||||
##unbox
|
##unbox
|
||||||
|
##unbox-long-long
|
||||||
##box
|
##box
|
||||||
##box-long-long
|
##box-long-long
|
||||||
##allot-byte-array ;
|
##allot-byte-array ;
|
||||||
|
|
|
@ -286,6 +286,7 @@ CONDITIONAL: ##fixnum-mul %fixnum-mul
|
||||||
|
|
||||||
! FFI
|
! FFI
|
||||||
CODEGEN: ##unbox %unbox
|
CODEGEN: ##unbox %unbox
|
||||||
|
CODEGEN: ##unbox-long-long %unbox-long-long
|
||||||
CODEGEN: ##store-reg-param %store-reg-param
|
CODEGEN: ##store-reg-param %store-reg-param
|
||||||
CODEGEN: ##store-stack-param %store-stack-param
|
CODEGEN: ##store-stack-param %store-stack-param
|
||||||
CODEGEN: ##load-reg-param %load-reg-param
|
CODEGEN: ##load-reg-param %load-reg-param
|
||||||
|
|
|
@ -580,6 +580,8 @@ HOOK: struct-return-on-stack? cpu ( -- ? )
|
||||||
! can be passed to a C function, or returned from a callback
|
! can be passed to a C function, or returned from a callback
|
||||||
HOOK: %unbox cpu ( dst src func rep -- )
|
HOOK: %unbox cpu ( dst src func rep -- )
|
||||||
|
|
||||||
|
HOOK: %unbox-long-long cpu ( src out func -- )
|
||||||
|
|
||||||
HOOK: %store-reg-param cpu ( src reg rep -- )
|
HOOK: %store-reg-param cpu ( src reg rep -- )
|
||||||
|
|
||||||
HOOK: %store-stack-param cpu ( src n rep -- )
|
HOOK: %store-stack-param cpu ( src n rep -- )
|
||||||
|
|
|
@ -154,6 +154,14 @@ M:: x86.32 %unbox ( dst src func rep -- )
|
||||||
src func call-unbox-func
|
src func call-unbox-func
|
||||||
dst rep %load-return ;
|
dst rep %load-return ;
|
||||||
|
|
||||||
|
M:: x86.32 %unbox-long-long cpu ( src out func -- )
|
||||||
|
EAX src int-rep %copy
|
||||||
|
0 stack@ EAX MOV
|
||||||
|
EAX out int-rep %copy
|
||||||
|
4 stack@ EAX MOV
|
||||||
|
8 save-vm-ptr
|
||||||
|
func f %alien-invoke ;
|
||||||
|
|
||||||
M:: x86.32 %box ( dst src func rep -- )
|
M:: x86.32 %box ( dst src func rep -- )
|
||||||
rep rep-size save-vm-ptr
|
rep rep-size save-vm-ptr
|
||||||
src rep %store-return
|
src rep %store-return
|
||||||
|
|
|
@ -36,9 +36,6 @@ struct context {
|
||||||
set-context-object primitives */
|
set-context-object primitives */
|
||||||
cell context_objects[context_object_count];
|
cell context_objects[context_object_count];
|
||||||
|
|
||||||
/* temporary area used by FFI code generation */
|
|
||||||
s64 long_long_return;
|
|
||||||
|
|
||||||
context(cell datastack_size, cell retainstack_size, cell callstack_size);
|
context(cell datastack_size, cell retainstack_size, cell callstack_size);
|
||||||
~context();
|
~context();
|
||||||
|
|
||||||
|
|
10
vm/math.cpp
10
vm/math.cpp
|
@ -491,10 +491,9 @@ s64 factor_vm::to_signed_8(cell obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_C_API s64 *to_signed_8(cell obj, factor_vm *parent)
|
VM_C_API void to_signed_8(cell obj, s64 *out, factor_vm *parent)
|
||||||
{
|
{
|
||||||
parent->ctx->long_long_return = parent->to_signed_8(obj);
|
*out = parent->to_signed_8(obj);
|
||||||
return &parent->ctx->long_long_return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cell factor_vm::from_unsigned_8(u64 n)
|
cell factor_vm::from_unsigned_8(u64 n)
|
||||||
|
@ -525,10 +524,9 @@ u64 factor_vm::to_unsigned_8(cell obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_C_API s64 *to_unsigned_8(cell obj, factor_vm *parent)
|
VM_C_API void to_unsigned_8(cell obj, u64 *out, factor_vm *parent)
|
||||||
{
|
{
|
||||||
parent->ctx->long_long_return = parent->to_unsigned_8(obj);
|
*out = parent->to_unsigned_8(obj);
|
||||||
return &parent->ctx->long_long_return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_C_API cell from_float(float flo, factor_vm *parent)
|
VM_C_API cell from_float(float flo, factor_vm *parent)
|
||||||
|
|
|
@ -90,8 +90,8 @@ VM_C_API cell from_unsigned_cell(cell integer, factor_vm *vm);
|
||||||
VM_C_API cell from_signed_8(s64 n, factor_vm *vm);
|
VM_C_API cell from_signed_8(s64 n, factor_vm *vm);
|
||||||
VM_C_API cell from_unsigned_8(u64 n, factor_vm *vm);
|
VM_C_API cell from_unsigned_8(u64 n, factor_vm *vm);
|
||||||
|
|
||||||
VM_C_API s64 *to_signed_8(cell obj, factor_vm *vm);
|
VM_C_API void to_signed_8(cell obj, s64 *out, factor_vm *parent);
|
||||||
VM_C_API s64 *to_unsigned_8(cell obj, factor_vm *vm);
|
VM_C_API void to_unsigned_8(cell obj, u64 *out, factor_vm *parent);
|
||||||
|
|
||||||
VM_C_API fixnum to_fixnum(cell tagged, factor_vm *vm);
|
VM_C_API fixnum to_fixnum(cell tagged, factor_vm *vm);
|
||||||
VM_C_API cell to_cell(cell tagged, factor_vm *vm);
|
VM_C_API cell to_cell(cell tagged, factor_vm *vm);
|
||||||
|
|
Loading…
Reference in New Issue