xref: /freebsd/stand/ficl/powerpc/sysdep.c (revision ca987d4641cdcd7f27e153db17c5bf064934faf5)
1*ca987d46SWarner Losh /*******************************************************************
2*ca987d46SWarner Losh ** s y s d e p . c
3*ca987d46SWarner Losh ** Forth Inspired Command Language
4*ca987d46SWarner Losh ** Author: John Sadler (john_sadler@alum.mit.edu)
5*ca987d46SWarner Losh ** Created: 16 Oct 1997
6*ca987d46SWarner Losh ** Implementations of FICL external interface functions...
7*ca987d46SWarner Losh **
8*ca987d46SWarner Losh *******************************************************************/
9*ca987d46SWarner Losh 
10*ca987d46SWarner Losh /* $FreeBSD$ */
11*ca987d46SWarner Losh 
12*ca987d46SWarner Losh #ifdef TESTMAIN
13*ca987d46SWarner Losh #include <stdio.h>
14*ca987d46SWarner Losh #include <stdlib.h>
15*ca987d46SWarner Losh #else
16*ca987d46SWarner Losh #include <stand.h>
17*ca987d46SWarner Losh #endif
18*ca987d46SWarner Losh #include "ficl.h"
19*ca987d46SWarner Losh 
20*ca987d46SWarner Losh /*
21*ca987d46SWarner Losh *******************  FreeBSD  P O R T   B E G I N S   H E R E ******************** Michael Smith
22*ca987d46SWarner Losh */
23*ca987d46SWarner Losh 
24*ca987d46SWarner Losh #if PORTABLE_LONGMULDIV == 0
25*ca987d46SWarner Losh DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
26*ca987d46SWarner Losh {
27*ca987d46SWarner Losh     DPUNS q;
28*ca987d46SWarner Losh     u_int64_t qx;
29*ca987d46SWarner Losh 
30*ca987d46SWarner Losh     qx = (u_int64_t)x * (u_int64_t) y;
31*ca987d46SWarner Losh 
32*ca987d46SWarner Losh     q.hi = (u_int32_t)( qx >> 32 );
33*ca987d46SWarner Losh     q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
34*ca987d46SWarner Losh 
35*ca987d46SWarner Losh     return q;
36*ca987d46SWarner Losh }
37*ca987d46SWarner Losh 
38*ca987d46SWarner Losh UNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
39*ca987d46SWarner Losh {
40*ca987d46SWarner Losh     UNSQR result;
41*ca987d46SWarner Losh     u_int64_t qx, qh;
42*ca987d46SWarner Losh 
43*ca987d46SWarner Losh     qh = q.hi;
44*ca987d46SWarner Losh     qx = (qh << 32) | q.lo;
45*ca987d46SWarner Losh 
46*ca987d46SWarner Losh     result.quot = qx / y;
47*ca987d46SWarner Losh     result.rem  = qx % y;
48*ca987d46SWarner Losh 
49*ca987d46SWarner Losh     return result;
50*ca987d46SWarner Losh }
51*ca987d46SWarner Losh #endif
52*ca987d46SWarner Losh 
53*ca987d46SWarner Losh void  ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
54*ca987d46SWarner Losh {
55*ca987d46SWarner Losh     IGNORE(pVM);
56*ca987d46SWarner Losh 
57*ca987d46SWarner Losh     while(*msg != 0)
58*ca987d46SWarner Losh 	putchar(*(msg++));
59*ca987d46SWarner Losh     if (fNewline)
60*ca987d46SWarner Losh 	putchar('\n');
61*ca987d46SWarner Losh 
62*ca987d46SWarner Losh    return;
63*ca987d46SWarner Losh }
64*ca987d46SWarner Losh 
65*ca987d46SWarner Losh void *ficlMalloc (size_t size)
66*ca987d46SWarner Losh {
67*ca987d46SWarner Losh     return malloc(size);
68*ca987d46SWarner Losh }
69*ca987d46SWarner Losh 
70*ca987d46SWarner Losh void *ficlRealloc (void *p, size_t size)
71*ca987d46SWarner Losh {
72*ca987d46SWarner Losh     return realloc(p, size);
73*ca987d46SWarner Losh }
74*ca987d46SWarner Losh 
75*ca987d46SWarner Losh void  ficlFree   (void *p)
76*ca987d46SWarner Losh {
77*ca987d46SWarner Losh     free(p);
78*ca987d46SWarner Losh }
79*ca987d46SWarner Losh 
80*ca987d46SWarner Losh 
81*ca987d46SWarner Losh /*
82*ca987d46SWarner Losh ** Stub function for dictionary access control - does nothing
83*ca987d46SWarner Losh ** by default, user can redefine to guarantee exclusive dict
84*ca987d46SWarner Losh ** access to a single thread for updates. All dict update code
85*ca987d46SWarner Losh ** is guaranteed to be bracketed as follows:
86*ca987d46SWarner Losh ** ficlLockDictionary(TRUE);
87*ca987d46SWarner Losh ** <code that updates dictionary>
88*ca987d46SWarner Losh ** ficlLockDictionary(FALSE);
89*ca987d46SWarner Losh **
90*ca987d46SWarner Losh ** Returns zero if successful, nonzero if unable to acquire lock
91*ca987d46SWarner Losh ** befor timeout (optional - could also block forever)
92*ca987d46SWarner Losh */
93*ca987d46SWarner Losh #if FICL_MULTITHREAD
94*ca987d46SWarner Losh int ficlLockDictionary(short fLock)
95*ca987d46SWarner Losh {
96*ca987d46SWarner Losh 	IGNORE(fLock);
97*ca987d46SWarner Losh 	return 0;
98*ca987d46SWarner Losh }
99*ca987d46SWarner Losh #endif /* FICL_MULTITHREAD */
100