DEBUGpic16_emitcode("; +++", "%s:%d", __FILE__, __LINE__);
- pic16_DumpAop("aopForSym", AOP( IC_RESULT(ic) ));
if((ic->op == '=') && IC_RESULT(ic) && AOP( IC_RESULT(ic) )
&& (AOP_TYPE(IC_RESULT(ic)) == AOP_REG) ) {
+ pic16_DumpAop("aopForSym", AOP( IC_RESULT(ic) ));
for(i=0;i<aop->size;i++)
aop->aopu.stk.pop[i] = pcop[i] = pic16_popRegFromIdx( AOP(IC_RESULT(ic))->aopu.aop_reg[i]->rIdx);
if(pcop->name) {
DEBUGpic16_emitcode(";","%s offset %d",pcop->name,PCOI(pcop)->offset);
//sprintf(s,"(%s+0x%02x)", pcop->name,PCOI(aop->aopu.pcop)->offset);
- sprintf(s,"%s", pcop->name);
+ if (offset) {
+ pic16_emitpcomment ("; =!= %s:%d: changed from %s to (%s + %d)", __FUNCTION__, __LINE__, pcop->name, pcop->name, offset);
+ sprintf(s,"(%s + %d)", pcop->name, offset);
+ } else {
+ sprintf(s,"%s", pcop->name);
+ }
} else
sprintf(s,"0x%02x", PCOI(aop->aopu.pcop)->offset);
pcor->r = pc->r;
pcor->rIdx = pc->rIdx;
pcor->r->wasUsed=1;
+ pcor->instance = pc->instance;
// DEBUGpic16_emitcode ("; ***","%s , copying %s, rIdx=%d",__FUNCTION__,pc->pcop.name,pc->rIdx);
}
/*-----------------------------------------------------------------*/
-/* mov2w - generate either a MOVLW or MOVFW based operand type */
+/* pic16_mov2w - generate either a MOVLW or MOVFW based operand type */
/*-----------------------------------------------------------------*/
-void mov2w (asmop *aop, int offset)
+void pic16_mov2w (asmop *aop, int offset)
{
DEBUGpic16_emitcode ("; ***","%s %d offset=%d",__FUNCTION__,__LINE__,offset);
firstTimeThruLoop=0;
- mov2w (AOP(IC_LEFT(sic)), size);
+ pic16_mov2w (AOP(IC_LEFT(sic)), size);
// offset++;
}
DEBUGpic16_emitcode("; ", "push %d", psuedoStkPtr-1);
// pushaop(AOP(IC_LEFT(sic)), size);
- mov2w (AOP(IC_LEFT(sic)), size);
+ pic16_mov2w (AOP(IC_LEFT(sic)), size);
pushw();
}
}
pic16_AopType(AOP_TYPE(IC_LEFT(sic))));
DEBUGpic16_emitcode("; ", "push %d", psuedoStkPtr-1);
- mov2w (AOP(IC_LEFT(sic)), size);
+ pic16_mov2w (AOP(IC_LEFT(sic)), size);
pushw();
}
/* if left & right are bit variables */
if (AOP_TYPE(left) == AOP_CRY &&
AOP_TYPE(right) == AOP_CRY ) {
+ assert (0 && "bit variables used in genCmp");
pic16_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir);
pic16_emitcode("anl","c,/%s",AOP(left)->aopu.aop_dir);
} else {
pic16_emitpcode(POC_MOVFW, pic16_popGet(AOP(right),size));
pic16_emitpcode(POC_ADDLW, pic16_popGetLit( 0x80));
pic16_emitpcode(POC_ADDLW, pic16_popGetLit(0x100-i));
- rFalseIfx.condition ^= 1;
- genSkipc(&rFalseIfx);
-
-
- if(ifx) ifx->generated = 1;
- if ((AOP_TYPE(result) != AOP_CRY) && (AOP_SIZE(result)))
+ if ((AOP_TYPE(result) != AOP_CRY) && (AOP_SIZE(result))) {
+ emitTOGC;
+ if(ifx) ifx->generated = 1;
goto check_carry;
+ } else {
+ rFalseIfx.condition ^= 1;
+ genSkipc(&rFalseIfx);
+ if(ifx) ifx->generated = 1;
+ }
return;
}
return ic->next;
}
+ /*
if (ic->next &&
ic->next->op == IFX &&
IC_COND(ic->next)->key == op->key) {
DEBUGpic16_emitcode ("; WARNING ","%d IGNORING liveTo range in %s",__LINE__,__FUNCTION__);
return ic->next;
}
+ */
DEBUGpic16_emitcode ("; NULL :(","%d",__LINE__);
if (ic->next &&
if(AOP(result)->aopu.pcop->type == PO_IMMEDIATE
|| AOP(left)->aopu.pcop->type == PO_IMMEDIATE) {
- mov2w(AOP(left), offset); // patch 8
+ pic16_mov2w(AOP(left), offset); // patch 8
pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result), offset));
} else {
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset)); // patch 8
}
} else {
- mov2w(AOP(right), offset);
+ pic16_mov2w(AOP(right), offset);
pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offset)); // patch 8
}
offset++;
// sizeof(unsigned long int), sizeof(float));
+ if (AOP_TYPE(right) == AOP_REG) {
+ DEBUGpic16_emitcode("; ", "%s:%d assign from register\n", __FUNCTION__, __LINE__);
+ while (size--) {
+
+ pic16_emitpcode (POC_MOVFF, pic16_popGet2(AOP(right), AOP(result), offset++));
+ } // while
+ goto release;
+ }
+
+
if (AOP_TYPE(right) == AOP_REG) {
DEBUGpic16_emitcode("; ", "%s:%d assign from register\n", __FUNCTION__, __LINE__);
while (size--) {
mov2f(AOP(result), AOP(right), offset);
offset++;
}
+ pic16_emitpinfo (INF_OPTIMIZATION, pic16_newpCodeOpOpt (OPT_JUMPTABLE_END, ""));
/* now depending on the sign of the destination */
size = AOP_SIZE(result) - AOP_SIZE(right);
lo = BYTEofLONG(lit,0);
if(carry_info) {
- switch(lo) {
- case 0:
- emitSKPNC;
- pic16_emitpcode(POC_INCF, pic16_popGet(AOP(result),offset));
- break;
- case 0xff:
- pic16_emitpcode(POC_MOVLW,pic16_popGetLit(lo));
- emitSKPC;
- pic16_emitpcode(POC_ADDWF, pic16_popGet(AOP(result),offset));
- break;
- default:
- pic16_emitpcode(POC_MOVLW,pic16_popGetLit(lo));
- pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result),offset));
- break;
- }
+ pic16_emitpcode(POC_MOVLW,pic16_popGetLit(lo));
+ pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result),offset));
}else {
/* no carry info from previous step */
/* this means this is the first time to add */
/* left addend is in a register */
switch(lit & 0xff) {
case 0:
- mov2w(AOP(left),0);
+ pic16_mov2w(AOP(left),0);
emitMOVWF(result, 0);
break;
case 1:
pic16_emitpcode(POC_MOVLW, pic16_popGetLit(lit & 0xff));
pic16_emitpcode(POC_ADDFW, pic16_popGet(AOP(left),0));
} else {
- mov2w(AOP(left),0);
+ pic16_mov2w(AOP(left),0);
/* We don't know the state of the carry bit at this point */
clear_carry = 1;
}
} else {
pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset));
- mov2w(AOP(left),offset);
+ pic16_mov2w(AOP(left),offset);
pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result),offset));
}
offset++;
AOP(IC_RIGHT(ic))->aopu.aop_dir);
pic16_emitcode(" xorlw","1");
} else {
- mov2w(AOP(IC_LEFT(ic)),0);
+ pic16_mov2w(AOP(IC_LEFT(ic)),0);
pic16_emitpcode(POC_BTFSC , pic16_popGet(AOP(IC_RIGHT(ic)),0));
pic16_emitpcode(POC_INCFW , pic16_popGet(AOP(IC_LEFT(ic)),0));
} else {
emitCLRZ; // needed here as well: INCFW is not always executed, Z is undefined then
- mov2w(AOP(IC_LEFT(ic)),0);
+ pic16_mov2w(AOP(IC_LEFT(ic)),0);
pic16_emitpcode(POC_BTFSC, pic16_popGet(AOP(IC_RIGHT(ic)),0));
pic16_emitpcode(POC_INCFW, pic16_popGet(AOP(IC_LEFT(ic)),0));
//pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(IC_RIGHT(ic)),0,FALSE,FALSE));
// add first bytes
for(i=0; i<size; i++) {
if (AOP_TYPE(right) != AOP_ACC)
- mov2w(AOP(right),i);
+ pic16_mov2w(AOP(right),i);
if (pic16_sameRegs(AOP(left), AOP(result)))
{
if(i) { // add with carry
}
} else {
- mov2w(AOP(IC_LEFT(ic)),0);
+ pic16_mov2w(AOP(IC_LEFT(ic)),0);
pic16_emitpcode(POC_BTFSC , pic16_popGet(AOP(IC_RIGHT(ic)),0));
pic16_emitpcode(POC_DECFW , pic16_popGet(AOP(IC_LEFT(ic)),0));
}
goto release;
}
- mov2w(AOP(IC_RIGHT(ic)),0);
+ pic16_mov2w(AOP(IC_RIGHT(ic)),0);
pic16_emitpcode(POC_SUBLW, pic16_popGetLit(lit & 0xff));
pic16_emitpcode(POC_MOVWF,pic16_popGet(AOP(IC_RESULT(ic)),0));
DEBUGpic16_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
if(AOP_TYPE(IC_RIGHT(ic)) != AOP_ACC)
- mov2w(AOP(IC_RIGHT(ic)),0);
+ pic16_mov2w(AOP(IC_RIGHT(ic)),0);
if (pic16_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
pic16_emitpcode(POC_SUBWF, pic16_popGet(AOP(IC_LEFT(ic)),0));
while(size--){
if (pic16_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) {
- mov2w(AOP(IC_RIGHT(ic)),offset);
+ pic16_mov2w(AOP(IC_RIGHT(ic)),offset);
pic16_emitpcode(POC_SUBWFB_D1, pic16_popGet(AOP(IC_RESULT(ic)),offset));
} else {
- mov2w(AOP(IC_RIGHT(ic)),offset);
+ pic16_mov2w(AOP(IC_RIGHT(ic)),offset);
pic16_emitpcode(POC_SUBWFB_D0, pic16_popGet(AOP(IC_LEFT(ic)),offset));
pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(IC_RESULT(ic)),offset));
}
if(AOP_TYPE(left) != AOP_ACC) {
// left is not WREG
if(AOP_TYPE(right) != AOP_ACC) {
- mov2w(AOP(left), 0);
+ pic16_mov2w(AOP(left), 0);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
} else {
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(left), 0));
pct3 = pic16_popGetTempReg(1);
pct4 = pic16_popGetTempReg(1);
- mov2w(AOP(left), 0);
+ pic16_mov2w(AOP(left), 0);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_pCodeOpCopy(pct1)));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_pCodeOpCopy(pct3)));
- mov2w(AOP(left), 1);
+ pic16_mov2w(AOP(left), 1);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_pCodeOpCopy(pct4)));
} else {
- mov2w(AOP(left), 0);
+ pic16_mov2w(AOP(left), 0);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_popGet(AOP(result), 0)));
pic16_emitpcode(POC_MOVFW, pic16_popCopyReg(&pic16_pc_prodl));
pic16_emitpcode(POC_ADDWF, pic16_popGet(AOP(result), 1));
- mov2w(AOP(left), 1);
+ pic16_mov2w(AOP(left), 1);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFW, pic16_popCopyReg(&pic16_pc_prodl));
pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result), 1));
#if 0
pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),0,FALSE,FALSE),7,0, PO_GPR_REGISTER));
pic16_emitpcode(POC_SUBWF, pic16_popCopyReg(result_hi));
- mov2w(AOP(left),0);
+ pic16_mov2w(AOP(left),0);
pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),0,FALSE,FALSE),7,0, PO_GPR_REGISTER));
pic16_emitpcode(POC_SUBWF, pic16_popGet(AOP(result),1));
#endif
pct3 = pic16_popGetTempReg(1);
pct4 = pic16_popGetTempReg(1);
- mov2w(AOP(left), 0);
+ pic16_mov2w(AOP(left), 0);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_pCodeOpCopy(pct1)));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_pCodeOpCopy(pct3)));
- mov2w(AOP(left), 1);
+ pic16_mov2w(AOP(left), 1);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_pCodeOpCopy(pct4)));
} else {
- mov2w(AOP(left), 0);
+ pic16_mov2w(AOP(left), 0);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFF, pic16_popGet2p(
pic16_popCopyReg(&pic16_pc_prodl), pic16_popGet(AOP(result), 0)));
pic16_emitpcode(POC_MOVFW, pic16_popCopyReg(&pic16_pc_prodl));
pic16_emitpcode(POC_ADDWF, pic16_popGet(AOP(result), 1));
- mov2w(AOP(left), 1);
+ pic16_mov2w(AOP(left), 1);
pic16_emitpcode(POC_MULWF, pic16_popGet(AOP(right), 0));
pic16_emitpcode(POC_MOVFW, pic16_popCopyReg(&pic16_pc_prodl));
pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result), 1));