реклама на сайте
подробности

 
 
85 страниц V  « < 83 84 85  
Reply to this topicStart new topic
> свежак KGP win32/arm/avr/mips/m68k, GNU tools chain
GetSmart
сообщение Sep 20 2017, 01:22
Сообщение #1261


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ладно, проехали. Раз никто не захотел выкладывать. Листинги не надо.

Сообщение отредактировал GetSmart - Sep 20 2017, 04:21


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
klen
сообщение Sep 22 2017, 10:17
Сообщение #1262


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(GetSmart @ Sep 20 2017, 04:22) *
Ладно, проехали. Раз никто не захотел выкладывать. Листинги не надо.



какой Вы нетерпеливый! Вот Вам нате....

фабула: выношу на обсуждение два тезезиса
а) работа 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);


выход кодогенератора
CODE
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МГц)
CODE
__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);
}




выход котогенератора
CODE
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);


CODE
// вычисление 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


Сообщение отредактировал IgorKossak - Sep 22 2017, 17:41
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
klen
сообщение Sep 22 2017, 11:19
Сообщение #1263


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



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");
}


выход генератора
CODE
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

CODE
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) можно сказать что не работет вообще - ну тоесть считает но оооочень медленно. по моим ощущениям.

Сообщение отредактировал IgorKossak - Sep 22 2017, 17:44
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
klen
сообщение May 13 2018, 20:15
Сообщение #1264


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Свежак!
на этот раз 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% и работает быстрее.
Go to the top of the page
 
+Quote Post

85 страниц V  « < 83 84 85
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 20:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016