- for(;size--; offset++) {
- if(AOP_TYPE(right) == AOP_LIT){
- if((bytelit = (int)((lit >> (offset*8)) & 0x0FFL)) == 0x0FF)
- continue;
- else
- if (bytelit == 0)
- aopPut(AOP(result),zero,offset);
- else
- if (IS_AOP_PREG(result)) {
- MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
- emitcode("anl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
- aopPut(AOP(result),"a",offset);
- } else
- emitcode("anl","%s,%s",
- aopGet(AOP(left),offset,FALSE,TRUE),
- aopGet(AOP(right),offset,FALSE,FALSE));
- } else {
- if (AOP_TYPE(left) == AOP_ACC)
- emitcode("anl","a,%s",aopGet(AOP(right),offset,FALSE,FALSE));
- else {
- MOVA(aopGet(AOP(right),offset,FALSE,FALSE));
- if (IS_AOP_PREG(result)) {
- emitcode("anl","a,%s",aopGet(AOP(left),offset,FALSE,TRUE));
- aopPut(AOP(result),"a",offset);
+ for(;size--; offset++,lit>>=8) {
+ if(AOP_TYPE(right) == AOP_LIT){
+ switch(lit & 0xff) {
+ case 0x00:
+ /* and'ing with 0 has clears the result */
+ emitcode("clrf","%s",aopGet(AOP(result),offset,FALSE,FALSE));
+ break;
+ case 0xff:
+ emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+ break;
+
+ default:
+ {
+ int p = my_powof2( (~lit) & 0xff );
+ if(p>=0) {
+ /* only one bit is set in the literal, so use a bcf instruction */
+ emitcode("bcf","%s,%d",aopGet(AOP(left),offset,FALSE,TRUE),p);
+ } else {
+ emitcode("movlw","0x%x", (lit & 0xff));
+ emitcode("andwf","%s,f",aopGet(AOP(left),offset,FALSE,TRUE),p);
+ }
+ }
+ }
+ } else {
+ if (AOP_TYPE(left) == AOP_ACC)
+ emitcode("iorwf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+ else {
+ emitcode("movf","%s,w",aopGet(AOP(right),offset,FALSE,FALSE));
+ emitcode("iorwf","%s,f",aopGet(AOP(left),offset,FALSE,FALSE));
+
+ }
+ }
+ }