Перейти к содержанию

    

свежак KGP win32/arm/avr/mips/m68k

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ладно, проехали. Раз никто не захотел выкладывать. Листинги не надо.

 

 

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

 

фабула: выношу на обсуждение два тезезиса

а) работа 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

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Свежак!

на этот раз 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% и работает быстрее.

Поделиться сообщением


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

Изменено пользователем Terminator
дополнил

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по первому вопросу знаю почему так- собрал с поддежкой ivybridge + avx,  поэтому и падает на младших процах, соберал для generic x86_64,

выложу на днях, правда ровно в два раза медленне компиляция и линковка... 

 

ро второму тоже понятно,  библиотеки криво разложил... опять же выложу потестите,  косяг организационный...

 

UPDATE

пересобрал для generic x86_64 и ivybridge+avx......  потестил по отдельности (это как показывает практика - ничего не значит, у автора всегда все работает :)) FTP сдох - починю выложу на тестироване.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Свежак!  наконец то починили заливку на сервак! какая всетаки гадость эта ваша рыба за... 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

я его не проверял - нечем. традиционно нет машины с масдаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то пошло не так :)

Это без 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ничего страшного. починим. проверю почему так. libm не использую, .. надо будет сделать набор тестов. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да... символ '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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

коллеги с сахары попросили для 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти