rubinius/rubinius

View on GitHub
build/libraries/libffi/src/sh/sysv.S

Summary

Maintainability
Test Coverage
/* -----------------------------------------------------------------------
   sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
   
   SuperH Foreign Function Interface 

   Permission is hereby granted, free of charge, to any person obtaining
   a copy of this software and associated documentation files (the
   ``Software''), to deal in the Software without restriction, including
   without limitation the rights to use, copy, modify, merge, publish,
   distribute, sublicense, and/or sell copies of the Software, and to
   permit persons to whom the Software is furnished to do so, subject to
   the following conditions:

   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.

   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   DEALINGS IN THE SOFTWARE.
   ----------------------------------------------------------------------- */

#define LIBFFI_ASM    
#include <fficonfig.h>
#include <ffi.h>
#ifdef HAVE_MACHINE_ASM_H
#include <machine/asm.h>
#else
/* XXX these lose for some platforms, I'm sure. */
#define CNAME(x) x
#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
#endif

#if defined(__HITACHI__)
#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
#else
#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
#endif

.text

    # r4:    ffi_prep_args
    # r5:    &ecif
    # r6:    bytes
    # r7:    flags
    # sp+0: rvalue
    # sp+4: fn

    # This assumes we are using gas.
ENTRY(ffi_call_SYSV)
    # Save registers
.LFB1:
    mov.l    r8,@-r15
.LCFI0:
    mov.l    r9,@-r15
.LCFI1:
    mov.l    r10,@-r15
.LCFI2:
    mov.l    r12,@-r15
.LCFI3:
    mov.l    r14,@-r15
.LCFI4:
    sts.l    pr,@-r15
.LCFI5:
    mov    r15,r14
.LCFI6:
#if defined(__SH4__)
    mov    r6,r8
    mov    r7,r9

    sub    r6,r15
    add    #-16,r15
    mov    #~7,r0
    and    r0,r15

    mov    r4,r0
    jsr    @r0
     mov    r15,r4

    mov    r9,r1
    shlr8    r9
    shlr8    r9
    shlr8    r9

    mov    #FFI_TYPE_STRUCT,r2
    cmp/eq    r2,r9
    bf    1f
#if STRUCT_VALUE_ADDRESS_WITH_ARG
     mov.l    @r15+,r4
    bra    2f
     mov    #5,r2
#else
     mov.l    @r15+,r10
#endif
1:
    mov    #4,r2
2:
    mov    #4,r3

L_pass:
    cmp/pl    r8
    bf    L_call_it

    mov    r1,r0
    and    #3,r0

L_pass_d:
    cmp/eq    #FFI_TYPE_DOUBLE,r0
    bf    L_pass_f

    mov    r3,r0
    and    #1,r0
    tst    r0,r0
    bt    1f
    add    #1,r3
1:
    mov    #12,r0
    cmp/hs    r0,r3
    bt/s    3f
     shlr2    r1
    bsr    L_pop_d
     nop
3:
    add    #2,r3
    bra    L_pass
     add    #-8,r8

L_pop_d:
    mov    r3,r0
    add    r0,r0
    add    r3,r0
    add    #-12,r0
    braf    r0
     nop
#ifdef __LITTLE_ENDIAN__
    fmov.s    @r15+,fr5
    rts
     fmov.s    @r15+,fr4
    fmov.s    @r15+,fr7
    rts
     fmov.s    @r15+,fr6
    fmov.s    @r15+,fr9
    rts
     fmov.s    @r15+,fr8
    fmov.s    @r15+,fr11
    rts
     fmov.s    @r15+,fr10
#else
    fmov.s    @r15+,fr4
    rts
     fmov.s    @r15+,fr5
    fmov.s    @r15+,fr6
    rts
     fmov.s    @r15+,fr7
    fmov.s    @r15+,fr8
    rts
     fmov.s    @r15+,fr9
    fmov.s    @r15+,fr10
    rts
     fmov.s    @r15+,fr11
#endif

L_pass_f:
    cmp/eq    #FFI_TYPE_FLOAT,r0
    bf    L_pass_i

    mov    #12,r0
    cmp/hs    r0,r3
    bt/s    2f
     shlr2    r1
    bsr    L_pop_f
     nop
2:
    add    #1,r3
    bra    L_pass
     add    #-4,r8

L_pop_f:
    mov    r3,r0
    shll2    r0
    add    #-16,r0
    braf    r0
     nop
