#include "prims.h" #include "math.h" /* private globals */ extern inst *p_oper1, *p_oper2, *p_oper3, *p_oper4; static inst temp1; extern int p_result; extern double p_float; extern int p_nargs; void prims_add (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (arith_type(p_oper2, p_oper1)) { p_result = p_oper1->data.number + p_oper2->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (float_type(p_oper2, p_oper1)) { p_float = p_oper1->data.fnum + p_oper2->data.fnum; push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } else abort_interp("Invalid argument types. (2)"); } void prims_subtract (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (arith_type(p_oper2, p_oper1)) { p_result = p_oper2->data.number - p_oper1->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (float_type(p_oper2, p_oper1)) { p_float = p_oper2->data.fnum - p_oper1->data.fnum; push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } else abort_interp("Invalid argument types."); } void prims_multiply (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (arith_type(p_oper2, p_oper1)) { p_result = p_oper1->data.number * p_oper2->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (float_type(p_oper2, p_oper1)) { p_float = p_oper1->data.fnum * p_oper2->data.fnum; push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } else abort_interp("Invalid argument types."); } void prims_divide (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (arith_type(p_oper2, p_oper1)) { if (p_oper1->data.number) p_result = p_oper2->data.number / p_oper1->data.number; else p_result = 0; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (float_type(p_oper2, p_oper1)) { if (p_oper1->data.fnum) p_float = p_oper2->data.fnum / p_oper1->data.fnum; else p_float = 0; push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } else abort_interp("Invalid argument types."); } void prims_mod (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (!arith_type(p_oper2, p_oper1)) abort_interp("Invalid argument type."); { if (p_oper1->data.number) p_result = p_oper2->data.number % p_oper1->data.number; else p_result = 0; } CLEAR(p_oper1); CLEAR(p_oper2); push(arg, top, p_oper2->type, MIPSCAST &p_result); } void prims_lessthan (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type == PROG_INTEGER && p_oper2->type == PROG_INTEGER) { p_result = p_oper2->data.number < p_oper1->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (p_oper1->type == PROG_FLOAT && p_oper2->type == PROG_FLOAT) { p_result = p_oper2->data.fnum < p_oper1->data.fnum; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else abort_interp("Invalid argument type."); } void prims_greathan (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type == PROG_INTEGER && p_oper2->type == PROG_INTEGER) { p_result = p_oper2->data.number > p_oper1->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (p_oper1->type == PROG_FLOAT && p_oper2->type == PROG_FLOAT) { p_result = p_oper2->data.fnum > p_oper1->data.fnum; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else abort_interp("Invalid argument type."); } void prims_equal (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type == PROG_INTEGER && p_oper2->type == PROG_INTEGER) { p_result = p_oper2->data.number == p_oper1->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (p_oper1->type == PROG_FLOAT && p_oper2->type == PROG_FLOAT) { p_result = p_oper2->data.fnum == p_oper1->data.fnum; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else abort_interp("Invalid argument type."); } void prims_lesseq (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type == PROG_INTEGER && p_oper2->type == PROG_INTEGER) { p_result = p_oper2->data.number <= p_oper1->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (p_oper1->type == PROG_FLOAT && p_oper2->type == PROG_FLOAT) { p_result = p_oper2->data.fnum <= p_oper1->data.fnum; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else abort_interp("Invalid argument type."); } void prims_greateq (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type == PROG_INTEGER && p_oper2->type == PROG_INTEGER) { p_result = p_oper2->data.number >= p_oper1->data.number; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else if (p_oper1->type == PROG_FLOAT && p_oper2->type == PROG_FLOAT) { p_result = p_oper2->data.fnum >= p_oper1->data.fnum; push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } else abort_interp("Invalid argument type."); } void prims_random (__P_PROTO) { p_result = random(); if ((*top) >= STACK_SIZE) abort_interp("Stack overflow."); push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } void prims_frandom (__P_PROTO) { #ifdef HAVE_DRAND48 p_float = drand48(); #else abort_interp("Sorry, this computer doesn't support the drand48 function."); #endif if ((*top) >= STACK_SIZE) abort_interp("Stack overflow."); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_dbcomp (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type != PROG_OBJECT || p_oper2->type != PROG_OBJECT) abort_interp("Invalid argument type."); p_result = p_oper1->data.objref == p_oper2->data.objref; CLEAR(p_oper1); CLEAR(p_oper2); push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } void prims_at (__P_PROTO) { CHECKOP(1); temp1 = *(p_oper1 = POP()); if (temp1.type != PROG_VAR || temp1.data.number >= MAX_VAR) abort_interp("Non-variable argument."); copyinst(&(fr -> variables[temp1.data.number]), &arg[(*top)++]); CLEAR(&temp1); } void prims_bang (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if ((p_oper1->type != PROG_VAR) || (p_oper1->data.number >= MAX_VAR) || (p_oper1->data.number < 0)) abort_interp("Non-variable argument (2)"); CLEAR(&fr -> variables[p_oper1->data.number]); copyinst(p_oper2, &(fr -> variables[p_oper1->data.number])); CLEAR(p_oper1); CLEAR(p_oper2); } void prims_pplus (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if ((p_oper1->type != PROG_VAR) || (p_oper1->data.number >= MAX_VAR) || (p_oper1->data.number < 0)) abort_interp("Non-variable argument (1)"); switch (fr -> variables[p_oper1->data.number].type) { case PROG_INTEGER: fr -> variables[p_oper1->data.number].data.number++; break; case PROG_OBJECT: fr -> variables[p_oper1->data.number].data.objref++; break; default: abort_interp("Variable contains non-integer"); break; } CLEAR(p_oper1); } void prims_mminus (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if ((p_oper1->type != PROG_VAR) || (p_oper1->data.number >= MAX_VAR) || (p_oper1->data.number < 0)) abort_interp("Non-variable argument (1)"); switch (fr -> variables[p_oper1->data.number].type) { case PROG_INTEGER: fr -> variables[p_oper1->data.number].data.number--; break; case PROG_OBJECT: fr -> variables[p_oper1->data.number].data.objref--; break; default: abort_interp("Variable contains non-integer"); break; } CLEAR(p_oper1); } void prims_bitor (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (!arith_type(p_oper2, p_oper1)) abort_interp("Invalid argument type."); p_result = p_oper1->data.number | p_oper2->data.number; CLEAR(p_oper1); CLEAR(p_oper2); push(arg, top, p_oper2->type, MIPSCAST &p_result); } void prims_bitand (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (!arith_type(p_oper2, p_oper1)) abort_interp("Invalid argument type."); p_result = p_oper1->data.number & p_oper2->data.number; CLEAR(p_oper1); CLEAR(p_oper2); push(arg, top, p_oper2->type, MIPSCAST &p_result); } void prims_bitnot (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_INTEGER) abort_interp("Invalid argument type."); p_result = ~p_oper1->data.number; CLEAR(p_oper1); push(arg, top, p_oper1->type, MIPSCAST &p_result); } void prims_bitrotleft (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (!arith_type(p_oper2, p_oper1)) abort_interp("Invalid argument type."); if (p_oper1->data.number < 0) p_result = p_oper2->data.number >> (-p_oper1->data.number); else p_result = p_oper2->data.number << p_oper1->data.number; CLEAR(p_oper1); CLEAR(p_oper2); push(arg, top, p_oper2->type, MIPSCAST &p_result); } void prims_bitrotright (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (!arith_type(p_oper2, p_oper1)) abort_interp("Invalid argument type."); if (p_oper1->data.number < 0) p_result = p_oper2->data.number << (-p_oper1->data.number); else p_result = p_oper2->data.number >> p_oper1->data.number; CLEAR(p_oper1); CLEAR(p_oper2); push(arg, top, p_oper2->type, MIPSCAST &p_result); } void prims_pi (__P_PROTO) { #ifndef M_PI p_float = 3.14159265358979323846; #else p_float = M_PI; #endif if ((*top) >= STACK_SIZE) abort_interp("Stack overflow."); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_e (__P_PROTO) { #ifndef M_E p_float = 2.7182818284590452354; #else p_float = M_E; #endif if ((*top) >= STACK_SIZE) abort_interp("Stack overflow."); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_sin (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = sin(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_cos (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = cos(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_tan (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = tan(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_asin (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = asin(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_acos (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = acos(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_atan (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = atan(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_atan2 (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); if (p_oper2->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = atan2(p_oper2->data.fnum, p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_log10 (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = exp(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_pow (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); if (p_oper2->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = pow(p_oper2->data.fnum, p_oper2->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_sqrt (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = sqrt(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_cbrt (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_CBRT abort_interp("Sorry, this computer doesn't support the cbrt function."); #else p_float = cbrt(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_sinh (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = sinh(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_cosh (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = cosh(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_tanh (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = tanh(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_asinh (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ASINH abort_interp("Sorry, this computer doesn't support the asinh function."); #else p_float = asinh(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_acosh (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ASINH abort_interp("Sorry, this computer doesn't support the acosh function."); #else p_float = acosh(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_atanh (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ASINH abort_interp("Sorry, this computer doesn't support the atanh function."); #else p_float = atanh(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_ceil (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = ceil(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_floor (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); p_float = floor(p_oper1->data.fnum); push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_finite (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_FINITE abort_interp("Sorry, this computer doesn't support the finite function."); #else p_result = finite(p_oper1->data.fnum); #endif push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } void prims_isinf (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ISINF abort_interp("Sorry, this computer doesn't support the isinf function."); #else p_result = isinf(p_oper1->data.fnum); #endif push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } void prims_isnan (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ISNAN abort_interp("Sorry, this computer doesn't support the isnan function."); #else p_result = isnan(p_oper1->data.fnum); #endif push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } void prims_isnormal (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ISNORMAL abort_interp("Sorry, this computer doesn't support the isnormal function."); #else p_result = isnormal(p_oper1->data.fnum); #endif push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } void prims_issubnormal (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ISSUBNORMAL abort_interp("Sorry, this computer doesn't support the issubnormal function."); #else p_result = issubnormal(p_oper1->data.fnum); #endif push(arg, top, PROG_INTEGER, MIPSCAST &p_result); } void prims_fabs (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_FABS abort_interp("Sorry, this computer doesn't support the fabs function."); #else p_float = fabs(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_remainder (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); if (p_oper2->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_REMAINDER p_float = fmod(p_oper2->data.fnum, p_oper1->data.fnum); #else p_float = remainder(p_oper2->data.fnum, p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_j0 (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_J1 abort_interp("Sorry, this computer doesn't support the j0 function."); #else p_float = j0(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_j1 (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_J1 abort_interp("Sorry, this computer doesn't support the j1 function."); #else p_float = j1(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_y0 (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_Y1 abort_interp("Sorry, this computer doesn't support the y0 function."); #else p_float = y0(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_y1 (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_Y1 abort_interp("Sorry, this computer doesn't support the y1 function."); #else p_float = y1(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_jn (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type != PROG_INTEGER) abort_interp("Invalid argument type."); if (p_oper2->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_J1 abort_interp("Sorry, this computer doesn't support the jn function."); #else p_float = jn(p_oper2->data.fnum, p_oper2->data.number); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_yn (__P_PROTO) { CHECKOP(2); p_oper1 = POP(); p_oper2 = POP(); if (p_oper1->type != PROG_INTEGER) abort_interp("Invalid argument type."); if (p_oper2->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_Y1 abort_interp("Sorry, this computer doesn't support the yn function."); #else p_float = yn(p_oper2->data.fnum, p_oper2->data.number); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_erf (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ERFC abort_interp("Sorry, this computer doesn't support the erf function."); #else p_float = erf(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } void prims_erfc (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_ERFC abort_interp("Sorry, this computer doesn't support the erfc function."); #else p_float = erfc(p_oper1->data.fnum); #endif push(arg, top, PROG_FLOAT, MIPSCAST &p_float); } #ifdef HAVE_LGAMMA int signgam; #endif void prims_lgamma (__P_PROTO) { CHECKOP(1); p_oper1 = POP(); if (p_oper1->type != PROG_FLOAT) abort_interp("Invalid argument type."); #ifndef HAVE_LGAMMA abort_interp("Sorry, this computer doesn't support the lgamma function."); #else p_float = lgamma(p_oper1->data.fnum); #endif p_result = signgam; push(arg, top, PROG_FLOAT, MIPSCAST &p_float); push(arg, top, PROG_INTEGER, MIPSCAST &p_result); }