#include "pcode.h"
#include "gen.h"
-/*
- if(IC_RESULT(ic) && AOP(IC_RESULT(ic)))
- DEBUGpic14_emitcode ("; ","result %s",
- AopType(AOP_TYPE(IC_RESULT(ic))));
-
- if(IC_LEFT(ic) && AOP(IC_LEFT(ic)))
- DEBUGpic14_emitcode ("; ","left %s",
- AopType(AOP_TYPE(IC_LEFT(ic))));
-
- if(IC_RIGHT(ic) && AOP(IC_RIGHT(ic)))
- DEBUGpic14_emitcode ("; ","right %s",
- AopType(AOP_TYPE(IC_RIGHT(ic))));
-*/
-
static int labelOffset=0;
static int debug_verbose=1;
unsigned int pic14aopLiteral (value *val, int offset);
const char *AopType(short type);
+static iCode *ifxForOp ( operand *op, iCode *ic );
#define BYTEofLONG(l,b) ( (l>> (b<<3)) & 0xff)
return -1;
}
+void DEBUGpic14_AopType(int line_no, operand *left, operand *right, operand *result)
+{
+
+ DEBUGpic14_emitcode ("; ","line = %d result %s=%s, left %s=%s, right %s=%s, size = %d",
+ line_no,
+ ((result) ? AopType(AOP_TYPE(result)) : "-"),
+ ((result) ? aopGet(AOP(result),0,TRUE,FALSE) : "-"),
+ ((left) ? AopType(AOP_TYPE(left)) : "-"),
+ ((left) ? aopGet(AOP(left),0,TRUE,FALSE) : "-"),
+ ((right) ? AopType(AOP_TYPE(right)) : "-"),
+ ((right) ? aopGet(AOP(right),0,FALSE,FALSE) : "-"),
+ ((result) ? AOP_SIZE(result) : 0));
+
+}
+
void DEBUGpic14_emitcode (char *inst,char *fmt, ...)
{
va_list ap;
sym->aop = aop = newAsmop (AOP_CRY);
aop->aopu.aop_dir = sym->rname ;
aop->size = getSize(sym->type);
- DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size);
+ //DEBUGpic14_emitcode(";","%d sym->rname = %s, size = %d",__LINE__,sym->rname,aop->size);
return aop;
}
/* if it is in direct space */
if (!op)
return ;
- DEBUGpic14_emitcode(";","%d",__LINE__);
+ // DEBUGpic14_emitcode(";","%d",__LINE__);
/* if this a literal */
if (IS_OP_LITERAL(op)) {
op->aop = aop = newAsmop(AOP_LIT);
aop->aopu.aop_lit = op->operand.valOperand;
aop->size = getSize(operandType(op));
- DEBUGpic14_emitcode(";","%d, lit = %d",__LINE__,aop->aopu.aop_lit);
return;
}
/* if this is a true symbol */
if (IS_TRUE_SYMOP(op)) {
- DEBUGpic14_emitcode(";","%d - true symop",__LINE__);
- op->aop = aopForSym(ic,OP_SYMBOL(op),result);
- return ;
+ //DEBUGpic14_emitcode(";","%d - true symop",__LINE__);
+ op->aop = aopForSym(ic,OP_SYMBOL(op),result);
+ return ;
}
/* this is a temporary : this has
/* if the type is a conditional */
if (sym->regType == REG_CND) {
- DEBUGpic14_emitcode(";","%d",__LINE__);
aop = op->aop = sym->aop = newAsmop(AOP_CRY);
aop->size = 0;
return;
sym->aop = op->aop = aop =
aopForRemat (sym);
aop->size = getSize(sym->type);
- DEBUGpic14_emitcode(";","%d",__LINE__);
return;
}
}
/* else spill location */
+ if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
+ /* force a new aop if sizes differ */
+ sym->usl.spillLoc->aop = NULL;
+ }
DEBUGpic14_emitcode(";","%s %d %s",__FUNCTION__,__LINE__,sym->usl.spillLoc->rname);
sym->aop = op->aop = aop =
aopForSym(ic,sym->usl.spillLoc,result);
/* depending on the asmop type only three cases need work AOP_RO
, AOP_R1 && AOP_STK */
+#if 0
switch (aop->type) {
case AOP_R0 :
if (_G.r0Pushed ) {
}
}
}
+#endif
dealloc:
/* all other cases just dealloc */
return rs;
case AOP_REG:
- DEBUGpic14_emitcode(";","%d",__LINE__);
if (dname)
return aop->aopu.aop_reg[offset]->dname;
else
return aop->aopu.aop_reg[offset]->name;
case AOP_CRY:
- pic14_emitcode(";","%d",__LINE__);
- //pic14_emitcode("clr","a");
- //pic14_emitcode("mov","c,%s",aop->aopu.aop_dir);
- //pic14_emitcode("rlc","a") ;
- //return (dname ? "acc" : "a");
+ //pic14_emitcode(";","%d",__LINE__);
return aop->aopu.aop_dir;
case AOP_ACC:
DEBUGpic14_emitcode(";Warning -pic port ignoring get(AOP_ACC)","%d",__LINE__);
- //if (!offset && dname)
- // return "acc";
- //return aop->aopu.aop_str[offset];
return "AOP_accumulator_bug";
case AOP_LIT:
- DEBUGpic14_emitcode(";","%d",__LINE__);
sprintf(s,"0x%02x", pic14aopLiteral (aop->aopu.aop_lit,offset));
rs = Safe_calloc(1,strlen(s)+1);
strcpy(rs,s);
pcor->r = pc->r;
pcor->rIdx = pc->rIdx;
+ //DEBUGpic14_emitcode ("; ***","%s , copying %s, rIdx=%d",__FUNCTION__,pc->pcop.name,pc->rIdx);
return PCOP(pcor);
}
/*-----------------------------------------------------------------*/
/* popGet - asm operator to pcode operator conversion */
/*-----------------------------------------------------------------*/
-pCodeOp *popGet (asmop *aop, int offset, bool bit16, bool dname)
+pCodeOp *popGet (asmop *aop, int offset) //, bool bit16, bool dname)
{
char *s = buffer ;
char *rs;
DEBUGpic14_emitcode(";","%d",__LINE__);
pcop = Safe_calloc(1,sizeof(pCodeOp) );
pcop->type = PO_IMMEDIATE;
- if (bit16)
- sprintf (s,"%s",aop->aopu.aop_immd);
+ //if (bit16)
+ // sprintf (s,"%s",aop->aopu.aop_immd);
+ //else
+ if (offset)
+ sprintf(s,"(%s >> %d)",
+ aop->aopu.aop_immd,
+ offset*8);
else
- if (offset)
- sprintf(s,"(%s >> %d)",
- aop->aopu.aop_immd,
- offset*8);
- else
- sprintf(s,"%s",
- aop->aopu.aop_immd);
+ sprintf(s,"%s",
+ aop->aopu.aop_immd);
pcop->name = Safe_calloc(1,strlen(s)+1);
strcpy(pcop->name,s);
return pcop;
{
int rIdx = aop->aopu.aop_reg[offset]->rIdx;
- DEBUGpic14_emitcode(";","%d, rIdx=0x%x",__LINE__,rIdx);
- if(bit16)
- pcop = Safe_calloc(1,sizeof(pCodeOpRegBit) );
- else
- pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
- //pcop->type = PO_GPR_REGISTER;
+ pcop = Safe_calloc(1,sizeof(pCodeOpReg) );
PCOR(pcop)->rIdx = rIdx;
PCOR(pcop)->r = pic14_regWithIdx(rIdx);
pcop->type = PCOR(pcop)->r->pc_type;
-
- if (dname)
- rs = aop->aopu.aop_reg[offset]->dname;
- else
- rs = aop->aopu.aop_reg[offset]->name;
-
- DEBUGpic14_emitcode(";","%d %s",__LINE__,rs);
-
+ rs = aop->aopu.aop_reg[offset]->name;
+ //DEBUGpic14_emitcode(";","%d regiser idx = %d name =%s",__LINE__,rIdx,rs);
return pcop;
}
return pcop;
case AOP_LIT:
- DEBUGpic14_emitcode(";","%d",__LINE__);
return newpCodeOpLit(pic14aopLiteral (aop->aopu.aop_lit,offset));
case AOP_STR:
pcop->type = PO_STR;
//aop->coff = offset ;
- if (strcmp(aop->aopu.aop_str[offset],"a") == 0 && dname)
- sprintf(s,"%s","acc");
- else
- sprintf(s,"%s",aop->aopu.aop_str[offset]);
- pcop->name = Safe_calloc(1,strlen(s)+1);
- strcpy(pcop->name,s);
- return pcop;
+ //if (strcmp(aop->aopu.aop_str[offset],"a") == 0 && dname)
+ // sprintf(s,"%s","acc");
+ //else
+ sprintf(s,"%s",aop->aopu.aop_str[offset]);
+ pcop->name = Safe_calloc(1,strlen(s)+1);
+ strcpy(pcop->name,s);
+ return pcop;
}
if(strcmp(s,"W"))
pic14_emitcode(";BUG! should have this:movf","%s,w %d",s,__LINE__);
- emitpcode(POC_MOVWF,popGet(aop,offset,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(aop,offset));
}
pcop->name = Safe_strdup(s);
emitpcode(POC_MOVFW,pcop);
}
- emitpcode(POC_MOVWF,popGet(aop,offset,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(aop,offset));
}
break;
/*-----------------------------------------------------------------*/
void pic14_outAcc(operand *result)
{
+ int size,offset;
+ DEBUGpic14_emitcode ("; ***","%s %d - ",__FUNCTION__,__LINE__);
+ DEBUGpic14_AopType(__LINE__,NULL,NULL,result);
- DEBUGpic14_emitcode ("; ***","%s %d - Warning no code will be generated here",__FUNCTION__,__LINE__);
-#if 0
- size = pic14_getDataSize(result);
- if(size){
- aopPut(AOP(result),"a",0);
- size--;
- offset = 1;
- /* unsigned or positive */
- while(size--){
- aopPut(AOP(result),zero,offset++);
- }
- }
-#endif
+ size = pic14_getDataSize(result);
+ if(size){
+ emitpcode(POC_MOVWF,popGet(AOP(result),0));
+ size--;
+ offset = 1;
+ /* unsigned or positive */
+ while(size--)
+ emitpcode(POC_CLRF,popGet(AOP(result),offset++));
+ }
+
}
/*-----------------------------------------------------------------*/
DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
if ( AOP_TYPE(oper) != AOP_ACC) {
- emitpcode(POC_MOVFW,popGet(AOP(oper),0,FALSE,FALSE));
- pic14_emitcode("movf","%s,w",aopGet(AOP(oper),0,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(oper),0));
}
while (size--) {
- pic14_emitcode("iorwf","%s,w",aopGet(AOP(oper),offset,FALSE,FALSE));
- emitpcode(POC_IORFW, popGet(AOP(oper),offset++,FALSE,FALSE));
+ emitpcode(POC_IORFW, popGet(AOP(oper),offset++));
}
}
/*-----------------------------------------------------------------*/
static void genNot (iCode *ic)
{
- symbol *tlbl;
- sym_link *optype = operandType(IC_LEFT(ic));
-
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- /* assign asmOps to operand & result */
- aopOp (IC_LEFT(ic),ic,FALSE);
- aopOp (IC_RESULT(ic),ic,TRUE);
+ symbol *tlbl;
+ sym_link *optype = operandType(IC_LEFT(ic));
+ int size;
- /* if in bit space then a special case */
- if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) {
- pic14_emitcode("movlw","1<<%s");
- //pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir);
- //pic14_emitcode("cpl","c");
- //pic14_outBitC(IC_RESULT(ic));
- goto release;
- }
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ /* assign asmOps to operand & result */
+ aopOp (IC_LEFT(ic),ic,FALSE);
+ aopOp (IC_RESULT(ic),ic,TRUE);
+
+ DEBUGpic14_AopType(__LINE__,IC_LEFT(ic),NULL,IC_RESULT(ic));
+ /* if in bit space then a special case */
+ if (AOP_TYPE(IC_LEFT(ic)) == AOP_CRY) {
+ pic14_emitcode("movlw","1<<%s");
+ //pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir);
+ //pic14_emitcode("cpl","c");
+ //pic14_outBitC(IC_RESULT(ic));
+ goto release;
+ }
- /* if type float then do float */
- if (IS_FLOAT(optype)) {
- genNotFloat(IC_LEFT(ic),IC_RESULT(ic));
- goto release;
- }
+ /* if type float then do float */
+ if (IS_FLOAT(optype)) {
+ genNotFloat(IC_LEFT(ic),IC_RESULT(ic));
+ goto release;
+ }
- pic14_toBoolean(IC_LEFT(ic));
+ size = AOP_SIZE(IC_RESULT(ic));
+ if(size == 1) {
+ emitpcode(POC_COMFW,popGet(AOP(IC_LEFT(ic)),0));
+ emitpcode(POC_ANDLW,popGetLit(1));
+ emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0));
+ goto release;
+ }
+ pic14_toBoolean(IC_LEFT(ic));
- tlbl = newiTempLabel(NULL);
- pic14_emitcode("cjne","a,#0x01,%05d_DS_",tlbl->key+100);
- pic14_emitcode("","%05d_DS_:",tlbl->key+100);
- pic14_outBitC(IC_RESULT(ic));
+ tlbl = newiTempLabel(NULL);
+ pic14_emitcode("cjne","a,#0x01,%05d_DS_",tlbl->key+100);
+ pic14_emitcode("","%05d_DS_:",tlbl->key+100);
+ pic14_outBitC(IC_RESULT(ic));
-release:
- /* release the aops */
- freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
- freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
+ release:
+ /* release the aops */
+ freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
+ freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
}
/*-----------------------------------------------------------------*/
static void genUminus (iCode *ic)
{
- int offset ,size ;
- sym_link *optype, *rtype;
+ int size, i;
+ sym_link *optype, *rtype;
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- /* assign asmops */
- aopOp(IC_LEFT(ic),ic,FALSE);
- aopOp(IC_RESULT(ic),ic,TRUE);
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ /* assign asmops */
+ aopOp(IC_LEFT(ic),ic,FALSE);
+ aopOp(IC_RESULT(ic),ic,TRUE);
- /* if both in bit space then special
- case */
- if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY &&
- AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) {
+ /* if both in bit space then special
+ case */
+ if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY &&
+ AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) {
- pic14_emitcode("mov","c,%s",IC_LEFT(ic)->aop->aopu.aop_dir);
- pic14_emitcode("cpl","c");
- pic14_emitcode("mov","%s,c",IC_RESULT(ic)->aop->aopu.aop_dir);
- goto release;
- }
+ emitpcode(POC_BCF, popGet(AOP(IC_RESULT(ic)),0));
+ emitpcode(POC_BTFSS, popGet(AOP(IC_LEFT(ic)),0));
+ emitpcode(POC_BSF, popGet(AOP(IC_RESULT(ic)),0));
- optype = operandType(IC_LEFT(ic));
- rtype = operandType(IC_RESULT(ic));
+ goto release;
+ }
- /* if float then do float stuff */
- if (IS_FLOAT(optype)) {
- genUminusFloat(IC_LEFT(ic),IC_RESULT(ic));
- goto release;
- }
+ optype = operandType(IC_LEFT(ic));
+ rtype = operandType(IC_RESULT(ic));
- /* otherwise subtract from zero */
- size = AOP_SIZE(IC_LEFT(ic));
- offset = 0 ;
- CLRC ;
- while(size--) {
- char *l = aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE);
- if (!strcmp(l,"a")) {
- pic14_emitcode("cpl","a");
- pic14_emitcode("inc","a");
- } else {
- pic14_emitcode("clr","a");
- pic14_emitcode("subb","a,%s",l);
- }
- aopPut(AOP(IC_RESULT(ic)),"a",offset++);
+ /* if float then do float stuff */
+ if (IS_FLOAT(optype)) {
+ genUminusFloat(IC_LEFT(ic),IC_RESULT(ic));
+ goto release;
+ }
+
+ /* otherwise subtract from zero by taking the 2's complement */
+ size = AOP_SIZE(IC_LEFT(ic));
+
+ for(i=0; i<size; i++) {
+ if (pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
+ emitpcode(POC_COMF, popGet(AOP(IC_LEFT(ic)),i));
+ else {
+ emitpcode(POC_COMFW, popGet(AOP(IC_LEFT(ic)),i));
+ emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),i));
}
+ }
- /* if any remaining bytes in the result */
- /* we just need to propagate the sign */
- if ((size = (AOP_SIZE(IC_RESULT(ic)) - AOP_SIZE(IC_LEFT(ic))))) {
- pic14_emitcode("rlc","a");
- pic14_emitcode("subb","a,acc");
- while (size--)
- aopPut(AOP(IC_RESULT(ic)),"a",offset++);
- }
+ emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),0));
+ for(i=1; i<size; i++) {
+ emitSKPNZ;
+ emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),i));
+ }
-release:
- /* release the aops */
- freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
- freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
+ release:
+ /* release the aops */
+ freeAsmop(IC_LEFT(ic),NULL,ic,(RESULTONSTACK(ic) ? 0 : 1));
+ freeAsmop(IC_RESULT(ic),NULL,ic,TRUE);
}
/*-----------------------------------------------------------------*/
}
dtype = operandType(IC_LEFT(ic));
- if (dtype &&
+ if (currFunc && dtype &&
(FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) &&
IFFUNC_ISISR(currFunc->type) &&
!ic->bankSaved)
/*-----------------------------------------------------------------*/
static void assignResultValue(operand * oper)
{
- int offset = 0;
int size = AOP_SIZE(oper);
DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
if(!GpsuedoStkPtr) {
/* The last byte in the assignment is in W */
- //aopPut(AOP(oper),"W",size-1);
- emitpcode(POC_MOVWF, popGet(AOP(oper),0,FALSE,FALSE));
- GpsuedoStkPtr++;
- if(size == 1)
- return;
size--;
- offset++;
+ emitpcode(POC_MOVWF, popGet(AOP(oper),size));
+ GpsuedoStkPtr++;
}
while (size--) {
emitpcode(POC_MOVFW,popRegFromIdx(GpsuedoStkPtr-1 + Gstack_base_addr));
- emitpcode(POC_MOVWF, popGet(AOP(oper),offset,FALSE,FALSE));
- offset++;
GpsuedoStkPtr++;
-
+ emitpcode(POC_MOVWF, popGet(AOP(oper),size));
}
}
-/*-----------------------------------------------------------------*/
-/* genXpush - pushes onto the external stack */
-/*-----------------------------------------------------------------*/
-static void genXpush (iCode *ic)
-{
- asmop *aop = newAsmop(0);
- regs *r ;
- int size,offset = 0;
-
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- aopOp(IC_LEFT(ic),ic,FALSE);
- r = getFreePtr(ic,&aop,FALSE);
-
-
- pic14_emitcode("mov","%s,_spx",r->name);
-
- size = AOP_SIZE(IC_LEFT(ic));
- while(size--) {
-
- char *l = aopGet(AOP(IC_LEFT(ic)),
- offset++,FALSE,FALSE);
- MOVA(l);
- pic14_emitcode("movx","@%s,a",r->name);
- pic14_emitcode("inc","%s",r->name);
-
- }
-
-
- pic14_emitcode("mov","_spx,%s",r->name);
-
- freeAsmop(NULL,aop,ic,TRUE);
- freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
-}
-
/*-----------------------------------------------------------------*/
/* genIpush - genrate code for pushing this gets a little complex */
/*-----------------------------------------------------------------*/
static void genIpush (iCode *ic)
{
+
+ DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
int size, offset = 0 ;
char *l;
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
/* if this is not a parm push : ie. it is spill push
and spill push is always done on the local stack */
if (!ic->parmPush) {
registers that need to be saved */
saveRegisters(ic);
- /* if use external stack then call the external
- stack pushing routine */
- if (options.useXstack) {
- genXpush(ic);
- return ;
- }
-
/* then do the push */
aopOp(IC_LEFT(ic),ic,FALSE);
}
freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
+#endif
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
static void genIpop (iCode *ic)
{
+ DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
int size,offset ;
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
/* if the temp was not pushed then */
if (OP_SYMBOL(IC_LEFT(ic))->isspilt)
return ;
FALSE,TRUE));
freeAsmop(IC_LEFT(ic),NULL,ic,TRUE);
+#endif
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
static void unsaverbank (int bank,iCode *ic,bool popPsw)
{
+ DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
int i;
asmop *aop ;
regs *r = NULL;
pic14_emitcode("mov","_spx,%s",r->name);
freeAsmop(NULL,aop,ic,TRUE);
- }
+ }
+#endif
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
static void saverbank (int bank, iCode *ic, bool pushPsw)
{
+ DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
int i;
asmop *aop ;
regs *r = NULL;
pic14_emitcode("mov","psw,#0x%02x",(bank << 3)&0x00ff);
}
ic->bankSaved = 1;
-
+#endif
}
/*-----------------------------------------------------------------*/
the same register bank then we need to save the
destination registers on the stack */
dtype = operandType(IC_LEFT(ic));
- if (dtype &&
+ if (currFunc && dtype &&
(FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)) &&
IFFUNC_ISISR(currFunc->type) &&
!ic->bankSaved)
* in registers. (The pCode optimizer will get
* rid of most of these :).
*/
- int psuedoStkPtr=0;
+ int psuedoStkPtr=-1;
int firstTimeThruLoop = 1;
+ _G.sendSet = reverseSet(_G.sendSet);
+
+ /* First figure how many parameters are getting passed */
+ for (sic = setFirstItem(_G.sendSet) ; sic ;
+ sic = setNextItem(_G.sendSet)) {
+
+ aopOp(IC_LEFT(sic),sic,FALSE);
+ psuedoStkPtr += AOP_SIZE(IC_LEFT(sic));
+ freeAsmop (IC_LEFT(sic),NULL,sic,FALSE);
+ }
+
for (sic = setFirstItem(_G.sendSet) ; sic ;
sic = setNextItem(_G.sendSet)) {
int size, offset = 0;
while (size--) {
- char *l = aopGet(AOP(IC_LEFT(sic)),offset,
- FALSE,FALSE);
DEBUGpic14_emitcode ("; ","%d left %s",__LINE__,
AopType(AOP_TYPE(IC_LEFT(sic))));
if(!firstTimeThruLoop) {
- /* If is not the first time we've been through the loop
+ /* If this is not the first time we've been through the loop
* then we need to save the parameter in a temporary
* register. The last byte of the last parameter is
* passed in W. */
- pic14_emitcode("movwf","%s",fReturn[offset]);
- emitpcode(POC_MOVWF,popRegFromIdx(psuedoStkPtr + Gstack_base_addr));
- psuedoStkPtr++;
- DEBUGpic14_emitcode ("; ","%d save param in %d",__LINE__,
- psuedoStkPtr+Gstack_base_addr);
+ emitpcode(POC_MOVWF,popRegFromIdx(--psuedoStkPtr + Gstack_base_addr));
+
}
firstTimeThruLoop=0;
- if (strcmp(l,fReturn[offset])) {
+ //if (strcmp(l,fReturn[offset])) {
- if ( ((AOP(IC_LEFT(sic))->type) == AOP_IMMD) ||
- ((AOP(IC_LEFT(sic))->type) == AOP_LIT) )
- emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(sic)),size,FALSE,FALSE));
- //pic14_emitcode("movlw","%s",l);
- else
- emitpcode(POC_MOVFW,popGet(AOP(IC_LEFT(sic)),size,FALSE,FALSE));
- //pic14_emitcode("movf","%s,w",l);
+ if ( ((AOP(IC_LEFT(sic))->type) == AOP_IMMD) ||
+ ((AOP(IC_LEFT(sic))->type) == AOP_LIT) )
+ emitpcode(POC_MOVLW,popGet(AOP(IC_LEFT(sic)),offset));
+ else
+ emitpcode(POC_MOVFW,popGet(AOP(IC_LEFT(sic)),offset));
- /* The last one is passed in W but all others are passed on
- the psuedo stack */
- /*
- if(size) {
- pic14_emitcode("movwf","%s",fReturn[offset]);
- emitpcode(POC_MOVWF,popRegFromIdx(offset + Gstack_base_addr));
- }
- */
- }
+ //}
offset++;
}
freeAsmop (IC_LEFT(sic),NULL,sic,TRUE);
the same register bank then we need to save the
destination registers on the stack */
dtype = operandType(IC_LEFT(ic));
- if (dtype &&
+ if (currFunc && dtype &&
IFFUNC_ISISR(currFunc->type) &&
(FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)))
saverbank(FUNC_REGBANK(dtype),ic,TRUE);
}
/* if register bank was saved then unsave them */
- if (dtype &&
+ if (currFunc && dtype &&
(FUNC_REGBANK(currFunc->type) != FUNC_REGBANK(dtype)))
unsaverbank(FUNC_REGBANK(dtype),ic,TRUE);
/*-----------------------------------------------------------------*/
static bool inExcludeList(char *s)
{
+ DEBUGpic14_emitcode ("; ***","%s %d - WARNING no code generated",__FUNCTION__,__LINE__);
+#if 0
int i =0;
DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
STRCASECMP(s,options.excludeRegs[i]) == 0)
return TRUE;
}
+#endif
return FALSE ;
}
if (strcmp(fReturn[offset],l)) {
if( ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD) ||
((AOP(IC_LEFT(ic))->type) == AOP_LIT) ) {
- emitpcode(POC_MOVLW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
- pic14_emitcode("movlw","%s",l);
+ emitpcode(POC_MOVLW, popGet(AOP(IC_LEFT(ic)),offset));
}else {
- emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
- pic14_emitcode("movf","%s,w",l);
+ emitpcode(POC_MOVFW, popGet(AOP(IC_LEFT(ic)),offset));
}
if(size) {
emitpcode(POC_MOVWF,popRegFromIdx(offset + Gstack_base_addr));
pic14_emitcode ("goto","_%05d_DS_",(IC_LABEL(ic)->key+100)+labelOffset);
}
-/*-----------------------------------------------------------------*/
-/* findLabelBackwards: walks back through the iCode chain looking */
-/* for the given label. Returns number of iCode instructions */
-/* between that label and given ic. */
-/* Returns zero if label not found. */
-/*-----------------------------------------------------------------*/
-#if 0
-static int findLabelBackwards(iCode *ic, int key)
-{
- int count = 0;
-
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- while (ic->prev)
- {
- ic = ic->prev;
- count++;
-
- if (ic->op == LABEL && IC_LABEL(ic)->key == key)
- {
- /* printf("findLabelBackwards = %d\n", count); */
- return count;
- }
- }
-
- return 0;
-}
-#endif
/*-----------------------------------------------------------------*/
/* genMultbits :- multiplication of bits */
operand *right,
operand *result)
{
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+
+ if(!pic14_sameRegs(AOP(result),AOP(right)))
+ emitpcode(POC_BSF, popGet(AOP(result),0));
+
+ emitpcode(POC_BTFSC,popGet(AOP(right),0));
+ emitpcode(POC_BTFSS,popGet(AOP(left),0));
+ emitpcode(POC_BCF, popGet(AOP(result),0));
- pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
- pic14_emitcode("anl","c,%s",AOP(right)->aopu.aop_dir);
- pic14_outBitC(result);
}
int size,offset;
DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ DEBUGpic14_AopType(__LINE__,left,right,result);
+
/* (if two literals, the value is computed before) */
/* if one literal, literal on the right */
if (AOP_TYPE(left) == AOP_LIT){
aopOp (right,ic,FALSE);
aopOp (result,ic,TRUE);
+ DEBUGpic14_AopType(__LINE__,left,right,result);
+
/* special cases first */
/* both are bits */
if (AOP_TYPE(left) == AOP_CRY &&
rifx->generated = 1;
}
+/*-----------------------------------------------------------------*/
+/* genSkipz2 */
+/*-----------------------------------------------------------------*/
+static void genSkipz2(resolvedIfx *rifx)
+{
+ if(!rifx)
+ return;
+
+ if(rifx->condition)
+ emitSKPZ;
+ else
+ emitSKPNZ;
+
+ emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key));
+ rifx->generated = 1;
+}
+
/*-----------------------------------------------------------------*/
/* genSkipz */
/*-----------------------------------------------------------------*/
pic14_emitcode("goto","_%05d_DS_",IC_FALSE(ifx)->key+100+labelOffset);
}
+/*-----------------------------------------------------------------*/
+/* genSkipCond */
+/*-----------------------------------------------------------------*/
+static void genSkipCond(resolvedIfx *rifx,operand *op, int offset, int bit)
+{
+ if(!rifx)
+ return;
+
+ if(rifx->condition)
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0));
+ else
+ emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(op),offset,FALSE,FALSE),bit,0));
+
+
+ emitpcode(POC_GOTO,popGetLabel(rifx->lbl->key));
+ rifx->generated = 1;
+}
+
+#if 0
+/*-----------------------------------------------------------------*/
+/* genChkZeroes :- greater or less than comparison */
+/* For each byte in a literal that is zero, inclusive or the */
+/* the corresponding byte in the operand with W */
+/* returns true if any of the bytes are zero */
+/*-----------------------------------------------------------------*/
+static int genChkZeroes(operand *op, int lit, int size)
+{
+
+ int i;
+ int flag =1;
+
+ while(size--) {
+ i = (lit >> (size*8)) & 0xff;
+
+ if(i==0) {
+ if(flag)
+ emitpcode(POC_MOVFW, popGet(AOP(op),size));
+ else
+ emitpcode(POC_IORFW, popGet(AOP(op),size));
+ flag = 0;
+ }
+ }
+
+ return (flag==0);
+}
+#endif
+
/*-----------------------------------------------------------------*/
/* genCmp :- greater or less than comparison */
/*-----------------------------------------------------------------*/
{
int size, offset = 0 ;
unsigned long lit = 0L,i = 0;
- resolvedIfx rIfx;
-
+ resolvedIfx rFalseIfx;
+ // resolvedIfx rTrueIfx;
+ symbol *truelbl;
DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
if(ifx) {
DEBUGpic14_emitcode ("; ***","true ifx is %s",((IC_TRUE(ifx) == NULL) ? "false" : "true"));
DEBUGpic14_emitcode ("; ***","false ifx is %s",((IC_FALSE(ifx) == NULL) ? "false" : "true"));
}
- resolveIfx(&rIfx,ifx);
+ resolveIfx(&rFalseIfx,ifx);
+ truelbl = newiTempLabel(NULL);
+
+ //if(IC_TRUE(ifx) == NULL)
/* if left & right are bit variables */
if (AOP_TYPE(left) == AOP_CRY &&
AOP_TYPE(right) == AOP_CRY ) {
pic14_emitcode("","%05d_DS_:",lbl->key+100);
} else {
+ symbol *lbl = newiTempLabel(NULL);
+
if(AOP_TYPE(right) == AOP_LIT) {
- symbol *lbl = newiTempLabel(NULL);
lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
- DEBUGpic14_emitcode(";right lit","lit = %d,sign=%d",lit,sign);
+ DEBUGpic14_emitcode(";right lit","lit = 0x%x,sign=%d",lit,sign);
- size--;
- i = (lit >> (size*8)) & 0xff;
- if(sign) {
- if(i & 0x80) {
- emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
- } else {
- emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
- }
- emitpcode(POC_GOTO,popGetLabel(lbl->key));
- }
+ /* special cases */
- emitpcode(POC_MOVLW, popGetLit(i));
- emitpcode(POC_SUBFW, popGet(AOP(left),size,FALSE,FALSE));
- while(size--) {
- i = (lit >> (size*8)) & 0xff;
- emitpcode(POC_MOVLW, popGetLit(i));
- emitSKPNC;
- emitpcode(POC_SUBFW, popGet(AOP(left),size,FALSE,FALSE));
- }
+ if(lit == 0) {
+
+ if(sign != 0)
+ genSkipCond(&rFalseIfx,left,size-1,7);
+ else
+ /* no need to compare to 0...*/
+ /* NOTE: this is a de-generate compare that most certainly
+ * creates some dead code. */
+ emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key));
+
+ if(ifx) ifx->generated = 1;
+ return;
+
+ }
+ size--;
+
+ if(size == 0) {
+ //i = (lit >> (size*8)) & 0xff;
+ DEBUGpic14_emitcode(";right lit","line = %d",__LINE__);
+
+ emitpcode(POC_MOVFW, popGet(AOP(left),size));
+
+ i = ((0-lit) & 0xff);
+ if(sign) {
+ if( i == 0x81) {
+ /* lit is 0x7f, all signed chars are less than
+ * this except for 0x7f itself */
+ emitpcode(POC_XORLW, popGetLit(0x7f));
+ genSkipz2(&rFalseIfx);
+ } else {
+ emitpcode(POC_ADDLW, popGetLit(0x80));
+ emitpcode(POC_ADDLW, popGetLit(i^0x80));
+ genSkipc(&rFalseIfx);
+ }
+
+ } else {
+ emitpcode(POC_ADDLW, popGetLit(i));
+ genSkipc(&rFalseIfx);
+
+ }
+
+ if(ifx) ifx->generated = 1;
+ return;
+ }
+
+ /* chars are out of the way. now do ints and longs */
+
+
+ DEBUGpic14_emitcode(";right lit","line = %d",__LINE__);
+
+ /* special cases */
+
+ if(sign) {
+
+ if(lit == 0) {
+ genSkipCond(&rFalseIfx,left,size,7);
+ if(ifx) ifx->generated = 1;
+ return;
+ }
+
+ if(lit <0x100) {
+ DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+
+ //rFalseIfx.condition ^= 1;
+ //genSkipCond(&rFalseIfx,left,size,7);
+ //rFalseIfx.condition ^= 1;
+
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+ if(rFalseIfx.condition)
+ emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key));
+ else
+ emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+
+ emitpcode(POC_MOVLW, popGetLit(0x100-lit));
+ emitpcode(POC_ADDFW, popGet(AOP(left),0));
+ emitpcode(POC_MOVFW, popGet(AOP(left),1));
+
+ while(size > 1)
+ emitpcode(POC_IORFW, popGet(AOP(left),size--));
+
+ if(rFalseIfx.condition) {
+ emitSKPZ;
+ emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+
+ } else {
+ emitSKPNZ;
+ }
+
+ genSkipc(&rFalseIfx);
+ emitpLabel(truelbl->key);
+ if(ifx) ifx->generated = 1;
+ return;
+
+ }
+
+ if(size == 1) {
+
+ if( (lit & 0xff) == 0) {
+ /* lower byte is zero */
+ DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+ i = ((lit >> 8) & 0xff) ^0x80;
+ emitpcode(POC_MOVFW, popGet(AOP(left),size));
+ emitpcode(POC_ADDLW, popGetLit( 0x80));
+ emitpcode(POC_ADDLW, popGetLit(0x100-i));
+ genSkipc(&rFalseIfx);
+
+
+ if(ifx) ifx->generated = 1;
+ return;
+
+ }
+ } else {
+ /* Special cases for signed longs */
+ if( (lit & 0xffffff) == 0) {
+ /* lower byte is zero */
+ DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+ i = ((lit >> 8*3) & 0xff) ^0x80;
+ emitpcode(POC_MOVFW, popGet(AOP(left),size));
+ emitpcode(POC_ADDLW, popGetLit( 0x80));
+ emitpcode(POC_ADDLW, popGetLit(0x100-i));
+ genSkipc(&rFalseIfx);
+
+
+ if(ifx) ifx->generated = 1;
+ return;
+
+ }
+
+ }
+
+
+ if(lit & (0x80 << (size*8))) {
+ /* lit is negative */
+ DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+
+ //genSkipCond(&rFalseIfx,left,size,7);
+
+ emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+
+ if(rFalseIfx.condition)
+ emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+ else
+ emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key));
+
+
+ } else {
+ /* lit is positive */
+ DEBUGpic14_emitcode(";right lit","line = %d signed compare to 0x%x",__LINE__,lit);
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+ if(rFalseIfx.condition)
+ emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key));
+ else
+ emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+
+ //emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(left),size,FALSE,FALSE),7,0));
+ //emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+ //rFalseIfx.condition ^= 1;
+ //genSkipCond(&rFalseIfx,left,size,7);
+ //rFalseIfx.condition ^= 1;
+ }
+
+ /*
+ This works, but is only good for ints.
+ It also requires a "known zero" register.
+ emitpcode(POC_MOVLW, popGetLit(mlit & 0xff));
+ emitpcode(POC_ADDFW, popGet(AOP(left),0));
+ emitpcode(POC_RLFW, popCopyReg(&pc_kzero));
+ emitpcode(POC_ADDLW, popGetLit( ((mlit>>8) & 0xff)));
+ emitpcode(POC_ADDFW, popGet(AOP(left),1));
+ genSkipc(&rFalseIfx);
+
+ emitpLabel(truelbl->key);
+ if(ifx) ifx->generated = 1;
+ return;
+ **/
+
+ /* There are no more special cases, so perform a general compare */
+
+ emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff));
+ emitpcode(POC_SUBFW, popGet(AOP(left),size));
+
+ while(size--) {
+
+ emitpcode(POC_MOVLW, popGetLit((lit >> (size*8)) & 0xff));
+ emitSKPNZ;
+ emitpcode(POC_SUBFW, popGet(AOP(left),size));
+ }
+ //rFalseIfx.condition ^= 1;
+ genSkipc(&rFalseIfx);
+
+ emitpLabel(truelbl->key);
+
+ if(ifx) ifx->generated = 1;
+ return;
- if(ifx) {
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- //genSkipc(ifx,0,1); //IC_TRUE(ifx) == NULL);
- genSkipc(&rIfx);
- //if(sign)
- emitpLabel(lbl->key);
- ifx->generated = 1;
}
+
+
+ /* sign is out of the way. So now do an unsigned compare */
+ DEBUGpic14_emitcode(";right lit","line = %d unsigned compare to 0x%x",__LINE__,lit);
+
+
+ //genChkZeroes(left)
+
+ /* General case - compare to an unsigned literal on the right.*/
+
+ i = (lit >> (size*8)) & 0xff;
+ emitpcode(POC_MOVLW, popGetLit(i));
+ emitpcode(POC_SUBFW, popGet(AOP(left),size));
+ while(size--) {
+ i = (lit >> (size*8)) & 0xff;
+
+ if(i) {
+ emitpcode(POC_MOVLW, popGetLit(i));
+ emitSKPNZ;
+ emitpcode(POC_SUBFW, popGet(AOP(left),size));
+ } else {
+ /* this byte of the lit is zero,
+ *if it's not the last then OR in the variable */
+ if(size)
+ emitpcode(POC_IORFW, popGet(AOP(left),size));
+ }
+ }
+
+
+ emitpLabel(lbl->key);
+ //if(emitFinalCheck)
+ genSkipc(&rFalseIfx);
+ if(sign)
+ emitpLabel(truelbl->key);
+
+ if(ifx) ifx->generated = 1;
return;
+
+
}
if(AOP_TYPE(left) == AOP_LIT) {
lit = (unsigned long)(floatFromVal(AOP(left)->aopu.aop_lit));
+
DEBUGpic14_emitcode(";left lit","lit = %d,sign=%d",lit,sign);
+ /* Special cases */
+ if((lit == 0) && (sign == 0)){
+
+ size--;
+ emitpcode(POC_MOVFW, popGet(AOP(right),size));
+ while(size)
+ emitpcode(POC_IORFW, popGet(AOP(right),--size));
+
+ //rFalseIfx.condition ^= 1;
+ genSkipz2(&rFalseIfx);
+ if(ifx) ifx->generated = 1;
+ return;
+ }
+
if(size==1) {
+ /* Special cases */
+ lit &= 0xff;
+ if(((lit == 0xff) && !sign) || ((lit==0x7f) && sign)) {
+ /* degenerate compare can never be true */
+ if(rFalseIfx.condition == 0)
+ emitpcode(POC_GOTO,popGetLabel(rFalseIfx.lbl->key));
+
+ if(ifx) ifx->generated = 1;
+ return;
+ }
+
if(sign) {
- if(lit & 0x80) {
- emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),7,0));
+ if((lit+1)&0xff) {
+ emitpcode(POC_MOVFW, popGet(AOP(right),0));
+ emitpcode(POC_ADDLW, popGetLit(0x80));
+ emitpcode(POC_ADDLW, popGetLit(((-(lit+1)) & 0xff) ^ 0x80));
+ rFalseIfx.condition ^= 1;
+ genSkipc(&rFalseIfx);
} else {
- emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),7,0));
+ rFalseIfx.condition ^= 1;
+ genSkipCond(&rFalseIfx,right,0,7);
}
- if(ifx) {
- if(IC_TRUE(ifx) != NULL)
- emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
- else
- emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
+
+ } else {
+ if(lit & 0xff) {
+ emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff));
+ emitpcode(POC_SUBFW, popGet(AOP(right),0));
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ rFalseIfx.condition ^= 1;
+ genSkipc(&rFalseIfx);
+ } else {
+ emitpcode(POC_MOVFW, popGet(AOP(right),0));
+ genSkipz2(&rFalseIfx);
}
}
- emitpcode(POC_MOVLW, popGetLit((lit+1) & 0xff));
- emitpcode(POC_SUBFW, popGet(AOP(right),0,FALSE,FALSE));
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- rIfx.condition ^= 1;
- genSkipc(&rIfx);// if(ifx) genSkipc(ifx,1,1);//IC_TRUE(ifx)!=NULL);
+
+ if(ifx) ifx->generated = 1;
+ return;
+
} else {
- size--;
- //lit++;
- i = (lit >> (size*8)) & 0xff;
+
+ /* Size is greater than 1 */
+
+
if(sign) {
- if(i & 0x80) {
+ int lp1 = lit+1;
+
+ size--;
+
+ if(lp1 == 0) {
+ /* this means lit = 0xffffffff, or -1 */
+
+
+ DEBUGpic14_emitcode(";left lit = -1","line = %d ",__LINE__);
+ rFalseIfx.condition ^= 1;
+ genSkipCond(&rFalseIfx,right,size,7);
+ if(ifx) ifx->generated = 1;
+ return;
+ }
+
+ if(lit == 0) {
+ int s = size;
+
+ if(rFalseIfx.condition) {
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
+ emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+ }
+
+ emitpcode(POC_MOVFW, popGet(AOP(right),size));
+ while(size--)
+ emitpcode(POC_IORFW, popGet(AOP(right),size));
+
+
+ emitSKPZ;
+ if(rFalseIfx.condition) {
+ emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key));
+ emitpLabel(truelbl->key);
+ }else {
+ rFalseIfx.condition ^= 1;
+ genSkipCond(&rFalseIfx,right,s,7);
+ }
+
+ if(ifx) ifx->generated = 1;
+ return;
+ }
+
+
+ if(lit & (0x80 << (size*8))) {
+ /* Lit is less than zero */
+ DEBUGpic14_emitcode(";left lit","line = %d 0x%x is less than 0",__LINE__,lit);
+ //rFalseIfx.condition ^= 1;
+ //genSkipCond(&rFalseIfx,left,size,7);
+ //rFalseIfx.condition ^= 1;
emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
+ //emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+
+ if(rFalseIfx.condition)
+ emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key));
+ else
+ emitpcode(POC_GOTO, popGetLabel(truelbl->key));
+
+
} else {
+ /* Lit is greater than or equal to zero */
+ DEBUGpic14_emitcode(";left lit","line = %d 0x%x is greater than 0",__LINE__,lit);
+ //rFalseIfx.condition ^= 1;
+ //genSkipCond(&rFalseIfx,right,size,7);
+ //rFalseIfx.condition ^= 1;
+
+ //emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
+ //emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key));
+
emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),size,FALSE,FALSE),7,0));
- }
- if(ifx) {
- if(IC_TRUE(ifx) != NULL)
- emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
+ if(rFalseIfx.condition)
+ emitpcode(POC_GOTO, popGetLabel(truelbl->key));
else
- emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
+ emitpcode(POC_GOTO, popGetLabel(rFalseIfx.lbl->key));
+
}
- }
+ emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff));
+ emitpcode(POC_SUBFW, popGet(AOP(right),size));
- emitpcode(POC_MOVFW, popGet(AOP(right),size,FALSE,FALSE));
- emitpcode(POC_SUBLW, popGetLit((i)&0xff));
- while(size--) {
- i = (lit >> (size*8)) & 0xff;
- emitpcode(POC_MOVFW, popGet(AOP(right),size,FALSE,FALSE));
- emitSKPNC;
- emitpcode(POC_SUBLW, popGetLit((i)&0xff));
- }
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- genSkipc(&rIfx);// if(ifx) genSkipc(ifx,0,1); //IC_TRUE(ifx) == NULL);
+ while(size--) {
- }
-/*
+ emitpcode(POC_MOVLW, popGetLit((lp1 >> (size*8)) & 0xff));
+ emitSKPNZ;
+ emitpcode(POC_SUBFW, popGet(AOP(right),size));
+ }
+ rFalseIfx.condition ^= 1;
+ //rFalseIfx.condition = 1;
+ genSkipc(&rFalseIfx);
+
+ emitpLabel(truelbl->key);
+
+ if(ifx) ifx->generated = 1;
+ return;
+
+ } else {
+ /* Unsigned compare for sizes greater than 1 */
+
+ while(size--) {
+ i = (lit >> (size*8)) & 0xff;
+
+
+ if(size) {
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ emitpcode(POC_MOVLW, popGetLit(i&0xff));
+ emitpcode(POC_SUBFW, popGet(AOP(right),size));
+ emitSKPZ;
+ emitpcode(POC_GOTO, popGetLabel(lbl->key));
+ } else {
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ emitpcode(POC_MOVLW, popGetLit((i+1)&0xff));
+ emitpcode(POC_SUBFW, popGet(AOP(right),size));
+
+ }
+ }
+
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+
+ emitpLabel(lbl->key);
+
+ rFalseIfx.condition ^= 1;
+ genSkipc(&rFalseIfx);
+
+ }
if(sign)
- emitpLabel(lbl->key);
-*/
+ emitpLabel(truelbl->key);
if(ifx) ifx->generated = 1;
return;
+ }
}
+ /* Compare two variables */
-
- // CLRC;
DEBUGpic14_emitcode(";sign","%d",sign);
- pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
- pic14_emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));//++
+ size--;
+ if(sign) {
+ /* Sigh. thus sucks... */
+ if(size) {
+ emitpcode(POC_MOVFW, popGet(AOP(left),size));
+ emitpcode(POC_MOVWF, popRegFromIdx(Gstack_base_addr));
+ emitpcode(POC_MOVLW, popGetLit(0x80));
+ emitpcode(POC_XORWF, popRegFromIdx(Gstack_base_addr));
+ emitpcode(POC_XORFW, popGet(AOP(right),size));
+ emitpcode(POC_SUBFW, popRegFromIdx(Gstack_base_addr));
+ } else {
+ /* Signed char comparison */
+ /* Special thanks to Nikolai Golovchenko for this snippet */
+ emitpcode(POC_MOVFW, popGet(AOP(right),0));
+ emitpcode(POC_SUBFW, popGet(AOP(left),0));
+ emitpcode(POC_RRFW, popGet(AOP(left),0)); /* could be any register */
+ emitpcode(POC_XORFW, popGet(AOP(left),0));
+ emitpcode(POC_XORFW, popGet(AOP(right),0));
+ emitpcode(POC_ADDLW, popGetLit(0x80));
+
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ genSkipc(&rFalseIfx);
+
+ if(ifx) ifx->generated = 1;
+ return;
+ }
+
+ } else {
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_SUBFW, popGet(AOP(left),offset++,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(right),size));
+ emitpcode(POC_SUBFW, popGet(AOP(left),size));
+ }
- size--;
- while (size--) {
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
- emitSKPC;
- emitpcode(POC_INCFSZW, popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_SUBFW, popGet(AOP(left),offset,FALSE,FALSE));
+ /* The rest of the bytes of a multi-byte compare */
+ while (size) {
+
+ emitSKPZ;
+ emitpcode(POC_GOTO, popGetLabel(lbl->key));
+ size--;
+
+ emitpcode(POC_MOVFW, popGet(AOP(right),size));
+ emitpcode(POC_SUBFW, popGet(AOP(left),size));
+
-/*
- pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
- emitSKPC;
- pic14_emitcode("incfsz","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
- pic14_emitcode("subwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
-*/
- offset++;
}
+
+ emitpLabel(lbl->key);
+
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ genSkipc(&rFalseIfx);
+ if(ifx) ifx->generated = 1;
+ return;
+
}
}
switch( BYTEofLONG(lit,i)) {
case 0:
- emitpcode(POC_MOVFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(op),offset+i));
break;
case 1:
- emitpcode(POC_DECFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_DECFW,popGet(AOP(op),offset+i));
break;
case 0xff:
- emitpcode(POC_INCFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_INCFW,popGet(AOP(op),offset+i));
break;
default:
- emitpcode(POC_MOVFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(op),offset+i));
emitpcode(POC_XORLW,popGetLit(BYTEofLONG(lit,i)));
}
switch( BYTEofLONG(lit,i)) {
case 0:
- emitpcode(POC_IORFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_IORFW,popGet(AOP(op),offset+i));
break;
case 1:
emitSKPNZ;
- emitpcode(POC_DECFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_DECFW,popGet(AOP(op),offset+i));
break;
case 0xff:
emitSKPNZ;
- emitpcode(POC_INCFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_INCFW,popGet(AOP(op),offset+i));
break;
default:
emitpcode(POC_MOVLW,popGetLit(BYTEofLONG(lit,i)));
emitSKPNZ;
- emitpcode(POC_XORFW,popGet(AOP(op),offset+i,FALSE,FALSE));
+ emitpcode(POC_XORFW,popGet(AOP(op),offset+i));
}
/*-----------------------------------------------------------------*/
/* gencjneshort - compare and jump if not equal */
/*-----------------------------------------------------------------*/
-static void gencjne(operand *left, operand *right, iCode *ifx)
+static void gencjne(operand *left, operand *right, operand *result, iCode *ifx)
{
int size = max(AOP_SIZE(left),AOP_SIZE(right));
int offset = 0;
unsigned long lit = 0L;
DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- DEBUGpic14_emitcode ("; ","left %s=%s, right %s=%s, size = %d",
- AopType(AOP_TYPE(left)),
- aopGet(AOP(left),0,TRUE,FALSE),
- AopType(AOP_TYPE(right)),
- aopGet(AOP(right),0,FALSE,FALSE),
- size);
+ DEBUGpic14_AopType(__LINE__,left,right,NULL);
resolveIfx(&rIfx,ifx);
lbl = newiTempLabel(NULL);
case 2:
genc16bit2lit(left, lit, 0);
emitSKPNZ;
- pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
emitpcode(POC_GOTO,popGetLabel(lbl->key));
break;
default:
while (size--) {
if(lit & 0xff) {
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
emitpcode(POC_XORLW,popGetLit(lit & 0xff));
- pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("xorlw","0x%x",lit & 0xff);
} else {
- emitpcode(POC_MOVF,popGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVF,popGet(AOP(left),offset));
}
emitSKPNZ;
- pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
emitpcode(POC_GOTO,popGetLabel(lbl->key));
offset++;
lit >>= 8;
case 2:
genc16bit2lit(left, lit, 0);
emitSKPNZ;
- pic14_emitcode("goto","_%05d_DS_",lbl->key+100+labelOffset);
emitpcode(POC_GOTO,popGetLabel(lbl->key));
break;
default:
if((AOP_TYPE(left) == AOP_DIR) &&
((AOP_TYPE(right) == AOP_REG) || (AOP_TYPE(right) == AOP_DIR))) {
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+ emitpcode(POC_XORFW,popGet(AOP(right),offset));
} else if((AOP_TYPE(left) == AOP_DIR) && (AOP_TYPE(right) == AOP_LIT)){
switch (lit & 0xff) {
case 0:
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
break;
case 1:
- emitpcode(POC_DECFSZ,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_DECFSZ,popGet(AOP(left),offset));
emitpcode(POC_GOTO,popGetLabel(lbl->key));
emit_skip=0;
break;
case 0xff:
- emitpcode(POC_INCFSZ,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_INCFSZ,popGet(AOP(left),offset));
emitpcode(POC_GOTO,popGetLabel(lbl->key));
emit_skip=0;
break;
default:
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
emitpcode(POC_XORLW,popGetLit(lit & 0xff));
}
lit >>= 8;
} else {
- emitpcode(POC_MOVF,popGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("movf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVF,popGet(AOP(left),offset));
}
if(emit_skip) {
- pic14_emitcode(";***","%s %d",__FUNCTION__,__LINE__);
- if(rIfx.condition)
- emitSKPNZ;
- else
- emitSKPZ;
- emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key));
+ if(AOP_TYPE(result) == AOP_CRY) {
+ pic14_emitcode(";***","%s %d",__FUNCTION__,__LINE__);
+ if(rIfx.condition)
+ emitSKPNZ;
+ else
+ emitSKPZ;
+ emitpcode(POC_GOTO,popGetLabel(rIfx.lbl->key));
+ } else {
+ /* fix me. probably need to check result size too */
+ emitpcode(POC_CLRF,popGet(AOP(result),0));
+ if(rIfx.condition)
+ emitSKPNZ;
+ else
+ emitSKPZ;
+ emitpcode(POC_INCF,popGet(AOP(result),0));
+ }
if(ifx)
ifx->generated=1;
}
AOP_TYPE(left) != AOP_DIR){
while(size--) {
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+ emitpcode(POC_XORFW,popGet(AOP(right),offset));
pic14_emitcode(";***","%s %d",__FUNCTION__,__LINE__);
if(rIfx.condition)
emitSKPNZ;
aopOp((right=IC_RIGHT(ic)),ic,FALSE);
aopOp((result=IC_RESULT(ic)),ic,TRUE);
-/*
- DEBUGpic14_emitcode ("; ","result %s, left %s, right %s",
- AopType(AOP_TYPE(IC_RESULT(ic))),
- AopType(AOP_TYPE(IC_LEFT(ic))),
- AopType(AOP_TYPE(IC_RIGHT(ic))));
-*/
size = max(AOP_SIZE(left),AOP_SIZE(right));
- DEBUGpic14_emitcode ("; ","result %s=%s, left %s=%s, right %s=%s, size = %d",
- AopType(AOP_TYPE(result)),
- aopGet(AOP(result),0,TRUE,FALSE),
- AopType(AOP_TYPE(left)),
- aopGet(AOP(left),0,TRUE,FALSE),
- AopType(AOP_TYPE(right)),
- aopGet(AOP(right),0,FALSE,FALSE),
- size);
+ DEBUGpic14_AopType(__LINE__,left,right,result);
/* if literal, literal on the right or
if the right is in a pointer register and left
is not */
if ((AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ||
(IS_AOP_PREG(right) && !IS_AOP_PREG(left))) {
- operand *t = IC_RIGHT(ic);
- IC_RIGHT(ic) = IC_LEFT(ic);
- IC_LEFT(ic) = t;
+ operand *tmp = right ;
+ right = left;
+ left = tmp;
}
+
if(ifx && !AOP_SIZE(result)){
symbol *tlbl;
/* if they are both bit variables */
if (AOP_TYPE(left) == AOP_CRY &&
((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) {
if(AOP_TYPE(right) == AOP_LIT){
- unsigned long lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit);
+ unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
if(lit == 0L){
pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
pic14_emitcode("cpl","c");
if(AOP_TYPE(right) == AOP_LIT) {
lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
-
switch(size) {
case 1:
switch(lit & 0xff) {
case 1:
if ( IC_TRUE(ifx) ) {
- emitpcode(POC_DECFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_DECFW,popGet(AOP(left),offset));
emitSKPNZ;
emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
} else {
- emitpcode(POC_DECFSZW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_DECFSZW,popGet(AOP(left),offset));
emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
}
break;
case 0xff:
if ( IC_TRUE(ifx) ) {
- emitpcode(POC_INCFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_INCFW,popGet(AOP(left),offset));
emitSKPNZ;
emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
} else {
- emitpcode(POC_INCFSZW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_INCFSZW,popGet(AOP(left),offset));
emitpcode(POC_GOTO,popGetLabel(IC_FALSE(ifx)->key));
}
break;
default:
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
if(lit)
emitpcode(POC_XORLW,popGetLit(lit & 0xff));
genSkip(ifx,'z');
default:
/* size is 4 */
if(lit==0) {
- emitpcode(POC_MOVFW,popGet(AOP(left),0,FALSE,FALSE));
- emitpcode(POC_IORFW,popGet(AOP(left),1,FALSE,FALSE));
- emitpcode(POC_IORFW,popGet(AOP(left),2,FALSE,FALSE));
- emitpcode(POC_IORFW,popGet(AOP(left),3,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),0));
+ emitpcode(POC_IORFW,popGet(AOP(left),1));
+ emitpcode(POC_IORFW,popGet(AOP(left),2));
+ emitpcode(POC_IORFW,popGet(AOP(left),3));
} else {
//genSkip(ifx,'z');
genc16bit2lit(left,lit,2);
} else {
- emitpcode(POC_IORFW,popGet(AOP(left),2,FALSE,FALSE));
- emitpcode(POC_IORFW,popGet(AOP(left),3,FALSE,FALSE));
+ emitpcode(POC_IORFW,popGet(AOP(left),2));
+ emitpcode(POC_IORFW,popGet(AOP(left),3));
}
} else if(AOP_TYPE(right) == AOP_CRY ) {
/* we know the left is not a bit, but that the right is */
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
emitpcode( ( (IC_TRUE(ifx)) ? POC_BTFSC : POC_BTFSS),
- popGet(AOP(right),offset,FALSE,FALSE));
+ popGet(AOP(right),offset));
emitpcode(POC_XORLW,popGetLit(1));
- pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
- if ( IC_TRUE(ifx) )
- pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
- AOP(right)->aopu.aop_dir,
- AOP(right)->aopu.aop_dir);
- else
- pic14_emitcode("btfss","(%s >> 3), (%s & 7)",
- AOP(right)->aopu.aop_dir,
- AOP(right)->aopu.aop_dir);
-
- pic14_emitcode("xorlw","1");
-
/* if the two are equal, then W will be 0 and the Z bit is set
* we could test Z now, or go ahead and check the high order bytes if
* the variable we're comparing is larger than a byte. */
while(--size)
- emitpcode(POC_IORFW,popGet(AOP(left),offset,FALSE,FALSE));
- //pic14_emitcode("iorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_IORFW,popGet(AOP(left),offset));
if ( IC_TRUE(ifx) ) {
emitSKPNZ;
tlbl = newiTempLabel(NULL);
while(size--) {
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
-
- pic14_emitcode("movf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+ emitpcode(POC_XORFW,popGet(AOP(right),offset));
if ( IC_TRUE(ifx) ) {
if(size) {
if (AOP_TYPE(left) == AOP_CRY &&
((AOP_TYPE(right) == AOP_CRY) || (AOP_TYPE(right) == AOP_LIT))) {
if(AOP_TYPE(right) == AOP_LIT){
- unsigned long lit = (unsigned long)floatFromVal(AOP(IC_RIGHT(ic))->aopu.aop_lit);
+ unsigned long lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
if(lit == 0L){
pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
pic14_emitcode("cpl","c");
pic14_outBitC(result);
} else {
- gencjne(left,right,ifx);
+ gencjne(left,right,result,ifx);
/*
if(ifx)
gencjne(left,right,newiTempLabel(NULL));
*/
/* if the result is used in an arithmetic operation
then put the result in place */
+/*
if (AOP_TYPE(result) != AOP_CRY)
pic14_outAcc(result);
+*/
/* leave the result in acc */
}
aopOp((right=IC_RIGHT(ic)),ic,FALSE);
aopOp((result=IC_RESULT(ic)),ic,FALSE);
+ DEBUGpic14_AopType(__LINE__,left,right,result);
+
/* if both are bit variables */
if (AOP_TYPE(left) == AOP_CRY &&
AOP_TYPE(right) == AOP_CRY ) {
size = AOP_SIZE(result);
- DEBUGpic14_emitcode ("; ","result %s=%s, left %s=%s, right %s=%s, size = %d",
- AopType(AOP_TYPE(result)),
- aopGet(AOP(result),0,TRUE,FALSE),
- AopType(AOP_TYPE(left)),
- aopGet(AOP(left),0,TRUE,FALSE),
- AopType(AOP_TYPE(right)),
- aopGet(AOP(right),0,FALSE,FALSE),
- size);
+ DEBUGpic14_AopType(__LINE__,left,right,result);
+
// if(bit & yy)
// result = bit & yy;
if (AOP_TYPE(left) == AOP_CRY){
case 0x00:
/* and'ing with 0 has clears the result */
pic14_emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
- emitpcode(POC_CLRF,popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_CLRF,popGet(AOP(result),offset));
break;
case 0xff:
/* and'ing with 0xff is a nop when the result and left are the same */
if(p>=0) {
/* only one bit is set in the literal, so use a bcf instruction */
pic14_emitcode("bcf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p);
- //emitpcode(POC_BCF,popGet(AOP(left),offset,FALSE,TRUE));
emitpcode(POC_BCF,newpCodeOpBit(aopGet(AOP(left),offset,FALSE,FALSE),p,0));
} else {
if(know_W != (lit&0xff))
emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
know_W = lit &0xff;
- emitpcode(POC_ANDWF,popGet(AOP(left),offset,FALSE,TRUE));
+ emitpcode(POC_ANDWF,popGet(AOP(left),offset));
}
}
}
} else {
if (AOP_TYPE(left) == AOP_ACC) {
- emitpcode(POC_ANDFW,popGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_ANDFW,popGet(AOP(right),offset));
} else {
- emitpcode(POC_MOVFW,popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_ANDWF,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+ emitpcode(POC_ANDWF,popGet(AOP(left),offset));
}
}
case 0x00:
pic14_emitcode("clrf","%s",
aopGet(AOP(result),offset,FALSE,FALSE));
- emitpcode(POC_CLRF,popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_CLRF,popGet(AOP(result),offset));
break;
case 0xff:
pic14_emitcode("movf","%s,w",
aopGet(AOP(left),offset,FALSE,FALSE));
pic14_emitcode("movwf","%s",
aopGet(AOP(result),offset,FALSE,FALSE));
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset));
break;
default:
pic14_emitcode("movlw","0x%x",t);
aopGet(AOP(result),offset,FALSE,FALSE));
emitpcode(POC_MOVLW, popGetLit(t));
- emitpcode(POC_ANDFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_ANDFW,popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset));
}
continue;
}
if (AOP_TYPE(left) == AOP_ACC) {
pic14_emitcode("andwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_ANDFW,popGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_ANDFW,popGet(AOP(right),offset));
} else {
pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
pic14_emitcode("andwf","%s,w",
aopGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVFW,popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_ANDFW,popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+ emitpcode(POC_ANDFW,popGet(AOP(left),offset));
}
pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset));
}
}
}
aopOp((right= IC_RIGHT(ic)),ic,FALSE);
aopOp((result=IC_RESULT(ic)),ic,TRUE);
+ DEBUGpic14_AopType(__LINE__,left,right,result);
/* if left is a literal & right is not then exchange them */
if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
left = tmp;
}
- DEBUGpic14_emitcode ("; ","result %s, left %s, right %s",
- AopType(AOP_TYPE(result)),
- AopType(AOP_TYPE(left)),
- AopType(AOP_TYPE(right)));
+ DEBUGpic14_AopType(__LINE__,left,right,result);
if(AOP_TYPE(right) == AOP_LIT)
lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit);
// lit != 0 => result = 1
if(AOP_TYPE(result) == AOP_CRY){
if(size)
- emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BSF, popGet(AOP(result),0));
//pic14_emitcode("bsf","(%s >> 3), (%s & 7)",
// AOP(result)->aopu.aop_dir,
// AOP(result)->aopu.aop_dir);
if (AOP_TYPE(right) == AOP_CRY){
if(pic14_sameRegs(AOP(result),AOP(left))){
// c = bit | bit;
- emitpcode(POC_BCF, popGet(AOP(result),0,FALSE,FALSE));
- emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BCF, popGet(AOP(result),0));
+ emitpcode(POC_BTFSC, popGet(AOP(right),0));
+ emitpcode(POC_BSF, popGet(AOP(result),0));
pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
AOP(result)->aopu.aop_dir,
} else {
if( AOP_TYPE(result) == AOP_ACC) {
emitpcode(POC_MOVLW, popGetLit(0));
- emitpcode(POC_BTFSS, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_BTFSC, popGet(AOP(left),0,FALSE,FALSE));
+ emitpcode(POC_BTFSS, popGet(AOP(right),0));
+ emitpcode(POC_BTFSC, popGet(AOP(left),0));
emitpcode(POC_MOVLW, popGetLit(1));
} else {
- emitpcode(POC_BCF, popGet(AOP(result),0,FALSE,FALSE));
- emitpcode(POC_BTFSS, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_BTFSC, popGet(AOP(left),0,FALSE,FALSE));
- emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BCF, popGet(AOP(result),0));
+ emitpcode(POC_BTFSS, popGet(AOP(right),0));
+ emitpcode(POC_BTFSC, popGet(AOP(left),0));
+ emitpcode(POC_BSF, popGet(AOP(result),0));
pic14_emitcode("bcf","(%s >> 3), (%s & 7)",
AOP(result)->aopu.aop_dir,
pic14_emitcode(";XXX "," %s,%d",__FILE__,__LINE__);
- emitpcode(POC_BCF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BCF, popGet(AOP(result),0));
if( AOP_TYPE(right) == AOP_ACC) {
emitpcode(POC_IORLW, popGetLit(0));
emitSKPNZ;
- emitpcode(POC_BTFSC, popGet(AOP(left),0,FALSE,FALSE));
- emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BTFSC, popGet(AOP(left),0));
+ emitpcode(POC_BSF, popGet(AOP(result),0));
}
if(know_W != (lit & 0xff))
emitpcode(POC_MOVLW, popGetLit(lit & 0xff));
know_W = lit & 0xff;
- emitpcode(POC_IORWF, popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_IORWF, popGet(AOP(left),offset));
}
}
} else {
if (AOP_TYPE(left) == AOP_ACC) {
- emitpcode(POC_IORFW, popGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_IORFW, popGet(AOP(right),offset));
pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
} else {
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_IORWF, popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+ emitpcode(POC_IORWF, popGet(AOP(left),offset));
pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
pic14_emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
int t = (lit >> (offset*8)) & 0x0FFL;
switch(t) {
case 0x00:
- emitpcode(POC_MOVFW, popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
pic14_emitcode("movf","%s,w",
aopGet(AOP(left),offset,FALSE,FALSE));
break;
default:
emitpcode(POC_MOVLW, popGetLit(t));
- emitpcode(POC_IORFW, popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_IORFW, popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
pic14_emitcode("movlw","0x%x",t);
pic14_emitcode("iorwf","%s,w",
// faster than result <- left, anl result,right
// and better if result is SFR
if (AOP_TYPE(left) == AOP_ACC) {
- emitpcode(POC_IORWF, popGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_IORWF, popGet(AOP(right),offset));
pic14_emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
} else {
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_IORFW, popGet(AOP(left),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+ emitpcode(POC_IORFW, popGet(AOP(left),offset));
pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
pic14_emitcode("iorwf","%s,w",
aopGet(AOP(left),offset,FALSE,FALSE));
}
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
}
}
/*-----------------------------------------------------------------*/
static void genXor (iCode *ic, iCode *ifx)
{
- operand *left, *right, *result;
- int size, offset=0;
- unsigned long lit = 0L;
+ operand *left, *right, *result;
+ int size, offset=0;
+ unsigned long lit = 0L;
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- aopOp((left = IC_LEFT(ic)),ic,FALSE);
- aopOp((right= IC_RIGHT(ic)),ic,FALSE);
- aopOp((result=IC_RESULT(ic)),ic,TRUE);
+ aopOp((left = IC_LEFT(ic)),ic,FALSE);
+ aopOp((right= IC_RIGHT(ic)),ic,FALSE);
+ aopOp((result=IC_RESULT(ic)),ic,TRUE);
- /* if left is a literal & right is not ||
- if left needs acc & right does not */
- if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
- (AOP_NEEDSACC(left) && !AOP_NEEDSACC(right))) {
- operand *tmp = right ;
- right = left;
- left = tmp;
- }
+ /* if left is a literal & right is not ||
+ if left needs acc & right does not */
+ if ((AOP_TYPE(left) == AOP_LIT && AOP_TYPE(right) != AOP_LIT) ||
+ (AOP_NEEDSACC(left) && !AOP_NEEDSACC(right))) {
+ operand *tmp = right ;
+ right = left;
+ left = tmp;
+ }
- /* if result = right then exchange them */
- if(pic14_sameRegs(AOP(result),AOP(right))){
- operand *tmp = right ;
- right = left;
- left = tmp;
- }
+ /* if result = right then exchange them */
+ if(pic14_sameRegs(AOP(result),AOP(right))){
+ operand *tmp = right ;
+ right = left;
+ left = tmp;
+ }
- /* if right is bit then exchange them */
- if (AOP_TYPE(right) == AOP_CRY &&
- AOP_TYPE(left) != AOP_CRY){
- operand *tmp = right ;
- right = left;
- left = tmp;
- }
- if(AOP_TYPE(right) == AOP_LIT)
- lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit);
+ /* if right is bit then exchange them */
+ if (AOP_TYPE(right) == AOP_CRY &&
+ AOP_TYPE(left) != AOP_CRY){
+ operand *tmp = right ;
+ right = left;
+ left = tmp;
+ }
+ if(AOP_TYPE(right) == AOP_LIT)
+ lit = (unsigned long)floatFromVal (AOP(right)->aopu.aop_lit);
- size = AOP_SIZE(result);
+ size = AOP_SIZE(result);
- // if(bit ^ yy)
- // xx = bit ^ yy;
- if (AOP_TYPE(left) == AOP_CRY){
- if(AOP_TYPE(right) == AOP_LIT){
- // c = bit & literal;
- if(lit>>1){
- // lit>>1 != 0 => result = 1
- if(AOP_TYPE(result) == AOP_CRY){
- if(size)
- pic14_emitcode("setb","%s",AOP(result)->aopu.aop_dir);
- else if(ifx)
- continueIfTrue(ifx);
- goto release;
- }
- pic14_emitcode("setb","c");
- } else{
- // lit == (0 or 1)
- if(lit == 0){
- // lit == 0, result = left
- if(size && pic14_sameRegs(AOP(result),AOP(left)))
- goto release;
- pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
- } else{
- // lit == 1, result = not(left)
- if(size && pic14_sameRegs(AOP(result),AOP(left))){
- pic14_emitcode("cpl","%s",AOP(result)->aopu.aop_dir);
- goto release;
- } else {
- pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
- pic14_emitcode("cpl","c");
- }
- }
- }
+ // if(bit ^ yy)
+ // xx = bit ^ yy;
+ if (AOP_TYPE(left) == AOP_CRY){
+ if(AOP_TYPE(right) == AOP_LIT){
+ // c = bit & literal;
+ if(lit>>1){
+ // lit>>1 != 0 => result = 1
+ if(AOP_TYPE(result) == AOP_CRY){
+ if(size)
+ pic14_emitcode("setb","%s",AOP(result)->aopu.aop_dir);
+ else if(ifx)
+ continueIfTrue(ifx);
+ goto release;
+ }
+ pic14_emitcode("setb","c");
+ } else{
+ // lit == (0 or 1)
+ if(lit == 0){
+ // lit == 0, result = left
+ if(size && pic14_sameRegs(AOP(result),AOP(left)))
+ goto release;
+ pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
+ } else{
+ // lit == 1, result = not(left)
+ if(size && pic14_sameRegs(AOP(result),AOP(left))){
+ pic14_emitcode("cpl","%s",AOP(result)->aopu.aop_dir);
+ goto release;
+ } else {
+ pic14_emitcode("mov","c,%s",AOP(left)->aopu.aop_dir);
+ pic14_emitcode("cpl","c");
+ }
+ }
+ }
- } else {
- // right != literal
- symbol *tlbl = newiTempLabel(NULL);
- if (AOP_TYPE(right) == AOP_CRY){
- // c = bit ^ bit;
- pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir);
- }
- else{
- int sizer = AOP_SIZE(right);
- // c = bit ^ val
- // if val>>1 != 0, result = 1
- pic14_emitcode("setb","c");
- while(sizer){
- MOVA(aopGet(AOP(right),sizer-1,FALSE,FALSE));
- if(sizer == 1)
- // test the msb of the lsb
- pic14_emitcode("anl","a,#0xfe");
- pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
- sizer--;
- }
- // val = (0,1)
- pic14_emitcode("rrc","a");
- }
- pic14_emitcode("jnb","%s,%05d_DS_",AOP(left)->aopu.aop_dir,(tlbl->key+100));
- pic14_emitcode("cpl","c");
- pic14_emitcode("","%05d_DS_:",(tlbl->key+100));
- }
- // bit = c
- // val = c
- if(size)
- pic14_outBitC(result);
- // if(bit | ...)
- else if((AOP_TYPE(result) == AOP_CRY) && ifx)
- genIfxJump(ifx, "c");
- goto release ;
+ } else {
+ // right != literal
+ symbol *tlbl = newiTempLabel(NULL);
+ if (AOP_TYPE(right) == AOP_CRY){
+ // c = bit ^ bit;
+ pic14_emitcode("mov","c,%s",AOP(right)->aopu.aop_dir);
+ }
+ else{
+ int sizer = AOP_SIZE(right);
+ // c = bit ^ val
+ // if val>>1 != 0, result = 1
+ pic14_emitcode("setb","c");
+ while(sizer){
+ MOVA(aopGet(AOP(right),sizer-1,FALSE,FALSE));
+ if(sizer == 1)
+ // test the msb of the lsb
+ pic14_emitcode("anl","a,#0xfe");
+ pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
+ sizer--;
+ }
+ // val = (0,1)
+ pic14_emitcode("rrc","a");
+ }
+ pic14_emitcode("jnb","%s,%05d_DS_",AOP(left)->aopu.aop_dir,(tlbl->key+100));
+ pic14_emitcode("cpl","c");
+ pic14_emitcode("","%05d_DS_:",(tlbl->key+100));
}
+ // bit = c
+ // val = c
+ if(size)
+ pic14_outBitC(result);
+ // if(bit | ...)
+ else if((AOP_TYPE(result) == AOP_CRY) && ifx)
+ genIfxJump(ifx, "c");
+ goto release ;
+ }
- if(pic14_sameRegs(AOP(result),AOP(left))){
- /* if left is same as result */
- for(;size--; offset++) {
- if(AOP_TYPE(right) == AOP_LIT){
- int t = (lit >> (offset*8)) & 0x0FFL;
- if(t == 0x00L)
- continue;
- else
- if (IS_AOP_PREG(left)) {
- MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
- pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
- aopPut(AOP(result),"a",offset);
- } else {
- emitpcode(POC_MOVLW, popGetLit(t));
- emitpcode(POC_XORWF,popGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("xrl","%s,%s",
- aopGet(AOP(left),offset,FALSE,TRUE),
- aopGet(AOP(right),offset,FALSE,FALSE));
- }
- } else {
- if (AOP_TYPE(left) == AOP_ACC)
- pic14_emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE));
- else {
- MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
- if (IS_AOP_PREG(left)) {
- pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
- aopPut(AOP(result),"a",offset);
- } else
- pic14_emitcode("xrl","%s,a",
- aopGet(AOP(left),offset,FALSE,TRUE));
- }
- }
- }
- } else {
- // left & result in different registers
- if(AOP_TYPE(result) == AOP_CRY){
- // result = bit
- // if(size), result in bit
- // if(!size && ifx), conditional oper: if(left ^ right)
- symbol *tlbl = newiTempLabel(NULL);
- int sizer = max(AOP_SIZE(left),AOP_SIZE(right));
- if(size)
- pic14_emitcode("setb","c");
- while(sizer--){
- if((AOP_TYPE(right) == AOP_LIT) &&
- (((lit >> (offset*8)) & 0x0FFL) == 0x00L)){
- MOVA(aopGet(AOP(left),offset,FALSE,FALSE));
- } else {
- MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
- pic14_emitcode("xrl","a,%s",
- aopGet(AOP(left),offset,FALSE,FALSE));
- }
- pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
- offset++;
- }
- if(size){
- CLRC;
- pic14_emitcode("","%05d_DS_:",tlbl->key+100);
- pic14_outBitC(result);
- } else if(ifx)
- jmpTrueOrFalse(ifx, tlbl);
- } else for(;(size--);offset++){
- // normal case
- // result = left & right
- if(AOP_TYPE(right) == AOP_LIT){
- int t = (lit >> (offset*8)) & 0x0FFL;
- switch(t) {
- case 0x00:
- emitpcode(POC_MOVFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
- pic14_emitcode("movf","%s,w",
+ if(pic14_sameRegs(AOP(result),AOP(left))){
+ /* if left is same as result */
+ for(;size--; offset++) {
+ if(AOP_TYPE(right) == AOP_LIT){
+ int t = (lit >> (offset*8)) & 0x0FFL;
+ if(t == 0x00L)
+ continue;
+ else
+ if (IS_AOP_PREG(left)) {
+ MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
+ pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
+ aopPut(AOP(result),"a",offset);
+ } else {
+ emitpcode(POC_MOVLW, popGetLit(t));
+ emitpcode(POC_XORWF,popGet(AOP(left),offset));
+ pic14_emitcode("xrl","%s,%s",
+ aopGet(AOP(left),offset,FALSE,TRUE),
+ aopGet(AOP(right),offset,FALSE,FALSE));
+ }
+ } else {
+ if (AOP_TYPE(left) == AOP_ACC)
+ pic14_emitcode("xrl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE));
+ else {
+ emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+ emitpcode(POC_XORWF,popGet(AOP(left),offset));
+/*
+ if (IS_AOP_PREG(left)) {
+ pic14_emitcode("xrl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
+ aopPut(AOP(result),"a",offset);
+ } else
+ pic14_emitcode("xrl","%s,a",
+ aopGet(AOP(left),offset,FALSE,TRUE));
+*/
+ }
+ }
+ }
+ } else {
+ // left & result in different registers
+ if(AOP_TYPE(result) == AOP_CRY){
+ // result = bit
+ // if(size), result in bit
+ // if(!size && ifx), conditional oper: if(left ^ right)
+ symbol *tlbl = newiTempLabel(NULL);
+ int sizer = max(AOP_SIZE(left),AOP_SIZE(right));
+ if(size)
+ pic14_emitcode("setb","c");
+ while(sizer--){
+ if((AOP_TYPE(right) == AOP_LIT) &&
+ (((lit >> (offset*8)) & 0x0FFL) == 0x00L)){
+ MOVA(aopGet(AOP(left),offset,FALSE,FALSE));
+ } else {
+ MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
+ pic14_emitcode("xrl","a,%s",
aopGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("movwf","%s",
+ }
+ pic14_emitcode("jnz","%05d_DS_",tlbl->key+100);
+ offset++;
+ }
+ if(size){
+ CLRC;
+ pic14_emitcode("","%05d_DS_:",tlbl->key+100);
+ pic14_outBitC(result);
+ } else if(ifx)
+ jmpTrueOrFalse(ifx, tlbl);
+ } else for(;(size--);offset++){
+ // normal case
+ // result = left & right
+ if(AOP_TYPE(right) == AOP_LIT){
+ int t = (lit >> (offset*8)) & 0x0FFL;
+ switch(t) {
+ case 0x00:
+ emitpcode(POC_MOVFW,popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+ pic14_emitcode("movf","%s,w",
+ aopGet(AOP(left),offset,FALSE,FALSE));
+ pic14_emitcode("movwf","%s",
aopGet(AOP(result),offset,FALSE,FALSE));
- break;
- case 0xff:
- emitpcode(POC_COMFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
- pic14_emitcode("comf","%s,w",
+ break;
+ case 0xff:
+ emitpcode(POC_COMFW,popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+ pic14_emitcode("comf","%s,w",
aopGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("movwf","%s",
+ pic14_emitcode("movwf","%s",
aopGet(AOP(result),offset,FALSE,FALSE));
- break;
- default:
- emitpcode(POC_MOVLW, popGetLit(t));
- emitpcode(POC_XORFW,popGet(AOP(left),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
- pic14_emitcode("movlw","0x%x",t);
- pic14_emitcode("xorwf","%s,w",
+ break;
+ default:
+ emitpcode(POC_MOVLW, popGetLit(t));
+ emitpcode(POC_XORFW,popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+ pic14_emitcode("movlw","0x%x",t);
+ pic14_emitcode("xorwf","%s,w",
aopGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("movwf","%s",
+ pic14_emitcode("movwf","%s",
aopGet(AOP(result),offset,FALSE,FALSE));
- }
- continue;
- }
+ }
+ continue;
+ }
- // faster than result <- left, anl result,right
- // and better if result is SFR
- if (AOP_TYPE(left) == AOP_ACC) {
- emitpcode(POC_XORFW,popGet(AOP(right),offset,FALSE,FALSE));
- pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
- } else {
- emitpcode(POC_MOVFW,popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_XORFW,popGet(AOP(left),offset,FALSE,FALSE));
- pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
- pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
- }
- if ( AOP_TYPE(result) != AOP_ACC){
- emitpcode(POC_MOVWF,popGet(AOP(result),offset,FALSE,FALSE));
- pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
- }
- }
+ // faster than result <- left, anl result,right
+ // and better if result is SFR
+ if (AOP_TYPE(left) == AOP_ACC) {
+ emitpcode(POC_XORFW,popGet(AOP(right),offset));
+ pic14_emitcode("xorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+ } else {
+ emitpcode(POC_MOVFW,popGet(AOP(right),offset));
+ emitpcode(POC_XORFW,popGet(AOP(left),offset));
+ pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+ pic14_emitcode("xorwf","%s,w",aopGet(AOP(left),offset,FALSE,FALSE));
+ }
+ if ( AOP_TYPE(result) != AOP_ACC){
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset));
+ pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
+ }
}
+ }
-release :
+ release :
freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
- freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
- freeAsmop(result,NULL,ic,TRUE);
+ freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE));
+ freeAsmop(result,NULL,ic,TRUE);
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
static void genRRC (iCode *ic)
{
- operand *left , *result ;
- int size, offset = 0;
- char *l;
+ operand *left , *result ;
+ int size, offset = 0, same;
- /* rotate right with carry */
- left = IC_LEFT(ic);
- result=IC_RESULT(ic);
- aopOp (left,ic,FALSE);
- aopOp (result,ic,FALSE);
+ /* rotate right with carry */
+ left = IC_LEFT(ic);
+ result=IC_RESULT(ic);
+ aopOp (left,ic,FALSE);
+ aopOp (result,ic,FALSE);
- /* move it to the result */
- size = AOP_SIZE(result);
- offset = size - 1 ;
- CLRC;
- while (size--) {
- l = aopGet(AOP(left),offset,FALSE,FALSE);
- MOVA(l);
- pic14_emitcode("rrc","a");
- if (AOP_SIZE(result) > 1)
- aopPut(AOP(result),"a",offset--);
- }
- /* now we need to put the carry into the
- highest order byte of the result */
- if (AOP_SIZE(result) > 1) {
- l = aopGet(AOP(result),AOP_SIZE(result)-1,FALSE,FALSE);
- MOVA(l);
+ DEBUGpic14_AopType(__LINE__,left,NULL,result);
+
+ same = pic14_sameRegs(AOP(result),AOP(left));
+
+ size = AOP_SIZE(result);
+
+ /* get the lsb and put it into the carry */
+ emitpcode(POC_RRFW, popGet(AOP(left),size-1));
+
+ offset = 0 ;
+
+ while(size--) {
+
+ if(same) {
+ emitpcode(POC_RRF, popGet(AOP(left),offset));
+ } else {
+ emitpcode(POC_RRFW, popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
}
- pic14_emitcode("mov","acc.7,c");
- aopPut(AOP(result),"a",AOP_SIZE(result)-1);
- freeAsmop(left,NULL,ic,TRUE);
- freeAsmop(result,NULL,ic,TRUE);
+
+ offset++;
+ }
+
+ freeAsmop(left,NULL,ic,TRUE);
+ freeAsmop(result,NULL,ic,TRUE);
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
static void genRLC (iCode *ic)
{
- operand *left , *result ;
- int size, offset = 0;
- char *l;
+ operand *left , *result ;
+ int size, offset = 0;
+ int same;
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- /* rotate right with carry */
- left = IC_LEFT(ic);
- result=IC_RESULT(ic);
- aopOp (left,ic,FALSE);
- aopOp (result,ic,FALSE);
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ /* rotate right with carry */
+ left = IC_LEFT(ic);
+ result=IC_RESULT(ic);
+ aopOp (left,ic,FALSE);
+ aopOp (result,ic,FALSE);
- /* move it to the result */
- size = AOP_SIZE(result);
- offset = 0 ;
- if (size--) {
- l = aopGet(AOP(left),offset,FALSE,FALSE);
- MOVA(l);
- pic14_emitcode("add","a,acc");
- if (AOP_SIZE(result) > 1)
- aopPut(AOP(result),"a",offset++);
- while (size--) {
- l = aopGet(AOP(left),offset,FALSE,FALSE);
- MOVA(l);
- pic14_emitcode("rlc","a");
- if (AOP_SIZE(result) > 1)
- aopPut(AOP(result),"a",offset++);
- }
- }
- /* now we need to put the carry into the
- highest order byte of the result */
- if (AOP_SIZE(result) > 1) {
- l = aopGet(AOP(result),0,FALSE,FALSE);
- MOVA(l);
+ DEBUGpic14_AopType(__LINE__,left,NULL,result);
+
+ same = pic14_sameRegs(AOP(result),AOP(left));
+
+ /* move it to the result */
+ size = AOP_SIZE(result);
+
+ /* get the msb and put it into the carry */
+ emitpcode(POC_RLFW, popGet(AOP(left),size-1));
+
+ offset = 0 ;
+
+ while(size--) {
+
+ if(same) {
+ emitpcode(POC_RLF, popGet(AOP(left),offset));
+ } else {
+ emitpcode(POC_RLFW, popGet(AOP(left),offset));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
}
- pic14_emitcode("mov","acc.0,c");
- aopPut(AOP(result),"a",0);
- freeAsmop(left,NULL,ic,TRUE);
- freeAsmop(result,NULL,ic,TRUE);
+
+ offset++;
+ }
+
+
+ freeAsmop(left,NULL,ic,TRUE);
+ freeAsmop(result,NULL,ic,TRUE);
}
/*-----------------------------------------------------------------*/
switch(shCount) {
case 1:
- emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_RLFW, popGet(AOP(left),offl));
if(same)
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
else {
- emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
}
break;
case 1:
emitCLRC;
if(same)
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
else {
- emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
}
break;
case 2:
emitCLRC;
if(same) {
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
} else {
- emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
}
emitCLRC;
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
break;
case 3:
if(same)
- emitpcode(POC_SWAPF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_SWAPF, popGet(AOP(result),offr));
else {
- emitpcode(POC_SWAPFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
}
- emitpcode(POC_RLFW, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLFW, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RLFW, popGet(AOP(result),offr));
+ emitpcode(POC_RLFW, popGet(AOP(result),offr));
emitpcode(POC_ANDLW, popGetLit(0x1f));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
break;
case 4:
- emitpcode(POC_SWAPFW, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
emitpcode(POC_ANDLW, popGetLit(0x0f));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
break;
case 5:
- emitpcode(POC_SWAPFW, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_SWAPFW, popGet(AOP(left),offl));
emitpcode(POC_ANDLW, popGetLit(0x0f));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
emitCLRC;
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
break;
case 6:
- emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_RLFW, popGet(AOP(left),offl));
emitpcode(POC_ANDLW, popGetLit(0x80));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
break;
case 7:
- emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RLFW, popGet(AOP(left),offl));
+ emitpcode(POC_CLRF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
break;
switch(shCount) {
case 1:
/* Shift left 1 bit position */
- emitpcode(POC_MOVFW, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),offl));
if(same) {
- emitpcode(POC_ADDWF, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_ADDWF, popGet(AOP(left),offl));
} else {
- emitpcode(POC_ADDFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_ADDFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
}
break;
case 2:
- emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_RLFW, popGet(AOP(left),offl));
emitpcode(POC_ANDLW,popGetLit(0x7e));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF,popGet(AOP(result),offr));
break;
case 3:
- emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_RLFW, popGet(AOP(left),offl));
emitpcode(POC_ANDLW,popGetLit(0x3e));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
break;
case 4:
- emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
emitpcode(POC_ANDLW, popGetLit(0xf0));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
break;
case 5:
- emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
emitpcode(POC_ANDLW, popGetLit(0xf0));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF,popGet(AOP(result),offr));
break;
case 6:
- emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
+ emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
emitpcode(POC_ANDLW, popGetLit(0x30));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
break;
case 7:
- emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl));
+ emitpcode(POC_CLRF, popGet(AOP(result),offr));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
break;
default:
aopPut(AOP(result),"a",offr);
} else {
if(!sign) {
- emitpcode(POC_MOVFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
//aopPut(AOP(result),l,offr);
}else{
}
}
-/*-----------------------------------------------------------------*/
-/* AccAXRrl1 - right rotate c->a:x->c by 1 */
-/*-----------------------------------------------------------------*/
-static void AccAXRrl1 (char *x)
-{
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- pic14_emitcode("rrc","a");
- pic14_emitcode("xch","a,%s", x);
- pic14_emitcode("rrc","a");
- pic14_emitcode("xch","a,%s", x);
-}
-
-/*-----------------------------------------------------------------*/
-/* AccAXLrl1 - left rotate c<-a:x<-c by 1 */
-/*-----------------------------------------------------------------*/
-static void AccAXLrl1 (char *x)
-{
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- pic14_emitcode("xch","a,%s",x);
- pic14_emitcode("rlc","a");
- pic14_emitcode("xch","a,%s",x);
- pic14_emitcode("rlc","a");
-}
-#if 0
-/*-----------------------------------------------------------------*/
-/* AccAXLsh1 - left shift a:x<-0 by 1 */
-/*-----------------------------------------------------------------*/
-static void AccAXLsh1 (char *x)
-{
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- pic14_emitcode("xch","a,%s",x);
- pic14_emitcode("add","a,acc");
- pic14_emitcode("xch","a,%s",x);
- pic14_emitcode("rlc","a");
-}
-#endif
-#if 0
-/*-----------------------------------------------------------------*/
-/* AccAXLsh - left shift a:x by known count (0..7) */
-/*-----------------------------------------------------------------*/
-static void AccAXLsh (char *x, int shCount)
-{
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- switch(shCount){
- case 0 :
- break;
- case 1 :
- AccAXLsh1(x);
- break;
- case 2 :
- AccAXLsh1(x);
- AccAXLsh1(x);
- break;
- case 3 :
- case 4 :
- case 5 : // AAAAABBB:CCCCCDDD
- AccRol(shCount); // BBBAAAAA:CCCCCDDD
- pic14_emitcode("anl","a,#0x%02x",
- SLMask[shCount]); // BBB00000:CCCCCDDD
- pic14_emitcode("xch","a,%s",x); // CCCCCDDD:BBB00000
- AccRol(shCount); // DDDCCCCC:BBB00000
- pic14_emitcode("xch","a,%s",x); // BBB00000:DDDCCCCC
- pic14_emitcode("xrl","a,%s",x); // (BBB^DDD)CCCCC:DDDCCCCC
- pic14_emitcode("xch","a,%s",x); // DDDCCCCC:(BBB^DDD)CCCCC
- pic14_emitcode("anl","a,#0x%02x",
- SLMask[shCount]); // DDD00000:(BBB^DDD)CCCCC
- pic14_emitcode("xch","a,%s",x); // (BBB^DDD)CCCCC:DDD00000
- pic14_emitcode("xrl","a,%s",x); // BBBCCCCC:DDD00000
- break;
- case 6 : // AAAAAABB:CCCCCCDD
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 000000BB:CCCCCCDD
- pic14_emitcode("mov","c,acc.0"); // c = B
- pic14_emitcode("xch","a,%s",x); // CCCCCCDD:000000BB
- AccAXRrl1(x); // BCCCCCCD:D000000B
- AccAXRrl1(x); // BBCCCCCC:DD000000
- break;
- case 7 : // a:x <<= 7
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 0000000B:CCCCCCCD
- pic14_emitcode("mov","c,acc.0"); // c = B
- pic14_emitcode("xch","a,%s",x); // CCCCCCCD:0000000B
- AccAXRrl1(x); // BCCCCCCC:D0000000
- break;
- default :
- break;
- }
-}
-#endif
-#if 0
-/*-----------------------------------------------------------------*/
-/* AccAXRsh - right shift a:x known count (0..7) */
-/*-----------------------------------------------------------------*/
-static void AccAXRsh (char *x, int shCount)
-{
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- switch(shCount){
- case 0 :
- break;
- case 1 :
- CLRC;
- AccAXRrl1(x); // 0->a:x
- break;
- case 2 :
- CLRC;
- AccAXRrl1(x); // 0->a:x
- CLRC;
- AccAXRrl1(x); // 0->a:x
- break;
- case 3 :
- case 4 :
- case 5 : // AAAAABBB:CCCCCDDD = a:x
- AccRol(8 - shCount); // BBBAAAAA:DDDCCCCC
- pic14_emitcode("xch","a,%s",x); // CCCCCDDD:BBBAAAAA
- AccRol(8 - shCount); // DDDCCCCC:BBBAAAAA
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 000CCCCC:BBBAAAAA
- pic14_emitcode("xrl","a,%s",x); // BBB(CCCCC^AAAAA):BBBAAAAA
- pic14_emitcode("xch","a,%s",x); // BBBAAAAA:BBB(CCCCC^AAAAA)
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 000AAAAA:BBB(CCCCC^AAAAA)
- pic14_emitcode("xch","a,%s",x); // BBB(CCCCC^AAAAA):000AAAAA
- pic14_emitcode("xrl","a,%s",x); // BBBCCCCC:000AAAAA
- pic14_emitcode("xch","a,%s",x); // 000AAAAA:BBBCCCCC
- break;
- case 6 : // AABBBBBB:CCDDDDDD
- pic14_emitcode("mov","c,acc.7");
- AccAXLrl1(x); // ABBBBBBC:CDDDDDDA
- AccAXLrl1(x); // BBBBBBCC:DDDDDDAA
- pic14_emitcode("xch","a,%s",x); // DDDDDDAA:BBBBBBCC
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 000000AA:BBBBBBCC
- break;
- case 7 : // ABBBBBBB:CDDDDDDD
- pic14_emitcode("mov","c,acc.7"); // c = A
- AccAXLrl1(x); // BBBBBBBC:DDDDDDDA
- pic14_emitcode("xch","a,%s",x); // DDDDDDDA:BBBBBBCC
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 0000000A:BBBBBBBC
- break;
- default :
- break;
- }
-}
-#endif
-/*-----------------------------------------------------------------*/
-/* AccAXRshS - right shift signed a:x known count (0..7) */
-/*-----------------------------------------------------------------*/
-static void AccAXRshS (char *x, int shCount)
-{
- symbol *tlbl ;
- DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- switch(shCount){
- case 0 :
- break;
- case 1 :
- pic14_emitcode("mov","c,acc.7");
- AccAXRrl1(x); // s->a:x
- break;
- case 2 :
- pic14_emitcode("mov","c,acc.7");
- AccAXRrl1(x); // s->a:x
- pic14_emitcode("mov","c,acc.7");
- AccAXRrl1(x); // s->a:x
- break;
- case 3 :
- case 4 :
- case 5 : // AAAAABBB:CCCCCDDD = a:x
- tlbl = newiTempLabel(NULL);
- AccRol(8 - shCount); // BBBAAAAA:CCCCCDDD
- pic14_emitcode("xch","a,%s",x); // CCCCCDDD:BBBAAAAA
- AccRol(8 - shCount); // DDDCCCCC:BBBAAAAA
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 000CCCCC:BBBAAAAA
- pic14_emitcode("xrl","a,%s",x); // BBB(CCCCC^AAAAA):BBBAAAAA
- pic14_emitcode("xch","a,%s",x); // BBBAAAAA:BBB(CCCCC^AAAAA)
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 000AAAAA:BBB(CCCCC^AAAAA)
- pic14_emitcode("xch","a,%s",x); // BBB(CCCCC^AAAAA):000AAAAA
- pic14_emitcode("xrl","a,%s",x); // BBBCCCCC:000AAAAA
- pic14_emitcode("xch","a,%s",x); // 000SAAAA:BBBCCCCC
- pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100);
- pic14_emitcode("orl","a,#0x%02x",
- (unsigned char)~SRMask[shCount]); // 111AAAAA:BBBCCCCC
- pic14_emitcode("","%05d_DS_:",tlbl->key+100);
- break; // SSSSAAAA:BBBCCCCC
- case 6 : // AABBBBBB:CCDDDDDD
- tlbl = newiTempLabel(NULL);
- pic14_emitcode("mov","c,acc.7");
- AccAXLrl1(x); // ABBBBBBC:CDDDDDDA
- AccAXLrl1(x); // BBBBBBCC:DDDDDDAA
- pic14_emitcode("xch","a,%s",x); // DDDDDDAA:BBBBBBCC
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 000000AA:BBBBBBCC
- pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100);
- pic14_emitcode("orl","a,#0x%02x",
- (unsigned char)~SRMask[shCount]); // 111111AA:BBBBBBCC
- pic14_emitcode("","%05d_DS_:",tlbl->key+100);
- break;
- case 7 : // ABBBBBBB:CDDDDDDD
- tlbl = newiTempLabel(NULL);
- pic14_emitcode("mov","c,acc.7"); // c = A
- AccAXLrl1(x); // BBBBBBBC:DDDDDDDA
- pic14_emitcode("xch","a,%s",x); // DDDDDDDA:BBBBBBCC
- pic14_emitcode("anl","a,#0x%02x",
- SRMask[shCount]); // 0000000A:BBBBBBBC
- pic14_emitcode("jnb","acc.%d,%05d_DS_",7-shCount,tlbl->key+100);
- pic14_emitcode("orl","a,#0x%02x",
- (unsigned char)~SRMask[shCount]); // 1111111A:BBBBBBBC
- pic14_emitcode("","%05d_DS_:",tlbl->key+100);
- break;
- default :
- break;
- }
-}
-
/*-----------------------------------------------------------------*/
/* shiftL2Left2Result - shift left two bytes from left to result */
/*-----------------------------------------------------------------*/
case 2:
case 3:
- emitpcode(POC_MOVFW,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF,popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
while(--shCount) {
emitCLRC;
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
}
break;
case 4:
case 5:
emitpcode(POC_MOVLW, popGetLit(0x0f));
- emitpcode(POC_ANDWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_SWAPF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ANDFW, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_XORWF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_ANDWF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_SWAPF, popGet(AOP(result),offr));
+ emitpcode(POC_ANDFW, popGet(AOP(result),offr));
+ emitpcode(POC_XORWF, popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16));
if(shCount >=5) {
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
}
break;
case 6:
- emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
+ emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
+ emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16));
emitpcode(POC_ANDLW,popGetLit(0xc0));
- emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_XORWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_XORFW,popGet(AOP(result),offr));
+ emitpcode(POC_XORWF,popGet(AOP(result),offr));
+ emitpcode(POC_XORFW,popGet(AOP(result),offr));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
break;
case 7:
- emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRFW, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRFW, popGet(AOP(result),offr));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_CLRF, popGet(AOP(result),offr));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
}
} else {
case 3:
/* note, use a mov/add for the shift since the mov has a
chance of getting optimized out */
- emitpcode(POC_MOVFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF, popGet(AOP(result),offr));
+ emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16));
while(--shCount) {
emitCLRC;
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
}
break;
case 4:
case 5:
- emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16,FALSE,FALSE));
+ emitpcode(POC_SWAPFW,popGet(AOP(left),offl+MSB16));
emitpcode(POC_ANDLW, popGetLit(0xF0));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_SWAPFW,popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_SWAPFW,popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
emitpcode(POC_ANDLW, popGetLit(0xF0));
- emitpcode(POC_XORWF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_XORWF, popGet(AOP(result),offr));
+ emitpcode(POC_ADDWF, popGet(AOP(result),offr+MSB16));
if(shCount == 5) {
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
}
break;
case 6:
- emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRFW, popGet(AOP(result),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
-
- emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRFW, popGet(AOP(result),offl));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
+
+ emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
+ emitpcode(POC_RRFW, popGet(AOP(result),offr+MSB16));
emitpcode(POC_ANDLW,popGetLit(0xc0));
- emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_XORWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_XORFW,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ emitpcode(POC_XORFW,popGet(AOP(result),offr));
+ emitpcode(POC_XORWF,popGet(AOP(result),offr));
+ emitpcode(POC_XORFW,popGet(AOP(result),offr));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
break;
case 7:
- emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
- emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_CLRF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_CLRF, popGet(AOP(result),offr));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
}
}
MOVA(aopGet(AOP(left),offl+MSB16,FALSE,FALSE));
}
/* a:x >> shCount (x = lsb(result))*/
+/*
if(sign)
AccAXRshS( aopGet(AOP(result),offr,FALSE,FALSE) , shCount);
else {
- //AccAXRsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount);
-
- switch(shCount) {
- case 0:
- break;
- case 1:
- case 2:
- case 3:
- emitCLRC;
- if(same) {
- emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRF,popGet(AOP(result),offr,FALSE,FALSE));
- } else {
+ AccAXRsh( aopGet(AOP(result),offr,FALSE,FALSE) , shCount);
+*/
+ switch(shCount) {
+ case 0:
+ break;
+ case 1:
+ case 2:
+ case 3:
+ emitCLRC;
+ if(same) {
+ emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRF,popGet(AOP(result),offr));
+ } else {
- emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- }
+ emitpcode(POC_RRFW, popGet(AOP(left),offl+MSB16));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ }
- while(--shCount) {
- emitCLRC;
- emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRF,popGet(AOP(result),offr,FALSE,FALSE));
- }
- break;
- case 4:
- case 5:
- if(same) {
+ while(--shCount) {
+ emitCLRC;
+ emitpcode(POC_RRF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRF,popGet(AOP(result),offr));
+ }
+ break;
+ case 4:
+ case 5:
+ if(same) {
- emitpcode(POC_MOVLW, popGetLit(0xf0));
- emitpcode(POC_ANDWF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_SWAPF, popGet(AOP(result),offr,FALSE,FALSE));
+ emitpcode(POC_MOVLW, popGetLit(0xf0));
+ emitpcode(POC_ANDWF, popGet(AOP(result),offr));
+ emitpcode(POC_SWAPF, popGet(AOP(result),offr));
- emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_ANDFW, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_ADDWF, popGet(AOP(result),offr,FALSE,FALSE));
- } else {
- emitpcode(POC_SWAPF, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_ANDLW, popGetLit(0x0f));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr,FALSE,FALSE));
-
- emitpcode(POC_SWAPF, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_ANDLW, popGetLit(0xf0));
- emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_ADDWF, popGet(AOP(result),offr,FALSE,FALSE));
- }
+ emitpcode(POC_SWAPF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_ANDFW, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_ADDWF, popGet(AOP(result),offr));
+ } else {
+ emitpcode(POC_SWAPF, popGet(AOP(left),offl));
+ emitpcode(POC_ANDLW, popGetLit(0x0f));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr));
- if(shCount >=5) {
- emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),offr,FALSE,FALSE));
- }
+ emitpcode(POC_SWAPF, popGet(AOP(left),offl+MSB16));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_ANDLW, popGetLit(0xf0));
+ emitpcode(POC_XORWF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_ADDWF, popGet(AOP(result),offr));
+ }
- break;
+ if(shCount >=5) {
+ emitpcode(POC_RRF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RRF, popGet(AOP(result),offr));
+ }
- case 6:
- if(same) {
-
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
-
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RLFW, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ANDLW,popGetLit(0x03));
- emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_XORWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- } else {
- emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RLFW, popGet(AOP(result),offl+MSB16,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_RLFW, popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_ANDLW,popGetLit(0x03));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- }
+ break;
- break;
- case 7:
- emitpcode(POC_RLFW, popGet(AOP(left),offl,FALSE,FALSE));
- emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16,FALSE,FALSE));
- emitpcode(POC_MOVWF,popGet(AOP(result),offr,FALSE,FALSE));
- emitpcode(POC_CLRF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16,FALSE,FALSE));
+ case 6:
+ if(same) {
+
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
+
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RLFW, popGet(AOP(result),offr));
+ emitpcode(POC_ANDLW,popGetLit(0x03));
+ emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_XORWF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_XORFW,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ } else {
+ emitpcode(POC_RLFW, popGet(AOP(left),offl));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RLFW, popGet(AOP(result),offl+MSB16));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RLF, popGet(AOP(result),offr));
+ emitpcode(POC_RLFW, popGet(AOP(result),offr));
+ emitpcode(POC_ANDLW,popGetLit(0x03));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
}
+
+ break;
+ case 7:
+ emitpcode(POC_RLFW, popGet(AOP(left),offl));
+ emitpcode(POC_RLFW, popGet(AOP(left),offl+MSB16));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offr));
+ emitpcode(POC_CLRF, popGet(AOP(result),offr+MSB16));
+ emitpcode(POC_RLF, popGet(AOP(result),offr+MSB16));
}
}
+
/*-----------------------------------------------------------------*/
/* shiftLLeftOrResult - shift left one byte from left, or to result*/
/*-----------------------------------------------------------------*/
else
movLeft2Result(left, LSB, result, MSB16, 0);
}
- emitpcode(POC_CLRF,popGet(AOP(result),LSB,FALSE,FALSE));
+ emitpcode(POC_CLRF,popGet(AOP(result),LSB));
}
/* 1 <= shCount <= 7 */
/* if it is only one byte then */
if (size == 1) {
if(optimized_for_speed) {
- emitpcode(POC_SWAPFW, popGet(AOP(left),0,FALSE,FALSE));
+ emitpcode(POC_SWAPFW, popGet(AOP(left),0));
emitpcode(POC_ANDLW, popGetLit(0xf0));
emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),2,0));
- emitpcode(POC_MOVFW, popGet(AOP(left),0,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),0));
+ emitpcode(POC_MOVWF, popGet(AOP(result),0));
emitpcode(POC_BTFSS, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0));
- emitpcode(POC_ADDWF, popGet(AOP(result),0,FALSE,FALSE));
- emitpcode(POC_RLFW, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_ADDWF, popGet(AOP(result),0));
+ emitpcode(POC_RLFW, popGet(AOP(result),0));
emitpcode(POC_ANDLW, popGetLit(0xfe));
- emitpcode(POC_ADDFW, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_ADDFW, popGet(AOP(result),0));
emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),1,0));
- emitpcode(POC_ADDWF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_ADDWF, popGet(AOP(result),0));
} else {
tlbl = newiTempLabel(NULL);
if (!pic14_sameRegs(AOP(left),AOP(result))) {
- emitpcode(POC_MOVFW, popGet(AOP(left),0,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),0));
+ emitpcode(POC_MOVWF, popGet(AOP(result),0));
}
- emitpcode(POC_COMFW, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_RRF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_COMFW, popGet(AOP(right),0));
+ emitpcode(POC_RRF, popGet(AOP(result),0));
emitpLabel(tlbl->key);
- emitpcode(POC_RLF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_RLF, popGet(AOP(result),0));
emitpcode(POC_ADDLW, popGetLit(1));
emitSKPC;
emitpcode(POC_GOTO,popGetLabel(tlbl->key));
if(sign)
addSign(result, MSB16, sign);
else
- emitpcode(POC_CLRF,popGet(AOP(result),MSB16,FALSE,FALSE));
+ emitpcode(POC_CLRF,popGet(AOP(result),MSB16));
}
*/
tlbl = newiTempLabel(NULL);
if (!pic14_sameRegs(AOP(left),AOP(result))) {
- emitpcode(POC_MOVFW, popGet(AOP(left),0,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),0));
+ emitpcode(POC_MOVWF, popGet(AOP(result),0));
}
- emitpcode(POC_COMFW, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_RLF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_COMFW, popGet(AOP(right),0));
+ emitpcode(POC_RLF, popGet(AOP(result),0));
emitpLabel(tlbl->key);
- emitpcode(POC_RRF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_RRF, popGet(AOP(result),0));
emitpcode(POC_ADDLW, popGetLit(1));
emitSKPC;
emitpcode(POC_GOTO,popGetLabel(tlbl->key));
aopOp(result,ic,TRUE);
- emitpcode(POC_MOVFW, popGet(AOP(left),0,FALSE,TRUE));
+ emitpcode(POC_MOVFW, popGet(AOP(left),0));
size = AOP_SIZE(result);
while (size--) {
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,TRUE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
offset++;
}
aopOp(result,ic,FALSE);
- DEBUGpic14_emitcode ("; ","result %s, left %s",
- AopType(AOP_TYPE(result)),
- AopType(AOP_TYPE(left)));
+ DEBUGpic14_AopType(__LINE__,left,NULL,result);
/* if the operand is already in dptr
then we do nothing else we move the value to dptr */
}
else { /* we need to get it byte by byte */
+ emitpcode(POC_MOVFW,popGet(AOP(left),0));
+ emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
+
size = AOP_SIZE(result);
offset = 0 ;
while(size--) {
emitpcode(POC_MOVFW,popCopyReg(&pc_indf));
- emitpcode(POC_MOVWF,popGet(AOP(result),offset++,FALSE,FALSE));
+ emitpcode(POC_MOVWF,popGet(AOP(result),offset++));
if(size)
emitpcode(POC_INCF,popCopyReg(&pc_fsr));
}
pic14_emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
pic14_emitcode("movwf","%s",buffer);
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(right),offset));
emitpcode(POC_MOVWF, popRegFromString(buffer));
}
aopOp(right,ic,FALSE);
size = AOP_SIZE(right);
- DEBUGpic14_emitcode ("; ","result %s=%s, right %s=%s, size = %d",
- AopType(AOP_TYPE(result)),
- aopGet(AOP(result),0,TRUE,FALSE),
- AopType(AOP_TYPE(right)),
- aopGet(AOP(right),0,FALSE,FALSE),
- size);
+ DEBUGpic14_AopType(__LINE__,NULL,right,result);
/* if the operand is already in dptr
then we do nothing else we move the value to dptr */
/* hack hack! see if this the FSR. If so don't load W */
if(AOP_TYPE(right) != AOP_ACC) {
- if(size==2)
- emitpcode(POC_DECF,popCopyReg(&pc_fsr));
+ emitpcode(POC_MOVFW,popGet(AOP(result),0));
+ emitpcode(POC_MOVWF,popCopyReg(&pc_fsr));
- if(size==4) {
- emitpcode(POC_MOVLW,popGetLit(0xfd));
- emitpcode(POC_ADDWF,popCopyReg(&pc_fsr));
- }
+ //if(size==2)
+ //emitpcode(POC_DECF,popCopyReg(&pc_fsr));
+ //if(size==4) {
+ // emitpcode(POC_MOVLW,popGetLit(0xfd));
+ // emitpcode(POC_ADDWF,popCopyReg(&pc_fsr));
+ //}
while(size--) {
- emitpcode(POC_MOVFW,popGet(AOP(right),offset++,FALSE,FALSE));
+ emitpcode(POC_MOVFW,popGet(AOP(right),offset++));
emitpcode(POC_MOVWF,popCopyReg(&pc_indf));
if(size)
aopOp((right=IC_RIGHT(ic)),ic,FALSE);
aopOp((result=IC_RESULT(ic)),ic,TRUE);
- if(result)
- DEBUGpic14_emitcode ("; ","result %s",
- AopType(AOP_TYPE(IC_RESULT(ic))));
+ DEBUGpic14_AopType(__LINE__,left,right,result);
- if(left)
- DEBUGpic14_emitcode ("; ","left %s",
- AopType(AOP_TYPE(IC_LEFT(ic))));
- if(right)
- DEBUGpic14_emitcode ("; ","right %s",
- AopType(AOP_TYPE(IC_RIGHT(ic))));
-
- emitpcode(POC_MOVLW, popGet(AOP(left),0,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_MOVLW, popGet(AOP(left),0));
+ emitpcode(POC_MOVWF, popGet(AOP(result),0));
#if 0
/* object not on stack then we need the name */
aopOp(right,ic,FALSE);
aopOp(result,ic,TRUE);
- DEBUGpic14_emitcode ("; ","result %s, right %s, size = %d",
- AopType(AOP_TYPE(IC_RESULT(ic))),
- AopType(AOP_TYPE(IC_RIGHT(ic))),
- AOP_SIZE(result));
+ DEBUGpic14_AopType(__LINE__,NULL,right,result);
/* if they are the same registers */
if (pic14_sameRegs(AOP(right),AOP(result)))
if (AOP_TYPE(right) == AOP_LIT) {
emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF),
- popGet(AOP(result),0,FALSE,FALSE));
+ popGet(AOP(result),0));
if (((int) operandLitValue(right)))
pic14_emitcode("bsf","(%s >> 3),(%s & 7)",
/* the right is also a bit variable */
if (AOP_TYPE(right) == AOP_CRY) {
- emitpcode(POC_BCF, popGet(AOP(result),0,FALSE,FALSE));
- emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BCF, popGet(AOP(result),0));
+ emitpcode(POC_BTFSC, popGet(AOP(right),0));
+ emitpcode(POC_BSF, popGet(AOP(result),0));
pic14_emitcode("bcf","(%s >> 3),(%s & 7)",
AOP(result)->aopu.aop_dir,
}
/* we need to or */
- emitpcode(POC_BCF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BCF, popGet(AOP(result),0));
pic14_toBoolean(right);
emitSKPZ;
- emitpcode(POC_BSF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BSF, popGet(AOP(result),0));
//aopPut(AOP(result),"a",0);
goto release ;
}
lit = (unsigned long)floatFromVal(AOP(right)->aopu.aop_lit);
if( AOP_TYPE(right) == AOP_DIR && (AOP_TYPE(result) == AOP_REG) && size==1) {
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
if(aopIdx(AOP(result),0) == 4) {
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
goto release;
} else
DEBUGpic14_emitcode ("; WARNING","%s %d ignoring register storage",__FUNCTION__,__LINE__);
know_W=-1;
while (size--) {
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
if(AOP_TYPE(right) == AOP_LIT) {
if(lit&0xff) {
if(know_W != (lit&0xff))
emitpcode(POC_MOVLW,popGetLit(lit&0xff));
know_W = lit&0xff;
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
} else
- emitpcode(POC_CLRF, popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_CLRF, popGet(AOP(result),offset));
lit >>= 8;
} else if (AOP_TYPE(right) == AOP_CRY) {
- emitpcode(POC_CLRF, popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_CLRF, popGet(AOP(result),offset));
if(offset == 0) {
- emitpcode(POC_BTFSS, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE));
+ emitpcode(POC_BTFSS, popGet(AOP(right),0));
+ emitpcode(POC_INCF, popGet(AOP(result),0));
}
} else {
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+ DEBUGpic14_emitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
+ emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
}
offset++;
pic14_emitcode("","%05d_DS_:",jtab->key+100);
emitpcode(POC_MOVLW, popGetLabel(jtab->key));
- emitpcode(POC_ADDFW, popGet(AOP(IC_JTCOND(ic)),0,FALSE,FALSE));
+ emitpcode(POC_ADDFW, popGet(AOP(IC_JTCOND(ic)),0));
emitSKPNC;
emitpcode(POC_INCF, popCopyReg(&pc_pclath));
emitpcode(POC_MOVWF, popCopyReg(&pc_pcl));
{
operand *result = IC_RESULT(ic);
sym_link *ctype = operandType(IC_LEFT(ic));
+ sym_link *rtype = operandType(IC_RIGHT(ic));
operand *right = IC_RIGHT(ic);
int size, offset ;
aopOp(right,ic,FALSE) ;
aopOp(result,ic,FALSE);
+ DEBUGpic14_AopType(__LINE__,NULL,right,result);
+
/* if the result is a bit */
if (AOP_TYPE(result) == AOP_CRY) {
/* if the right size is a literal then
if (AOP_TYPE(right) == AOP_LIT) {
emitpcode( ( ((int) operandLitValue(right)) ? POC_BSF : POC_BCF),
- popGet(AOP(result),0,FALSE,FALSE));
+ popGet(AOP(result),0));
if (((int) operandLitValue(right)))
pic14_emitcode("bsf","(%s >> 3), (%s & 7)",
if (AOP_TYPE(right) == AOP_CRY) {
emitCLRC;
- emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE));
+ emitpcode(POC_BTFSC, popGet(AOP(right),0));
pic14_emitcode("clrc","");
pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
}
/* we need to or */
- pic14_toBoolean(right);
- aopPut(AOP(result),"a",0);
+ if (AOP_TYPE(right) == AOP_REG) {
+ emitpcode(POC_BCF, popGet(AOP(result),0));
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),0,FALSE,FALSE),0,0));
+ emitpcode(POC_BSF, popGet(AOP(result),0));
+ }
+ pic14_toBoolean(right);
+ aopPut(AOP(result),"a",0);
goto release ;
}
+ if ((AOP_TYPE(right) == AOP_CRY) && (AOP_TYPE(result) == AOP_REG)) {
+ int offset = 1;
+ size = AOP_SIZE(result);
+
+ emitpcode(POC_CLRF, popGet(AOP(result),0));
+ emitpcode(POC_BTFSC, popGet(AOP(right),0));
+ emitpcode(POC_INCF, popGet(AOP(result),0));
+
+ while (size--)
+ emitpcode(POC_CLRF, popGet(AOP(result),offset++));
+
+ goto release;
+ }
+
/* if they are the same size : or less */
if (AOP_SIZE(result) <= AOP_SIZE(right)) {
}
- if (AOP_TYPE(right) == AOP_CRY) {
- int offset = 1;
- size = AOP_SIZE(right);
-
- emitpcode(POC_CLRF, popGet(AOP(result),0,FALSE,FALSE));
- emitpcode(POC_BTFSC, popGet(AOP(right),0,FALSE,FALSE));
- emitpcode(POC_INCF, popGet(AOP(result),0,FALSE,FALSE));
-
- pic14_emitcode("clrf","%s ; %d", aopGet(AOP(result),0,FALSE,FALSE),__LINE__);
- pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
- AOP(right)->aopu.aop_dir,
- AOP(right)->aopu.aop_dir);
- pic14_emitcode("incf","%s,f", aopGet(AOP(result),0,FALSE,FALSE),__LINE__);
- while (size--) {
- pic14_emitcode("clrf","%s;%d", aopGet(AOP(result),offset,FALSE,FALSE),__LINE__);
- emitpcode(POC_CLRF, popGet(AOP(result),offset++,FALSE,FALSE));
- }
- goto release;
- }
/* so we now know that the size of destination is greater
than the size of the source.
size = AOP_SIZE(right);
offset = 0 ;
while (size--) {
- pic14_emitcode(";","%d",__LINE__);
- /* aopPut(AOP(result),
- aopGet(AOP(right),offset,FALSE,FALSE),
- offset); */
- emitpcode(POC_MOVFW, popGet(AOP(right),offset,FALSE,FALSE));
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
+ emitpcode(POC_MOVFW, popGet(AOP(right),offset));
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset));
offset++;
}
/* now depending on the sign of the destination */
size = AOP_SIZE(result) - AOP_SIZE(right);
/* if unsigned or not an integral type */
- if (SPEC_USIGN(ctype) || !IS_SPEC(ctype)) {
- while (size--) {
- emitpcode(POC_CLRF, popGet(AOP(result),offset,FALSE,FALSE));
- pic14_emitcode("clrf","%s ;%d",aopGet(AOP(result),offset,FALSE,FALSE),__LINE__);
- offset++;
- }
+ if (SPEC_USIGN(rtype) || !IS_SPEC(rtype)) {
+ while (size--)
+ emitpcode(POC_CLRF, popGet(AOP(result),offset++));
} else {
/* we need to extend the sign :{ */
- emitpcodeNULLop(POC_CLRW);
-
- if(offset)
- emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0));
- else
- emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset,FALSE,FALSE),7,0));
-
- emitpcode(POC_MOVLW, popGetLit(0xff));
+ if(size == 1) {
+ /* Save one instruction of casting char to int */
+ emitpcode(POC_CLRF, popGet(AOP(result),offset));
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0));
+ emitpcode(POC_DECF, popGet(AOP(result),offset));
+ } else {
+ emitpcodeNULLop(POC_CLRW);
- pic14_emitcode("clrw","");
- pic14_emitcode("btfsc","(%s >> 3), (%s & 7)",
- AOP(right)->aopu.aop_dir,
- AOP(right)->aopu.aop_dir);
- pic14_emitcode("movlw","0xff");
- while (size--) {
- emitpcode(POC_MOVWF, popGet(AOP(result),offset,FALSE,FALSE));
- pic14_emitcode("movwf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
- offset++;
- // aopPut(AOP(result),"a",offset++);
- }
+ if(offset)
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset-1,FALSE,FALSE),7,0));
+ else
+ emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(right),offset,FALSE,FALSE),7,0));
+
+ emitpcode(POC_MOVLW, popGetLit(0xff));
+ while (size--)
+ emitpcode(POC_MOVWF, popGet(AOP(result),offset++));
+ }
}
- /* we are done hurray !!!! */
-
release:
freeAsmop(right,NULL,ic,TRUE);
freeAsmop(result,NULL,ic,TRUE);
} else {
- emitpcode(POC_DECFSZ,popGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));
+ emitpcode(POC_DECFSZ,popGet(AOP(IC_RESULT(ic)),0));
emitpcode(POC_GOTO,popGetLabel(IC_TRUE(ifx)->key));
pic14_emitcode("decfsz","%s,f",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE));