I have some missunderstanding in PIC18 addressing (as i see). So there is a part of lst file generated by XC8. At the end of code we can see the switch/case operator compare block, which then branches to case parts. So lets get two consistent labels l884 and l885. It's addreses is 1984h and 1990h (distance of 12 bytes or 6 words). But if we looks for the code, which is branches to them, we can see:
E0F7 bz l885
and
E0EF bz l884
the distance is 8 !!! not 6, not 0C, but 8 ???!!! i wish to change switch()/case block in this function to calculated goto, cause this point is critical to speed (this is the reason i watch this listing) but now i do not unserstand now which multiplier i must to use 6, 8, or 12?
addr hex code label disasm
001984 l884:
;main.c: 405: Run(canIdCheckers[1].func);
001984 C102 F03C movff _canIdCheckers+2,Run@addr
001988 C103 F03D movff _canIdCheckers+3,Run@addr+1
00198C ECB2 F014 call _Run ;wreg free
001990 l885:
;main.c: 407: Run(canIdCheckers[0].func);
001990 C100 F03C movff _canIdCheckers,Run@addr
001994 C101 F03D movff _canIdCheckers+1,Run@addr+1
001998 EFB2 F014 goto _Run ;wreg free
00199C l5504:
00199C 501E movf _canIdCheckerCount,w,c
; Switch size 1, requested type "space"
; Number of cases is 48, Range of values is 1 to 48
; switch strategies available:
; Name Instructions Cycles
; simple_byte 145 73 (average)
; Chosen strategy is simple_byte
00199E 0A01 xorlw 1 ; case 1
0019A0 E0F7 bz l885
0019A2 0A03 xorlw 3 ; case 2
0019A4 E0EF bz l884