#ifdef __LITTLE_ENDIAN__
    rts
     fmov.s    @r15+,fr5
    rts
     fmov.s    @r15+,fr4
    rts
     fmov.s    @r15+,fr7
    rts
     fmov.s    @r15+,fr6
    rts
     fmov.s    @r15+,fr9
    rts
     fmov.s    @r15+,fr8
    rts
     fmov.s    @r15+,fr11
    rts
     fmov.s    @r15+,fr10
#else
    rts
     fmov.s    @r15+,fr4
    rts
     fmov.s    @r15+,fr5
    rts
     fmov.s    @r15+,fr6
    rts
     fmov.s    @r15+,fr7
    rts
     fmov.s    @r15+,fr8
    rts
     fmov.s    @r15+,fr9
    rts
     fmov.s    @r15+,fr10
    rts
     fmov.s    @r15+,fr11
#endif

L_pass_i:
    cmp/eq    #FFI_TYPE_INT,r0
    bf    L_call_it

    mov    #8,r0
    cmp/hs    r0,r2
    bt/s    2f
     shlr2    r1
    bsr    L_pop_i
     nop
2:
    add    #1,r2
    bra    L_pass
     add    #-4,r8

L_pop_i:
    mov    r2,r0
    shll2    r0
    add    #-16,r0
    braf    r0
     nop
    rts
     mov.l    @r15+,r4
    rts
     mov.l    @r15+,r5
    rts
     mov.l    @r15+,r6
    rts
     mov.l    @r15+,r7

L_call_it:
    # call function
#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
    mov    r10, r2
#endif
    mov.l  @(28,r14),r1
    jsr    @r1
     nop

L_ret_d:
    mov    #FFI_TYPE_DOUBLE,r2
    cmp/eq    r2,r9
    bf    L_ret_ll

    mov.l    @(24,r14),r1
#ifdef __LITTLE_ENDIAN__
    fmov.s    fr1,@r1
    add    #4,r1
    bra    L_epilogue
     fmov.s    fr0,@r1
#else
    fmov.s    fr0,@r1
    add    #4,r1
    bra    L_epilogue
     fmov.s    fr1,@r1
#endif

L_ret_ll:
    mov    #FFI_TYPE_SINT64,r2
    cmp/eq    r2,r9
    bt/s    1f
     mov    #FFI_TYPE_UINT64,r2
    cmp/eq    r2,r9
    bf    L_ret_f

1:
    mov.l    @(24,r14),r2
    mov.l    r0,@r2
    bra    L_epilogue
     mov.l    r1,@(4,r2)

L_ret_f:
    mov    #FFI_TYPE_FLOAT,r2
    cmp/eq    r2,r9
    bf    L_ret_i

    mov.l    @(24,r14),r1
    bra    L_epilogue
     fmov.s    fr0,@r1

L_ret_i:
    mov    #FFI_TYPE_INT,r2
    cmp/eq    r2,r9
    bf    L_epilogue

    mov.l    @(24,r14),r1
    bra    L_epilogue
     mov.l    r0,@r1

L_epilogue:
    # Remove the space we pushed for the args
    mov   r14,r15

    lds.l  @r15+,pr
    mov.l  @r15+,r14
    mov.l  @r15+,r12
    mov.l  @r15+,r10
    mov.l  @r15+,r9
    rts
     mov.l  @r15+,r8
#else
    mov    r6,r8
    mov    r7,r9

    sub    r6,r15
    add    #-16,r15
    mov    #~7,r0
    and    r0,r15

    mov    r4,r0
    jsr    @r0
     mov    r15,r4

    mov    r9,r3
    shlr8    r9
    shlr8    r9
    shlr8    r9

    mov    #FFI_TYPE_STRUCT,r2
    cmp/eq    r2,r9
    bf    1f
#if STRUCT_VALUE_ADDRESS_WITH_ARG
    mov.l    @r15+,r4
    bra    2f
     mov    #5,r2
#else
    mov.l    @r15+,r10
#endif
1:
    mov    #4,r2
2:

L_pass:
    cmp/pl    r8
    bf    L_call_it

    mov    r3,r0
    and    #3,r0

L_pass_d:
    cmp/eq    #FFI_TYPE_DOUBLE,r0
    bf    L_pass_i

    mov    r15,r0
    and    #7,r0
    tst    r0,r0
    bt    1f
    add    #4,r15
1:
    mov    #8,r0
    cmp/hs    r0,r2
    bt/s    2f
     shlr2    r3
    bsr    L_pop_d
     nop
2:
    add    #2,r2
    bra    L_pass
     add    #-8,r8

