{RRC, "rrc", picGenericOne, NULL},
{RLC, "rlc", picGenericOne, NULL},
{GETHBIT, "ghbit", picGenericOne, NULL},
+ {GETABIT, "gabit", picGenericOne, NULL},
+ {GETBYTE, "gbyte", picGenericOne, NULL},
+ {GETWORD, "gword", picGenericOne, NULL},
{UNARYMINUS, "-", picGenericOne, NULL},
{IPUSH, "push", picGenericOne, NULL},
{IPOP, "pop", picGenericOne, NULL},
(i >> 1));
}
break;
+ case GETABIT:
+ retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+ (TYPE_UDWORD)operandLitValue(right)) & 1);
+ break;
+ case GETBYTE:
+ retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+ (TYPE_UDWORD)operandLitValue(right)) & 0xFF);
+ break;
+ case GETWORD:
+ retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+ (TYPE_UDWORD)operandLitValue(right)) & 0xFFFF);
+ break;
+
+ case GETHBIT:
+ retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+ ((getSize (let) * 8) - 1)) & 1);
+ break;
case UNARYMINUS:
retval = operandFromValue (valCastLiteral (type,
return IC_RESULT (ic);
}
+/*-----------------------------------------------------------------*/
+/* geniCodeBinary - for a generic binary operation */
+/*-----------------------------------------------------------------*/
+operand *
+geniCodeBinary (operand * left, operand * right, int oper)
+{
+ iCode *ic = newiCode (oper, left, right);
+
+ IC_RESULT (ic) = newiTempOperand (operandType (left), 0);
+ ADDTOCHAIN (ic);
+ return IC_RESULT (ic);
+}
+
/*-----------------------------------------------------------------*/
/* geniCodeConditional - geniCode for '?' ':' operation */
/*-----------------------------------------------------------------*/
#endif
case '~':
- {
- sym_link *ltype = operandType (left);
- operand *op = geniCodeUnary (geniCodeRValue (left, FALSE), tree->opval.op);
- if ((SPEC_NOUN(ltype) == V_CHAR) && IS_UNSIGNED(ltype))
- {
- setOperandType (op, INTTYPE);
- }
- return op;
- }
case RRC:
case RLC:
case SWAP:
setOperandType (op, UCHARTYPE);
return op;
}
+ case GETABIT:
+ case GETBYTE:
+ case GETWORD:
+ {
+ operand *op = geniCodeBinary (geniCodeRValue (left, FALSE),
+ geniCodeRValue (right, FALSE),
+ tree->opval.op);
+ setOperandType (op, (tree->opval.op == GETWORD) ? UINTTYPE : UCHARTYPE);
+ return op;
+ }
case AND_OP:
case OR_OP:
return geniCodeLogicAndOr (tree, lvl);