#include "common.h"
#include "newalloc.h"
+#include "math.h"
/*-----------------------------------------------------------------*/
/* global variables */
symbol *returnLabel; /* function return label */
symbol *entryLabel; /* function entry label */
-#if defined(__BORLANDC__) || defined(_MSC_VER)
-#define LONG_LONG __int64
-#else
-#define LONG_LONG long long
-#endif
-
/*-----------------------------------------------------------------*/
/* forward definition of some functions */
operand *geniCodeDivision (operand *, operand *);
*/
void checkConstantRange(sym_link *ltype, value *val, char *msg, int pedantic) {
- LONG_LONG max = (LONG_LONG) 1 << bitsForType(ltype);
+ double max;
char message[132]="";
int warnings=0;
int negative=0;
- long v=SPEC_CVAL(val->type).v_long;
+ long v;
+
+ max = pow ((double)2.0, (double)bitsForType(ltype));
+
+ if (SPEC_LONG(val->type)) {
+ if (SPEC_USIGN(val->type)) {
+ v=SPEC_CVAL(val->type).v_ulong;
+ } else {
+ v=SPEC_CVAL(val->type).v_long;
+ }
+ } else {
+ if (SPEC_USIGN(val->type)) {
+ v=SPEC_CVAL(val->type).v_uint;
+ } else {
+ v=SPEC_CVAL(val->type).v_int;
+ }
+ }
+
#if 0
// this could be a good idea
{
iCode *ic;
- if (IS_VOID(OP_SYMBOL(condition)->type)) {
+ if (IS_VOID(operandType(condition))) {
werror(E_VOID_VALUE_USED);
}
operandLitValue (right));
break;
case BITWISEAND:
- retval = operandFromLit ((SPEC_USIGN(let) ?
- (unsigned long) operandLitValue (left) :
- (long) operandLitValue (left)) &
- (SPEC_USIGN(ret) ?
- (unsigned long) operandLitValue (right) :
- (long) operandLitValue (right)));
+ retval = operandFromLit ((long)operandLitValue(left) &
+ (long)operandLitValue(right));
break;
case '|':
- retval = operandFromLit ((SPEC_USIGN(let) ?
- (unsigned long) operandLitValue (left) :
- (long) operandLitValue (left)) |
- (SPEC_USIGN(ret) ?
- (unsigned long) operandLitValue (right) :
- (long) operandLitValue (right)));
+ retval = operandFromLit ((long)operandLitValue (left) |
+ (long)operandLitValue (right));
break;
case '^':
- retval = operandFromLit ((SPEC_USIGN(let) ?
- (unsigned long) operandLitValue (left) :
- (long) operandLitValue (left)) ^
- (SPEC_USIGN(ret) ?
- (unsigned long) operandLitValue (right) :
- (long) operandLitValue (right)));
+ retval = operandFromLit ((long)operandLitValue (left) ^
+ (long)operandLitValue (right));
break;
case AND_OP:
retval = operandFromLit (operandLitValue (left) &&
register equivalent for a local symbol */
if (sym->level && sym->etype && SPEC_OCLS (sym->etype) &&
(IN_FARSPACE (SPEC_OCLS (sym->etype)) &&
- /* (!TARGET_IS_DS390)) && */
(!(options.model == MODEL_FLAT24)) ) &&
options.stackAuto == 0)
ok = 0;
!sym->_isparm && /* not a parameter */
sym->level && /* is a local variable */
!sym->addrtaken && /* whose address has not been taken */
- !sym->reqv && /* does not already have a register euivalence */
+ !sym->reqv && /* does not already have a reg equivalence */
+ !sym->onStack && /* jwk: not on stack */
!IS_VOLATILE (sym->etype) && /* not declared as volatile */
!IS_STATIC (sym->etype) && /* and not declared static */
!sym->islbl && /* not a label */
else
IC_RESULT (ic)->isaddr = (!IS_AGGREGATE (sym->type));
- IC_RESULT (ic)->operand.symOperand->args = sym->args;
-
ADDTOCHAIN (ic);
return IC_RESULT (ic);
/* ic->supportRtn = ((IS_GENPTR(type) | op->isGptr) & op->isaddr); */
- /* if the right is a symbol */
- if (op->type == SYMBOL)
- IC_RESULT (ic)->operand.symOperand->args =
- op->operand.symOperand->args;
ADDTOCHAIN (ic);
return IC_RESULT (ic);
/* if casting to/from pointers, do some checking */
if (IS_PTR(type)) { // to a pointer
- if (!IS_PTR(optype) && !IS_FUNC(optype)) { // from a non pointer
+ if (!IS_PTR(optype) && !IS_FUNC(optype) && !IS_AGGREGATE(optype)) { // from a non pointer
if (IS_INTEGRAL(optype)) {
// maybe this is NULL, than it's ok.
if (!(IS_LITERAL(optype) && (SPEC_CVAL(optype).v_ulong ==0))) {
/*-----------------------------------------------------------------*/
/* geniCodeParms - generates parameters */
/*-----------------------------------------------------------------*/
-static void
-geniCodeParms (ast * parms, int *stack, sym_link * fetype, symbol * func,int lvl)
+value *
+geniCodeParms (ast * parms, value *argVals, int *stack,
+ sym_link * fetype, symbol * func,int lvl)
{
iCode *ic;
operand *pval;
if (!parms)
- return;
+ return argVals;
+
+ if (argVals==NULL) {
+ // first argument
+ argVals=FUNC_ARGS(func->type);
+ }
+
+ if (parms->argSym ||
+ (parms->type!=EX_OP && parms->type!=EX_OPERAND)) {
+ fprintf (stderr, "What the fuck??\n");
+ }
/* if this is a param node then do the left & right */
if (parms->type == EX_OP && parms->opval.op == PARAM)
{
- geniCodeParms (parms->left, stack, fetype, func,lvl);
- geniCodeParms (parms->right, stack, fetype, func,lvl);
- return;
+ argVals=geniCodeParms (parms->left, argVals, stack, fetype, func,lvl);
+ argVals=geniCodeParms (parms->right, argVals, stack, fetype, func,lvl);
+ return argVals;
}
/* get the parameter value */
}
/* if register parm then make it a send */
- if (((parms->argSym && IS_REGPARM (parms->argSym->etype)) ||
- IS_REGPARM (parms->etype)) && !func->hasVargs)
+ if ((parms->argSym && IS_REGPARM(parms->argSym->etype)) ||
+ (IS_REGPARM (parms->etype) && !IFFUNC_HASVARARGS(func->type)))
{
ic = newiCode (SEND, pval, NULL);
ADDTOCHAIN (ic);
else
{
/* now decide whether to push or assign */
- if (!(options.stackAuto || IS_RENT (fetype)))
+ if (!(options.stackAuto || IFFUNC_ISREENT (func->type)))
{
/* assign */
- operand *top = operandFromSymbol (parms->argSym);
+ operand *top = operandFromSymbol (argVals->sym);
geniCodeAssign (top, pval, 1);
}
else
}
}
+ argVals=argVals->next;
+ return argVals;
}
/*-----------------------------------------------------------------*/
geniCodeSEParms (parms,lvl);
/* first the parameters */
- geniCodeParms (parms, &stack, getSpec (operandType (left)), OP_SYMBOL (left),lvl);
+ geniCodeParms (parms, NULL, &stack, getSpec (operandType (left)), OP_SYMBOL (left),lvl);
/* now call : if symbol then pcall */
if (IS_OP_POINTER (left) || IS_ITEMP(left))
else
ic = newiCode (CALL, left, NULL);
- IC_ARGS (ic) = left->operand.symOperand->args;
+ IC_ARGS (ic) = FUNC_ARGS(left->operand.symOperand->type);
type = copyLinkChain (operandType (left)->next);
etype = getSpec (type);
SPEC_EXTR (etype) = 0;