L_pop_d:
    mov    r2,r0
    add    r0,r0
    add    r2,r0
    add    #-12,r0
    add    r0,r0
    braf    r0
     nop
    mov.l    @r15+,r4
    rts
     mov.l    @r15+,r5
    mov.l    @r15+,r5
    rts
     mov.l    @r15+,r6
    mov.l    @r15+,r6
    rts
     mov.l    @r15+,r7
    rts
     mov.l    @r15+,r7

L_pass_i:
    cmp/eq    #FFI_TYPE_INT,r0
    bf    L_call_it

    mov    #8,r0
    cmp/hs    r0,r2
    bt/s    2f
     shlr2    r3
    bsr    L_pop_i
     nop
2:
    add    #1,r2
    bra    L_pass
     add    #-4,r8

L_pop_i:
    mov    r2,r0
    shll2    r0
    add    #-16,r0
    braf    r0
     nop
    rts
     mov.l    @r15+,r4
    rts
     mov.l    @r15+,r5
    rts
     mov.l    @r15+,r6
    rts
     mov.l    @r15+,r7

L_call_it:
    # call function
#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
    mov    r10, r2
#endif
    mov.l  @(28,r14),r1
    jsr    @r1
     nop

L_ret_d:
    mov    #FFI_TYPE_DOUBLE,r2
    cmp/eq    r2,r9
    bf    L_ret_ll

    mov.l    @(24,r14),r2
    mov.l    r0,@r2
    bra    L_epilogue
     mov.l    r1,@(4,r2)

L_ret_ll:
    mov    #FFI_TYPE_SINT64,r2
    cmp/eq    r2,r9
    bt/s    1f
     mov    #FFI_TYPE_UINT64,r2
    cmp/eq    r2,r9
    bf    L_ret_i

1:
    mov.l    @(24,r14),r2
    mov.l    r0,@r2
    bra    L_epilogue
     mov.l    r1,@(4,r2)

L_ret_i:
    mov    #FFI_TYPE_FLOAT,r2
    cmp/eq    r2,r9
    bt    1f
    mov    #FFI_TYPE_INT,r2
    cmp/eq    r2,r9
    bf    L_epilogue
1:
    mov.l    @(24,r14),r1
    bra    L_epilogue
     mov.l    r0,@r1

L_epilogue:
    # Remove the space we pushed for the args
    mov   r14,r15

    lds.l  @r15+,pr
    mov.l  @r15+,r14
    mov.l  @r15+,r12
    mov.l  @r15+,r10
    mov.l  @r15+,r9
    rts
     mov.l  @r15+,r8
#endif
.LFE1:
.ffi_call_SYSV_end:
        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)

.globl    ffi_closure_helper_SYSV

ENTRY(ffi_closure_SYSV)
.LFB2:
    mov.l    r7,@-r15
.LCFI7:
    mov.l    r6,@-r15
.LCFI8:
    mov.l    r5,@-r15
.LCFI9:
    mov.l    r4,@-r15
.LCFIA:
    mov.l    r14,@-r15
.LCFIB:
    sts.l    pr,@-r15

    /* Stack layout:    
       xx bytes (on stack parameters)
       16 bytes (register parameters)
        4 bytes (saved frame pointer)
        4 bytes (saved return address)
       32 bytes (floating register parameters, SH-4 only)
        8 bytes (result)
        4 bytes (pad)
        4 bytes (5th arg)
       <- new stack pointer
    */
.LCFIC:
#if defined(__SH4__)
    add    #-48,r15
#else
    add    #-16,r15
#endif
.LCFID:
    mov    r15,r14
.LCFIE:

#if defined(__SH4__)
    mov    r14,r1
    add    #48,r1
#ifdef __LITTLE_ENDIAN__
    fmov.s    fr10,@-r1
    fmov.s    fr11,@-r1
    fmov.s    fr8,@-r1
    fmov.s    fr9,@-r1
    fmov.s    fr6,@-r1
    fmov.s    fr7,@-r1
    fmov.s    fr4,@-r1
    fmov.s    fr5,@-r1
#else
    fmov.s    fr11,@-r1
    fmov.s    fr10,@-r1
    fmov.s    fr9,@-r1
    fmov.s    fr8,@-r1
    fmov.s    fr7,@-r1
    fmov.s    fr6,@-r1
    fmov.s    fr5,@-r1
    fmov.s    fr4,@-r1
#endif
    mov    r1,r7
    mov    r14,r6
    add    #56,r6
#else
    mov    r14,r6
    add    #24,r6
#endif

    bt/s    10f
     mov    r2, r5
    mov    r14,r1
    add    #8,r1
    mov    r1,r5
