Неправильные расчеты после векторизации G CC на ARM - PullRequest
2 голосов
/ 28 января 2020

Существует простая программа, которая перебирает массив структур и вычисляет сумму разности между ее членами. Программа скомпилирована для ARM (aarch64) с G CC 9.

Проблема в том, что оптимизатор G CC векторизует l oop, и после этого я получил неправильный результат. Проблема исчезнет, ​​если я принудительно отключу векторизацию l oop.

#include <cstdio>
#include <cstdlib>
#include <cstdint>

#define MAX_VALUE         23
#define MAX_VALUE2        512

struct T
{
  intptr_t start;
  intptr_t finish;
  uint16_t anotherArray[MAX_VALUE];
};

struct S
{
  T someArray[MAX_VALUE2];
};

int getValue()
{
  static int n = 0;
  return n++;
}

const int MaxI = 100;
void init (S *s)
{
        for (volatile int n = 0; n < MaxI; ++n)
        {
                s->someArray[n].start = getValue();
                s->someArray[n].finish = getValue();
        }
}

int main ()
{
        S *s = new S;
        init(s);

        uint16_t totalLen = 0;
        printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
        for (int i = 0; i < MaxI; i++) // << this loop causes the problem
        {
                totalLen += (s->someArray[i].finish - s->someArray[i].start);
        }

        printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
        return 0;
}

Правильный вывод должен быть

totalLen=0
totalLen=100

При компиляции программы G CC вывод оптимизатора "l oop векторизация с использованием 8-байтовых векторов ". После того как totalLen не равно 100. Я полагаю, это потому, что struct T не выровнен должным образом.

Я могу отключить векторизацию l oop несколькими способами:

  • -fno-tree-vectorize
  • добавить «volatile» к for l oop: for (volatile int i = 0; i < MaxI; i++)
  • удалить anotherArray член из struct T
  • изменить тип totalLen с uint16_t на int (кстати, почему?)
  • ...

Однако я не хочу отключать векторизацию. Я хотел бы использовать векторизацию, если это возможно, чтобы достичь лучшей производительности.

Что мне делать с этой проблемой? Можно ли как-то изменить struct T, чтобы выровнять его должным образом? Может быть, что-то еще? Может быть, это ошибка компилятора?

Вот пример Godbolt: https://godbolt.org/z/fdmHEG

ОБНОВЛЕНИЕ:

Часть моего g++ -O3 -g3 -S a.cpp вывода

    .arch armv8-a
    .file   "a.cpp"
    .text
.Ltext0:
    .align  2
    .p2align 3,,7
    .global _Z8getValuev
    .type   _Z8getValuev, %function
