W7pro 64b using MPLAB v5.3 with XC8 v2.10
Project using a PIC12F629
The following C code, specifically lCase(), isn't being compiled properly by XC8:
char uCase(char cC)
{
return (cC & ccUCMask); // 0xDF
}
char lCase(char cC)
{
return (cC | ccLCMask); // 0x20
}
results in:
02D8 1283 BCF 0x03,5
02D9 00B4 MOVWF 0x34,F
02DA 0834 MOVF 0x34,W
02DB 39DF ANDLW 0xDF
02DC 0008 RETURN
02DD 0008 RETURN
This was expected to provide:
02D8 1283 BCF 0x03,5
02D9 00B4 MOVWF 0x34,F
02DA 0834 MOVF 0x34,W
02DB 39DF ANDLW 0xDF
02DC 0008 RETURN
02DD 1283 BCF 0x03,5
02DE 00B4 MOVWF 0x34,F
02DF 0834 MOVF 0x34,W
02C0 39DF IORLW 0x20
02C1 0008 RETURN
2 attempts at forcing the compiler to provide a working solution by explicitly using a local variable
This one fails
char lCase(char cC)
{
char cX = cC;
return (cX | ccLCMask);
}
This C Code works but returns way too much machine code
char lCase(char cC)
{
char cX = cC;
cX = cX | ccLCMask;
return (cX);
}
02C1 1283 BCF 0x03,5
02C2 00B5 MOVWF 0x35,F
02C3 0835 MOVF 0x35,W
02C4 00B4 MOVWF 0x34,F
02C5 0834 MOVF 0x34,W
02C6 00B6 MOVWF 0x36,F
02C7 0836 MOVF 0x36,W
02C8 3820 IORLW 0x20
02C9 00B4 MOVWF 0x34,F
02CA 0834 MOVF 0x34,W
02CB 00B6 MOVWF 0x36,F
02CC 0008 RETURN
At a high level, it would appear the "|" isn't being compiled properly if included within the return() statement
I could forcibly use asm("IORLW 0x20"); but wasn't expecting to 2nd guess the compiler.
Thoughts?