--- gforth/prim 2005/09/27 13:50:43 1.177 +++ gforth/prim 2005/12/31 15:46:10 1.184 @@ -1,6 +1,6 @@ \ Gforth primitives -\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005 Free Software Foundation, Inc. \ This file is part of Gforth. @@ -2444,6 +2444,24 @@ FP=fp; sp=(Cell*)(SYSCALL(Cell*(*)(Cell *, void *))u)(sp, &FP); fp=FP; +w@ ( a_addr -- u ) gforth wfetch +u = *(UWyde*)(a_addr); + +sw@ ( a_addr -- u ) gforth swfetch +u = *(Wyde*)(a_addr); + +w! ( u a_addr -- ) gforth wstore +*(Wyde*)(a_addr) = u; + +l@ ( a_addr -- u ) gforth lfetch +u = *(UTetrabyte*)(a_addr); + +sl@ ( a_addr -- u ) gforth slfetch +u = *(Tetrabyte*)(a_addr); + +l! ( u a_addr -- ) gforth lstore +*(Tetrabyte*)(a_addr) = u; + \+FFCALL av-start-void ( c_addr -- ) gforth av_start_void @@ -2639,7 +2657,9 @@ ffi-prep-cif ( a_atypes n a_rtype a_cif w = ffi_prep_cif(a_cif, FFI_DEFAULT_ABI, n, a_rtype, a_atypes); ffi-call ( a_avalues a_rvalue a_ip a_cif -- ) gforth ffi_call +SAVE_REGS ffi_call(a_cif, a_ip, a_rvalue, a_avalues); +REST_REGS ffi-prep-closure ( a_ip a_cif a_closure -- w ) gforth ffi_prep_closure w = ffi_prep_closure(a_closure, a_cif, ffi_callback, a_ip); @@ -2649,7 +2669,7 @@ ffi-2@ ( a_addr -- d ) gforth ffi_2fetch DLO_IS(d, (Cell*)(*a_addr)); DHI_IS(d, 0); #else -d = *(DCell*)(*a_addr); +d = *(DCell*)(a_addr); #endif ffi-2! ( d a_addr -- ) gforth ffi_2store @@ -2660,7 +2680,7 @@ ffi-2! ( d a_addr -- ) gforth ffi_2store #endif ffi-arg-int ( -- w ) gforth ffi_arg_int -w = *(Cell*)(*clist++); +w = *(int *)(*clist++); ffi-arg-longlong ( -- d ) gforth ffi_arg_longlong #ifdef BUGGY_LONG_LONG @@ -2679,24 +2699,32 @@ r = *(float*)(*clist++); ffi-arg-double ( -- r ) gforth ffi_arg_double r = *(double*)(*clist++); -ffi-ret-int ( -- w ) gforth ffi_ret_int +ffi-ret-void ( -- ) gforth ffi_ret_void +return 0; + +ffi-ret-int ( w -- ) gforth ffi_ret_int *(int*)(ritem) = w; +return 0; -ffi-ret-longlong ( -- d ) gforth ffi_ret_longlong +ffi-ret-longlong ( d -- ) gforth ffi_ret_longlong #ifdef BUGGY_LONG_LONG *(Cell*)(ritem) = DLO(d); #else *(DCell*)(ritem) = d; #endif +return 0; -ffi-ret-ptr ( -- c_addr ) gforth ffi_ret_ptr +ffi-ret-ptr ( c_addr -- ) gforth ffi_ret_ptr *(char **)(ritem) = c_addr; +return 0; -ffi-ret-float ( -- r ) gforth ffi_ret_float +ffi-ret-float ( r -- ) gforth ffi_ret_float *(float*)(ritem) = r; +return 0; -ffi-ret-double ( -- r ) gforth ffi_ret_double +ffi-ret-double ( r -- ) gforth ffi_ret_double *(double*)(ritem) = r; +return 0; \+