_Z8getValuev:
.LFB29:
    .file 1 "a.cpp"
    .loc 1 21 1
    .cfi_startproc
    .loc 1 22 3
    .loc 1 23 3
    .loc 1 23 13 is_stmt 0
    adrp    x1, .LANCHOR0
    ldr w0, [x1, #:lo12:.LANCHOR0]
    add w2, w0, 1
    str w2, [x1, #:lo12:.LANCHOR0]
    .loc 1 24 1
    ret
    .cfi_endproc
.LFE29:
    .size   _Z8getValuev, .-_Z8getValuev
    .align  2
    .p2align 3,,7
    .global _Z4initP1S
    .type   _Z4initP1S, %function
_Z4initP1S:
.LFB30:
    .loc 1 28 1 is_stmt 1
    .cfi_startproc
.LVL0:
    .loc 1 29 2
.LBB15:
    .loc 1 29 20
    adrp    x5, .LANCHOR0
    ldr w4, [x5, #:lo12:.LANCHOR0]
    sxtw    x1, w4
    add x3, x1, 200
.LVL1:
    .p2align 3,,7
.L4:
    .loc 1 31 3
.LBE15:
    .loc 1 22 3
    .loc 1 23 3
.LBB16:
    .loc 1 32 26 is_stmt 0
    add x2, x1, 1
    stp x1, x2, [x0]
    .loc 1 29 2 is_stmt 1
    .loc 1 29 20
    add x1, x1, 2
    cmp x1, x3
    add x0, x0, 64
    bne .L4
    add w4, w4, 200
    str w4, [x5, #:lo12:.LANCHOR0]
.LBE16:
    .loc 1 34 1 is_stmt 0
    ret
    .cfi_endproc
.LFE30:
    .size   _Z4initP1S, .-_Z4initP1S
    .section    .rodata.str1.8,"aMS",@progbits,1
    .align  3
.LC0:
    .string "main"
    .align  3
.LC1:
    .string "a.cpp"
    .align  3
.LC2:
    .string "%s:%d, %s: totalLen=%d\n"
    .section    .text.startup,"ax",@progbits
    .align  2
    .p2align 3,,7
    .global main
    .type   main, %function
main:
.LFB31:
    .loc 1 37 1 is_stmt 1
    .cfi_startproc
    .loc 1 44 2
    .loc 1 37 1 is_stmt 0
    stp x29, x30, [sp, -48]!
    .cfi_def_cfa_offset 48
    .cfi_offset 29, -48
    .cfi_offset 30, -40
    .loc 1 44 13
    mov x0, 128
    .loc 1 37 1
    mov x29, sp
    stp x19, x20, [sp, 16]
    stp x21, x22, [sp, 32]
    .cfi_offset 19, -32
    .cfi_offset 20, -24
    .cfi_offset 21, -16
    .cfi_offset 22, -8
    .loc 1 44 13
    bl  _Znwm
.LVL2:
    adrp    x5, .LANCHOR0
    mov x19, x0
.LVL3:
    .loc 1 45 2 is_stmt 1
    .loc 1 29 2
.LBB17:
.LBB18:
    .loc 1 29 20
    ldr w0, [x5, #:lo12:.LANCHOR0]
.LVL4:
    mov x2, x19
    sxtw    x1, w0
    add x4, x1, 200
.LVL5:
    .p2align 3,,7
.L7:
    .loc 1 31 3
.LBE18:
.LBE17:
    .loc 1 22 3
    .loc 1 23 3
.LBB20:
.LBB19:
    .loc 1 32 26 is_stmt 0
    add x3, x1, 1
    stp x1, x3, [x2]
    .loc 1 29 2 is_stmt 1
    .loc 1 29 20
    add x1, x1, 2
    cmp x1, x4
    add x2, x2, 64
    bne .L7
    add w0, w0, 200
.LBE19:
.LBE20:
    .loc 1 48 8 is_stmt 0
    adrp    x22, .LC0
    adrp    x21, .LC1
    add x22, x22, :lo12:.LC0
    add x21, x21, :lo12:.LC1
    adrp    x20, .LC2
    add x20, x20, :lo12:.LC2
    mov x3, x22
    mov x1, x21
    str w0, [x5, #:lo12:.LANCHOR0]
.LVL6:
    .loc 1 47 2 is_stmt 1
    .loc 1 48 2
    .loc 1 48 8 is_stmt 0
    mov w4, 0
    mov x0, x20
    mov w2, 48
    bl  printf
.LVL7:
    .loc 1 49 2 is_stmt 1
.LBB21:
    .loc 1 49 20
    mov x0, x19
.LBE21:
    .loc 1 48 8 is_stmt 0
    movi    v6.2s, 0
    mov w3, 0
    ldr x1, [x0], 64
.LVL8:
.L8:
.LBB22:
    .loc 1 51 3 is_stmt 1 discriminator 2
    .loc 1 51 32 is_stmt 0 discriminator 2
    mov x6, x0
    ldp x11, x5, [x0, -56]
    .loc 1 51 39 discriminator 2
    fmov    d2, x1
    .loc 1 51 32 discriminator 2
    ldp x9, x4, [x0, -24]
    add w3, w3, 2
    ldp x10, x2, [x0, -40]
    mov x7, x0
    .loc 1 51 39 discriminator 2
    fmov    d0, x11
    ins v2.d[1], x11
    .loc 1 51 32 discriminator 2
    ldr x1, [x6], 8
    .loc 1 51 39 discriminator 2
    fmov    d1, x9
    ins v0.d[1], x5
    fmov    d5, x5
    ins v1.d[1], x4
    fmov    d7, x10
    .loc 1 51 32 discriminator 2
    ldr x8, [x0, -8]
    .loc 1 51 39 discriminator 2
    fmov    d4, x8
    ins v7.d[1], x2
    ins v5.d[1], x10
    ins v4.d[1], x1
    cmp w3, 24
    xtn v3.2s, v1.2d
    add x0, x0, 64
    xtn v0.2s, v0.2d
    fmov    d1, x2
    xtn v16.2s, v7.2d
    xtn v2.2s, v2.2d
    xtn v7.2s, v4.2d
    mov v0.8b, v0.8b
    mov v3.8b, v3.8b
    ins v1.d[1], x9
    fmov    d4, x4
    mov v2.8b, v2.8b
    xtn v5.2s, v5.2d
    ins v0.d[1], v16.d[0]
    ins v3.d[1], v7.d[0]
    xtn v1.2s, v1.2d
    ins v4.d[1], x8
    ins v2.d[1], v5.d[0]
    xtn v0.4h, v0.4s
    xtn v3.4h, v3.4s
    mov v1.8b, v1.8b
    xtn v4.2s, v4.2d
    xtn v2.4h, v2.4s
    .loc 1 49 2 is_stmt 1 discriminator 2
    .loc 1 49 20 discriminator 2
    .loc 1 51 3 discriminator 2
    .loc 1 51 12 is_stmt 0 discriminator 2
    add v0.4h, v0.4h, v3.4h
    .loc 1 51 39 discriminator 2
    ins v1.d[1], v4.d[0]
    .loc 1 51 12 discriminator 2
    sub v0.4h, v0.4h, v2.4h
    .loc 1 51 39 discriminator 2
    xtn v1.4h, v1.4s
    .loc 1 51 12 discriminator 2
    sub v0.4h, v0.4h, v1.4h
    add v6.4h, v6.4h, v0.4h
    .loc 1 49 2 is_stmt 1 discriminator 2
    .loc 1 49 20 discriminator 2
    bne .L8
    .loc 1 51 3
    .loc 1 49 2
    .loc 1 49 20
.LBE22:
    .loc 1 55 2
.LBB23:
    .loc 1 51 39 is_stmt 0
    ldr q0, [x6]
.LBE23:
    .loc 1 55 8
    mov x3, x22
.LBB24:
    .loc 1 51 39
    ldr q1, [x7]
.LBE24:
    .loc 1 55 8
    mov x1, x21
.LBB25:
    .loc 1 51 39
    ldr q3, [x6, 16]
.LBE25:
    .loc 1 55 8
    mov x0, x20
.LBB26:
    .loc 1 51 39
    ldr q2, [x7, 16]
.LBE26:
    .loc 1 55 8
    mov w2, 55
.LBB27:
    .loc 1 51 39
    xtn v0.2s, v0.2d
    xtn v1.2s, v1.2d
    xtn v3.2s, v3.2d
    xtn v2.2s, v2.2d
    mov v0.8b, v0.8b
    mov v1.8b, v1.8b
    ins v0.d[1], v3.d[0]
    ins v1.d[1], v2.d[0]
    xtn v0.4h, v0.4s
    xtn v1.4h, v1.4s
    sub v0.4h, v0.4h, v1.4h
    .loc 1 51 12
    add v0.4h, v0.4h, v6.4h
    addv    h0, v0.4h
.LBE27:
    .loc 1 55 8
    umov    w4, v0.h[0]
    bl  printf
.LVL9:
    .loc 1 56 2 is_stmt 1
    .loc 1 57 1 is_stmt 0
    mov w0, 0
    ldp x19, x20, [sp, 16]
.LVL10:
    ldp x21, x22, [sp, 32]
    ldp x29, x30, [sp], 48
    .cfi_restore 30
    .cfi_restore 29
    .cfi_restore 21
    .cfi_restore 22
    .cfi_restore 19
    .cfi_restore 20
    .cfi_def_cfa_offset 0
    ret
    .cfi_endproc
.LFE31:
    .size   main, .-main
    .bss
    .align  2
    .set    .LANCHOR0,. + 0
    .type   _ZZ8getValuevE3__n, %object
    .size   _ZZ8getValuevE3__n, 4
_ZZ8getValuevE3__n:
    .zero   4
    .text

ОБНОВЛЕНИЕ 2:

Результат objdump -C -S a.out:

./a.out:     file format elf64-littleaarch64


Disassembly of section .init:

0000000000400508 <_init>:
  400508:   a9bf7bfd    stp x29, x30, [sp,#-16]!
  40050c:   910003fd    mov x29, sp
  400510:   940000a6    bl  4007a8 <call_weak_fn>
  400514:   a8c17bfd    ldp x29, x30, [sp],#16
  400518:   d65f03c0    ret

Disassembly of section .plt:

0000000000400520 <.plt>:
  400520:   a9bf7bf0    stp x16, x30, [sp,#-16]!
  400524:   f00000f0    adrp    x16, 41f000 <__FRAME_END__+0x1e4f0>
  400528:   f947fe11    ldr x17, [x16,#4088]
  40052c:   913fe210    add x16, x16, #0xff8
  400530:   d61f0220    br  x17
  400534:   d503201f    nop
  400538:   d503201f    nop
  40053c:   d503201f    nop

0000000000400540 <__libc_start_main@plt>:
  400540:   90000110    adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400544:   f9400211    ldr x17, [x16]
  400548:   91000210    add x16, x16, #0x0
  40054c:   d61f0220    br  x17

0000000000400550 <operator new(unsigned long)@plt>:
  400550:   90000110    adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400554:   f9400611    ldr x17, [x16,#8]
  400558:   91002210    add x16, x16, #0x8
  40055c:   d61f0220    br  x17

0000000000400560 <abort@plt>:
  400560:   90000110    adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400564:   f9400a11    ldr x17, [x16,#16]
  400568:   91004210    add x16, x16, #0x10
  40056c:   d61f0220    br  x17

0000000000400570 <__gmon_start__@plt>:
  400570:   90000110    adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400574:   f9400e11    ldr x17, [x16,#24]
  400578:   91006210    add x16, x16, #0x18
  40057c:   d61f0220    br  x17

0000000000400580 <printf@plt>:
  400580:   90000110    adrp    x16, 420000 <__libc_start_main@GLIBC_2.17>
  400584:   f9401211    ldr x17, [x16,#32]
  400588:   91008210    add x16, x16, #0x20
  40058c:   d61f0220    br  x17

Disassembly of section .text:

0000000000400590 <main>:
        s->someArray[i].finish = getValue();
    }
}

int main ()
{
  400590:   a9bd7bfd    stp x29, x30, [sp,#-48]!
    S *s = new S;
  400594:   d2900000    mov x0, #0x8000                 // #32768
{
  400598:   910003fd    mov x29, sp
  40059c:   a90153f3    stp x19, x20, [sp,#16]
  4005a0:   a9025bf5    stp x21, x22, [sp,#32]
    S *s = new S;
  4005a4:   97ffffeb    bl  400550 <operator new(unsigned long)@plt>
  4005a8:   90000105    adrp    x5, 420000 <__libc_start_main@GLIBC_2.17>
  4005ac:   aa0003f3    mov x19, x0
    for (int i = 0; i < MaxI; ++i)
  4005b0:   b9403ca0    ldr w0, [x5,#60]
  4005b4:   aa1303e2    mov x2, x19
  4005b8:   93407c01    sxtw    x1, w0
  4005bc:   91032024    add x4, x1, #0xc8
        s->someArray[i].finish = getValue();
  4005c0:   91000423    add x3, x1, #0x1
  4005c4:   a9000c41    stp x1, x3, [x2]
    for (int i = 0; i < MaxI; ++i)
  4005c8:   91000821    add x1, x1, #0x2
  4005cc:   eb04003f    cmp x1, x4
  4005d0:   91010042    add x2, x2, #0x40
  4005d4:   54ffff61    b.ne    4005c0 <main+0x30>
  4005d8:   11032000    add w0, w0, #0xc8
    init(s);

    uint16_t totalLen = 0;
    printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
  4005dc:   90000016    adrp    x22, 400000 <_init-0x508>
  4005e0:   90000015    adrp    x21, 400000 <_init-0x508>
  4005e4:   912562d6    add x22, x22, #0x958
  4005e8:   912582b5    add x21, x21, #0x960
  4005ec:   90000014    adrp    x20, 400000 <_init-0x508>
  4005f0:   9125a294    add x20, x20, #0x968
  4005f4:   aa1603e3    mov x3, x22
  4005f8:   aa1503e1    mov x1, x21
  4005fc:   b9003ca0    str w0, [x5,#60]
  400600:   52800004    mov w4, #0x0                    // #0
  400604:   aa1403e0    mov x0, x20
  400608:   52800542    mov w2, #0x2a                   // #42
  40060c:   97ffffdd    bl  400580 <printf@plt>
    for (int i = 0; i < MaxI; i++)
  400610:   aa1303e0    mov x0, x19
    printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
  400614:   0f000406    movi    v6.2s, #0x0
  400618:   52800003    mov w3, #0x0                    // #0
  40061c:   f8440401    ldr x1, [x0],#64
    {
        totalLen += (s->someArray[i].finish - s->someArray[i].start);
  400620:   aa0003e6    mov x6, x0
  400624:   a97c940b    ldp x11, x5, [x0,#-56]
  400628:   9e670022    fmov    d2, x1
  40062c:   a97e9009    ldp x9, x4, [x0,#-24]
  400630:   11000863    add w3, w3, #0x2
  400634:   a97d880a    ldp x10, x2, [x0,#-40]
  400638:   aa0003e7    mov x7, x0
  40063c:   9e670160    fmov    d0, x11
  400640:   4e181d62    mov v2.d[1], x11
  400644:   f84084c1    ldr x1, [x6],#8
  400648:   9e670121    fmov    d1, x9
  40064c:   4e181ca0    mov v0.d[1], x5
  400650:   9e6700a5    fmov    d5, x5
  400654:   4e181c81    mov v1.d[1], x4
  400658:   9e670147    fmov    d7, x10
  40065c:   f85f8008    ldur    x8, [x0,#-8]
  400660:   9e670104    fmov    d4, x8
  400664:   4e181c47    mov v7.d[1], x2
  400668:   4e181d45    mov v5.d[1], x10
  40066c:   4e181c24    mov v4.d[1], x1
  400670:   7100607f    cmp w3, #0x18
  400674:   0ea12823    xtn v3.2s, v1.2d
  400678:   91010000    add x0, x0, #0x40
  40067c:   0ea12800    xtn v0.2s, v0.2d
  400680:   9e670041    fmov    d1, x2
  400684:   0ea128f0    xtn v16.2s, v7.2d
  400688:   0ea12842    xtn v2.2s, v2.2d
  40068c:   0ea12887    xtn v7.2s, v4.2d
  400690:   0ea01c00    mov v0.8b, v0.8b
  400694:   0ea31c63    mov v3.8b, v3.8b
  400698:   4e181d21    mov v1.d[1], x9
  40069c:   9e670084    fmov    d4, x4
  4006a0:   0ea21c42    mov v2.8b, v2.8b
  4006a4:   0ea128a5    xtn v5.2s, v5.2d
  4006a8:   6e180600    mov v0.d[1], v16.d[0]
  4006ac:   6e1804e3    mov v3.d[1], v7.d[0]
  4006b0:   0ea12821    xtn v1.2s, v1.2d
  4006b4:   4e181d04    mov v4.d[1], x8
  4006b8:   6e1804a2    mov v2.d[1], v5.d[0]
  4006bc:   0e612800    xtn v0.4h, v0.4s
  4006c0:   0e612863    xtn v3.4h, v3.4s
  4006c4:   0ea11c21    mov v1.8b, v1.8b
  4006c8:   0ea12884    xtn v4.2s, v4.2d
  4006cc:   0e612842    xtn v2.4h, v2.4s
  4006d0:   0e638400    add v0.4h, v0.4h, v3.4h
  4006d4:   6e180481    mov v1.d[1], v4.d[0]
  4006d8:   2e628400    sub v0.4h, v0.4h, v2.4h
  4006dc:   0e612821    xtn v1.4h, v1.4s
  4006e0:   2e618400    sub v0.4h, v0.4h, v1.4h
  4006e4:   0e6084c6    add v6.4h, v6.4h, v0.4h
    for (int i = 0; i < MaxI; i++)
  4006e8:   54fff9c1    b.ne    400620 <main+0x90>
        totalLen += (s->someArray[i].finish - s->someArray[i].start);
  4006ec:   3dc000c0    ldr q0, [x6]
    }

    printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
  4006f0:   aa1603e3    mov x3, x22
        totalLen += (s->someArray[i].finish - s->someArray[i].start);
  4006f4:   3dc000e1    ldr q1, [x7]
    printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
  4006f8:   aa1503e1    mov x1, x21
        totalLen += (s->someArray[i].finish - s->someArray[i].start);
  4006fc:   3dc004c3    ldr q3, [x6,#16]
    printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
  400700:   aa1403e0    mov x0, x20
        totalLen += (s->someArray[i].finish - s->someArray[i].start);
  400704:   3dc004e2    ldr q2, [x7,#16]
    printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
  400708:   52800602    mov w2, #0x30                   // #48
        totalLen += (s->someArray[i].finish - s->someArray[i].start);
  40070c:   0ea12800    xtn v0.2s, v0.2d
  400710:   0ea12821    xtn v1.2s, v1.2d
  400714:   0ea12863    xtn v3.2s, v3.2d
  400718:   0ea12842    xtn v2.2s, v2.2d
  40071c:   0ea01c00    mov v0.8b, v0.8b
  400720:   0ea11c21    mov v1.8b, v1.8b
  400724:   6e180460    mov v0.d[1], v3.d[0]
  400728:   6e180441    mov v1.d[1], v2.d[0]
  40072c:   0e612800    xtn v0.4h, v0.4s
  400730:   0e612821    xtn v1.4h, v1.4s
  400734:   2e618400    sub v0.4h, v0.4h, v1.4h
  400738:   0e668400    add v0.4h, v0.4h, v6.4h
  40073c:   0e71b800    addv    h0, v0.4h
    printf("%s:%d, %s: totalLen=%d\n", __FILE__, __LINE__, __FUNCTION__, (int)totalLen);
  400740:   0e023c04    umov    w4, v0.h[0]
  400744:   97ffff8f    bl  400580 <printf@plt>
    return 0;
}
  400748:   52800000    mov w0, #0x0                    // #0
  40074c:   a94153f3    ldp x19, x20, [sp,#16]
  400750:   a9425bf5    ldp x21, x22, [sp,#32]
  400754:   a8c37bfd    ldp x29, x30, [sp],#48
  400758:   d65f03c0    ret
  40075c:   00000000    .inst   0x00000000 ; undefined

0000000000400760 <_start>:
  400760:   d280001d    mov x29, #0x0                       // #0
  400764:   d280001e    mov x30, #0x0                       // #0
  400768:   910003fd    mov x29, sp
  40076c:   aa0003e5    mov x5, x0
  400770:   f94003e1    ldr x1, [sp]
  400774:   910023e2    add x2, sp, #0x8
  400778:   910003e6    mov x6, sp
  40077c:   580000a0    ldr x0, 400790 <_start+0x30>
  400780:   580000c3    ldr x3, 400798 <_start+0x38>
  400784:   580000e4    ldr x4, 4007a0 <_start+0x40>
  400788:   97ffff6e    bl  400540 <__libc_start_main@plt>
  40078c:   97ffff75    bl  400560 <abort@plt>
  400790:   00400590    .word   0x00400590
  400794:   00000000    .word   0x00000000
  400798:   004008b4    .word   0x004008b4
  40079c:   00000000    .word   0x00000000
  4007a0:   0040092c    .word   0x0040092c
  4007a4:   00000000    .word   0x00000000

00000000004007a8 <call_weak_fn>:
  4007a8:   f00000e0    adrp    x0, 41f000 <__FRAME_END__+0x1e4f0>
  4007ac:   f947f000    ldr x0, [x0,#4064]
  4007b0:   b4000040    cbz x0, 4007b8 <call_weak_fn+0x10>
  4007b4:   17ffff6f    b   400570 <__gmon_start__@plt>
  4007b8:   d65f03c0    ret
  4007bc:   00000000    .inst   0x00000000 ; undefined

00000000004007c0 <deregister_tm_clones>:
  4007c0:   90000100    adrp    x0, 420000 <__libc_start_main@GLIBC_2.17>
  4007c4:   9100e000    add x0, x0, #0x38
  4007c8:   90000101    adrp    x1, 420000 <__libc_start_main@GLIBC_2.17>
  4007cc:   9100e021    add x1, x1, #0x38
  4007d0:   eb00003f    cmp x1, x0
  4007d4:   540000c0    b.eq    4007ec <deregister_tm_clones+0x2c>
  4007d8:   90000001    adrp    x1, 400000 <_init-0x508>
  4007dc:   f944a421    ldr x1, [x1,#2376]
  4007e0:   b4000061    cbz x1, 4007ec <deregister_tm_clones+0x2c>
  4007e4:   aa0103f0    mov x16, x1
  4007e8:   d61f0200    br  x16
  4007ec:   d65f03c0    ret

00000000004007f0 <register_tm_clones>:
  4007f0:   90000100    adrp    x0, 420000 <__libc_start_main@GLIBC_2.17>
  4007f4:   9100e000    add x0, x0, #0x38
  4007f8:   90000101    adrp    x1, 420000 <__libc_start_main@GLIBC_2.17>
  4007fc:   9100e021    add x1, x1, #0x38
  400800:   cb000021    sub x1, x1, x0
  400804:   d37ffc22    lsr x2, x1, #63
  400808:   8b810c41    add x1, x2, x1, asr #3
  40080c:   eb8107ff    negs    xzr, x1, asr #1
  400810:   9341fc21    asr x1, x1, #1
  400814:   540000c0    b.eq    40082c <register_tm_clones+0x3c>
  400818:   90000002    adrp    x2, 400000 <_init-0x508>
  40081c:   f944a842    ldr x2, [x2,#2384]
  400820:   b4000062    cbz x2, 40082c <register_tm_clones+0x3c>
  400824:   aa0203f0    mov x16, x2
  400828:   d61f0200    br  x16
  40082c:   d65f03c0    ret

0000000000400830 <__do_global_dtors_aux>:
  400830:   a9be7bfd    stp x29, x30, [sp,#-32]!
  400834:   910003fd    mov x29, sp
  400838:   f9000bf3    str x19, [sp,#16]
  40083c:   90000113    adrp    x19, 420000 <__libc_start_main@GLIBC_2.17>
  400840:   3940e260    ldrb    w0, [x19,#56]
  400844:   35000080    cbnz    w0, 400854 <__do_global_dtors_aux+0x24>
  400848:   97ffffde    bl  4007c0 <deregister_tm_clones>
  40084c:   52800020    mov w0, #0x1                    // #1
  400850:   3900e260    strb    w0, [x19,#56]
  400854:   f9400bf3    ldr x19, [sp,#16]
  400858:   a8c27bfd    ldp x29, x30, [sp],#32
  40085c:   d65f03c0    ret

0000000000400860 <frame_dummy>:
  400860:   17ffffe4    b   4007f0 <register_tm_clones>
  400864:   00000000    .inst   0x00000000 ; undefined

0000000000400868 <getValue()>:
  return n++;
  400868:   90000101    adrp    x1, 420000 <__libc_start_main@GLIBC_2.17>
  40086c:   b9403c20    ldr w0, [x1,#60]
  400870:   11000402    add w2, w0, #0x1
  400874:   b9003c22    str w2, [x1,#60]
}
  400878:   d65f03c0    ret
  40087c:   d503201f    nop

0000000000400880 <init(S*)>:
    for (int i = 0; i < MaxI; ++i)
  400880:   90000105    adrp    x5, 420000 <__libc_start_main@GLIBC_2.17>
  400884:   b9403ca4    ldr w4, [x5,#60]
  400888:   93407c81    sxtw    x1, w4
  40088c:   91032023    add x3, x1, #0xc8
        s->someArray[i].finish = getValue();
  400890:   91000422    add x2, x1, #0x1
  400894:   a9000801    stp x1, x2, [x0]
    for (int i = 0; i < MaxI; ++i)
  400898:   91000821    add x1, x1, #0x2
  40089c:   eb03003f    cmp x1, x3
  4008a0:   91010000    add x0, x0, #0x40
  4008a4:   54ffff61    b.ne    400890 <init(S*)+0x10>
  4008a8:   11032084    add w4, w4, #0xc8
  4008ac:   b9003ca4    str w4, [x5,#60]
}
  4008b0:   d65f03c0    ret

00000000004008b4 <__libc_csu_init>:
  4008b4:   a9bc7bfd    stp x29, x30, [sp,#-64]!
  4008b8:   910003fd    mov x29, sp
  4008bc:   a90153f3    stp x19, x20, [sp,#16]
  4008c0:   a90363f7    stp x23, x24, [sp,#48]
  4008c4:   f00000f4    adrp    x20, 41f000 <__FRAME_END__+0x1e4f0>
  4008c8:   f00000f8    adrp    x24, 41f000 <__FRAME_END__+0x1e4f0>
  4008cc:   91372318    add x24, x24, #0xdc8
  4008d0:   91374294    add x20, x20, #0xdd0
  4008d4:   cb180294    sub x20, x20, x24
  4008d8:   9343fe94    asr x20, x20, #3
  4008dc:   a9025bf5    stp x21, x22, [sp,#32]
  4008e0:   2a0003f7    mov w23, w0
  4008e4:   aa0103f6    mov x22, x1
  4008e8:   aa0203f5    mov x21, x2
  4008ec:   d2800013    mov x19, #0x0                       // #0
  4008f0:   97ffff06    bl  400508 <_init>
  4008f4:   b4000134    cbz x20, 400918 <__libc_csu_init+0x64>
  4008f8:   f8737b03    ldr x3, [x24,x19,lsl #3]
  4008fc:   2a1703e0    mov w0, w23
  400900:   aa1603e1    mov x1, x22
  400904:   aa1503e2    mov x2, x21
  400908:   d63f0060    blr x3
  40090c:   91000673    add x19, x19, #0x1
  400910:   eb14027f    cmp x19, x20
  400914:   54ffff21    b.ne    4008f8 <__libc_csu_init+0x44>
  400918:   a94153f3    ldp x19, x20, [sp,#16]
  40091c:   a9425bf5    ldp x21, x22, [sp,#32]
  400920:   a94363f7    ldp x23, x24, [sp,#48]
  400924:   a8c47bfd    ldp x29, x30, [sp],#64
  400928:   d65f03c0    ret

000000000040092c <__libc_csu_fini>:
  40092c:   d65f03c0    ret

Disassembly of section .fini:

0000000000400930 <_fini>:
  400930:   a9bf7bfd    stp x29, x30, [sp,#-16]!
  400934:   910003fd    mov x29, sp
  400938:   a8c17bfd    ldp x29, x30, [sp],#16
  40093c:   d65f03c0    ret
...