p_type = DCL_TYPE(operandType(ptr));
switch (p_type) {
- case FPOINTER:
case POINTER:
+ case FPOINTER:
+ case IPOINTER:
+ case PPOINTER:
if (!fsr0_setup || !*fsr0_setup)
{
pic16_loadFSR0( ptr, 0 );
}
break;
+ case CPOINTER:
+ /* XXX: Writing to CPOINTERs not (yet) implemented. */
+ assert ( !doWrite && "Cannot write into __code space!" );
+ if( (AOP_TYPE(ptr) == AOP_PCODE)
+ && ((AOP(ptr)->aopu.pcop->type == PO_IMMEDIATE)
+ || (AOP(ptr)->aopu.pcop->type == PO_DIR)))
+ {
+ pic16_emitpcode(POC_MOVLW, pic16_popGet (AOP (ptr), 0));
+ pic16_emitpcode(POC_MOVWF, pic16_popCopyReg (&pic16_pc_tblptrl));
+ pic16_emitpcode(POC_MOVLW, pic16_popGet (AOP (ptr), 1));
+ pic16_emitpcode(POC_MOVWF, pic16_popCopyReg (&pic16_pc_tblptrh));
+ pic16_emitpcode(POC_MOVLW, pic16_popGet (AOP (ptr), 2));
+ pic16_emitpcode(POC_MOVWF, pic16_popCopyReg (&pic16_pc_tblptru));
+ } else {
+ mov2fp(pic16_popCopyReg(&pic16_pc_tblptrl), AOP(ptr), 0);
+ mov2fp(pic16_popCopyReg(&pic16_pc_tblptrh), AOP(ptr), 1);
+ mov2fp(pic16_popCopyReg(&pic16_pc_tblptru), AOP(ptr), 2);
+ } // if
+
+ pic16_emitpcodeNULLop (POC_TBLRD_POSTINC);
+ pic16_emitpcode (POC_MOVFW, pic16_popCopyReg (&pic16_pc_tablat));
+ break;
+
default:
assert (0 && "invalid pointer type specified");
break;
pic16_aopOp(result,ic,TRUE);
size = AOP_SIZE(result);
+ /* if bit then unpack */
+ if (IS_BITFIELD(getSpec (operandType (left)))) {
+ genUnpackBits(result,left,"BAD",GPOINTER);
+ goto release;
+ } // if
+
DEBUGpic16_pic16_AopType(__LINE__,left,NULL,result);
DEBUGpic16_emitcode ("; "," %d getting const pointer",__LINE__);
offset++;
}
+release:
pic16_freeAsmop(left,NULL,ic,TRUE);
pic16_freeAsmop(result,NULL,ic,TRUE);
}
size = ((SPEC_BLEN (lsym->etype) / 8) +
(SPEC_BLEN (lsym->etype) % 8 ? 1 : 0));
}
- i = ulFromVal (val);
+ i = (ulFromVal (val) & ((1ul << SPEC_BLEN (lsym->etype)) - 1ul));
i <<= SPEC_BSTR (lsym->etype);
ival |= i;
if (! ( lsym->next &&
pic16_printIvalCharPtr (symbol * sym, sym_link * type, value * val, char ptype, void *p)
{
int size = 0;
+ int i;
/* PENDING: this is _very_ mcs51 specific, including a magic
number...
else
{
// these are literals assigned to pointers
- switch (size)
+ for (i = 0; i < size; i++)
{
- case 1:
- pic16_emitDB(pic16aopLiteral(val, 0), ptype, p);
- break;
- case 2:
- pic16_emitDB(pic16aopLiteral(val, 0), ptype, p);
- pic16_emitDB(pic16aopLiteral(val, 1), ptype, p);
- break;
- case 3:
- pic16_emitDB(pic16aopLiteral(val, 0), ptype, p);
- pic16_emitDB(pic16aopLiteral(val, 1), ptype, p);
- pic16_emitDB(pic16aopLiteral(val, 2), ptype, p);
- break;
-
- default:
- assert (0);
- }
+ pic16_emitDB(pic16aopLiteral(val, i), ptype, p);
+ } // for
}
if (val->sym && val->sym->isstrlit) { // && !isinSet(statsg->syms, val->sym)) {
{
value *val;
int size;
+ int i;
#if 0
fprintf(stderr, "%s:%d initialising pointer: %s size: %d\n", __FILE__, __LINE__,
printFromToType (val->type, type);
}
+ size = getSize (type);
+
/* if val is literal */
if (IS_LITERAL (val->etype))
{
- switch (getSize (type))
+ for (i = 0; i < size; i++)
{
- case 1:
- pic16_emitDB((unsigned int) ulFromVal (val) & 0xff, ptype, p);
- break;
- case 2:
- pic16_emitDB(pic16aopLiteral(val, 0), ptype, p);
- pic16_emitDB(pic16aopLiteral(val, 1), ptype, p);
- break;
- case 3:
- pic16_emitDB(pic16aopLiteral(val, 0), ptype, p);
- pic16_emitDB(pic16aopLiteral(val, 1), ptype, p);
- pic16_emitDB(pic16aopLiteral(val, 2), ptype, p);
- break;
- default:
- fprintf(stderr, "%s:%d size = %d\n", __FILE__, __LINE__, getSize(type));
- assert(0);
- }
+ pic16_emitDB(pic16aopLiteral(val, i), ptype, p);
+ } // for
return;
}
-
- size = getSize (type);
-
if (size == 1) /* Z80 specific?? */
{
pic16_emitDS(val->name, ptype, p);
}
else if (size == 2)
{
- pic16_printPointerType (val->name, ptype, p);
+ pic16_printPointerType (val->name, ptype, p);
}
else if (size == 3)
{
int itype = 0;
itype = PTR_TYPE (SPEC_OCLS (val->etype));
pic16_printGPointerType (val->name, itype, ptype, p);
- } else
- assert(0);
- return;
+ }
+ else
+ {
+ assert(0);
+ }
}