From 275e9013a87e1b80f175da642a93768802c39f44 Mon Sep 17 00:00:00 2001 From: Perry Kivolowitz Date: Tue, 28 Feb 2023 20:48:44 -0600 Subject: [PATCH] beginning section on atomics --- .vscode/settings.json | 3 +- section_1/atomics/README.md | 129 +++ section_1/atomics/battle_pug.jpeg | Bin 0 -> 44188 bytes section_1/atomics/highlevel.cpp | 73 ++ section_1/atomics/highlevel.s | 1469 +++++++++++++++++++++++++++++ 5 files changed, 1673 insertions(+), 1 deletion(-) create mode 100644 section_1/atomics/README.md create mode 100644 section_1/atomics/battle_pug.jpeg create mode 100644 section_1/atomics/highlevel.cpp create mode 100644 section_1/atomics/highlevel.s diff --git a/.vscode/settings.json b/.vscode/settings.json index ac04ab5..e0d37d4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -75,6 +75,7 @@ ], "files.associations": { "ostream": "cpp", - "iomanip": "cpp" + "iomanip": "cpp", + "atomic": "cpp" } } \ No newline at end of file diff --git a/section_1/atomics/README.md b/section_1/atomics/README.md new file mode 100644 index 0000000..cab1c43 --- /dev/null +++ b/section_1/atomics/README.md @@ -0,0 +1,129 @@ +# Section 1 / Atomics + +![Gurney Hallek](./battle_pug.jpeg) + +## Threads + +Suppose you run two copies of the same program at the same time. They +both have a variable named `i`. Can a change to `i` made by one copy of +the program impact the value of `i` in the other running copy of the +program? Of course not. + +Think of running two copies of a program at the same time as having +two identical, but distinct, homes. What happens inside one house does +not impact what happens inside the house next door. + +Threads are a different way of getting more than one "copy" of a program +to run at the same time. Threads are different, however, in that they +all live within the same household. All of the housemates share the +living space and all housemates have access to any global or shared +resource. This makes for great gains in performance for a broad class +of problems but also introduces great hazards. + +Suppose you buy a carton of milk and place it in the fridge. If you were +the only member of the household you would expect that when we next went +to the fridge your milk would still be there, right? If you share the +household with other people, this might not be the case. + +Consider the following program: + +```c++ +#include // 1 +#include // 2 +#include // 3 +#include // 4 + // 5 +using std::cout; // 6 +using std::endl; // 7 +using std::atomic; // 8 +using std::vector; // 9 +using std::thread; // 10 + // 11 +const uint32_t MAX_LOOPS = 10000; // 12 +const uint32_t NUM_THREADS = 16; // 13 + // 14 +/* volatile is necessary if any use of the optimizer // 15 + is to be made. // 16 +*/ // 17 +volatile uint32_t naked_int = 0; // 18 +atomic atomic_integer(0); // 19 + // 20 +void NakedWorker() { // 21 + extern volatile uint32_t naked_int; // 22 + // 23 + for (uint32_t i = 0; i < MAX_LOOPS; i++) { // 24 + naked_int++; // 25 + } // 26 +} // 27 + // 28 +void AtomicWorker() { // 29 + extern atomic atomic_integer; // 30 + // 31 + for (uint32_t i = 0; i < MAX_LOOPS; i++) { // 32 + atomic_integer++; // 33 + } // 34 +} // 35 + // 36 +void DoNaked() { // 37 + vector threads; // 38 + // 39 + for (uint32_t i = 0; i < NUM_THREADS; i++) { // 40 + threads.push_back(new thread(NakedWorker)); // 41 + } // 42 + // 43 + for (auto &t : threads) { // 44 + t->join(); // 45 + } // 46 +} // 47 + // 48 +void DoAtomic() { // 49 + vector threads; // 50 + // 51 + for (uint32_t i = 0; i < NUM_THREADS; i++) { // 52 + threads.push_back(new thread(AtomicWorker)); // 53 + } // 54 + // 55 + for (auto &t : threads) { // 56 + t->join(); // 57 + } // 58 +} // 59 + // 60 +int main() { // 61 + // 62 + DoNaked(); // 63 + DoAtomic(); // 64 + // 65 + cout << "Correct sum is: "; // 66 + cout << NUM_THREADS * MAX_LOOPS << endl; // 67 + cout << "Naked sum: " << naked_int << endl; // 68 + cout << "Atomic sum: " << atomic_integer << endl; // 69 + // 70 + return 0; // 71 +} // 72 +perrykivolowitz@DAEDALUS atomics % +``` + +This program will spawn 16 threads which will each loop 10,000 times, +adding one to a zero-initialized integer each loop. At the end, when all +the threads complete, the integer should have the value 160,000. + +Alas, this is an example of the class "Hidden Update" bug. The shared +resource, the integer, will get clobbered in unpredictable ways. + +For example, multiple runs might produce: + +- Naked sum: 74291 +- Naked sum: 79390 +- Naked sum: 89115 +- etc + +## Serializing Access to Integer Types + +C++11 introduced the notion of *atomic integers*. These do not glow. +Rather, access to them is guaranteed to be atomic... as in, cannot be +broken down. The hidden update problem's root cause is that adding +(for example) to a value in memory involves three instructions at the +assembly language level. A load, an addition, and a store. The hidden +update occurs when a thread is yanked from the CPU in the middle of +these instructions. When the thread returns to the CPU, the store +causes old data to overwrite (hide) correct data. diff --git a/section_1/atomics/battle_pug.jpeg b/section_1/atomics/battle_pug.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..fe3f9bf3db26236d67434a25c9fb9abc946634c4 GIT binary patch literal 44188 zcmb5VWmFtb*gc2^cNyH>83xxNgS&gs!69gZCBfa@-Q7J2ZiBmqpo0dt09k(T|J^;i zANSU`t~!1C^r?I6_I;lIxAJcr4p&J|Q4S6s9u7|7ZNU9ohm(Or`X8VmA)%n7prD{* zp}zqO7wbRZ65{?32>%x({{xEuK>h#Vznj3nd-o0%1r-|w1)Bzd51{$~jeq@cc&PAs z2)&5#bZ`iG@Q8Tu{|4d6;ouMu;s1Nw{~L%%@Cfga;ZWWtN#WuCzjJVK@Cb-V@BXd9 zVIsoAA>bn7zFpbp>-_8P-5N1ENa8Twm_b7svcy)D262*2s$M_hx#il$qfu-xsvGDr z``Y|C+#|(Pu4c5v6*L`@TViD)#!E+RhpHv>-mQd0zi7*9!jzNZAiU|zC)2~K16s@{ zY<>G#{|KW_Zw=c5-;j&YubLs0ry(RbftL|QSY>h+_@r9;&^JRgjoCcBd0Gv;xCV2Xbh0Zt^Bh?Kl{Xb7wRC=}R~&_W!vU}rf5t@k zE}U?MN5#3m1f6{lP<+!&G3rG$3VU=GE;<305t(-2C;p~MC(4lK{z$9G5K8fW{A0>| z(TIZK&E#{R;H+u|Y;JyJHI}TwWnxSI2ciGH2cnu`A&jVy7P04nu33qbD4{S^gKtRs zwxd6$-lV1tDfS;63+^Ys)L&G~&FkTLt@aCim;;k7<=u67vbF&6e1ej+@uj%t2A&M3k&eRxWYK!IgYsH&U z`wcP3X2mtQ!r5CgkTSl<``9v4K5$z!TZ1bX>*PRb=;a>QVyaEETX_6{ooIJ3Epn!u zFY+Wm*?Jg^Y(`uPBW$f2%?Rm*U9);l(NrlZw^mx7IYPUV+9?Oe$6yRw4W|cRdh8gy z5}`xW%R@^@Qt>Lez49d_y6n1@{?uSR<;m}(cPQ=qyNN7KF@Npgd_2o-;#0H0j~BeYRhyb_W@F9U_noGOE>sQ z9Bn1=V)N>nQPACU0(RHg+o?T$xAFe^qMZkg&@i_-5s)g8krr+I-W#(uF>DjLh>SPn z$2Y2ht$}G1CT58RL(DU)Bf!p+hd!2)!fzM(>1*iMifev~N{siU_7x|*-YMz1*k!

