GetSmart 0 20 сентября, 2017 Опубликовано 20 сентября, 2017 (изменено) · Жалоба Ладно, проехали. Раз никто не захотел выкладывать. Листинги не надо. Изменено 20 сентября, 2017 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 22 сентября, 2017 Опубликовано 22 сентября, 2017 (изменено) · Жалоба Ладно, проехали. Раз никто не захотел выкладывать. Листинги не надо. какой Вы нетерпеливый! Вот Вам нате.... фабула: выношу на обсуждение два тезезиса а) работа GCC моей сборки, все непосильные стенания по его допиливанию, втыканию ключей и тд - в целях наибыстрейшего кода. б) совместно с пунктом а) пилю собственную С++ либу для STM32, либа использует последние фичи С++14 для облагораживания кода но цель таже - наибыстрейший код. представляю на рассмотрения куски кода и выход компиллера. компилятор: gcc версия 7.2.0 (Klen's GNU package (KGP) for x86_64-kgp-linux-gnu platform. << PRUNUS >>) gcc версия 8.0.0 20170918 (experimental) (Klen's GNU package (KGP) for x86_64-kgp-linux-gnu platform. << RIBES >>) разницы в выходе у двух версий практически нет, разница появляется в сложных структурах кода, причем трудно с ходу разобратся какая трасса лучше без измерений. ключи -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -mcpu=cortex-m4 -Ofast -fomit-frame-pointer -finline-functions -ffunction-sections -fdata-sections -fgraphite -funroll-loops -flto=8 -ffat-lto-objects -ggdb3 -fverbose-asm -fvar-tracking-assignments 1. Исходный код (функции атомарного доступа к регистрам переферии) rcc.ahb1_peripheral_clock.dma1_enable(); nop_rep(3); dma1_stream0.direct_mode_error_interrupt_enable(); dma1_stream0.transfer_error_interrupt_enable(); dma1_stream0.half_transfer_interrupt_enable(); dma1_stream0.transfer_complete_interrupt_enable(); dma1_stream0.flow_controller_peripheral(); dma1_stream0.direction_memory_to_memory(); dma1_stream0.circular_mode_disable(); dma1_stream0.peripheral_increment_mode_enable(); dma1_stream0.memory_increment_mode_enable(); dma1_stream0.peripheral_data_size_word(); dma1_stream0.memory_data_size_word(); dma1_stream0.peripheral_increment_offset_size_alignment(); dma1_stream0.priority_level_very_high(); dma1_stream0.double_buffer_mode_enable(); dma1_stream0.current_target_m1ar(); dma1_stream0.peripheral_burst_transfer_incr16(); dma1_stream0.memory_burst_transfer_incr16(); nop_rep(2); выход кодогенератора rcc.ahb1_peripheral_clock.dma1_enable(); nop_rep(3); 8010b44: bf00 nop 8010b46: bf00 nop 8010b48: bf00 nop *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b4a: 4f60 ldr r7, [pc, #384]; (8010ccc <stm32f4::reset_irq_handler()+0x5a0>) *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b4c: 6839 ldr r1, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b4e: f041 0602 orr.w r6, r1, #2 8010b52: 603e str r6, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b54: 683d ldr r5, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b56: f045 0304 orr.w r3, r5, #4 8010b5a: 603b str r3, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b5c: 683c ldr r4, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b5e: f044 0008 orr.w r0, r4, #8 8010b62: 6038 str r0, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b64: 683a ldr r2, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b66: f042 0110 orr.w r1, r2, #16 8010b6a: 6039 str r1, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b6c: 683e ldr r6, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b6e: f046 0520 orr.w r5, r6, #32 8010b72: 603d str r5, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b74: 683b ldr r3, [r7, #0] 8010b76: f023 04c0 bic.w r4, r3, #192; 0xc0 *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b7a: f044 0080 orr.w r0, r4, #128; 0x80 8010b7e: 6038 str r0, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b80: 683a ldr r2, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b82: f442 7180 orr.w r1, r2, #256; 0x100 8010b86: 6039 str r1, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b88: 683e ldr r6, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b8a: f446 7500 orr.w r5, r6, #512; 0x200 8010b8e: 603d str r5, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b90: 683b ldr r3, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b92: f443 6480 orr.w r4, r3, #1024; 0x400 8010b96: 603c str r4, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010b98: 6838 ldr r0, [r7, #0] 8010b9a: f420 58c0 bic.w r8, r0, #6144; 0x1800 *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010b9e: f448 5280 orr.w r2, r8, #4096; 0x1000 8010ba2: 603a str r2, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010ba4: 6839 ldr r1, [r7, #0] 8010ba6: f421 46c0 bic.w r6, r1, #24576; 0x6000 *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010baa: f446 4580 orr.w r5, r6, #16384; 0x4000 8010bae: 603d str r5, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010bb0: 683b ldr r3, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010bb2: f443 4400 orr.w r4, r3, #32768; 0x8000 8010bb6: 603c str r4, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010bb8: 6838 ldr r0, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010bba: f440 3240 orr.w r2, r0, #196608; 0x30000 8010bbe: 603a str r2, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010bc0: 6839 ldr r1, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010bc2: f441 2680 orr.w r6, r1, #262144; 0x40000 8010bc6: 603e str r6, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010bc8: 683d ldr r5, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010bca: f445 2300 orr.w r3, r5, #524288; 0x80000 8010bce: 603b str r3, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010bd0: 683c ldr r4, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010bd2: f444 00c0 orr.w r0, r4, #6291456; 0x600000 8010bd6: 6038 str r0, [r7, #0] *(((uint32_t*)this)) &= ~(T::mask << T::offset ); 8010bd8: 683a ldr r2, [r7, #0] *(((uint32_t*)this)) |= (bit_val << T::offset ); 8010bda: f042 71c0 orr.w r1, r2, #25165824; 0x1800000 8010bde: 6039 str r1, [r7, #0] nop_rep(2); 8010be0: bf00 nop 8010be2: bf00 nop 1. Тоже самое но в быстрой форме (функции быстрого доступа к битовым полям регистра переферии) nop_rep(2); dma1_stream0.configuration.reg_value = 0x0; // очистка регистра dma1_stream0.configuration.modify( dma_stream_t::configuration_t::direct_mode_error_interrupt_state_t::enable, dma_stream_t::configuration_t::transfer_error_interrupt_state_t::enable, dma_stream_t::configuration_t::half_transfer_interrupt_state_t::enable, dma_stream_t::configuration_t::transfer_error_interrupt_state_t::enable, dma_stream_t::configuration_t::transfrt_complete_interrupt_state_t::enable, dma_stream_t::configuration_t::flow_controller_t::peripheral, dma_stream_t::configuration_t::direction_t::memory_to_memory, dma_stream_t::configuration_t::circular_mode_t::enable, dma_stream_t::configuration_t::peripheral_increment_mode_t::enable, dma_stream_t::configuration_t::memory_increment_mode_t::enable, dma_stream_t::configuration_t::peripheral_data_size_t::word, dma_stream_t::configuration_t::memory_data_size_t::word, dma_stream_t::configuration_t::peripheral_increment_offset_size_t::alignment, dma_stream_t::configuration_t::priority_level_t::very_high, dma_stream_t::configuration_t::double_buffer_mode_t::enable, dma_stream_t::configuration_t::current_target_t::m1ar, dma_stream_t::configuration_t::peripheral_burst_transfer_t::incr16, dma_stream_t::configuration_t::memory_burst_transfer_t::incr16 ); nop_rep(2); 08010bd0: nop 08010bd2: nop 139 template<typename... Args> inline void modify(Args... args) { NRO uint32_t tmp = reg_value; modify( tmp , args...); reg_value = tmp; } 08010bd4: ldr r7, [pc, #528]; (0x8010de8 <reset_irq_handler+1584>) 08010bd6: ldr r1, [pc, #532]; (0x8010dec <reset_irq_handler+1588>) 08010bd8: str r1, [r7, #0] 08010bda: nop 08010bdc: nop 3. Пример использования векторной инструкции 64 += 16*16 + 16*16 (у меня используется для когерентного накопления сигнала с 16 битного АЦП, размер выборки 1600 элементов, время трассы 44мкс (~22.4кГц), 7494 такта процессора, тактовая 168МГц) __attribute__( ( always_inline ) ) static inline void smlaldvm (int64_t& accum , const uint32_t* x, const uint32_t* w) { data_64bit_t& reg64 = data_64bit_t::from(accum); asm ("ldr.w r4 , %[x0] \n\ ldr.w r5 , %[w0] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x1] \n\ ldr.w r5 , %[w1] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x2] \n\ ldr.w r5 , %[w2] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x3] \n\ ldr.w r5 , %[w3] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x4] \n\ ldr.w r5 , %[w4] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x5] \n\ ldr.w r5 , %[w5] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x6] \n\ ldr.w r5 , %[w6] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x7] \n\ ldr.w r5 , %[w7] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x8] \n\ ldr.w r5 , %[w8] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x9] \n\ ldr.w r5 , %[w9] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x10] \n\ ldr.w r5 , %[w10] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x11] \n\ ldr.w r5 , %[w11] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x12] \n\ ldr.w r5 , %[w12] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x13] \n\ ldr.w r5 , %[w13] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x14] \n\ ldr.w r5 , %[w14] \n\ smlald %[lw], %[hw], r4, r5 \n\ ldr.w r4 , %[x15] \n\ ldr.w r5 , %[w15] \n\ smlald %[lw], %[hw], r4, r5 \n" : [lw] "+r" (reg64.low_word.sval), [hw] "+r" (reg64.high_word.sval) : "0" (reg64.low_word.sval), "1" (reg64.high_word.sval) , [x0] "m" (x[0]), [w0] "m" (w[0]), [x1] "m" (x[1]), [w1] "m" (w[1]), [x2] "m" (x[2]), [w2] "m" (w[2]), [x3] "m" (x[3]), [w3] "m" (w[3]), [x4] "m" (x[4]), [w4] "m" (w[4]), [x5] "m" (x[5]), [w5] "m" (w[5]), [x6] "m" (x[6]), [w6] "m" (w[6]), [x7] "m" (x[7]), [w7] "m" (w[7]), [x8] "m" (x[8]), [w8] "m" (w[8]), [x9] "m" (x[9]), [w9] "m" (w[9]), [x10]"m" (x[10]),[w10] "m" (w[10]), [x11]"m" (x[11]),[w11] "m" (w[11]), [x12]"m" (x[12]),[w12] "m" (w[12]), [x13]"m" (x[13]),[w13] "m" (w[13]), [x14]"m" (x[14]),[w14] "m" (w[14]), [x15]"m" (x[15]),[w15] "m" (w[15]) : "r4" , "r5" ); } main() { data_64bit_t accum; data_32bit_t* x; data_32bit_t* w; uint32_t* cx = &x[0].uval; // отсчеты сигнала в канале дальности uint32_t* cw = &w[0].uval; // весовые коэфф. nop_rep(5); dwt.cyccnt_start(); for ( size_t i = 0; i < el / 16; i++ ) { smlaldvm( *((int64_t*)&accum.sval) , cx, cw); cx += 16; cw += 16; } cnt[2] = dwt.cyccnt_stop(); freq = rcc.cyc2us(cnt[2]); nop_rep(5); } выход котогенератора nop_rep(5); 8011418: bf00 nop 801141a: bf00 nop 801141c: bf00 nop 801141e: bf00 nop 8011420: bf00 nop cx = &x[0].uval; 8011422: 4dc8 ldr r5, [pc, #800]; (8011744 <stm32f4::reset_irq_handler()+0xf8c>) cw = &w[0].uval; 8011424: 4fc8 ldr r7, [pc, #800]; (8011748 <stm32f4::reset_irq_handler()+0xf90>) cx = &x[0].uval; 8011426: 682b ldr r3, [r5, #0] cw = &w[0].uval; 8011428: 683a ldr r2, [r7, #0] inline void cyccnt_start () { NRO cyccnt = 0; } 801142a: 2100 movs r1, #0 801142c: 6071 str r1, [r6, #4] 801142e: f503 5ac8 add.w sl, r3, #6400; 0x1900 : "0" (reg64.low_word.sval), "1" (reg64.high_word.sval) , 8011432: 4cc6 ldr r4, [pc, #792]; (801174c <stm32f4::reset_irq_handler()+0xf94>) for ( size_t i = 0; i < el / 16; i++ ) { smlaldvm( *((int64_t*)&accum.sval) , cx, cw); cx += 16; 8011434: f103 0e40 add.w lr, r3, #64; 0x40 : "0" (reg64.low_word.sval), "1" (reg64.high_word.sval) , 8011438: 6826 ldr r6, [r4, #0] 801143a: 6860 ldr r0, [r4, #4] ); 801143c: f8d3 4000 ldr.w r4, [r3] 8011440: f8d2 5000 ldr.w r5, [r2] 8011444: fbc4 60c5 smlald r6, r0, r4, r5 8011448: f8d3 4004 ldr.w r4, [r3, #4] 801144c: f8d2 5004 ldr.w r5, [r2, #4] 8011450: fbc4 60c5 smlald r6, r0, r4, r5 8011454: f8d3 4008 ldr.w r4, [r3, #8] 8011458: f8d2 5008 ldr.w r5, [r2, #8] 801145c: fbc4 60c5 smlald r6, r0, r4, r5 8011460: f8d3 400c ldr.w r4, [r3, #12] 8011464: f8d2 500c ldr.w r5, [r2, #12] 8011468: fbc4 60c5 smlald r6, r0, r4, r5 801146c: f8d3 4010 ldr.w r4, [r3, #16] 8011470: f8d2 5010 ldr.w r5, [r2, #16] 8011474: fbc4 60c5 smlald r6, r0, r4, r5 8011478: f8d3 4014 ldr.w r4, [r3, #20] 801147c: f8d2 5014 ldr.w r5, [r2, #20] 8011480: fbc4 60c5 smlald r6, r0, r4, r5 8011484: f8d3 4018 ldr.w r4, [r3, #24] 8011488: f8d2 5018 ldr.w r5, [r2, #24] 801148c: fbc4 60c5 smlald r6, r0, r4, r5 8011490: f8d3 401c ldr.w r4, [r3, #28] 8011494: f8d2 501c ldr.w r5, [r2, #28] 8011498: fbc4 60c5 smlald r6, r0, r4, r5 801149c: f8d3 4020 ldr.w r4, [r3, #32] 80114a0: f8d2 5020 ldr.w r5, [r2, #32] 80114a4: fbc4 60c5 smlald r6, r0, r4, r5 80114a8: f8d3 4024 ldr.w r4, [r3, #36]; 0x24 80114ac: f8d2 5024 ldr.w r5, [r2, #36]; 0x24 80114b0: fbc4 60c5 smlald r6, r0, r4, r5 80114b4: f8d3 4028 ldr.w r4, [r3, #40]; 0x28 80114b8: f8d2 5028 ldr.w r5, [r2, #40]; 0x28 80114bc: fbc4 60c5 smlald r6, r0, r4, r5 80114c0: f8d3 402c ldr.w r4, [r3, #44]; 0x2c 80114c4: f8d2 502c ldr.w r5, [r2, #44]; 0x2c 80114c8: fbc4 60c5 smlald r6, r0, r4, r5 80114cc: f8d3 4030 ldr.w r4, [r3, #48]; 0x30 80114d0: f8d2 5030 ldr.w r5, [r2, #48]; 0x30 80114d4: fbc4 60c5 smlald r6, r0, r4, r5 80114d8: f8d3 4034 ldr.w r4, [r3, #52]; 0x34 80114dc: f8d2 5034 ldr.w r5, [r2, #52]; 0x34 80114e0: fbc4 60c5 smlald r6, r0, r4, r5 80114e4: f8d3 4038 ldr.w r4, [r3, #56]; 0x38 80114e8: f8d2 5038 ldr.w r5, [r2, #56]; 0x38 80114ec: fbc4 60c5 smlald r6, r0, r4, r5 80114f0: f8d3 403c ldr.w r4, [r3, #60]; 0x3c 80114f4: f8d2 503c ldr.w r5, [r2, #60]; 0x3c 80114f8: fbc4 60c5 smlald r6, r0, r4, r5 cw += 16; 80114fc: f102 0b40 add.w fp, r2, #64; 0x40 ); 8011500: f8d3 4040 ldr.w r4, [r3, #64]; 0x40 8011504: f8d2 5040 ldr.w r5, [r2, #64]; 0x40 8011508: fbc4 60c5 smlald r6, r0, r4, r5 801150c: f8de 4004 ldr.w r4, [lr, #4] 8011510: f8db 5004 ldr.w r5, [fp, #4] 8011514: fbc4 60c5 smlald r6, r0, r4, r5 8011518: f8de 4008 ldr.w r4, [lr, #8] 801151c: f8db 5008 ldr.w r5, [fp, #8] 8011520: fbc4 60c5 smlald r6, r0, r4, r5 8011524: f8de 400c ldr.w r4, [lr, #12] 8011528: f8db 500c ldr.w r5, [fp, #12] 801152c: fbc4 60c5 smlald r6, r0, r4, r5 8011530: f8de 4010 ldr.w r4, [lr, #16] 8011534: f8db 5010 ldr.w r5, [fp, #16] 8011538: fbc4 60c5 smlald r6, r0, r4, r5 801153c: f8de 4014 ldr.w r4, [lr, #20] 8011540: f8db 5014 ldr.w r5, [fp, #20] 8011544: fbc4 60c5 smlald r6, r0, r4, r5 8011548: f8de 4018 ldr.w r4, [lr, #24] 801154c: f8db 5018 ldr.w r5, [fp, #24] 8011550: fbc4 60c5 smlald r6, r0, r4, r5 8011554: f8de 401c ldr.w r4, [lr, #28] 8011558: f8db 501c ldr.w r5, [fp, #28] 801155c: fbc4 60c5 smlald r6, r0, r4, r5 8011560: f8de 4020 ldr.w r4, [lr, #32] 8011564: f8db 5020 ldr.w r5, [fp, #32] 8011568: fbc4 60c5 smlald r6, r0, r4, r5 801156c: f8de 4024 ldr.w r4, [lr, #36]; 0x24 8011570: f8db 5024 ldr.w r5, [fp, #36]; 0x24 8011574: fbc4 60c5 smlald r6, r0, r4, r5 8011578: f8de 4028 ldr.w r4, [lr, #40]; 0x28 801157c: f8db 5028 ldr.w r5, [fp, #40]; 0x28 8011580: fbc4 60c5 smlald r6, r0, r4, r5 8011584: f8de 402c ldr.w r4, [lr, #44]; 0x2c 8011588: f8db 502c ldr.w r5, [fp, #44]; 0x2c 801158c: fbc4 60c5 smlald r6, r0, r4, r5 8011590: f8de 4030 ldr.w r4, [lr, #48]; 0x30 8011594: f8db 5030 ldr.w r5, [fp, #48]; 0x30 8011598: fbc4 60c5 smlald r6, r0, r4, r5 801159c: f8de 4034 ldr.w r4, [lr, #52]; 0x34 80115a0: f8db 5034 ldr.w r5, [fp, #52]; 0x34 80115a4: fbc4 60c5 smlald r6, r0, r4, r5 80115a8: f8de 4038 ldr.w r4, [lr, #56]; 0x38 80115ac: f8db 5038 ldr.w r5, [fp, #56]; 0x38 80115b0: fbc4 60c5 smlald r6, r0, r4, r5 80115b4: f8de 403c ldr.w r4, [lr, #60]; 0x3c 80115b8: f8db 503c ldr.w r5, [fp, #60]; 0x3c 80115bc: fbc4 60c5 smlald r6, r0, r4, r5 80115c0: f8de 4040 ldr.w r4, [lr, #64]; 0x40 80115c4: f8db 5040 ldr.w r5, [fp, #64]; 0x40 80115c8: fbc4 60c5 smlald r6, r0, r4, r5 80115cc: f8de 4044 ldr.w r4, [lr, #68]; 0x44 80115d0: f8db 5044 ldr.w r5, [fp, #68]; 0x44 80115d4: fbc4 60c5 smlald r6, r0, r4, r5 80115d8: f8de 4048 ldr.w r4, [lr, #72]; 0x48 80115dc: f8db 5048 ldr.w r5, [fp, #72]; 0x48 80115e0: fbc4 60c5 smlald r6, r0, r4, r5 80115e4: f8de 404c ldr.w r4, [lr, #76]; 0x4c 80115e8: f8db 504c ldr.w r5, [fp, #76]; 0x4c 80115ec: fbc4 60c5 smlald r6, r0, r4, r5 80115f0: f8de 4050 ldr.w r4, [lr, #80]; 0x50 80115f4: f8db 5050 ldr.w r5, [fp, #80]; 0x50 80115f8: fbc4 60c5 smlald r6, r0, r4, r5 80115fc: f8de 4054 ldr.w r4, [lr, #84]; 0x54 8011600: f8db 5054 ldr.w r5, [fp, #84]; 0x54 8011604: fbc4 60c5 smlald r6, r0, r4, r5 8011608: f8de 4058 ldr.w r4, [lr, #88]; 0x58 801160c: f8db 5058 ldr.w r5, [fp, #88]; 0x58 8011610: fbc4 60c5 smlald r6, r0, r4, r5 8011614: f8de 405c ldr.w r4, [lr, #92]; 0x5c 8011618: f8db 505c ldr.w r5, [fp, #92]; 0x5c 801161c: fbc4 60c5 smlald r6, r0, r4, r5 8011620: f8de 4060 ldr.w r4, [lr, #96]; 0x60 8011624: f8db 5060 ldr.w r5, [fp, #96]; 0x60 8011628: fbc4 60c5 smlald r6, r0, r4, r5 801162c: f8de 4064 ldr.w r4, [lr, #100]; 0x64 8011630: f8db 5064 ldr.w r5, [fp, #100]; 0x64 8011634: fbc4 60c5 smlald r6, r0, r4, r5 8011638: f8de 4068 ldr.w r4, [lr, #104]; 0x68 801163c: f8db 5068 ldr.w r5, [fp, #104]; 0x68 8011640: fbc4 60c5 smlald r6, r0, r4, r5 8011644: f8de 406c ldr.w r4, [lr, #108]; 0x6c 8011648: f8db 506c ldr.w r5, [fp, #108]; 0x6c 801164c: fbc4 60c5 smlald r6, r0, r4, r5 8011650: f8de 4070 ldr.w r4, [lr, #112]; 0x70 8011654: f8db 5070 ldr.w r5, [fp, #112]; 0x70 8011658: fbc4 60c5 smlald r6, r0, r4, r5 801165c: f8de 4074 ldr.w r4, [lr, #116]; 0x74 8011660: f8db 5074 ldr.w r5, [fp, #116]; 0x74 8011664: fbc4 60c5 smlald r6, r0, r4, r5 8011668: f8de 4078 ldr.w r4, [lr, #120]; 0x78 801166c: f8db 5078 ldr.w r5, [fp, #120]; 0x78 8011670: fbc4 60c5 smlald r6, r0, r4, r5 8011674: f8de 407c ldr.w r4, [lr, #124]; 0x7c 8011678: f8db 507c ldr.w r5, [fp, #124]; 0x7c 801167c: fbc4 60c5 smlald r6, r0, r4, r5 8011680: f8d3 40c0 ldr.w r4, [r3, #192]; 0xc0 8011684: f8d2 50c0 ldr.w r5, [r2, #192]; 0xc0 8011688: fbc4 60c5 smlald r6, r0, r4, r5 801168c: f8d3 40c4 ldr.w r4, [r3, #196]; 0xc4 8011690: f8d2 50c4 ldr.w r5, [r2, #196]; 0xc4 8011694: fbc4 60c5 smlald r6, r0, r4, r5 8011698: f8d3 40c8 ldr.w r4, [r3, #200]; 0xc8 801169c: f8d2 50c8 ldr.w r5, [r2, #200]; 0xc8 80116a0: fbc4 60c5 smlald r6, r0, r4, r5 80116a4: f8d3 40cc ldr.w r4, [r3, #204]; 0xcc 80116a8: f8d2 50cc ldr.w r5, [r2, #204]; 0xcc 80116ac: fbc4 60c5 smlald r6, r0, r4, r5 80116b0: f8d3 40d0 ldr.w r4, [r3, #208]; 0xd0 80116b4: f8d2 50d0 ldr.w r5, [r2, #208]; 0xd0 80116b8: fbc4 60c5 smlald r6, r0, r4, r5 80116bc: f8d3 40d4 ldr.w r4, [r3, #212]; 0xd4 80116c0: f8d2 50d4 ldr.w r5, [r2, #212]; 0xd4 80116c4: fbc4 60c5 smlald r6, r0, r4, r5 80116c8: f8d3 40d8 ldr.w r4, [r3, #216]; 0xd8 80116cc: f8d2 50d8 ldr.w r5, [r2, #216]; 0xd8 80116d0: fbc4 60c5 smlald r6, r0, r4, r5 80116d4: f8d3 40dc ldr.w r4, [r3, #220]; 0xdc 80116d8: f8d2 50dc ldr.w r5, [r2, #220]; 0xdc 80116dc: fbc4 60c5 smlald r6, r0, r4, r5 80116e0: f8d3 40e0 ldr.w r4, [r3, #224]; 0xe0 80116e4: f8d2 50e0 ldr.w r5, [r2, #224]; 0xe0 80116e8: fbc4 60c5 smlald r6, r0, r4, r5 80116ec: f8d3 40e4 ldr.w r4, [r3, #228]; 0xe4 80116f0: f8d2 50e4 ldr.w r5, [r2, #228]; 0xe4 80116f4: fbc4 60c5 smlald r6, r0, r4, r5 80116f8: f8d3 40e8 ldr.w r4, [r3, #232]; 0xe8 80116fc: f8d2 50e8 ldr.w r5, [r2, #232]; 0xe8 8011700: fbc4 60c5 smlald r6, r0, r4, r5 8011704: f8d3 40ec ldr.w r4, [r3, #236]; 0xec 8011708: f8d2 50ec ldr.w r5, [r2, #236]; 0xec 801170c: fbc4 60c5 smlald r6, r0, r4, r5 8011710: f8d3 40f0 ldr.w r4, [r3, #240]; 0xf0 8011714: f8d2 50f0 ldr.w r5, [r2, #240]; 0xf0 8011718: fbc4 60c5 smlald r6, r0, r4, r5 801171c: f8d3 40f4 ldr.w r4, [r3, #244]; 0xf4 8011720: f8d2 50f4 ldr.w r5, [r2, #244]; 0xf4 8011724: fbc4 60c5 smlald r6, r0, r4, r5 8011728: f8d3 40f8 ldr.w r4, [r3, #248]; 0xf8 801172c: f8d2 50f8 ldr.w r5, [r2, #248]; 0xf8 8011730: fbc4 60c5 smlald r6, r0, r4, r5 8011734: f8d3 40fc ldr.w r4, [r3, #252]; 0xfc 8011738: f8d2 50fc ldr.w r5, [r2, #252]; 0xfc 801173c: fbc4 60c5 smlald r6, r0, r4, r5 8011740: e006 b.n 8011750 <stm32f4::reset_irq_handler()+0xf98> 8011742: bf00 nop 8011744: 2001e3a0 .word 0x2001e3a0 8011748: 2001e39c .word 0x2001e39c 801174c: 200001e8 .word 0x200001e8 8011750: f8d3 4100 ldr.w r4, [r3, #256]; 0x100 8011754: f8d2 5100 ldr.w r5, [r2, #256]; 0x100 8011758: fbc4 60c5 smlald r6, r0, r4, r5 801175c: f8d3 4104 ldr.w r4, [r3, #260]; 0x104 8011760: f8d2 5104 ldr.w r5, [r2, #260]; 0x104 8011764: fbc4 60c5 smlald r6, r0, r4, r5 8011768: f8d3 4108 ldr.w r4, [r3, #264]; 0x108 801176c: f8d2 5108 ldr.w r5, [r2, #264]; 0x108 8011770: fbc4 60c5 smlald r6, r0, r4, r5 8011774: f8d3 410c ldr.w r4, [r3, #268]; 0x10c 8011778: f8d2 510c ldr.w r5, [r2, #268]; 0x10c 801177c: fbc4 60c5 smlald r6, r0, r4, r5 8011780: f8d3 4110 ldr.w r4, [r3, #272]; 0x110 8011784: f8d2 5110 ldr.w r5, [r2, #272]; 0x110 8011788: fbc4 60c5 smlald r6, r0, r4, r5 801178c: f8d3 4114 ldr.w r4, [r3, #276]; 0x114 8011790: f8d2 5114 ldr.w r5, [r2, #276]; 0x114 8011794: fbc4 60c5 smlald r6, r0, r4, r5 8011798: f8d3 4118 ldr.w r4, [r3, #280]; 0x118 801179c: f8d2 5118 ldr.w r5, [r2, #280]; 0x118 80117a0: fbc4 60c5 smlald r6, r0, r4, r5 80117a4: f8d3 411c ldr.w r4, [r3, #284]; 0x11c 80117a8: f8d2 511c ldr.w r5, [r2, #284]; 0x11c 80117ac: fbc4 60c5 smlald r6, r0, r4, r5 80117b0: f8d3 4120 ldr.w r4, [r3, #288]; 0x120 80117b4: f8d2 5120 ldr.w r5, [r2, #288]; 0x120 80117b8: fbc4 60c5 smlald r6, r0, r4, r5 80117bc: f8d3 4124 ldr.w r4, [r3, #292]; 0x124 80117c0: f8d2 5124 ldr.w r5, [r2, #292]; 0x124 80117c4: fbc4 60c5 smlald r6, r0, r4, r5 80117c8: f8d3 4128 ldr.w r4, [r3, #296]; 0x128 80117cc: f8d2 5128 ldr.w r5, [r2, #296]; 0x128 80117d0: fbc4 60c5 smlald r6, r0, r4, r5 80117d4: f8d3 412c ldr.w r4, [r3, #300]; 0x12c 80117d8: f8d2 512c ldr.w r5, [r2, #300]; 0x12c 80117dc: fbc4 60c5 smlald r6, r0, r4, r5 80117e0: f8d3 4130 ldr.w r4, [r3, #304]; 0x130 80117e4: f8d2 5130 ldr.w r5, [r2, #304]; 0x130 80117e8: fbc4 60c5 smlald r6, r0, r4, r5 80117ec: f8d3 4134 ldr.w r4, [r3, #308]; 0x134 80117f0: f8d2 5134 ldr.w r5, [r2, #308]; 0x134 80117f4: fbc4 60c5 smlald r6, r0, r4, r5 80117f8: f8d3 4138 ldr.w r4, [r3, #312]; 0x138 80117fc: f8d2 5138 ldr.w r5, [r2, #312]; 0x138 8011800: fbc4 60c5 smlald r6, r0, r4, r5 8011804: f8d3 413c ldr.w r4, [r3, #316]; 0x13c 8011808: f8d2 513c ldr.w r5, [r2, #316]; 0x13c 801180c: fbc4 60c5 smlald r6, r0, r4, r5 8011810: f8d3 4140 ldr.w r4, [r3, #320]; 0x140 8011814: f8d2 5140 ldr.w r5, [r2, #320]; 0x140 8011818: fbc4 60c5 smlald r6, r0, r4, r5 801181c: f8d3 4144 ldr.w r4, [r3, #324]; 0x144 8011820: f8d2 5144 ldr.w r5, [r2, #324]; 0x144 8011824: fbc4 60c5 smlald r6, r0, r4, r5 8011828: f8d3 4148 ldr.w r4, [r3, #328]; 0x148 801182c: f8d2 5148 ldr.w r5, [r2, #328]; 0x148 8011830: fbc4 60c5 smlald r6, r0, r4, r5 8011834: f8d3 414c ldr.w r4, [r3, #332]; 0x14c 8011838: f8d2 514c ldr.w r5, [r2, #332]; 0x14c 801183c: fbc4 60c5 smlald r6, r0, r4, r5 8011840: f8d3 4150 ldr.w r4, [r3, #336]; 0x150 8011844: f8d2 5150 ldr.w r5, [r2, #336]; 0x150 8011848: fbc4 60c5 smlald r6, r0, r4, r5 801184c: f8d3 4154 ldr.w r4, [r3, #340]; 0x154 8011850: f8d2 5154 ldr.w r5, [r2, #340]; 0x154 8011854: fbc4 60c5 smlald r6, r0, r4, r5 8011858: f8d3 4158 ldr.w r4, [r3, #344]; 0x158 801185c: f8d2 5158 ldr.w r5, [r2, #344]; 0x158 8011860: fbc4 60c5 smlald r6, r0, r4, r5 8011864: f8d3 415c ldr.w r4, [r3, #348]; 0x15c 8011868: f8d2 515c ldr.w r5, [r2, #348]; 0x15c 801186c: fbc4 60c5 smlald r6, r0, r4, r5 8011870: f8d3 4160 ldr.w r4, [r3, #352]; 0x160 8011874: f8d2 5160 ldr.w r5, [r2, #352]; 0x160 8011878: fbc4 60c5 smlald r6, r0, r4, r5 801187c: f8d3 4164 ldr.w r4, [r3, #356]; 0x164 8011880: f8d2 5164 ldr.w r5, [r2, #356]; 0x164 8011884: fbc4 60c5 smlald r6, r0, r4, r5 8011888: f8d3 4168 ldr.w r4, [r3, #360]; 0x168 801188c: f8d2 5168 ldr.w r5, [r2, #360]; 0x168 8011890: fbc4 60c5 smlald r6, r0, r4, r5 8011894: f8d3 416c ldr.w r4, [r3, #364]; 0x16c 8011898: f8d2 516c ldr.w r5, [r2, #364]; 0x16c 801189c: fbc4 60c5 smlald r6, r0, r4, r5 80118a0: f8d3 4170 ldr.w r4, [r3, #368]; 0x170 80118a4: f8d2 5170 ldr.w r5, [r2, #368]; 0x170 80118a8: fbc4 60c5 smlald r6, r0, r4, r5 80118ac: f8d3 4174 ldr.w r4, [r3, #372]; 0x174 80118b0: f8d2 5174 ldr.w r5, [r2, #372]; 0x174 80118b4: fbc4 60c5 smlald r6, r0, r4, r5 80118b8: f8d3 4178 ldr.w r4, [r3, #376]; 0x178 80118bc: f8d2 5178 ldr.w r5, [r2, #376]; 0x178 80118c0: fbc4 60c5 smlald r6, r0, r4, r5 80118c4: f8d3 417c ldr.w r4, [r3, #380]; 0x17c 80118c8: f8d2 517c ldr.w r5, [r2, #380]; 0x17c 80118cc: fbc4 60c5 smlald r6, r0, r4, r5 80118d0: f8d3 4180 ldr.w r4, [r3, #384]; 0x180 80118d4: f8d2 5180 ldr.w r5, [r2, #384]; 0x180 80118d8: fbc4 60c5 smlald r6, r0, r4, r5 80118dc: f8d3 4184 ldr.w r4, [r3, #388]; 0x184 80118e0: f8d2 5184 ldr.w r5, [r2, #388]; 0x184 80118e4: fbc4 60c5 smlald r6, r0, r4, r5 80118e8: f8d3 4188 ldr.w r4, [r3, #392]; 0x188 80118ec: f8d2 5188 ldr.w r5, [r2, #392]; 0x188 80118f0: fbc4 60c5 smlald r6, r0, r4, r5 80118f4: f8d3 418c ldr.w r4, [r3, #396]; 0x18c 80118f8: f8d2 518c ldr.w r5, [r2, #396]; 0x18c 80118fc: fbc4 60c5 smlald r6, r0, r4, r5 8011900: f8d3 4190 ldr.w r4, [r3, #400]; 0x190 8011904: f8d2 5190 ldr.w r5, [r2, #400]; 0x190 8011908: fbc4 60c5 smlald r6, r0, r4, r5 801190c: f8d3 4194 ldr.w r4, [r3, #404]; 0x194 8011910: f8d2 5194 ldr.w r5, [r2, #404]; 0x194 8011914: fbc4 60c5 smlald r6, r0, r4, r5 8011918: f8d3 4198 ldr.w r4, [r3, #408]; 0x198 801191c: f8d2 5198 ldr.w r5, [r2, #408]; 0x198 8011920: fbc4 60c5 smlald r6, r0, r4, r5 8011924: f8d3 419c ldr.w r4, [r3, #412]; 0x19c 8011928: f8d2 519c ldr.w r5, [r2, #412]; 0x19c 801192c: fbc4 60c5 smlald r6, r0, r4, r5 8011930: f8d3 41a0 ldr.w r4, [r3, #416]; 0x1a0 8011934: f8d2 51a0 ldr.w r5, [r2, #416]; 0x1a0 8011938: fbc4 60c5 smlald r6, r0, r4, r5 801193c: f8d3 41a4 ldr.w r4, [r3, #420]; 0x1a4 8011940: f8d2 51a4 ldr.w r5, [r2, #420]; 0x1a4 8011944: fbc4 60c5 smlald r6, r0, r4, r5 8011948: f8d3 41a8 ldr.w r4, [r3, #424]; 0x1a8 801194c: f8d2 51a8 ldr.w r5, [r2, #424]; 0x1a8 8011950: fbc4 60c5 smlald r6, r0, r4, r5 8011954: f8d3 41ac ldr.w r4, [r3, #428]; 0x1ac 8011958: f8d2 51ac ldr.w r5, [r2, #428]; 0x1ac 801195c: fbc4 60c5 smlald r6, r0, r4, r5 8011960: f8d3 41b0 ldr.w r4, [r3, #432]; 0x1b0 8011964: f8d2 51b0 ldr.w r5, [r2, #432]; 0x1b0 8011968: fbc4 60c5 smlald r6, r0, r4, r5 801196c: f8d3 41b4 ldr.w r4, [r3, #436]; 0x1b4 8011970: f8d2 51b4 ldr.w r5, [r2, #436]; 0x1b4 8011974: fbc4 60c5 smlald r6, r0, r4, r5 8011978: f8d3 41b8 ldr.w r4, [r3, #440]; 0x1b8 801197c: f8d2 51b8 ldr.w r5, [r2, #440]; 0x1b8 8011980: fbc4 60c5 smlald r6, r0, r4, r5 8011984: f8d3 41bc ldr.w r4, [r3, #444]; 0x1bc 8011988: f8d2 51bc ldr.w r5, [r2, #444]; 0x1bc 801198c: fbc4 60c5 smlald r6, r0, r4, r5 8011990: f8d3 41c0 ldr.w r4, [r3, #448]; 0x1c0 8011994: f8d2 51c0 ldr.w r5, [r2, #448]; 0x1c0 8011998: fbc4 60c5 smlald r6, r0, r4, r5 801199c: f8d3 41c4 ldr.w r4, [r3, #452]; 0x1c4 80119a0: f8d2 51c4 ldr.w r5, [r2, #452]; 0x1c4 80119a4: fbc4 60c5 smlald r6, r0, r4, r5 80119a8: f8d3 41c8 ldr.w r4, [r3, #456]; 0x1c8 80119ac: f8d2 51c8 ldr.w r5, [r2, #456]; 0x1c8 80119b0: fbc4 60c5 smlald r6, r0, r4, r5 80119b4: f8d3 41cc ldr.w r4, [r3, #460]; 0x1cc 80119b8: f8d2 51cc ldr.w r5, [r2, #460]; 0x1cc 80119bc: fbc4 60c5 smlald r6, r0, r4, r5 80119c0: f8d3 41d0 ldr.w r4, [r3, #464]; 0x1d0 80119c4: f8d2 51d0 ldr.w r5, [r2, #464]; 0x1d0 80119c8: fbc4 60c5 smlald r6, r0, r4, r5 80119cc: f8d3 41d4 ldr.w r4, [r3, #468]; 0x1d4 80119d0: f8d2 51d4 ldr.w r5, [r2, #468]; 0x1d4 80119d4: fbc4 60c5 smlald r6, r0, r4, r5 80119d8: f8d3 41d8 ldr.w r4, [r3, #472]; 0x1d8 80119dc: f8d2 51d8 ldr.w r5, [r2, #472]; 0x1d8 80119e0: fbc4 60c5 smlald r6, r0, r4, r5 80119e4: f8d3 41dc ldr.w r4, [r3, #476]; 0x1dc 80119e8: f8d2 51dc ldr.w r5, [r2, #476]; 0x1dc 80119ec: fbc4 60c5 smlald r6, r0, r4, r5 80119f0: f8d3 41e0 ldr.w r4, [r3, #480]; 0x1e0 80119f4: f8d2 51e0 ldr.w r5, [r2, #480]; 0x1e0 80119f8: fbc4 60c5 smlald r6, r0, r4, r5 80119fc: f8d3 41e4 ldr.w r4, [r3, #484]; 0x1e4 8011a00: f8d2 51e4 ldr.w r5, [r2, #484]; 0x1e4 8011a04: fbc4 60c5 smlald r6, r0, r4, r5 8011a08: f8d3 41e8 ldr.w r4, [r3, #488]; 0x1e8 8011a0c: f8d2 51e8 ldr.w r5, [r2, #488]; 0x1e8 8011a10: fbc4 60c5 smlald r6, r0, r4, r5 8011a14: f8d3 41ec ldr.w r4, [r3, #492]; 0x1ec 8011a18: f8d2 51ec ldr.w r5, [r2, #492]; 0x1ec 8011a1c: fbc4 60c5 smlald r6, r0, r4, r5 8011a20: f8d3 41f0 ldr.w r4, [r3, #496]; 0x1f0 8011a24: f8d2 51f0 ldr.w r5, [r2, #496]; 0x1f0 8011a28: fbc4 60c5 smlald r6, r0, r4, r5 8011a2c: f8d3 41f4 ldr.w r4, [r3, #500]; 0x1f4 8011a30: f8d2 51f4 ldr.w r5, [r2, #500]; 0x1f4 8011a34: fbc4 60c5 smlald r6, r0, r4, r5 8011a38: f8d3 41f8 ldr.w r4, [r3, #504]; 0x1f8 8011a3c: f8d2 51f8 ldr.w r5, [r2, #504]; 0x1f8 8011a40: fbc4 60c5 smlald r6, r0, r4, r5 8011a44: f8d3 41fc ldr.w r4, [r3, #508]; 0x1fc 8011a48: f8d2 51fc ldr.w r5, [r2, #508]; 0x1fc 8011a4c: fbc4 60c5 smlald r6, r0, r4, r5 8011a50: f8d3 4200 ldr.w r4, [r3, #512]; 0x200 8011a54: f8d2 5200 ldr.w r5, [r2, #512]; 0x200 8011a58: fbc4 60c5 smlald r6, r0, r4, r5 8011a5c: f8d3 4204 ldr.w r4, [r3, #516]; 0x204 8011a60: f8d2 5204 ldr.w r5, [r2, #516]; 0x204 8011a64: fbc4 60c5 smlald r6, r0, r4, r5 8011a68: f8d3 4208 ldr.w r4, [r3, #520]; 0x208 8011a6c: f8d2 5208 ldr.w r5, [r2, #520]; 0x208 8011a70: fbc4 60c5 smlald r6, r0, r4, r5 8011a74: f8d3 420c ldr.w r4, [r3, #524]; 0x20c 8011a78: f8d2 520c ldr.w r5, [r2, #524]; 0x20c 8011a7c: fbc4 60c5 smlald r6, r0, r4, r5 8011a80: f8d3 4210 ldr.w r4, [r3, #528]; 0x210 8011a84: f8d2 5210 ldr.w r5, [r2, #528]; 0x210 8011a88: fbc4 60c5 smlald r6, r0, r4, r5 8011a8c: f8d3 4214 ldr.w r4, [r3, #532]; 0x214 8011a90: f8d2 5214 ldr.w r5, [r2, #532]; 0x214 8011a94: fbc4 60c5 smlald r6, r0, r4, r5 8011a98: f8d3 4218 ldr.w r4, [r3, #536]; 0x218 8011a9c: f8d2 5218 ldr.w r5, [r2, #536]; 0x218 8011aa0: fbc4 60c5 smlald r6, r0, r4, r5 8011aa4: f8d3 421c ldr.w r4, [r3, #540]; 0x21c 8011aa8: f8d2 521c ldr.w r5, [r2, #540]; 0x21c 8011aac: fbc4 60c5 smlald r6, r0, r4, r5 8011ab0: f8d3 4220 ldr.w r4, [r3, #544]; 0x220 8011ab4: f8d2 5220 ldr.w r5, [r2, #544]; 0x220 8011ab8: fbc4 60c5 smlald r6, r0, r4, r5 8011abc: f8d3 4224 ldr.w r4, [r3, #548]; 0x224 8011ac0: f8d2 5224 ldr.w r5, [r2, #548]; 0x224 8011ac4: fbc4 60c5 smlald r6, r0, r4, r5 8011ac8: f8d3 4228 ldr.w r4, [r3, #552]; 0x228 8011acc: f8d2 5228 ldr.w r5, [r2, #552]; 0x228 8011ad0: fbc4 60c5 smlald r6, r0, r4, r5 8011ad4: f8d3 422c ldr.w r4, [r3, #556]; 0x22c 8011ad8: f8d2 522c ldr.w r5, [r2, #556]; 0x22c 8011adc: fbc4 60c5 smlald r6, r0, r4, r5 8011ae0: f8d3 4230 ldr.w r4, [r3, #560]; 0x230 8011ae4: f8d2 5230 ldr.w r5, [r2, #560]; 0x230 8011ae8: fbc4 60c5 smlald r6, r0, r4, r5 8011aec: f8d3 4234 ldr.w r4, [r3, #564]; 0x234 8011af0: f8d2 5234 ldr.w r5, [r2, #564]; 0x234 8011af4: fbc4 60c5 smlald r6, r0, r4, r5 8011af8: f8d3 4238 ldr.w r4, [r3, #568]; 0x238 8011afc: f8d2 5238 ldr.w r5, [r2, #568]; 0x238 8011b00: fbc4 60c5 smlald r6, r0, r4, r5 8011b04: f8d3 423c ldr.w r4, [r3, #572]; 0x23c 8011b08: f8d2 523c ldr.w r5, [r2, #572]; 0x23c 8011b0c: fbc4 60c5 smlald r6, r0, r4, r5 8011b10: f8d3 4240 ldr.w r4, [r3, #576]; 0x240 8011b14: f8d2 5240 ldr.w r5, [r2, #576]; 0x240 8011b18: fbc4 60c5 smlald r6, r0, r4, r5 8011b1c: f8d3 4244 ldr.w r4, [r3, #580]; 0x244 8011b20: f8d2 5244 ldr.w r5, [r2, #580]; 0x244 8011b24: fbc4 60c5 smlald r6, r0, r4, r5 8011b28: f8d3 4248 ldr.w r4, [r3, #584]; 0x248 8011b2c: f8d2 5248 ldr.w r5, [r2, #584]; 0x248 8011b30: fbc4 60c5 smlald r6, r0, r4, r5 8011b34: f8d3 424c ldr.w r4, [r3, #588]; 0x24c 8011b38: f8d2 524c ldr.w r5, [r2, #588]; 0x24c 8011b3c: fbc4 60c5 smlald r6, r0, r4, r5 8011b40: f8d3 4250 ldr.w r4, [r3, #592]; 0x250 8011b44: f8d2 5250 ldr.w r5, [r2, #592]; 0x250 8011b48: fbc4 60c5 smlald r6, r0, r4, r5 8011b4c: f8d3 4254 ldr.w r4, [r3, #596]; 0x254 8011b50: f8d2 5254 ldr.w r5, [r2, #596]; 0x254 8011b54: fbc4 60c5 smlald r6, r0, r4, r5 8011b58: f8d3 4258 ldr.w r4, [r3, #600]; 0x258 8011b5c: f8d2 5258 ldr.w r5, [r2, #600]; 0x258 8011b60: fbc4 60c5 smlald r6, r0, r4, r5 8011b64: f8d3 425c ldr.w r4, [r3, #604]; 0x25c 8011b68: f8d2 525c ldr.w r5, [r2, #604]; 0x25c 8011b6c: fbc4 60c5 smlald r6, r0, r4, r5 8011b70: f8d3 4260 ldr.w r4, [r3, #608]; 0x260 8011b74: f8d2 5260 ldr.w r5, [r2, #608]; 0x260 8011b78: fbc4 60c5 smlald r6, r0, r4, r5 8011b7c: f8d3 4264 ldr.w r4, [r3, #612]; 0x264 8011b80: f8d2 5264 ldr.w r5, [r2, #612]; 0x264 8011b84: fbc4 60c5 smlald r6, r0, r4, r5 8011b88: f8d3 4268 ldr.w r4, [r3, #616]; 0x268 8011b8c: f8d2 5268 ldr.w r5, [r2, #616]; 0x268 8011b90: fbc4 60c5 smlald r6, r0, r4, r5 8011b94: f8d3 426c ldr.w r4, [r3, #620]; 0x26c 8011b98: f8d2 526c ldr.w r5, [r2, #620]; 0x26c 8011b9c: fbc4 60c5 smlald r6, r0, r4, r5 8011ba0: f8d3 4270 ldr.w r4, [r3, #624]; 0x270 8011ba4: f8d2 5270 ldr.w r5, [r2, #624]; 0x270 8011ba8: fbc4 60c5 smlald r6, r0, r4, r5 8011bac: f8d3 4274 ldr.w r4, [r3, #628]; 0x274 8011bb0: f8d2 5274 ldr.w r5, [r2, #628]; 0x274 8011bb4: fbc4 60c5 smlald r6, r0, r4, r5 8011bb8: f8d3 4278 ldr.w r4, [r3, #632]; 0x278 8011bbc: f8d2 5278 ldr.w r5, [r2, #632]; 0x278 8011bc0: fbc4 60c5 smlald r6, r0, r4, r5 8011bc4: f8d3 427c ldr.w r4, [r3, #636]; 0x27c 8011bc8: f8d2 527c ldr.w r5, [r2, #636]; 0x27c 8011bcc: fbc4 60c5 smlald r6, r0, r4, r5 cx += 16; 8011bd0: f503 7320 add.w r3, r3, #640; 0x280 ); 8011bd4: 4d78 ldr r5, [pc, #480]; (8011db8 <stm32f4::reset_irq_handler()+0x1600>) for ( size_t i = 0; i < el / 16; i++ ) 8011bd6: 4553 cmp r3, sl ); 8011bd8: e9c5 6000 strd r6, r0, [r5] cw += 16; 8011bdc: f502 7220 add.w r2, r2, #640; 0x280 for ( size_t i = 0; i < el / 16; i++ ) 8011be0: f47f ac27 bne.w 8011432 <stm32f4::reset_irq_handler()+0xc7a> inline uint32_t cyccnt_stop () { NRO return cyccnt; } 8011be4: 4f75 ldr r7, [pc, #468]; (8011dbc <stm32f4::reset_irq_handler()+0x1604>) 8011be6: 6879 ldr r1, [r7, #4] } cnt[2] = dwt.cyccnt_stop(); 8011be8: 4c75 ldr r4, [pc, #468]; (8011dc0 <stm32f4::reset_irq_handler()+0x1608>) 8011bea: 60a1 str r1, [r4, #8] freq = rcc.cyc2us(cnt[2]); 8011bec: ed94 7a02 vldr s14, [r4, #8] inline uint32_t cyc2us(const uint32_t cycles ) { NRO return cyc2us(cycles , sys_clock_freq()); } 8011bf0: f7f6 fa08 bl 8008004 <stm32f4::rcc_t::sys_clock_freq() [clone .constprop.66]> 8011bf4: ee00 0a10 vmov s0, r0 inline uint32_t cyc2us(const uint32_t cycles , const uint32_t scf) { NRO return cycles * 1000000.0f / scf; } 8011bf8: eddf 7a72 vldr s15, [pc, #456]; 8011dc4 <stm32f4::reset_irq_handler()+0x160c> 8011bfc: 4e72 ldr r6, [pc, #456]; (8011dc8 <stm32f4::reset_irq_handler()+0x1610>) 8011bfe: eef8 0a47 vcvt.f32.u32 s1, s14 8011c02: eeb8 1a40 vcvt.f32.u32 s2, s0 8011c06: ee60 1aa7 vmul.f32 s3, s1, s15 8011c0a: ee81 2a81 vdiv.f32 s4, s3, s2 8011c0e: eefc 2ac2 vcvt.u32.f32 s5, s4 8011c12: eeb8 3a62 vcvt.f32.u32 s6, s5 8011c16: ed86 3a00 vstr s6, [r6] nop_rep(5); 8011c1a: bf00 nop 8011c1c: bf00 nop 8011c1e: bf00 nop 8011c20: bf00 nop 8011c22: bf00 nop 4. вычисление функции atan2(y,x), 145 тактов процессора // вычисление atan2 nop_rep(2); dwt.cyccnt_start(); freq = vdt::fast_atan2f(cnt[0] , cnt[1]); cnt[2] = dwt.cyccnt_stop(); nop_rep(2); // вычисление atan2 nop_rep(2); 8011b6e: bf00 nop 8011b70: bf00 nop inline void cyccnt_start () { NRO cyccnt = 0; } 8011b72: 2000 movs r0, #0 8011b74: 6078 str r0, [r7, #4] dwt.cyccnt_start(); freq = vdt::fast_atan2f(cnt[0] , cnt[1]); 8011b76: edd4 3a00 vldr s7, [r4] 8011b7a: ed94 4a01 vldr s8, [r4, #4] 8011b7e: eeb8 0a63 vcvt.f32.u32 s0, s7 8011b82: eef8 4a44 vcvt.f32.u32 s9, s8 inline float __attribute__ ((always_inline)) absf (float value) { float result; asm volatile ( "vabs.f32 %0, %1 \r\n" : "=w" (result) : "w" (value) ); 8011b86: eeb0 5ae4 vabs.f32 s10, s9 8011b8a: eef0 5a45 vmov.f32 s11, s10 8011b8e: eeb0 6ac0 vabs.f32 s12, s0 // move in first octant float xx = details::absf(x); float yy = details::absf(y); float tmp (0.0f); if (yy>xx) { 8011b92: eeb4 5ac6 vcmpe.f32 s10, s12 8011b96: eef1 fa10 vmrs APSR_nzcv, fpscr float yy = details::absf(y); 8011b9a: bf5c itt pl 8011b9c: eeb0 5a46 vmovpl.f32 s10, s12 float xx = details::absf(x); 8011ba0: eeb0 6a65 vmovpl.f32 s12, s11 } // To avoid the fpe, we protect against /0. const float oneIfXXZero = (xx==0.f); float t=yy/(xx/*+oneIfXXZero*/); 8011ba4: eec5 0a06 vdiv.f32 s1, s10, s12 float z=t; if( t > 0.4142135623730950f ) // * tan pi/8 8011ba8: eddf 6aa4 vldr s13, [pc, #656]; 8011e3c <stm32f4::reset_irq_handler()+0x1730> const float oneIfXXZero = (xx==0.f); 8011bac: ed9f 1aa4 vldr s2, [pc, #656]; 8011e40 <stm32f4::reset_irq_handler()+0x1734> float tmp (0.0f); 8011bb0: bf58 it pl 8011bb2: eddf 2aa3 vldrpl s5, [pc, #652]; 8011e40 <stm32f4::reset_irq_handler()+0x1734> const float oneIfXXZero = (xx==0.f); 8011bb6: eeb5 6a40 vcmp.f32 s12, #0.0 tmp =1.f; 8011bba: bf48 it mi 8011bbc: eef7 2a00 vmovmi.f32 s5, #112; 0x3f800000 1.0 const float oneIfXXZero = (xx==0.f); 8011bc0: eef7 7a00 vmov.f32 s15, #112; 0x3f800000 1.0 8011bc4: eef1 fa10 vmrs APSR_nzcv, fpscr if( t > 0.4142135623730950f ) // * tan pi/8 8011bc8: eef4 0ae6 vcmpe.f32 s1, s13 const float oneIfXXZero = (xx==0.f); 8011bcc: bf0c ite eq 8011bce: eeb0 7a41 vmoveq.f32 s14, s2 8011bd2: eeb0 7a67 vmovne.f32 s14, s15 if( t > 0.4142135623730950f ) // * tan pi/8 8011bd6: eef1 fa10 vmrs APSR_nzcv, fpscr 8011bda: dd36 ble.n 8011c4a <stm32f4::reset_irq_handler()+0x153e> z = (t-1.0f)/(t+1.0f); 8011bdc: ee70 1ae7 vsub.f32 s3, s1, s15 8011be0: ee70 6aa7 vadd.f32 s13, s1, s15 //printf("%e %e %e %e\n",yy,xx,t,z); float z2 = z * z; float ret =(((( 8.05374449538e-2f * z2 - 1.38776856032E-1f) * z2 8011be4: ed9f 2a97 vldr s4, [pc, #604]; 8011e44 <stm32f4::reset_irq_handler()+0x1738> 8011be8: ed9f 3a97 vldr s6, [pc, #604]; 8011e48 <stm32f4::reset_irq_handler()+0x173c> + 1.99777106478E-1f) * z2 8011bec: eddf 5a97 vldr s11, [pc, #604]; 8011e4c <stm32f4::reset_irq_handler()+0x1740> - 3.33329491539E-1f) * z2 * z 8011bf0: ed9f 6a97 vldr s12, [pc, #604]; 8011e50 <stm32f4::reset_irq_handler()+0x1744> z = (t-1.0f)/(t+1.0f); 8011bf4: eec1 3aa6 vdiv.f32 s7, s3, s13 // Here we put the result to 0 if xx was 0, if not nothing happens! ret*= (1.f - oneIfXXZero); // move back in place if (y==0.f) ret=0.f; 8011bf8: eeb4 0a41 vcmp.f32 s0, s2 float z2 = z * z; 8011bfc: ee23 4aa3 vmul.f32 s8, s7, s7 ret*= (1.f - oneIfXXZero); 8011c00: ee27 7a23 vmul.f32 s14, s14, s7 - 1.38776856032E-1f) * z2 8011c04: eea4 3a02 vfma.f32 s6, s8, s4 if (y==0.f) ret=0.f; 8011c08: eef1 fa10 vmrs APSR_nzcv, fpscr + 1.99777106478E-1f) * z2 8011c0c: eee3 5a04 vfma.f32 s11, s6, s8 - 3.33329491539E-1f) * z2 * z 8011c10: eea4 6a25 vfma.f32 s12, s8, s11 + z ); 8011c14: eee4 7a06 vfma.f32 s15, s8, s12 ret*= (1.f - oneIfXXZero); 8011c18: ee27 5a87 vmul.f32 s10, s15, s14 if (y==0.f) ret=0.f; 8011c1c: d058 beq.n 8011cd0 <stm32f4::reset_irq_handler()+0x15c4> if( t > 0.4142135623730950f ) ret += details::VDT_PI_4_F; 8011c1e: eddf 4a87 vldr s9, [pc, #540]; 8011e3c <stm32f4::reset_irq_handler()+0x1730> 8011c22: eef4 0ae4 vcmpe.f32 s1, s9 8011c26: eef1 fa10 vmrs APSR_nzcv, fpscr 8011c2a: dd2b ble.n 8011c84 <stm32f4::reset_irq_handler()+0x1578> 8011c2c: eddf 4a89 vldr s9, [pc, #548]; 8011e54 <stm32f4::reset_irq_handler()+0x1748> 8011c30: ee35 5a24 vadd.f32 s10, s10, s9 8011c34: e026 b.n 8011c84 <stm32f4::reset_irq_handler()+0x1578> led_set_off_ticks(index, led_gpio_conf[index].off); 8011c36: 6922 ldr r2, [r4, #16] 8011c38: f7ff b9c2 b.w 8010fc0 <stm32f4::reset_irq_handler()+0x8b4> ((volatile_data_32bit_t*)this)->uval |= (1 << (index)); 8011c3c: 6848 ldr r0, [r1, #4] 8011c3e: fa0e f209 lsl.w r2, lr, r9 8011c42: 4302 orrs r2, r0 8011c44: 604a str r2, [r1, #4] 8011c46: f7ff b9ab b.w 8010fa0 <stm32f4::reset_irq_handler()+0x894> float z2 = z * z; 8011c4a: ee60 1aa0 vmul.f32 s3, s1, s1 - 1.38776856032E-1f) * z2 8011c4e: ed9f 2a7d vldr s4, [pc, #500]; 8011e44 <stm32f4::reset_irq_handler()+0x1738> 8011c52: ed9f 3a7d vldr s6, [pc, #500]; 8011e48 <stm32f4::reset_irq_handler()+0x173c> + 1.99777106478E-1f) * z2 8011c56: eddf 3a7d vldr s7, [pc, #500]; 8011e4c <stm32f4::reset_irq_handler()+0x1740> - 3.33329491539E-1f) * z2 * z 8011c5a: ed9f 4a7d vldr s8, [pc, #500]; 8011e50 <stm32f4::reset_irq_handler()+0x1744> - 1.38776856032E-1f) * z2 8011c5e: eea1 3a82 vfma.f32 s6, s3, s4 ret*= (1.f - oneIfXXZero); 8011c62: ee67 4a20 vmul.f32 s9, s14, s1 + 1.99777106478E-1f) * z2 8011c66: eee1 3a83 vfma.f32 s7, s3, s6 if (y==0.f) ret=0.f; 8011c6a: eeb5 0a40 vcmp.f32 s0, #0.0 - 3.33329491539E-1f) * z2 * z 8011c6e: eea3 4aa1 vfma.f32 s8, s7, s3 if (y==0.f) ret=0.f; 8011c72: eef1 fa10 vmrs APSR_nzcv, fpscr + z ); 8011c76: eee1 7a84 vfma.f32 s15, s3, s8 ret*= (1.f - oneIfXXZero); 8011c7a: ee27 5aa4 vmul.f32 s10, s15, s9 if (y==0.f) ret=0.f; 8011c7e: d1ce bne.n 8011c1e <stm32f4::reset_irq_handler()+0x1512> 8011c80: eeb0 5a41 vmov.f32 s10, s2 if (tmp!=0) ret = details::VDT_PI_2_F - ret; 8011c84: eef5 2a40 vcmp.f32 s5, #0.0 8011c88: eef1 fa10 vmrs APSR_nzcv, fpscr 8011c8c: bf18 it ne 8011c8e: eddf 4a72 vldrne s9, [pc, #456]; 8011e58 <stm32f4::reset_irq_handler()+0x174c> 8011c92: 4b69 ldr r3, [pc, #420]; (8011e38 <stm32f4::reset_irq_handler()+0x172c>) 8011c94: bf18 it ne 8011c96: ee34 5ac5 vsubne.f32 s10, s9, s10 8011c9a: ed83 5a00 vstr s10, [r3] inline uint32_t cyccnt_stop () { NRO return cyccnt; } 8011c9e: 4d63 ldr r5, [pc, #396]; (8011e2c <stm32f4::reset_irq_handler()+0x1720>) 8011ca0: 686f ldr r7, [r5, #4] cnt[2] = dwt.cyccnt_stop(); 8011ca2: 4a63 ldr r2, [pc, #396]; (8011e30 <stm32f4::reset_irq_handler()+0x1724>) 8011ca4: 6097 str r7, [r2, #8] nop_rep(2); 8011ca6: bf00 nop 8011ca8: bf00 nop Изменено 22 сентября, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 22 сентября, 2017 Опубликовано 22 сентября, 2017 (изменено) · Жалоба 5. вот еще забавный пример - фиксированная запятая с насыщением силами GCC _Sat _Fract s[32]; _Sat _Fract h[32]; volatile _Sat _Accum ac ; _Sat _Accum filter( const _Sat _Fract* x , const _Sat _Fract* h , uint32_t i ) { _Accum accum = 0; while (i--) { accum += *(x++) * *(h++); } return accum; } void gcc_fract_test() { asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); ac = filter(s , h , 32 ); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); } выход генератора 800800c: bf00 nop asm volatile ("nop"); 800800e: bf00 nop asm volatile ("nop"); 8008010: bf00 nop 8008012: 4f2a ldr r7, [pc, #168]; (80080bc <gcc_fract_test+0xb4>) accum += *(x++) * *(h++); 8008014: 4e2a ldr r6, [pc, #168]; (80080c0 <gcc_fract_test+0xb8>) 8008016: 463d mov r5, r7 8008018: f836 1b02 ldrh.w r1, [r6], #2 800801c: f835 0b02 ldrh.w r0, [r5], #2 8008020: f001 fca2 bl 8009968 <__gnu_ssmulhq3> 8008024: f001 fc9e bl 8009964 <__gnu_satfracthqsa> 8008028: 2400 movs r4, #0 800802a: fa84 f880 qadd r8, r0, r4 800802e: f836 1b02 ldrh.w r1, [r6], #2 8008032: f835 0b02 ldrh.w r0, [r5], #2 8008036: f001 fc97 bl 8009968 <__gnu_ssmulhq3> 800803a: f001 fc93 bl 8009964 <__gnu_satfracthqsa> 800803e: 3740 adds r7, #64; 0x40 8008040: fa88 f480 qadd r4, r0, r8 8008044: 46a8 mov r8, r5 8008046: 46b1 mov r9, r6 8008048: f838 0b02 ldrh.w r0, [r8], #2 800804c: f839 1b02 ldrh.w r1, [r9], #2 8008050: f001 fc8a bl 8009968 <__gnu_ssmulhq3> 8008054: f001 fc86 bl 8009964 <__gnu_satfracthqsa> 8008058: f8b9 1000 ldrh.w r1, [r9] 800805c: fa84 f480 qadd r4, r0, r4 8008060: f8b8 0000 ldrh.w r0, [r8] 8008064: f001 fc80 bl 8009968 <__gnu_ssmulhq3> 8008068: f001 fc7c bl 8009964 <__gnu_satfracthqsa> 800806c: 88b1 ldrh r1, [r6, #4] 800806e: fa84 f880 qadd r8, r0, r4 8008072: 88a8 ldrh r0, [r5, #4] 8008074: f001 fc78 bl 8009968 <__gnu_ssmulhq3> 8008078: f001 fc74 bl 8009964 <__gnu_satfracthqsa> 800807c: 88f1 ldrh r1, [r6, #6] 800807e: fa88 f980 qadd r9, r0, r8 8008082: 88e8 ldrh r0, [r5, #6] 8008084: f001 fc70 bl 8009968 <__gnu_ssmulhq3> 8008088: f001 fc6c bl 8009964 <__gnu_satfracthqsa> 800808c: 350a adds r5, #10 800808e: 360a adds r6, #10 8008090: fa89 f480 qadd r4, r0, r9 8008094: f836 1c02 ldrh.w r1, [r6, #-2] 8008098: f835 0c02 ldrh.w r0, [r5, #-2] 800809c: f001 fc64 bl 8009968 <__gnu_ssmulhq3> 80080a0: f001 fc60 bl 8009964 <__gnu_satfracthqsa> while (i--) 80080a4: 42bd cmp r5, r7 accum += *(x++) * *(h++); 80080a6: fa84 f080 qadd r0, r0, r4 80080aa: 4604 mov r4, r0 while (i--) 80080ac: d1ca bne.n 8008044 <gcc_fract_test+0x3c> ac = filter(s , h , 32 ); 80080ae: 4b05 ldr r3, [pc, #20]; (80080c4 <gcc_fract_test+0xbc>) 80080b0: 6018 str r0, [r3, #0] asm volatile ("nop"); 80080b2: bf00 nop asm volatile ("nop"); 80080b4: bf00 nop asm volatile ("nop"); 80080b6: bf00 nop поскольку вызовы операций дробной арифметики внутри libgcc то тут положено раскрыть что там внутри хотя бы одного вызова, например __gnu_ssmulhq3 00000000 <__gnu_ssmulhq3>: 0: e92d4010 push {r4, lr} 4: e3a02001 mov r2, #1 8: ebfffffe bl 0 <__gnu_mulhelperhq> c: e8bd4010 pop {r4, lr} 10: e12fff1e bx lr 00000000 <__gnu_mulhelperhq>: 0: e1a03800 lsl r3, r0, #16 4: e1a01801 lsl r1, r1, #16 8: e52de004 push {lr} ; (str lr, [sp, #-4]!) c: e1a0c843 asr ip, r3, #16 10: e1a0e841 asr lr, r1, #16 14: e0000c9e mul r0, lr, ip 18: e2803901 add r3, r0, #16384 ; 0x4000 1c: e24dd00c sub sp, sp, #12 20: e1a007c3 asr r0, r3, #15 24: e3520000 cmp r2, #0 28: e58d0004 str r0, [sp, #4] 2c: 1a000002 bne 3c <__gnu_mulhelperhq+0x3c> 30: e28dd00c add sp, sp, #12 34: e49de004 pop {lr} ; (ldr lr, [sp], #4) 38: e12fff1e bx lr 3c: e28d0004 add r0, sp, #4 40: ebfffffe bl 0 <__gnu_saturate1hq> 44: e59d0004 ldr r0, [sp, #4] 48: e28dd00c add sp, sp, #12 4c: e49de004 pop {lr} ; (ldr lr, [sp], #4) 50: e12fff1e bx lr 00000000 <__gnu_saturate1hq>: 0: e59f2020 ldr r2, [pc, #32] ; 28 <__gnu_saturate1hq+0x28> 4: e5903000 ldr r3, [r0] 8: e1530002 cmp r3, r2 c: da000001 ble 18 <__gnu_saturate1hq+0x18> 10: e5802000 str r2, [r0] 14: e12fff1e bx lr 18: e59f100c ldr r1, [pc, #12] ; 2c <__gnu_saturate1hq+0x2c> 1c: e3730902 cmn r3, #32768 ; 0x8000 20: b5801000 strlt r1, [r0] 24: e12fff1e bx lr 28: 00007fff .word 0x00007fff 2c: ffff8000 .word 0xffff8000 собственно это все что вызовется при умножении с насыщением. быстро это или медленно работает эта рифметика я не не знаю, собрал поддержку этих типов для того чтобы посмотреть как оно вообще работает, но то что предлагают библиотеками (например https://en.wikipedia.org/wiki/Libfixmath) можно сказать что не работет вообще - ну тоесть считает но оооочень медленно. по моим ощущениям. Изменено 22 сентября, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 13 мая, 2018 Опубликовано 13 мая, 2018 · Жалоба Свежак! на этот раз 9 версия GCC. arm-kgp-eabi-gcc хост linux64 http://www.klen.org/Files/DevTools/x86_64-...0513_PETUNIA.7z 0. как бы 9 версия GCC из транка... ктобы что не говорил но LTO работает надежнее. компиллер на моих проектах ни разу не упал, что раньше на 7 и 8 версии часто случалось чего новго я тут накрутил... 1. все тулсы собраны с оптимизацией LTO, и под CPU sandy bridge, вроде бы стало быстрее компилять линковать. 2. отдельные заведенные через mulilib arm-таргеты libc,libstdc++, итд (лежат arm-kgp-eabi/arm-kgp-eabi/lib/thumb/... arm-kgp-eabi/lib/gcc/arm-kgp-eabi/9.0.0/thumb... ) cortex-m3 ( линкуются ) cortex-m3 + Ofast cortex-m3 + Os cortex-m4 + hard_float cortex-m4 + hard_float + Ofast cortex-m4 + hard_float + Os cortex-m7 + hard_float_sp cortex-m7 + hard_float_sp + Ofast cortex-m7 + hard_float_sp + Os cortex-m7 + hard_float_dp cortex-m7 + hard_float_dp + Ofast cortex-m7 + hard_float_dp + Os 3. Все таргеты собраны с LTO секциями и готовы к этой оптимизации при линковке 3. для таргетов cortex-m4 + hard_float + *, cortex-m7 + hard_float_sp + *, cortex-m7 + hard_float_dp + * добавлена отмодифицированная до "базовый операнд - float" библиотека математических вычислений GSL ( почитать https://ru.wikipedia.org/wiki/GNU_Scientific_Library ), базовый тип всех функций - float! 4. binutils собран с поддержкой плагинов, утилитки ar, nm, ranlib автоматом поднимают liblto-plugin.so ( arm-kgp-eabi/lib/bfd-plugins/liblto-plugin.so -> arm-kgp-eabi/libexec/gcc/arm-kgp-eabi/9.0.0/liblto-plugin.so ), это функционал необходим ar, nm, ranlib изготовилть "правильную" статическую либу с поддержкой LTO секций, а линкеру ее правильно прилинковать с LTO оптимизацией. советую начать эксперименты с компиляцие с ключами для компиляции (пример для cortex-m4): выжимаем скорость: -gdwarf-4 -g3 -gno-strict-dwarf -fvar-tracking-assignments -fverbose-asm -mfloat-abi=hard -mcpu=cortex-m4 -mtune=cortex-m4 -mfpu=fpv4-sp-d16 -Ofast -ffunction-sections -fdata-sections -fgraphite -funroll-loops -f -funroll-all-loops -fvariable-expansion-in-unroller выжимаем размер: -gdwarf-4 -g3 -gno-strict-dwarf -fvar-tracking-assignments -fverbose-asm -mfloat-abi=hard -mcpu=cortex-m4 -mtune=cortex-m4 -mfpu=fpv4-sp-d16 -Os -ffunction-sections -fdata-sections -fgraphite и для линковы то что выше плюс -fuse-linker-plugin -Wl,-gc-sections если все проканает, то можно попробовать добавить к ключам компиляции и линковки -flto или -flto -ffat-lto-objects - и пробывать LTO оптимизацию. у меня надежно линкуются все проекты и работают в железе. прошивка уменьшается в среднем на 30% и работает быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 7 октября, 2018 Опубликовано 7 октября, 2018 (изменено) · Жалоба On 5/14/2018 at 3:15 AM, klen said: arm-kgp-eabi-gcc хост linux64 У меня не работает: build $ /opt/arm-kgp-eabi/bin/arm-kgp-eabi-gcc --version Недопустимая инструкция (стек памяти сброшен на диск) Последняя строчка из dmesg: [175140.290577] traps: arm-kgp-eabi-gc[8187] trap invalid opcode ip:4056ea sp:7ffc4ad6a220 error:0 in arm-kgp-eabi-gcc[403000+63000] Host gentoo phenom II X6 P. S. предыдущая версия работает, но проект собрать не может. На этапе линковки вываливает кучу ошибок: /tmp/cc8PlR0G.s: Assembler messages: /tmp/cc8PlR0G.s:15: Error: selected processor does not support ARM opcodes /tmp/cc8PlR0G.s:22: Error: attempt to use an ARM instruction on a Thumb-only processor -- `cmp r2,#0' ... /tmp/cc8PlR0G.s:1441: Error: attempt to use an ARM instruction on a Thumb-only processor -- `b .L548' lto-wrapper: fatal error: /opt/arm-kgp-eabi/bin/arm-kgp-eabi-g++ returned 1 exit status compilation terminated. /opt/arm-kgp-eabi_20170625/bin/../lib/gcc/arm-kgp-eabi/8.0.0/../../../../arm-kgp-eabi/bin/ld: error: lto-wrapper failed collect2: error: ld returned 1 exit status И причём здесь lto ? Сборка с lto вылетает с "Error: offset out of range". точно так же как писал ранее. Изменено 7 октября, 2018 пользователем Terminator дополнил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба по первому вопросу знаю почему так- собрал с поддежкой ivybridge + avx, поэтому и падает на младших процах, соберал для generic x86_64, выложу на днях, правда ровно в два раза медленне компиляция и линковка... ро второму тоже понятно, библиотеки криво разложил... опять же выложу потестите, косяг организационный... UPDATE пересобрал для generic x86_64 и ivybridge+avx...... потестил по отдельности (это как показывает практика - ничего не значит, у автора всегда все работает :)) FTP сдох - починю выложу на тестироване. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 1 декабря, 2018 Опубликовано 1 декабря, 2018 · Жалоба Свежак! наконец то починили заливку на сервак! какая всетаки гадость эта ваша рыба за... WebDAV по сравнению с старым добрым FTP..... хост linux64 http://klen.org/Files/DevTools/x86_64-kgp-linux-gnu/arm-kgp-eabi_@_x86_64-kgp-linux-gnu_PLANTAGO.7z на этот раз релизный gcc 8.2.0 + мои муки на предмет оптимизации мультилиба и выпиливания исключений из libgcc(как обычно) собрал тулсы без использования avx инструкций хоста - предыдущий билд(собранный с avx) заработал не у всех из-за старых процессоров в компах. таргет - косяков не обнаружил, месяц все рабочие проекты собираются и работают. в ближайщее время планирую всунуть в мультилиб отдельно cortex-m0 с его вариациями (./+/small/fast multiply). предполагается изготовить девайс на stm32l011 - после беглого прочтения программинг маниакала сделал вывод что у этой серии микросхем ядро - cortex-m0+ fast multiply. то есть целочисленный умножитель параллельный 1 такт (НЕ последовательный как в ядрах cortex-m0+ small multiply), правильно? основанием считать я принял https://www.st.com/content/ccc/resource/technical/document/programming_manucoal/18/b4/a2/d9/87/cd/4f/18/DM00104451.pdf/files/DM00104451.pdf/jcr:content/translations/en.DM00104451.pdf PM0223 страница 10/10 ... providing high-end processing hardware including a single-cycle multiplier для масдая собранный из репозитория сегодняшняя ревизия host mingw64 http://klen.org/Files/DevTools/x86_64-kgp-mingw32/arm-kgp-eabi_@_x86_64-kgp-mingw32_20181201_PLANTAGO.7z я его не проверял - нечем. традиционно нет машины с масдаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба Что-то пошло не так :) Это без lto /opt/arm-kgp-eabi/bin/arm-kgp-eabi-ld.bfd: /tmp/ccXxvaiY.ltrans0.ltrans.o: in function `log10f': /home/LOCALNET/term/Projects/arm/workspace/0xA00_cpu/build/../../../../../../../../src/newlib/newlib/libm/math/wf_log10.c:67: undefined reference to `nan' collect2: error: ld returned 1 exit status Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 декабря, 2018 Опубликовано 6 декабря, 2018 · Жалоба ничего страшного. починим. проверю почему так. libm не использую, .. надо будет сделать набор тестов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 9 декабря, 2018 Опубликовано 9 декабря, 2018 · Жалоба да... символ 'nan' линкером не находится.. так и есть. поправил беду.. http://klen.org/Files/DevTools/x86_64-kgp-linux-gnu/arm-kgp-eabi_@_x86_64-kgp-linux-gnu_20181209_PLANTAGO.7z теперь должно полегчать. еще раз убедился - пока мы(то есть Вы) будем использовать С при кодировании и пресобранные либы (типа libc, libm? libgcc ... итд) хорошего выходного кода мы не получим - и понятно почему. суть трабла на который налетел господин Terminator: 1. сначала собирается комплятор - собираются таргет-либа libgcc.a - в ней всевозможные процедуры работы с стандартными типами С. 2. далее собирается newlib - это реализация стандартных функций libc.a, тут же libm.a что я сделал - я собрал все это барахло с LTO - мои ожидания в том что не только пользовательской код но и ibgcc.a, libc.a, libm.a покроется на круг LTO оптимизатором. не тут то было! при компиляции newlib те функции которые современный GCC 9.0.0 считает встроенными (например в данном случае double __builtin_nan (const char *str) ) он безжалостно выкидывает и наверно думает - "нехрен это складывать в либу - я и так на лету всуну в код нужный код когда С/С++-код пользователя попросит! и линковать ненадо, правдв здорово!". в итоге в libm.a функции log10f есть вызов nan(), а в объектнике который вышел из исходника sf_nan.c - его нет (тупо вырезано). в итоге много неразрешенных ссылок.... пикантность придает то что если системные либы не собирать с lto - все идет как по маслу и ничего не выбрасывается. в итоге мы имеем линковку собранных без lto системных библиотек с lto-"окученных" объектников прилагухи пользователя. кажется что мы что то теряем..... возможно но не факт. буду дополнительно исследовать. я же для себя выбрал иной путь - вся програмка это набор C++ кода, все либы суть есть хидеры в которых inline-имплементация нужyных функций и классов, и как можно шире шаблоны.... так уже реализована часть libc в виде хидеров... в моем наборе тулсов после сборки я я жеско выпиливаю все что связано с newlib., вместо libc libm - это тупо пустые либы затычки - реализации берутся из хидеров. получается вся прога компиляется из исходников... в таком подходе lto не дает сбоев - у него полная и наисвежайшая информация об символаи и коде. ЗЫ. для тех кому интересно сколько встроенных функций есть в gcc https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 12 декабря, 2018 Опубликовано 12 декабря, 2018 · Жалоба коллеги с сахары попросили для cortex-r4 сделать сборку. хост - линукс64 комбинации мультилиба собрано в тестовых целях, только для -mcpu=cortex-r4 1) - / -O2 / -Os / -Ofast 2) - / -mfloat-abi=hard -mfpu=vfpv3-d16 3) - / -flto http://klen.org/Files/DevTools/x86_64-kgp-linux-gnu/arm-kgp-eabi-cortex-r4-20181212_URTICA.tar.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 19 мая, 2019 Опубликовано 19 мая, 2019 · Жалоба свежак KGP собрано работв в linux64:http://www.klen.org/Files/DevTools/x86_64-kgp-linux-gnu/arm-kgp-eabi_@_x86_64-kgp-linux-gnu_20190519_LUPINE.tar.7z собрано для win64http://www.klen.org/Files/DevTools/x86_64-kgp-mingw32/arm-kgp-eabi_@_x86_64-kgp-mingw32_20190519_LUPINE.7z (к сожалению тестировать неначем, просьба при обнаружении косяков сообщить [email protected] ) имеем binutils 2.32.51.20190518 gcc 10.0.0 20190518 с моими допилами и подкрученным мультилибом в линуксовом дистре также openocd 0.10.0+dev-00867-g2b78f65 (2019-05-18-19:51) dfu-util 0.9 , под linux сборка протестена на рабочих проектах - все жужжит, масдайный неначем тестить. 10 версия компилятора используюет новуй версию LTO формата хранения данных в объектниках. скорее всего скоро можно будет с LTO даже отлаживатся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 20 мая, 2019 Опубликовано 20 мая, 2019 · Жалоба коллега с сахары обнаружил косяг, просба не качать. поправлю отпишусь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба а вот интересно, оно живое спустя только лет? я не сидел сложа лапки 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться