Diff for /gforth/prim between versions 1.177 and 1.185

version 1.177, 2005/09/27 13:50:43 version 1.185, 2006/01/05 01:37:31
Line 1 Line 1
 \ Gforth primitives  \ 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.  \ This file is part of Gforth.
   
Line 1229  useraddr ( #u -- a_addr ) new Line 1229  useraddr ( #u -- a_addr ) new
 a_addr = (Cell *)(up+u);  a_addr = (Cell *)(up+u);
   
 up!     ( a_addr -- )   gforth  up_store  up!     ( a_addr -- )   gforth  up_store
 UP=up=(char *)a_addr;  gforth_UP=up=(char *)a_addr;
 :  :
  up ! ;   up ! ;
 Variable UP  Variable UP
Line 1788  access the stack itself. The stack point Line 1788  access the stack itself. The stack point
 variables @code{SP} and @code{FP}.""  variables @code{SP} and @code{FP}.""
 /* This is a first attempt at support for calls to C. This may change in  /* This is a first attempt at support for calls to C. This may change in
    the future */     the future */
 FP=fp;  gforth_FP=fp;
 SP=sp;  gforth_SP=sp;
 ((void (*)())w)();  ((void (*)())w)();
 sp=SP;  sp=gforth_SP;
 fp=FP;  fp=gforth_FP;
   
 \+  \+
 \+file  \+file
Line 2440  u3 = 0; Line 2440  u3 = 0;
 #endif  #endif
   
 wcall   ( ... u -- ... )        gforth  wcall   ( ... u -- ... )        gforth
 FP=fp;  gforth_FP=fp;
 sp=(Cell*)(SYSCALL(Cell*(*)(Cell *, void *))u)(sp, &FP);  sp=(Cell*)(SYSCALL(Cell*(*)(Cell *, void *))u)(sp, &gforth_FP);
 fp=FP;  fp=gforth_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  \+FFCALL
   
Line 2547  REST_REGS Line 2565  REST_REGS
 c_addr = prv;  c_addr = prv;
   
 alloc-callback  ( a_ip -- c_addr )      gforth  alloc_callback  alloc-callback  ( a_ip -- c_addr )      gforth  alloc_callback
 c_addr = (char *)alloc_callback(engine_callback, (Xt *)a_ip);  c_addr = (char *)alloc_callback(gforth_callback, (Xt *)a_ip);
   
 va-start-void   ( -- )  gforth  va_start_void  va-start-void   ( -- )  gforth  va_start_void
 va_start_void(clist);  va_start_void(clist);
Line 2639  ffi-prep-cif ( a_atypes n a_rtype a_cif Line 2657  ffi-prep-cif ( a_atypes n a_rtype a_cif
 w = ffi_prep_cif(a_cif, FFI_DEFAULT_ABI, n, a_rtype, a_atypes);  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  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);  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  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);  w = ffi_prep_closure(a_closure, a_cif, gforth_callback, a_ip);
   
 ffi-2@ ( a_addr -- d )  gforth ffi_2fetch  ffi-2@ ( a_addr -- d )  gforth ffi_2fetch
 #ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
 DLO_IS(d, (Cell*)(*a_addr));  DLO_IS(d, (Cell*)(*a_addr));
 DHI_IS(d, 0);  DHI_IS(d, 0);
 #else  #else
 d = *(DCell*)(*a_addr);  d = *(DCell*)(a_addr);
 #endif  #endif
   
 ffi-2! ( d a_addr -- )  gforth ffi_2store  ffi-2! ( d a_addr -- )  gforth ffi_2store
Line 2660  ffi-2! ( d a_addr -- ) gforth ffi_2store Line 2680  ffi-2! ( d a_addr -- ) gforth ffi_2store
 #endif  #endif
   
 ffi-arg-int ( -- w )    gforth ffi_arg_int  ffi-arg-int ( -- w )    gforth ffi_arg_int
 w = *(Cell*)(*clist++);  w = *(int *)(*clist++);
   
 ffi-arg-longlong ( -- d )       gforth ffi_arg_longlong  ffi-arg-longlong ( -- d )       gforth ffi_arg_longlong
 #ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
Line 2679  r = *(float*)(*clist++); Line 2699  r = *(float*)(*clist++);
 ffi-arg-double ( -- r ) gforth ffi_arg_double  ffi-arg-double ( -- r ) gforth ffi_arg_double
 r = *(double*)(*clist++);  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;  *(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  #ifdef BUGGY_LONG_LONG
 *(Cell*)(ritem) = DLO(d);  *(Cell*)(ritem) = DLO(d);
 #else  #else
 *(DCell*)(ritem) = d;  *(DCell*)(ritem) = d;
 #endif  #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;  *(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;  *(float*)(ritem) = r;
   return 0;
   
 ffi-ret-double ( -- r ) gforth ffi_ret_double  ffi-ret-double ( r -- ) gforth ffi_ret_double
 *(double*)(ritem) = r;  *(double*)(ritem) = r;
   return 0;
   
 \+  \+
   

Removed from v.1.177  
changed lines
  Added in v.1.185


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>