2v+mD1*!r|4GVXHK;n#zV`Y@q5o^+f%Te*n~l2k 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%0A(MMkK5z6l`rG-9+y{Bi>tq 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 literal 0 HcmV?d00001 diff --git a/section_1/atomics/highlevel.cpp b/section_1/atomics/highlevel.cpp new file mode 100644 index 0000000..e35fae9 --- /dev/null +++ b/section_1/atomics/highlevel.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include + +using std::cout; +using std::endl; +using std::atomic; +using std::vector; +using std::thread; + +const uint32_t MAX_LOOPS = 10000; +const uint32_t NUM_THREADS = 16; + +/* volatile is necessary if any use of the optimizer + is to be made. +*/ +volatile uint32_t naked_int = 0; +atomic atomic_integer(0); + +void NakedWorker() { + extern volatile uint32_t naked_int; + + for (uint32_t i = 0; i < MAX_LOOPS; i++) { + naked_int++; + } +} + +void AtomicWorker() { + extern atomic atomic_integer; + + for (uint32_t i = 0; i < MAX_LOOPS; i++) { + atomic_integer++; + atomic_integer = atomic_integer * 30; + } +} + +void DoNaked() { + vector threads; + + for (uint32_t i = 0; i < NUM_THREADS; i++) { + threads.push_back(new thread(NakedWorker)); + } + + for (auto &t : threads) { + t->join(); + } +} + +void DoAtomic() { + vector threads; + + for (uint32_t i = 0; i < NUM_THREADS; i++) { + threads.push_back(new thread(AtomicWorker)); + } + + for (auto &t : threads) { + t->join(); + } +} + +int main() { + + DoNaked(); + DoAtomic(); + + cout << "Correct sum is: "; + cout << NUM_THREADS * MAX_LOOPS << endl; + cout << "Naked sum: " << naked_int << endl; + cout << "Atomic sum: " << atomic_integer << endl; + + return 0; +} diff --git a/section_1/atomics/highlevel.s b/section_1/atomics/highlevel.s new file mode 100644 index 0000000..146b5db --- /dev/null +++ b/section_1/atomics/highlevel.s @@ -0,0 +1,1469 @@ + .section __TEXT,__text,regular,pure_instructions + .build_version macos, 13, 0 sdk_version 13, 1 + .globl __Z11NakedWorkerv ; -- Begin function _Z11NakedWorkerv + .p2align 2 +__Z11NakedWorkerv: ; @_Z11NakedWorkerv + .cfi_startproc +; %bb.0: + mov w8, #10000 + adrp x9, _naked_int@PAGE +LBB0_1: ; =>This Inner Loop Header: Depth=1 + ldr w10, [x9, _naked_int@PAGEOFF] + add w10, w10, #1 + str w10, [x9, _naked_int@PAGEOFF] + subs w8, w8, #1 + b.ne LBB0_1 +; %bb.2: + ret + .cfi_endproc + ; -- End function + .globl __Z12AtomicWorkerv ; -- Begin function _Z12AtomicWorkerv + .p2align 2 +__Z12AtomicWorkerv: ; @_Z12AtomicWorkerv + .cfi_startproc +; %bb.0: + mov w8, #10000 + mov w9, #1 + mov w10, #30 +Lloh0: + adrp x11, _atomic_integer@PAGE +Lloh1: + add x11, x11, _atomic_integer@PAGEOFF +LBB1_1: ; =>This Inner Loop Header: Depth=1 + ldaddal w9, w12, [x11] + ldar w12, [x11] + mul w12, w12, w10 + stlr w12, [x11] + subs w8, w8, #1 + b.ne LBB1_1 +; %bb.2: + ret + .loh AdrpAdd Lloh0, Lloh1 + .cfi_endproc + ; -- End function + .globl __Z7DoNakedv ; -- Begin function _Z7DoNakedv + .p2align 2 +__Z7DoNakedv: ; @_Z7DoNakedv +Lfunc_begin0: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception0 +; %bb.0: + sub sp, sp, #128 + stp x28, x27, [sp, #32] ; 16-byte Folded Spill + stp x26, x25, [sp, #48] ; 16-byte Folded Spill + stp x24, x23, [sp, #64] ; 16-byte Folded Spill + stp x22, x21, [sp, #80] ; 16-byte Folded Spill + stp x20, x19, [sp, #96] ; 16-byte Folded Spill + stp x29, x30, [sp, #112] ; 16-byte Folded Spill + add x29, sp, #112 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + .cfi_offset w21, -40 + .cfi_offset w22, -48 + .cfi_offset w23, -56 + .cfi_offset w24, -64 + .cfi_offset w25, -72 + .cfi_offset w26, -80 + .cfi_offset w27, -88 + .cfi_offset w28, -96 + mov x27, #0 + stp xzr, xzr, [sp, #8] + mov w24, #16 + mov x25, #1152921504606846975 +Lloh2: + adrp x19, __Z11NakedWorkerv@PAGE +Lloh3: + add x19, x19, __Z11NakedWorkerv@PAGEOFF + str xzr, [sp, #24] + mov x26, #2305843009213693951 + b LBB2_3 +LBB2_1: ; in Loop: Header=BB2_3 Depth=1 + str x20, [x27], #8 + str x27, [sp, #16] +LBB2_2: ; in Loop: Header=BB2_3 Depth=1 + subs w24, w24, #1 + b.eq LBB2_15 +LBB2_3: ; =>This Inner Loop Header: Depth=1 +Ltmp0: + mov w0, #8 + bl __Znwm +Ltmp1: +; %bb.4: ; in Loop: Header=BB2_3 Depth=1 + mov x20, x0 +Ltmp2: + mov x1, x19 + bl __ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_ +Ltmp3: +; %bb.5: ; in Loop: Header=BB2_3 Depth=1 + ldr x8, [sp, #24] + cmp x27, x8 + b.lo LBB2_1 +; %bb.6: ; in Loop: Header=BB2_3 Depth=1 + ldr x21, [sp, #8] + sub x22, x27, x21 + asr x27, x22, #3 + add x9, x27, #1 + lsr x10, x9, #61 + cbnz x10, LBB2_22 +; %bb.7: ; in Loop: Header=BB2_3 Depth=1 + sub x8, x8, x21 + asr x10, x8, #2 + cmp x10, x9 + csel x9, x9, x10, lo + cmp x25, x8, asr #3 + csel x28, x9, x26, hi + cbz x28, LBB2_14 +; %bb.8: ; in Loop: Header=BB2_3 Depth=1 + lsr x8, x28, #61 + cbnz x8, LBB2_23 +; %bb.9: ; in Loop: Header=BB2_3 Depth=1 + lsl x0, x28, #3 +Ltmp5: + bl __Znwm +Ltmp6: +; %bb.10: ; in Loop: Header=BB2_3 Depth=1 + mov x23, x0 + add x27, x23, x27, lsl #3 + str x20, [x27], #8 + cmp x22, #1 + b.lt LBB2_12 +LBB2_11: ; in Loop: Header=BB2_3 Depth=1 + mov x0, x23 + mov x1, x21 + mov x2, x22 + bl _memcpy +LBB2_12: ; in Loop: Header=BB2_3 Depth=1 + add x8, x23, x28, lsl #3 + stp x23, x27, [sp, #8] + str x8, [sp, #24] + cbz x21, LBB2_2 +; %bb.13: ; in Loop: Header=BB2_3 Depth=1 + mov x0, x21 + bl __ZdlPv + b LBB2_2 +LBB2_14: ; in Loop: Header=BB2_3 Depth=1 + mov x23, #0 + add x27, x23, x27, lsl #3 + str x20, [x27], #8 + cmp x22, #1 + b.ge LBB2_11 + b LBB2_12 +LBB2_15: + ldr x19, [sp, #8] + cmp x19, x27 + b.eq LBB2_19 +; %bb.16: + mov x20, x19 +LBB2_17: ; =>This Inner Loop Header: Depth=1 + ldr x0, [x20] +Ltmp13: + bl __ZNSt3__16thread4joinEv +Ltmp14: +; %bb.18: ; in Loop: Header=BB2_17 Depth=1 + add x20, x20, #8 + cmp x20, x27 + b.ne LBB2_17 +LBB2_19: + cbz x19, LBB2_21 +; %bb.20: + mov x0, x19 + ldp x29, x30, [sp, #112] ; 16-byte Folded Reload + ldp x20, x19, [sp, #96] ; 16-byte Folded Reload + ldp x22, x21, [sp, #80] ; 16-byte Folded Reload + ldp x24, x23, [sp, #64] ; 16-byte Folded Reload + ldp x26, x25, [sp, #48] ; 16-byte Folded Reload + ldp x28, x27, [sp, #32] ; 16-byte Folded Reload + add sp, sp, #128 + b __ZdlPv +LBB2_21: + ldp x29, x30, [sp, #112] ; 16-byte Folded Reload + ldp x20, x19, [sp, #96] ; 16-byte Folded Reload + ldp x22, x21, [sp, #80] ; 16-byte Folded Reload + ldp x24, x23, [sp, #64] ; 16-byte Folded Reload + ldp x26, x25, [sp, #48] ; 16-byte Folded Reload + ldp x28, x27, [sp, #32] ; 16-byte Folded Reload + add sp, sp, #128 + ret +LBB2_22: +Ltmp10: + add x0, sp, #8 + bl __ZNKSt3__113__vector_baseIPNS_6threadENS_9allocatorIS2_EEE20__throw_length_errorEv +Ltmp11: + b LBB2_24 +LBB2_23: +Ltmp8: + bl __ZNSt3__1L20__throw_length_errorEPKc +Ltmp9: +LBB2_24: + brk #0x1 +LBB2_25: +Ltmp15: + b LBB2_29 +LBB2_26: +Ltmp12: + b LBB2_29 +LBB2_27: +Ltmp4: + mov x19, x0 + mov x0, x20 + bl __ZdlPv + b LBB2_30 +LBB2_28: +Ltmp7: +LBB2_29: + mov x19, x0 +LBB2_30: + ldr x0, [sp, #8] + cbz x0, LBB2_32 +; %bb.31: + str x0, [sp, #16] + bl __ZdlPv +LBB2_32: + mov x0, x19 + bl __Unwind_Resume + .loh AdrpAdd Lloh2, Lloh3 +Lfunc_end0: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table2: +Lexception0: + .byte 255 ; @LPStart Encoding = omit + .byte 255 ; @TType Encoding = omit + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end0-Lcst_begin0 +Lcst_begin0: + .uleb128 Ltmp0-Lfunc_begin0 ; >> Call Site 1 << + .uleb128 Ltmp1-Ltmp0 ; Call between Ltmp0 and Ltmp1 + .uleb128 Ltmp7-Lfunc_begin0 ; jumps to Ltmp7 + .byte 0 ; On action: cleanup + .uleb128 Ltmp2-Lfunc_begin0 ; >> Call Site 2 << + .uleb128 Ltmp3-Ltmp2 ; Call between Ltmp2 and Ltmp3 + .uleb128 Ltmp4-Lfunc_begin0 ; jumps to Ltmp4 + .byte 0 ; On action: cleanup + .uleb128 Ltmp5-Lfunc_begin0 ; >> Call Site 3 << + .uleb128 Ltmp6-Ltmp5 ; Call between Ltmp5 and Ltmp6 + .uleb128 Ltmp7-Lfunc_begin0 ; jumps to Ltmp7 + .byte 0 ; On action: cleanup + .uleb128 Ltmp6-Lfunc_begin0 ; >> Call Site 4 << + .uleb128 Ltmp13-Ltmp6 ; Call between Ltmp6 and Ltmp13 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp13-Lfunc_begin0 ; >> Call Site 5 << + .uleb128 Ltmp14-Ltmp13 ; Call between Ltmp13 and Ltmp14 + .uleb128 Ltmp15-Lfunc_begin0 ; jumps to Ltmp15 + .byte 0 ; On action: cleanup + .uleb128 Ltmp10-Lfunc_begin0 ; >> Call Site 6 << + .uleb128 Ltmp9-Ltmp10 ; Call between Ltmp10 and Ltmp9 + .uleb128 Ltmp12-Lfunc_begin0 ; jumps to Ltmp12 + .byte 0 ; On action: cleanup + .uleb128 Ltmp9-Lfunc_begin0 ; >> Call Site 7 << + .uleb128 Lfunc_end0-Ltmp9 ; Call between Ltmp9 and Lfunc_end0 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end0: + .p2align 2 + ; -- End function + .section __TEXT,__text,regular,pure_instructions + .globl __Z8DoAtomicv ; -- Begin function _Z8DoAtomicv + .p2align 2 +__Z8DoAtomicv: ; @_Z8DoAtomicv +Lfunc_begin1: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception1 +; %bb.0: + sub sp, sp, #128 + stp x28, x27, [sp, #32] ; 16-byte Folded Spill + stp x26, x25, [sp, #48] ; 16-byte Folded Spill + stp x24, x23, [sp, #64] ; 16-byte Folded Spill + stp x22, x21, [sp, #80] ; 16-byte Folded Spill + stp x20, x19, [sp, #96] ; 16-byte Folded Spill + stp x29, x30, [sp, #112] ; 16-byte Folded Spill + add x29, sp, #112 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + .cfi_offset w21, -40 + .cfi_offset w22, -48 + .cfi_offset w23, -56 + .cfi_offset w24, -64 + .cfi_offset w25, -72 + .cfi_offset w26, -80 + .cfi_offset w27, -88 + .cfi_offset w28, -96 + mov x27, #0 + stp xzr, xzr, [sp, #8] + mov w24, #16 + mov x25, #1152921504606846975 +Lloh4: + adrp x19, __Z12AtomicWorkerv@PAGE +Lloh5: + add x19, x19, __Z12AtomicWorkerv@PAGEOFF + str xzr, [sp, #24] + mov x26, #2305843009213693951 + b LBB3_3 +LBB3_1: ; in Loop: Header=BB3_3 Depth=1 + str x20, [x27], #8 + str x27, [sp, #16] +LBB3_2: ; in Loop: Header=BB3_3 Depth=1 + subs w24, w24, #1 + b.eq LBB3_15 +LBB3_3: ; =>This Inner Loop Header: Depth=1 +Ltmp16: + mov w0, #8 + bl __Znwm +Ltmp17: +; %bb.4: ; in Loop: Header=BB3_3 Depth=1 + mov x20, x0 +Ltmp18: + mov x1, x19 + bl __ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_ +Ltmp19: +; %bb.5: ; in Loop: Header=BB3_3 Depth=1 + ldr x8, [sp, #24] + cmp x27, x8 + b.lo LBB3_1 +; %bb.6: ; in Loop: Header=BB3_3 Depth=1 + ldr x21, [sp, #8] + sub x22, x27, x21 + asr x27, x22, #3 + add x9, x27, #1 + lsr x10, x9, #61 + cbnz x10, LBB3_22 +; %bb.7: ; in Loop: Header=BB3_3 Depth=1 + sub x8, x8, x21 + asr x10, x8, #2 + cmp x10, x9 + csel x9, x9, x10, lo + cmp x25, x8, asr #3 + csel x28, x9, x26, hi + cbz x28, LBB3_14 +; %bb.8: ; in Loop: Header=BB3_3 Depth=1 + lsr x8, x28, #61 + cbnz x8, LBB3_23 +; %bb.9: ; in Loop: Header=BB3_3 Depth=1 + lsl x0, x28, #3 +Ltmp21: + bl __Znwm +Ltmp22: +; %bb.10: ; in Loop: Header=BB3_3 Depth=1 + mov x23, x0 + add x27, x23, x27, lsl #3 + str x20, [x27], #8 + cmp x22, #1 + b.lt LBB3_12 +LBB3_11: ; in Loop: Header=BB3_3 Depth=1 + mov x0, x23 + mov x1, x21 + mov x2, x22 + bl _memcpy +LBB3_12: ; in Loop: Header=BB3_3 Depth=1 + add x8, x23, x28, lsl #3 + stp x23, x27, [sp, #8] + str x8, [sp, #24] + cbz x21, LBB3_2 +; %bb.13: ; in Loop: Header=BB3_3 Depth=1 + mov x0, x21 + bl __ZdlPv + b LBB3_2 +LBB3_14: ; in Loop: Header=BB3_3 Depth=1 + mov x23, #0 + add x27, x23, x27, lsl #3 + str x20, [x27], #8 + cmp x22, #1 + b.ge LBB3_11 + b LBB3_12 +LBB3_15: + ldr x19, [sp, #8] + cmp x19, x27 + b.eq LBB3_19 +; %bb.16: + mov x20, x19 +LBB3_17: ; =>This Inner Loop Header: Depth=1 + ldr x0, [x20] +Ltmp29: + bl __ZNSt3__16thread4joinEv +Ltmp30: +; %bb.18: ; in Loop: Header=BB3_17 Depth=1 + add x20, x20, #8 + cmp x20, x27 + b.ne LBB3_17 +LBB3_19: + cbz x19, LBB3_21 +; %bb.20: + mov x0, x19 + ldp x29, x30, [sp, #112] ; 16-byte Folded Reload + ldp x20, x19, [sp, #96] ; 16-byte Folded Reload + ldp x22, x21, [sp, #80] ; 16-byte Folded Reload + ldp x24, x23, [sp, #64] ; 16-byte Folded Reload + ldp x26, x25, [sp, #48] ; 16-byte Folded Reload + ldp x28, x27, [sp, #32] ; 16-byte Folded Reload + add sp, sp, #128 + b __ZdlPv +LBB3_21: + ldp x29, x30, [sp, #112] ; 16-byte Folded Reload + ldp x20, x19, [sp, #96] ; 16-byte Folded Reload + ldp x22, x21, [sp, #80] ; 16-byte Folded Reload + ldp x24, x23, [sp, #64] ; 16-byte Folded Reload + ldp x26, x25, [sp, #48] ; 16-byte Folded Reload + ldp x28, x27, [sp, #32] ; 16-byte Folded Reload + add sp, sp, #128 + ret +LBB3_22: +Ltmp26: + add x0, sp, #8 + bl __ZNKSt3__113__vector_baseIPNS_6threadENS_9allocatorIS2_EEE20__throw_length_errorEv +Ltmp27: + b LBB3_24 +LBB3_23: +Ltmp24: + bl __ZNSt3__1L20__throw_length_errorEPKc +Ltmp25: +LBB3_24: + brk #0x1 +LBB3_25: +Ltmp31: + b LBB3_29 +LBB3_26: +Ltmp28: + b LBB3_29 +LBB3_27: +Ltmp20: + mov x19, x0 + mov x0, x20 + bl __ZdlPv + b LBB3_30 +LBB3_28: +Ltmp23: +LBB3_29: + mov x19, x0 +LBB3_30: + ldr x0, [sp, #8] + cbz x0, LBB3_32 +; %bb.31: + str x0, [sp, #16] + bl __ZdlPv +LBB3_32: + mov x0, x19 + bl __Unwind_Resume + .loh AdrpAdd Lloh4, Lloh5 +Lfunc_end1: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table3: +Lexception1: + .byte 255 ; @LPStart Encoding = omit + .byte 255 ; @TType Encoding = omit + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end1-Lcst_begin1 +Lcst_begin1: + .uleb128 Ltmp16-Lfunc_begin1 ; >> Call Site 1 << + .uleb128 Ltmp17-Ltmp16 ; Call between Ltmp16 and Ltmp17 + .uleb128 Ltmp23-Lfunc_begin1 ; jumps to Ltmp23 + .byte 0 ; On action: cleanup + .uleb128 Ltmp18-Lfunc_begin1 ; >> Call Site 2 << + .uleb128 Ltmp19-Ltmp18 ; Call between Ltmp18 and Ltmp19 + .uleb128 Ltmp20-Lfunc_begin1 ; jumps to Ltmp20 + .byte 0 ; On action: cleanup + .uleb128 Ltmp21-Lfunc_begin1 ; >> Call Site 3 << + .uleb128 Ltmp22-Ltmp21 ; Call between Ltmp21 and Ltmp22 + .uleb128 Ltmp23-Lfunc_begin1 ; jumps to Ltmp23 + .byte 0 ; On action: cleanup + .uleb128 Ltmp22-Lfunc_begin1 ; >> Call Site 4 << + .uleb128 Ltmp29-Ltmp22 ; Call between Ltmp22 and Ltmp29 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp29-Lfunc_begin1 ; >> Call Site 5 << + .uleb128 Ltmp30-Ltmp29 ; Call between Ltmp29 and Ltmp30 + .uleb128 Ltmp31-Lfunc_begin1 ; jumps to Ltmp31 + .byte 0 ; On action: cleanup + .uleb128 Ltmp26-Lfunc_begin1 ; >> Call Site 6 << + .uleb128 Ltmp25-Ltmp26 ; Call between Ltmp26 and Ltmp25 + .uleb128 Ltmp28-Lfunc_begin1 ; jumps to Ltmp28 + .byte 0 ; On action: cleanup + .uleb128 Ltmp25-Lfunc_begin1 ; >> Call Site 7 << + .uleb128 Lfunc_end1-Ltmp25 ; Call between Ltmp25 and Lfunc_end1 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end1: + .p2align 2 + ; -- End function + .section __TEXT,__text,regular,pure_instructions + .globl _main ; -- Begin function main + .p2align 2 +_main: ; @main +Lfunc_begin2: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception2 +; %bb.0: + sub sp, sp, #48 + stp x20, x19, [sp, #16] ; 16-byte Folded Spill + stp x29, x30, [sp, #32] ; 16-byte Folded Spill + add x29, sp, #32 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + bl __Z7DoNakedv + bl __Z8DoAtomicv +Lloh6: + adrp x19, __ZNSt3__14coutE@GOTPAGE +Lloh7: + ldr x19, [x19, __ZNSt3__14coutE@GOTPAGEOFF] +Lloh8: + adrp x1, l_.str@PAGE +Lloh9: + add x1, x1, l_.str@PAGEOFF + mov x0, x19 + mov w2, #16 + bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m + mov x0, x19 + mov w1, #28928 + movk w1, #2, lsl #16 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEj + mov x19, x0 + ldr x8, [x0] + ldur x8, [x8, #-24] + add x0, x0, x8 + add x8, sp, #8 + bl __ZNKSt3__18ios_base6getlocEv +Ltmp32: +Lloh10: + adrp x1, __ZNSt3__15ctypeIcE2idE@GOTPAGE +Lloh11: + ldr x1, [x1, __ZNSt3__15ctypeIcE2idE@GOTPAGEOFF] + add x0, sp, #8 + bl __ZNKSt3__16locale9use_facetERNS0_2idE +Ltmp33: +; %bb.1: + ldr x8, [x0] + ldr x8, [x8, #56] +Ltmp34: + mov w1, #10 + blr x8 +Ltmp35: +; %bb.2: + mov x20, x0 + add x0, sp, #8 + bl __ZNSt3__16localeD1Ev + mov x0, x19 + mov x1, x20 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc + mov x0, x19 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv +Lloh12: + adrp x0, __ZNSt3__14coutE@GOTPAGE +Lloh13: + ldr x0, [x0, __ZNSt3__14coutE@GOTPAGEOFF] +Lloh14: + adrp x1, l_.str.1@PAGE +Lloh15: + add x1, x1, l_.str.1@PAGEOFF + mov w2, #11 + bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m +Lloh16: + adrp x8, _naked_int@PAGE +Lloh17: + ldr w1, [x8, _naked_int@PAGEOFF] + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEj + mov x19, x0 + ldr x8, [x0] + ldur x8, [x8, #-24] + add x0, x0, x8 + add x8, sp, #8 + bl __ZNKSt3__18ios_base6getlocEv +Ltmp37: +Lloh18: + adrp x1, __ZNSt3__15ctypeIcE2idE@GOTPAGE +Lloh19: + ldr x1, [x1, __ZNSt3__15ctypeIcE2idE@GOTPAGEOFF] + add x0, sp, #8 + bl __ZNKSt3__16locale9use_facetERNS0_2idE +Ltmp38: +; %bb.3: + ldr x8, [x0] + ldr x8, [x8, #56] +Ltmp39: + mov w1, #10 + blr x8 +Ltmp40: +; %bb.4: + mov x20, x0 + add x0, sp, #8 + bl __ZNSt3__16localeD1Ev + mov x0, x19 + mov x1, x20 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc + mov x0, x19 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv +Lloh20: + adrp x0, __ZNSt3__14coutE@GOTPAGE +Lloh21: + ldr x0, [x0, __ZNSt3__14coutE@GOTPAGEOFF] +Lloh22: + adrp x1, l_.str.2@PAGE +Lloh23: + add x1, x1, l_.str.2@PAGEOFF + mov w2, #12 + bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m +Lloh24: + adrp x8, _atomic_integer@PAGE +Lloh25: + add x8, x8, _atomic_integer@PAGEOFF + ldar w1, [x8] + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEj + mov x19, x0 + ldr x8, [x0] + ldur x8, [x8, #-24] + add x0, x0, x8 + add x8, sp, #8 + bl __ZNKSt3__18ios_base6getlocEv +Ltmp42: +Lloh26: + adrp x1, __ZNSt3__15ctypeIcE2idE@GOTPAGE +Lloh27: + ldr x1, [x1, __ZNSt3__15ctypeIcE2idE@GOTPAGEOFF] + add x0, sp, #8 + bl __ZNKSt3__16locale9use_facetERNS0_2idE +Ltmp43: +; %bb.5: + ldr x8, [x0] + ldr x8, [x8, #56] +Ltmp44: + mov w1, #10 + blr x8 +Ltmp45: +; %bb.6: + mov x20, x0 + add x0, sp, #8 + bl __ZNSt3__16localeD1Ev + mov x0, x19 + mov x1, x20 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc + mov x0, x19 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv + mov w0, #0 + ldp x29, x30, [sp, #32] ; 16-byte Folded Reload + ldp x20, x19, [sp, #16] ; 16-byte Folded Reload + add sp, sp, #48 + ret +LBB4_7: +Ltmp46: + b LBB4_10 +LBB4_8: +Ltmp41: + b LBB4_10 +LBB4_9: +Ltmp36: +LBB4_10: + mov x19, x0 + add x0, sp, #8 + bl __ZNSt3__16localeD1Ev + mov x0, x19 + bl __Unwind_Resume + .loh AdrpLdrGot Lloh10, Lloh11 + .loh AdrpAdd Lloh8, Lloh9 + .loh AdrpLdrGot Lloh6, Lloh7 + .loh AdrpLdrGot Lloh18, Lloh19 + .loh AdrpLdr Lloh16, Lloh17 + .loh AdrpAdd Lloh14, Lloh15 + .loh AdrpLdrGot Lloh12, Lloh13 + .loh AdrpLdrGot Lloh26, Lloh27 + .loh AdrpAdd Lloh24, Lloh25 + .loh AdrpAdd Lloh22, Lloh23 + .loh AdrpLdrGot Lloh20, Lloh21 +Lfunc_end2: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table4: +Lexception2: + .byte 255 ; @LPStart Encoding = omit + .byte 255 ; @TType Encoding = omit + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end2-Lcst_begin2 +Lcst_begin2: + .uleb128 Lfunc_begin2-Lfunc_begin2 ; >> Call Site 1 << + .uleb128 Ltmp32-Lfunc_begin2 ; Call between Lfunc_begin2 and Ltmp32 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp32-Lfunc_begin2 ; >> Call Site 2 << + .uleb128 Ltmp35-Ltmp32 ; Call between Ltmp32 and Ltmp35 + .uleb128 Ltmp36-Lfunc_begin2 ; jumps to Ltmp36 + .byte 0 ; On action: cleanup + .uleb128 Ltmp35-Lfunc_begin2 ; >> Call Site 3 << + .uleb128 Ltmp37-Ltmp35 ; Call between Ltmp35 and Ltmp37 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp37-Lfunc_begin2 ; >> Call Site 4 << + .uleb128 Ltmp40-Ltmp37 ; Call between Ltmp37 and Ltmp40 + .uleb128 Ltmp41-Lfunc_begin2 ; jumps to Ltmp41 + .byte 0 ; On action: cleanup + .uleb128 Ltmp40-Lfunc_begin2 ; >> Call Site 5 << + .uleb128 Ltmp42-Ltmp40 ; Call between Ltmp40 and Ltmp42 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp42-Lfunc_begin2 ; >> Call Site 6 << + .uleb128 Ltmp45-Ltmp42 ; Call between Ltmp42 and Ltmp45 + .uleb128 Ltmp46-Lfunc_begin2 ; jumps to Ltmp46 + .byte 0 ; On action: cleanup + .uleb128 Ltmp45-Lfunc_begin2 ; >> Call Site 7 << + .uleb128 Lfunc_end2-Ltmp45 ; Call between Ltmp45 and Lfunc_end2 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end2: + .p2align 2 + ; -- End function + .section __TEXT,__text,regular,pure_instructions + .private_extern ___clang_call_terminate ; -- Begin function __clang_call_terminate + .globl ___clang_call_terminate + .weak_def_can_be_hidden ___clang_call_terminate + .p2align 2 +___clang_call_terminate: ; @__clang_call_terminate +; %bb.0: + stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill + bl ___cxa_begin_catch + bl __ZSt9terminatev + ; -- End function + .private_extern __ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_ ; -- Begin function _ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_ + .globl __ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_ + .weak_def_can_be_hidden __ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_ + .p2align 2 +__ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_: ; @_ZNSt3__16threadC2IRFvvEJEvEEOT_DpOT0_ +Lfunc_begin3: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception3 +; %bb.0: + stp x22, x21, [sp, #-48]! ; 16-byte Folded Spill + stp x20, x19, [sp, #16] ; 16-byte Folded Spill + stp x29, x30, [sp, #32] ; 16-byte Folded Spill + add x29, sp, #32 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + .cfi_offset w21, -40 + .cfi_offset w22, -48 + mov x22, x1 + mov x20, x0 + mov w0, #8 + bl __Znwm + mov x21, x0 +Ltmp47: + bl __ZNSt3__115__thread_structC1Ev +Ltmp48: +; %bb.1: +Ltmp50: + mov w0, #16 + bl __Znwm +Ltmp51: +; %bb.2: + mov x19, x0 + stp x21, x22, [x0] +Ltmp53: +Lloh28: + adrp x2, __ZNSt3__1L14__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEPFvvEEEEEEPvSA_@PAGE +Lloh29: + add x2, x2, __ZNSt3__1L14__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEPFvvEEEEEEPvSA_@PAGEOFF + mov x0, x20 + mov x1, #0 + mov x3, x19 + bl _pthread_create +Ltmp54: +; %bb.3: + cbnz w0, LBB6_5 +; %bb.4: + mov x0, x20 + ldp x29, x30, [sp, #32] ; 16-byte Folded Reload + ldp x20, x19, [sp, #16] ; 16-byte Folded Reload + ldp x22, x21, [sp], #48 ; 16-byte Folded Reload + ret +LBB6_5: +Ltmp55: +Lloh30: + adrp x1, l_.str.3@PAGE +Lloh31: + add x1, x1, l_.str.3@PAGEOFF + bl __ZNSt3__120__throw_system_errorEiPKc +Ltmp56: +; %bb.6: + brk #0x1 +LBB6_7: +Ltmp52: + mov x20, x0 + mov x0, x21 + bl __ZNSt3__115__thread_structD1Ev + b LBB6_12 +LBB6_8: +Ltmp49: + mov x20, x0 + b LBB6_12 +LBB6_9: +Ltmp57: + mov x20, x0 + ldr x0, [x19] + str xzr, [x19] + cbz x0, LBB6_11 +; %bb.10: + bl __ZNSt3__115__thread_structD1Ev + bl __ZdlPv +LBB6_11: + mov x21, x19 +LBB6_12: + mov x0, x21 + bl __ZdlPv + mov x0, x20 + bl __Unwind_Resume + .loh AdrpAdd Lloh28, Lloh29 + .loh AdrpAdd Lloh30, Lloh31 +Lfunc_end3: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table6: +Lexception3: + .byte 255 ; @LPStart Encoding = omit + .byte 255 ; @TType Encoding = omit + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end3-Lcst_begin3 +Lcst_begin3: + .uleb128 Lfunc_begin3-Lfunc_begin3 ; >> Call Site 1 << + .uleb128 Ltmp47-Lfunc_begin3 ; Call between Lfunc_begin3 and Ltmp47 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp47-Lfunc_begin3 ; >> Call Site 2 << + .uleb128 Ltmp48-Ltmp47 ; Call between Ltmp47 and Ltmp48 + .uleb128 Ltmp49-Lfunc_begin3 ; jumps to Ltmp49 + .byte 0 ; On action: cleanup + .uleb128 Ltmp50-Lfunc_begin3 ; >> Call Site 3 << + .uleb128 Ltmp51-Ltmp50 ; Call between Ltmp50 and Ltmp51 + .uleb128 Ltmp52-Lfunc_begin3 ; jumps to Ltmp52 + .byte 0 ; On action: cleanup + .uleb128 Ltmp53-Lfunc_begin3 ; >> Call Site 4 << + .uleb128 Ltmp56-Ltmp53 ; Call between Ltmp53 and Ltmp56 + .uleb128 Ltmp57-Lfunc_begin3 ; jumps to Ltmp57 + .byte 0 ; On action: cleanup + .uleb128 Ltmp56-Lfunc_begin3 ; >> Call Site 5 << + .uleb128 Lfunc_end3-Ltmp56 ; Call between Ltmp56 and Lfunc_end3 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end3: + .p2align 2 + ; -- End function + .section __TEXT,__text,regular,pure_instructions + .p2align 2 ; -- Begin function _ZNSt3__1L14__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEPFvvEEEEEEPvSA_ +__ZNSt3__1L14__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEPFvvEEEEEEPvSA_: ; @_ZNSt3__1L14__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEPFvvEEEEEEPvSA_ +Lfunc_begin4: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception4 +; %bb.0: + stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill + stp x29, x30, [sp, #16] ; 16-byte Folded Spill + add x29, sp, #16 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + mov x19, x0 +Ltmp58: + bl __ZNSt3__119__thread_local_dataEv +Ltmp59: +; %bb.1: + ldr x1, [x19] + str xzr, [x19] + ldr x0, [x0] +Ltmp61: + bl _pthread_setspecific +Ltmp62: +; %bb.2: + ldr x8, [x19, #8] +Ltmp63: + blr x8 +Ltmp64: +; %bb.3: + ldr x0, [x19] + str xzr, [x19] + cbz x0, LBB7_5 +; %bb.4: + bl __ZNSt3__115__thread_structD1Ev + bl __ZdlPv +LBB7_5: + mov x0, x19 + bl __ZdlPv + mov x0, #0 + ldp x29, x30, [sp, #16] ; 16-byte Folded Reload + ldp x20, x19, [sp], #32 ; 16-byte Folded Reload + ret +LBB7_6: +Ltmp60: + mov x20, x0 + cbnz x19, LBB7_8 + b LBB7_11 +LBB7_7: +Ltmp65: + mov x20, x0 +LBB7_8: + ldr x0, [x19] + str xzr, [x19] + cbz x0, LBB7_10 +; %bb.9: + bl __ZNSt3__115__thread_structD1Ev + bl __ZdlPv +LBB7_10: + mov x0, x19 + bl __ZdlPv +LBB7_11: + mov x0, x20 + bl __Unwind_Resume +Lfunc_end4: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table7: +Lexception4: + .byte 255 ; @LPStart Encoding = omit + .byte 255 ; @TType Encoding = omit + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end4-Lcst_begin4 +Lcst_begin4: + .uleb128 Ltmp58-Lfunc_begin4 ; >> Call Site 1 << + .uleb128 Ltmp59-Ltmp58 ; Call between Ltmp58 and Ltmp59 + .uleb128 Ltmp60-Lfunc_begin4 ; jumps to Ltmp60 + .byte 0 ; On action: cleanup + .uleb128 Ltmp61-Lfunc_begin4 ; >> Call Site 2 << + .uleb128 Ltmp64-Ltmp61 ; Call between Ltmp61 and Ltmp64 + .uleb128 Ltmp65-Lfunc_begin4 ; jumps to Ltmp65 + .byte 0 ; On action: cleanup + .uleb128 Ltmp64-Lfunc_begin4 ; >> Call Site 3 << + .uleb128 Lfunc_end4-Ltmp64 ; Call between Ltmp64 and Lfunc_end4 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end4: + .p2align 2 + ; -- End function + .section __TEXT,__text,regular,pure_instructions + .p2align 2 ; -- Begin function _ZNKSt3__113__vector_baseIPNS_6threadENS_9allocatorIS2_EEE20__throw_length_errorEv +__ZNKSt3__113__vector_baseIPNS_6threadENS_9allocatorIS2_EEE20__throw_length_errorEv: ; @_ZNKSt3__113__vector_baseIPNS_6threadENS_9allocatorIS2_EEE20__throw_length_errorEv + .cfi_startproc +; %bb.0: + stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill + mov x29, sp + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + bl __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv + .cfi_endproc + ; -- End function + .p2align 2 ; -- Begin function _ZNSt3__1L20__throw_length_errorEPKc +__ZNSt3__1L20__throw_length_errorEPKc: ; @_ZNSt3__1L20__throw_length_errorEPKc +Lfunc_begin5: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception5 +; %bb.0: + stp x20, x19, [sp, #-32]! ; 16-byte Folded Spill + stp x29, x30, [sp, #16] ; 16-byte Folded Spill + add x29, sp, #16 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + mov w0, #16 + bl ___cxa_allocate_exception + mov x19, x0 +Ltmp66: + bl __ZNSt12length_errorC1EPKc +Ltmp67: +; %bb.1: +Lloh32: + adrp x1, __ZTISt12length_error@GOTPAGE +Lloh33: + ldr x1, [x1, __ZTISt12length_error@GOTPAGEOFF] +Lloh34: + adrp x2, __ZNSt12length_errorD1Ev@GOTPAGE +Lloh35: + ldr x2, [x2, __ZNSt12length_errorD1Ev@GOTPAGEOFF] + mov x0, x19 + bl ___cxa_throw +LBB9_2: +Ltmp68: + mov x20, x0 + mov x0, x19 + bl ___cxa_free_exception + mov x0, x20 + bl __Unwind_Resume + .loh AdrpLdrGot Lloh34, Lloh35 + .loh AdrpLdrGot Lloh32, Lloh33 +Lfunc_end5: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table9: +Lexception5: + .byte 255 ; @LPStart Encoding = omit + .byte 255 ; @TType Encoding = omit + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end5-Lcst_begin5 +Lcst_begin5: + .uleb128 Lfunc_begin5-Lfunc_begin5 ; >> Call Site 1 << + .uleb128 Ltmp66-Lfunc_begin5 ; Call between Lfunc_begin5 and Ltmp66 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp66-Lfunc_begin5 ; >> Call Site 2 << + .uleb128 Ltmp67-Ltmp66 ; Call between Ltmp66 and Ltmp67 + .uleb128 Ltmp68-Lfunc_begin5 ; jumps to Ltmp68 + .byte 0 ; On action: cleanup + .uleb128 Ltmp67-Lfunc_begin5 ; >> Call Site 3 << + .uleb128 Lfunc_end5-Ltmp67 ; Call between Ltmp67 and Lfunc_end5 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end5: + .p2align 2 + ; -- End function + .section __TEXT,__text,regular,pure_instructions + .p2align 2 ; -- Begin function _ZNSt12length_errorC1EPKc +__ZNSt12length_errorC1EPKc: ; @_ZNSt12length_errorC1EPKc + .cfi_startproc +; %bb.0: + stp x29, x30, [sp, #-16]! ; 16-byte Folded Spill + mov x29, sp + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 +Lloh36: + adrp x1, l_.str.4@PAGE +Lloh37: + add x1, x1, l_.str.4@PAGEOFF + bl __ZNSt11logic_errorC2EPKc +Lloh38: + adrp x8, __ZTVSt12length_error@GOTPAGE +Lloh39: + ldr x8, [x8, __ZTVSt12length_error@GOTPAGEOFF] + add x8, x8, #16 + str x8, [x0] + ldp x29, x30, [sp], #16 ; 16-byte Folded Reload + ret + .loh AdrpLdrGot Lloh38, Lloh39 + .loh AdrpAdd Lloh36, Lloh37 + .cfi_endproc + ; -- End function + .globl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m ; -- Begin function _ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m + .weak_def_can_be_hidden __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m + .p2align 2 +__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m: ; @_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m +Lfunc_begin6: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception6 +; %bb.0: + sub sp, sp, #112 + stp x26, x25, [sp, #32] ; 16-byte Folded Spill + stp x24, x23, [sp, #48] ; 16-byte Folded Spill + stp x22, x21, [sp, #64] ; 16-byte Folded Spill + stp x20, x19, [sp, #80] ; 16-byte Folded Spill + stp x29, x30, [sp, #96] ; 16-byte Folded Spill + add x29, sp, #96 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + .cfi_offset w21, -40 + .cfi_offset w22, -48 + .cfi_offset w23, -56 + .cfi_offset w24, -64 + .cfi_offset w25, -72 + .cfi_offset w26, -80 + mov x21, x2 + mov x20, x1 + mov x19, x0 +Ltmp69: + add x0, sp, #8 + mov x1, x19 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_ +Ltmp70: +; %bb.1: + ldrb w8, [sp, #8] + cbz w8, LBB11_10 +; %bb.2: + ldr x8, [x19] + ldur x8, [x8, #-24] + add x22, x19, x8 + ldr x23, [x22, #40] + ldr w25, [x22, #8] + ldr w24, [x22, #144] + cmn w24, #1 + b.ne LBB11_7 +; %bb.3: +Ltmp72: + add x8, sp, #24 + mov x0, x22 + bl __ZNKSt3__18ios_base6getlocEv +Ltmp73: +; %bb.4: +Ltmp74: +Lloh40: + adrp x1, __ZNSt3__15ctypeIcE2idE@GOTPAGE +Lloh41: + ldr x1, [x1, __ZNSt3__15ctypeIcE2idE@GOTPAGEOFF] + add x0, sp, #24 + bl __ZNKSt3__16locale9use_facetERNS0_2idE +Ltmp75: +; %bb.5: + ldr x8, [x0] + ldr x8, [x8, #56] +Ltmp76: + mov w1, #32 + blr x8 +Ltmp77: +; %bb.6: + mov x24, x0 + add x0, sp, #24 + bl __ZNSt3__16localeD1Ev + str w24, [x22, #144] +LBB11_7: + add x3, x20, x21 + mov w8, #176 + and w8, w25, w8 + cmp w8, #32 + csel x2, x3, x20, eq +Ltmp79: + sxtb w5, w24 + mov x0, x23 + mov x1, x20 + mov x4, x22 + bl __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ +Ltmp80: +; %bb.8: + cbnz x0, LBB11_10 +; %bb.9: + ldr x8, [x19] + ldur x8, [x8, #-24] + add x0, x19, x8 + ldr w8, [x0, #32] + mov w9, #5 + orr w1, w8, w9 +Ltmp82: + bl __ZNSt3__18ios_base5clearEj +Ltmp83: +LBB11_10: + add x0, sp, #8 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev +LBB11_11: + mov x0, x19 + ldp x29, x30, [sp, #96] ; 16-byte Folded Reload + ldp x20, x19, [sp, #80] ; 16-byte Folded Reload + ldp x22, x21, [sp, #64] ; 16-byte Folded Reload + ldp x24, x23, [sp, #48] ; 16-byte Folded Reload + ldp x26, x25, [sp, #32] ; 16-byte Folded Reload + add sp, sp, #112 + ret +LBB11_12: +Ltmp84: + b LBB11_15 +LBB11_13: +Ltmp78: + mov x20, x0 + add x0, sp, #24 + bl __ZNSt3__16localeD1Ev + b LBB11_16 +LBB11_14: +Ltmp81: +LBB11_15: + mov x20, x0 +LBB11_16: + add x0, sp, #8 + bl __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev + b LBB11_18 +LBB11_17: +Ltmp71: + mov x20, x0 +LBB11_18: + mov x0, x20 + bl ___cxa_begin_catch + ldr x8, [x19] + ldur x8, [x8, #-24] + add x0, x19, x8 +Ltmp85: + bl __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv +Ltmp86: +; %bb.19: + bl ___cxa_end_catch + b LBB11_11 +LBB11_20: +Ltmp87: + mov x19, x0 +Ltmp88: + bl ___cxa_end_catch +Ltmp89: +; %bb.21: + mov x0, x19 + bl __Unwind_Resume +LBB11_22: +Ltmp90: + bl ___clang_call_terminate + .loh AdrpLdrGot Lloh40, Lloh41 +Lfunc_end6: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table11: +Lexception6: + .byte 255 ; @LPStart Encoding = omit + .byte 155 ; @TType Encoding = indirect pcrel sdata4 + .uleb128 Lttbase0-Lttbaseref0 +Lttbaseref0: + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end6-Lcst_begin6 +Lcst_begin6: + .uleb128 Ltmp69-Lfunc_begin6 ; >> Call Site 1 << + .uleb128 Ltmp70-Ltmp69 ; Call between Ltmp69 and Ltmp70 + .uleb128 Ltmp71-Lfunc_begin6 ; jumps to Ltmp71 + .byte 1 ; On action: 1 + .uleb128 Ltmp72-Lfunc_begin6 ; >> Call Site 2 << + .uleb128 Ltmp73-Ltmp72 ; Call between Ltmp72 and Ltmp73 + .uleb128 Ltmp81-Lfunc_begin6 ; jumps to Ltmp81 + .byte 1 ; On action: 1 + .uleb128 Ltmp74-Lfunc_begin6 ; >> Call Site 3 << + .uleb128 Ltmp77-Ltmp74 ; Call between Ltmp74 and Ltmp77 + .uleb128 Ltmp78-Lfunc_begin6 ; jumps to Ltmp78 + .byte 1 ; On action: 1 + .uleb128 Ltmp79-Lfunc_begin6 ; >> Call Site 4 << + .uleb128 Ltmp80-Ltmp79 ; Call between Ltmp79 and Ltmp80 + .uleb128 Ltmp81-Lfunc_begin6 ; jumps to Ltmp81 + .byte 1 ; On action: 1 + .uleb128 Ltmp82-Lfunc_begin6 ; >> Call Site 5 << + .uleb128 Ltmp83-Ltmp82 ; Call between Ltmp82 and Ltmp83 + .uleb128 Ltmp84-Lfunc_begin6 ; jumps to Ltmp84 + .byte 1 ; On action: 1 + .uleb128 Ltmp83-Lfunc_begin6 ; >> Call Site 6 << + .uleb128 Ltmp85-Ltmp83 ; Call between Ltmp83 and Ltmp85 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp85-Lfunc_begin6 ; >> Call Site 7 << + .uleb128 Ltmp86-Ltmp85 ; Call between Ltmp85 and Ltmp86 + .uleb128 Ltmp87-Lfunc_begin6 ; jumps to Ltmp87 + .byte 0 ; On action: cleanup + .uleb128 Ltmp86-Lfunc_begin6 ; >> Call Site 8 << + .uleb128 Ltmp88-Ltmp86 ; Call between Ltmp86 and Ltmp88 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp88-Lfunc_begin6 ; >> Call Site 9 << + .uleb128 Ltmp89-Ltmp88 ; Call between Ltmp88 and Ltmp89 + .uleb128 Ltmp90-Lfunc_begin6 ; jumps to Ltmp90 + .byte 1 ; On action: 1 + .uleb128 Ltmp89-Lfunc_begin6 ; >> Call Site 10 << + .uleb128 Lfunc_end6-Ltmp89 ; Call between Ltmp89 and Lfunc_end6 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end6: + .byte 1 ; >> Action Record 1 << + ; Catch TypeInfo 1 + .byte 0 ; No further actions + .p2align 2 + ; >> Catch TypeInfos << + .long 0 ; TypeInfo 1 +Lttbase0: + .p2align 2 + ; -- End function + .section __TEXT,__text,regular,pure_instructions + .private_extern __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ ; -- Begin function _ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ + .globl __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ + .weak_def_can_be_hidden __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ + .p2align 2 +__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_: ; @_ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ +Lfunc_begin7: + .cfi_startproc + .cfi_personality 155, ___gxx_personality_v0 + .cfi_lsda 16, Lexception7 +; %bb.0: + sub sp, sp, #112 + stp x26, x25, [sp, #32] ; 16-byte Folded Spill + stp x24, x23, [sp, #48] ; 16-byte Folded Spill + stp x22, x21, [sp, #64] ; 16-byte Folded Spill + stp x20, x19, [sp, #80] ; 16-byte Folded Spill + stp x29, x30, [sp, #96] ; 16-byte Folded Spill + add x29, sp, #96 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + .cfi_offset w19, -24 + .cfi_offset w20, -32 + .cfi_offset w21, -40 + .cfi_offset w22, -48 + .cfi_offset w23, -56 + .cfi_offset w24, -64 + .cfi_offset w25, -72 + .cfi_offset w26, -80 + mov x19, x0 + cbz x0, LBB12_15 +; %bb.1: + mov x24, x5 + mov x20, x4 + mov x22, x3 + mov x21, x2 + ldr x8, [x4, #24] + sub x9, x3, x1 + subs x8, x8, x9 + csel x23, x8, xzr, gt + sub x25, x2, x1 + cmp x25, #1 + b.lt LBB12_3 +; %bb.2: + ldr x8, [x19] + ldr x8, [x8, #96] + mov x0, x19 + mov x2, x25 + blr x8 + cmp x0, x25 + b.ne LBB12_14 +LBB12_3: + cmp x23, #1 + b.lt LBB12_11 +; %bb.4: + cmp x23, #23 + b.hs LBB12_6 +; %bb.5: + add x25, sp, #8 + strb w23, [sp, #31] + b LBB12_7 +LBB12_6: + add x8, x23, #16 + and x26, x8, #0xfffffffffffffff0 + mov x0, x26 + bl __Znwm + mov x25, x0 + orr x8, x26, #0x8000000000000000 + stp x23, x8, [sp, #16] + str x0, [sp, #8] +LBB12_7: + mov x0, x25 + mov x1, x24 + mov x2, x23 + bl _memset + strb wzr, [x25, x23] + ldrsb w8, [sp, #31] + ldr x9, [sp, #8] + cmp w8, #0 + add x8, sp, #8 + csel x1, x9, x8, lt + ldr x8, [x19] + ldr x8, [x8, #96] +Ltmp91: + mov x0, x19 + mov x2, x23 + blr x8 +Ltmp92: +; %bb.8: + mov x24, x0 + ldrsb w8, [sp, #31] + tbnz w8, #31, LBB12_10 +; %bb.9: + cmp x24, x23 + b.ne LBB12_14 + b LBB12_11 +LBB12_10: + ldr x0, [sp, #8] + bl __ZdlPv + cmp x24, x23 + b.ne LBB12_14 +LBB12_11: + sub x22, x22, x21 + cmp x22, #1 + b.lt LBB12_13 +; %bb.12: + ldr x8, [x19] + ldr x8, [x8, #96] + mov x0, x19 + mov x1, x21 + mov x2, x22 + blr x8 + cmp x0, x22 + b.ne LBB12_14 +LBB12_13: + str xzr, [x20, #24] + b LBB12_15 +LBB12_14: + mov x19, #0 +LBB12_15: + mov x0, x19 + ldp x29, x30, [sp, #96] ; 16-byte Folded Reload + ldp x20, x19, [sp, #80] ; 16-byte Folded Reload + ldp x22, x21, [sp, #64] ; 16-byte Folded Reload + ldp x24, x23, [sp, #48] ; 16-byte Folded Reload + ldp x26, x25, [sp, #32] ; 16-byte Folded Reload + add sp, sp, #112 + ret +LBB12_16: +Ltmp93: + mov x19, x0 + ldrsb w8, [sp, #31] + tbz w8, #31, LBB12_18 +; %bb.17: + ldr x0, [sp, #8] + bl __ZdlPv +LBB12_18: + mov x0, x19 + bl __Unwind_Resume +Lfunc_end7: + .cfi_endproc + .section __TEXT,__gcc_except_tab + .p2align 2 +GCC_except_table12: +Lexception7: + .byte 255 ; @LPStart Encoding = omit + .byte 255 ; @TType Encoding = omit + .byte 1 ; Call site Encoding = uleb128 + .uleb128 Lcst_end7-Lcst_begin7 +Lcst_begin7: + .uleb128 Lfunc_begin7-Lfunc_begin7 ; >> Call Site 1 << + .uleb128 Ltmp91-Lfunc_begin7 ; Call between Lfunc_begin7 and Ltmp91 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup + .uleb128 Ltmp91-Lfunc_begin7 ; >> Call Site 2 << + .uleb128 Ltmp92-Ltmp91 ; Call between Ltmp91 and Ltmp92 + .uleb128 Ltmp93-Lfunc_begin7 ; jumps to Ltmp93 + .byte 0 ; On action: cleanup + .uleb128 Ltmp92-Lfunc_begin7 ; >> Call Site 3 << + .uleb128 Lfunc_end7-Ltmp92 ; Call between Ltmp92 and Lfunc_end7 + .byte 0 ; has no landing pad + .byte 0 ; On action: cleanup +Lcst_end7: + .p2align 2 + ; -- End function + .globl _naked_int ; @naked_int +.zerofill __DATA,__common,_naked_int,4,2 + .globl _atomic_integer ; @atomic_integer +.zerofill __DATA,__common,_atomic_integer,4,2 + .section __TEXT,__cstring,cstring_literals +l_.str: ; @.str + .asciz "Correct sum is: " + +l_.str.1: ; @.str.1 + .asciz "Naked sum: " + +l_.str.2: ; @.str.2 + .asciz "Atomic sum: " + +l_.str.3: ; @.str.3 + .asciz "thread constructor failed" + +l_.str.4: ; @.str.4 + .asciz "allocator::allocate(size_t n) 'n' exceeds maximum supported size" + +.subsections_via_symbols