10:

    mov    r14,r1
#if defined(__SH4__)
    add    #72,r1
#else
    add    #40,r1
#endif
    mov.l    r1,@r14

#ifdef PIC
    mov.l    L_got,r1
    mova    L_got,r0
    add    r0,r1
    mov.l    L_helper,r0
    add    r1,r0
#else
    mov.l    L_helper,r0
#endif
    jsr    @r0
     mov    r3,r4

    shll    r0
    mov    r0,r1
    mova    L_table,r0
    add    r1,r0
    mov.w    @r0,r0
    mov    r14,r2
    braf    r0
     add    #8,r2
0:
    .align 2
#ifdef PIC
L_got:
    .long    _GLOBAL_OFFSET_TABLE_
L_helper:
    .long    ffi_closure_helper_SYSV@GOTOFF
#else
L_helper:
    .long    ffi_closure_helper_SYSV
#endif
L_table:
    .short L_case_v - 0b    /* FFI_TYPE_VOID */
    .short L_case_i - 0b    /* FFI_TYPE_INT */
#if defined(__SH4__)
    .short L_case_f - 0b    /* FFI_TYPE_FLOAT */
    .short L_case_d - 0b    /* FFI_TYPE_DOUBLE */
    .short L_case_d - 0b    /* FFI_TYPE_LONGDOUBLE */
#else
    .short L_case_i - 0b    /* FFI_TYPE_FLOAT */
    .short L_case_ll - 0b    /* FFI_TYPE_DOUBLE */
    .short L_case_ll - 0b    /* FFI_TYPE_LONGDOUBLE */
#endif
    .short L_case_uq - 0b    /* FFI_TYPE_UINT8 */
    .short L_case_q - 0b    /* FFI_TYPE_SINT8 */
    .short L_case_uh - 0b    /* FFI_TYPE_UINT16 */
    .short L_case_h - 0b    /* FFI_TYPE_SINT16 */
    .short L_case_i - 0b    /* FFI_TYPE_UINT32 */
    .short L_case_i - 0b    /* FFI_TYPE_SINT32 */
    .short L_case_ll - 0b    /* FFI_TYPE_UINT64 */
    .short L_case_ll - 0b    /* FFI_TYPE_SINT64 */
    .short L_case_v - 0b    /* FFI_TYPE_STRUCT */
    .short L_case_i - 0b    /* FFI_TYPE_POINTER */

#if defined(__SH4__)
L_case_d:
#ifdef __LITTLE_ENDIAN__
    fmov.s    @r2+,fr1
    bra    L_case_v
     fmov.s    @r2,fr0
#else
    fmov.s    @r2+,fr0
    bra    L_case_v
     fmov.s    @r2,fr1
#endif

L_case_f:
    bra    L_case_v
     fmov.s    @r2,fr0
#endif
    
L_case_ll:
    mov.l    @r2+,r0
    bra    L_case_v
     mov.l    @r2,r1
    
L_case_i:
    bra    L_case_v
     mov.l    @r2,r0
    
L_case_q:
#ifdef __LITTLE_ENDIAN__
#else
    add    #3,r2
#endif
    bra    L_case_v
     mov.b    @r2,r0

L_case_uq:
#ifdef __LITTLE_ENDIAN__
#else
    add    #3,r2
#endif
    mov.b    @r2,r0
    bra    L_case_v
     extu.b r0,r0

L_case_h:
#ifdef __LITTLE_ENDIAN__
#else
    add    #2,r2
#endif
    bra    L_case_v
     mov.w    @r2,r0

L_case_uh:
#ifdef __LITTLE_ENDIAN__
#else
    add    #2,r2
#endif
    mov.w    @r2,r0
    extu.w    r0,r0
    /* fall through */

L_case_v:
#if defined(__SH4__)
    add    #48,r15
#else
    add    #16,r15
#endif
    lds.l    @r15+,pr
    mov.l    @r15+,r14
    rts
     add    #16,r15
.LFE2:
.ffi_closure_SYSV_end:
        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)

#if defined __ELF__ && defined __linux__
    .section    .note.GNU-stack,"",@progbits
#endif

    .section    ".eh_frame","aw",@progbits
__FRAME_BEGIN__:
    .4byte    .LECIE1-.LSCIE1    /* Length of Common Information Entry */
.LSCIE1:
    .4byte    0x0    /* CIE Identifier Tag */
    .byte    0x1    /* CIE Version */
#ifdef PIC
    .ascii "zR\0"    /* CIE Augmentation */
