#if !defined(__AVR_TINY__)
#if !defined(__DOXYGEN__)
#include "macros.inc"
#define dst_b1      r25
#define dst_b0      r24
#define src_b30     r23 
#define src_b20     r22 
#define src_b1      r21
#define src_b0      r20
#define siz_b1      r19
#define siz_b0      r18
#define src_b2      r28 
#define dlen_b1     src_b30
#define dlen_b0     src_b20
#define rWord_b1    r25
#define rWord_b0    r24
    .text
    .global _U(strlcat_PF)
    .type   _U(strlcat_PF),@function
_U(strlcat_PF):
    push    src_b2
    mov src_b2, src_b20
    X_movw  XL, dst_b0      ; X = dst
    X_movw  ZL, src_b0      ; Z = src
    LPM_R0_ZPLUS_INIT src_b2
.L_strlcat_PF_dlen:         ; Find end of dst string
    ld  r0, X+          ; get next char from dst
    cp  siz_b0, __zero_reg__    ; and calc dlen = len of dst
    cpc siz_b1, __zero_reg__    ; size == 0 ?
    breq     1f         ; --> done
    tst r0          ; end of dst ?
    breq     1f         ; --> done
    subi    siz_b0, lo8(1)
    sbci    siz_b1, hi8(1)      ; siz--
    rjmp    .L_strlcat_PF_dlen  ; --> next char
1:  sbiw    XL, 1           ; undo post increment
    X_movw  dlen_b0, XL
    sub dlen_b0, dst_b0
    sbc dlen_b1, dst_b1     ; dlen = X - dst
    cp  siz_b0, __zero_reg__
    cpc siz_b1, __zero_reg__    ; size == 0 ?
    breq    .L_strlcat_PF_slen  ; --> done
    subi    siz_b0, lo8(1)
    sbci    siz_b1, hi8(1)      ; siz--
.L_strlcat_PF_concat:           ; Concatenate
    LPM_R0_ZPLUS_NEXT src_b2    ; get next char from src
    cp  siz_b0, __zero_reg__
    cpc siz_b1, __zero_reg__    ; size == 0 ?
    breq    1f          ; --> done
    tst r0          ; end of src ?
    breq    1f          ; --> done
    st  X+, r0          ; store in dest
    subi    siz_b0, lo8(1)
    sbci    siz_b1, hi8(1)      ; siz--
    rjmp    .L_strlcat_PF_concat    ; --> next char
1:  st  X, __zero_reg__     ; *X = '\0'
    sbiw    ZL, 1           ; undo post increment
#ifdef RAMPZ
    in  r0, _SFR_IO_ADDR(RAMPZ)
    sbc r0, __zero_reg__
    out _SFR_IO_ADDR(RAMPZ), r0
#endif
.L_strlcat_PF_slen:
    LPM_R0_ZPLUS_NEXT src_b2    ; get next char from src
    tst r0          ; end of src ?
    brne    .L_strlcat_PF_slen  ; --> next char
    sbiw    ZL, 1           ; undo post increment
#ifdef RAMPZ
    in  r0, _SFR_IO_ADDR(RAMPZ)
    sbc r0, __zero_reg__
    out _SFR_IO_ADDR(RAMPZ), r0
#endif
    X_movw  rWord_b0, dlen_b0
    add rWord_b0, ZL
    adc rWord_b1, ZH
    sub rWord_b0, src_b0
    sbc rWord_b1, src_b1    ; return(dlen + (Z - src))
    LPM_R0_ZPLUS_FINI src_b2
    pop src_b2
    ret
.L_strlcat_PF_end:
    .size   _U(strlcat_PF), .L_strlcat_PF_end - _U(strlcat_PF)
#endif 
#endif