This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

the unnecessary DPTR re-load in C51

I have found the following optimization problem in C51 v7.06a: the access to a structure member with offset>0 (XDATA) causes the unnecessary DPTR reload (and computing). There was no such problem in C51 v6.x.

Has anyone a solution/idea?

Code example

C-Source:

// XDATA access optimization test
#pragma SRC(LST\OptTSt1.asm)
#pragma OT(7,SPEED)
// --------------------------------------------------------------------------
struct ts
{
unsigned char cnt1;
unsigned char cnt2;
};
typedef struct ts xdata TS;
// --------------------------------------------------------------------------
void f1(TS* s)
{
if (++(s->cnt1)==0)
s->cnt1=0xFF; // optimization Ok, no DPTR re-load
}
// --------------------------------------------------------------------------
void f2(TS* s)
{
if (++(s->cnt2)==0)
s->cnt2=0xFF; // the unnecessary DPTR re-load!
}

Compiler output:

; void f1(TS* s)
RSEG ?PR?_f1?OPTTST1
_f1:
; SOURCE LINE # 12
;---- Variable 's?040' assigned to Register 'DPTR' ----
MOV DPL,R7
MOV DPH,R6
; {
; SOURCE LINE # 13
; if (s->cnt1==0)
; SOURCE LINE # 14
MOVX A,@DPTR
JNZ ?C0002
; s->cnt1=0xFF; // optimization Ok, no DPTR re-load
; SOURCE LINE # 15
MOV A,#0FFH
MOVX @DPTR,A
; }
; SOURCE LINE # 16
?C0002:
RET
; END OF _f1

; // --------------------------------------------------------------------------
; void f2(TS* s)

RSEG ?PR?_f2?OPTTST1
_f2:
; SOURCE LINE # 18
;---- Variable 's?141' assigned to Register 'R6/R7' ----
; {
; SOURCE LINE # 19
; if (s->cnt2==0)
; SOURCE LINE # 20
MOV DPL,R7
MOV DPH,R6
INC DPTR
MOVX A,@DPTR
JNZ ?C0004
; s->cnt2=0xFF; // the unnecessary DPTR re-load!
; SOURCE LINE # 21
MOV DPL,R7
MOV DPH,R6
INC DPTR
MOV A,#0FFH
MOVX @DPTR,A
; }
; SOURCE LINE # 22
?C0004:
RET
; END OF _f2