#else
    .byte    0x0    /* CIE Augmentation */
#endif
    .byte    0x1    /* uleb128 0x1; CIE Code Alignment Factor */
    .byte    0x7c    /* sleb128 -4; CIE Data Alignment Factor */
    .byte    0x11    /* CIE RA Column */
#ifdef PIC
    .uleb128 0x1    /* Augmentation size */
    .byte    0x10    /* FDE Encoding (pcrel) */
#endif
    .byte    0xc    /* DW_CFA_def_cfa */
    .byte    0xf    /* uleb128 0xf */
    .byte    0x0    /* uleb128 0x0 */
    .align    2
.LECIE1:
.LSFDE1:
    .4byte    .LEFDE1-.LASFDE1    /* FDE Length */
.LASFDE1:
    .4byte    .LASFDE1-__FRAME_BEGIN__    /* FDE CIE offset */
#ifdef PIC
    .4byte    .LFB1-.    /* FDE initial location */
#else
    .4byte    .LFB1    /* FDE initial location */
#endif
    .4byte    .LFE1-.LFB1     /* FDE address range */
#ifdef PIC
    .uleb128 0x0    /* Augmentation size */
#endif
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI0-.LFB1
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x4    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI1-.LCFI0
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x8    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI2-.LCFI1
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0xc    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI3-.LCFI2
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x10    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI4-.LCFI3
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x14    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI5-.LCFI4
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x18    /* uleb128 0x4 */
    .byte    0x91    /* DW_CFA_offset, column 0x11 */
    .byte    0x6    /* uleb128 0x6 */
    .byte    0x8e    /* DW_CFA_offset, column 0xe */
    .byte    0x5    /* uleb128 0x5 */
    .byte    0x8c    /* DW_CFA_offset, column 0xc */
    .byte    0x4    /* uleb128 0x4 */
    .byte    0x8a    /* DW_CFA_offset, column 0xa */
    .byte    0x3    /* uleb128 0x3 */
    .byte    0x89    /* DW_CFA_offset, column 0x9 */
    .byte    0x2    /* uleb128 0x2 */
    .byte    0x88    /* DW_CFA_offset, column 0x8 */
    .byte    0x1    /* uleb128 0x1 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI6-.LCFI5
    .byte    0xd    /* DW_CFA_def_cfa_register */
    .byte    0xe    /* uleb128 0xe */
    .align    2
.LEFDE1:

.LSFDE3:
    .4byte    .LEFDE3-.LASFDE3    /* FDE Length */
.LASFDE3:
    .4byte    .LASFDE3-__FRAME_BEGIN__    /* FDE CIE offset */
#ifdef PIC
    .4byte    .LFB2-.    /* FDE initial location */
#else
    .4byte    .LFB2    /* FDE initial location */
#endif
    .4byte    .LFE2-.LFB2     /* FDE address range */
#ifdef PIC
    .uleb128 0x0    /* Augmentation size */
#endif
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI7-.LFB2
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x4    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI8-.LCFI7
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x8    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFI9-.LCFI8
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0xc    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFIA-.LCFI9
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x10    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFIB-.LCFIA
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x14    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFIC-.LCFIB
    .byte    0xe    /* DW_CFA_def_cfa_offset */
    .byte    0x18    /* uleb128 0x4 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFID-.LCFIC
    .byte    0xe    /* DW_CFA_def_cfa_offset */
#if defined(__SH4__)
    .byte    24+48    /* uleb128 24+48 */
#else
    .byte    24+16    /* uleb128 24+16 */
#endif
    .byte    0x91    /* DW_CFA_offset, column 0x11 */
    .byte    0x6    /* uleb128 0x6 */
    .byte    0x8e    /* DW_CFA_offset, column 0xe */
    .byte    0x5    /* uleb128 0x5 */
    .byte    0x84    /* DW_CFA_offset, column 0x4 */
    .byte    0x4    /* uleb128 0x4 */
    .byte    0x85    /* DW_CFA_offset, column 0x5 */
    .byte    0x3    /* uleb128 0x3 */
    .byte    0x86    /* DW_CFA_offset, column 0x6 */
    .byte    0x2    /* uleb128 0x2 */
    .byte    0x87    /* DW_CFA_offset, column 0x7 */
    .byte    0x1    /* uleb128 0x1 */
    .byte    0x4    /* DW_CFA_advance_loc4 */
    .4byte    .LCFIE-.LCFID
    .byte    0xd    /* DW_CFA_def_cfa_register */
    .byte    0xe    /* uleb128 0xe */
    .align    2
.LEFDE3: