Существует простая программа, которая перебирает массив структур и вычисляет сумму разности между ее членами. Программа скомпилирована для 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