GCC CM4 FPU - sqrtf

Miroslav Mraz mrazik na volny.cz
Sobota Únor 11 20:51:31 CET 2017


Asi to záleží na verzi překladače. Mě to do paměti neukládá (-Os). Gcc 
version 6.2.1 20161205.

20000446:	eddd 5a00 	vldr	s11, [sp]
2000044a:	ed9d 6a00 	vldr	s12, [sp]
2000044e:	eddd 7a01 	vldr	s15, [sp, #4]
20000452:	ed9d 5a01 	vldr	s10, [sp, #4]
20000456:	eddd 6a02 	vldr	s13, [sp, #8]
2000045a:	ed9d 7a02 	vldr	s14, [sp, #8]
------- tohle jsou inline nepodstatné věci z kontextu programu
2000045e:	4a0c      	ldr	r2, [pc, #48]	; (20000490 20000460:	480c 
ldr	r0, [pc, #48]	; (20000494 20000462:	490d      	ldr	r1, [pc, #52]	; 
(20000498
------- konec nepodstatných věcí
   float amp = (ph1*ph1 + ph2*ph2 + ph3*ph3) * 2.0;
20000464:	ee67 7a85 	vmul.f32	s15, s15, s10
20000468:	eee5 7a86 	vfma.f32	s15, s11, s12
2000046c:	eee6 7a87 	vfma.f32	s15, s13, s14
20000470:	ee77 7aa7 	vadd.f32	s15, s15, s15
   asm ("vsqrt.f32 %0, %1" : "=w" (y) : "w" (x));
20000474:	eef1 7ae7 	vsqrt.f32	s15, s15
   y = _sqrt (amp);
------- tady na konci to uloží, ale něco s tím udělat musí, že
20000478:	edcd 7a03 	vstr	s15, [sp, #12]
   (void) y;

Zdroj jsem ještě pro jistotu zkomplikoval

static inline float _sqrt (float x) {
   float y;
   asm ("vsqrt.f32 %0, %1" : "=w" (y) : "w" (x));
   return y;
}
static void test_func (void) {
   volatile float ph1=0.0f, ph2=1.0f, ph3=2.0f, y;
   float amp = (ph1*ph1 + ph2*ph2 + ph3*ph3) * 2.0;
   y = _sqrt (amp);
   (void) y;
}

Mrazík

Dne 11.2.2017 v 19:46 Jaroslav Buchta napsal(a):
> Jeste jedna podotazka, stve me, ze prekladac kazdy mezivysledek strka do
> pameti, napr. takto
>
> (786)          amp = (ph1*ph1 + ph2*ph2 + ph3*ph3) * 2.0;  //-fno-math-errno
> 080017E8    vldr    s14, [r7, #56]    ; 0x38
> 080017EC    vldr    s15, [r7, #56]    ; 0x38
> 080017F0    vmul.f32    s14, s14, s15
> 080017F4    vldr    s13, [r7, #52]    ; 0x34
> 080017F8    vldr    s15, [r7, #52]    ; 0x34
> 080017FC    vmul.f32    s15, s13, s15
> 08001800    vadd.f32    s14, s14, s15
> 08001804    vldr    s13, [r7, #48]    ; 0x30
> 08001808    vldr    s15, [r7, #48]    ; 0x30
> 0800180C    vmul.f32    s15, s13, s15
> 08001810    vadd.f32    s15, s14, s15
> 08001814    vadd.f32    s15, s15, s15
> *08001818    vstr    s15, [r7, #44]    ; 0x2c**
> **(787)          asm volatile  ("vsqrt.f32 %0, %1" : "=w" (amp) : "w"
> (amp) );**
> **0800181C    vldr    s15, [r7, #44]    ; 0x2c**
> *08001820    vsqrt.f32    s15, s15
> 08001824    vstr    s15, [r7, #44]    ; 0x2c
>
> program vypada takto:
>          float amp;
> ...
>         amp = (ph1*ph1 + ph2*ph2 + ph3*ph3) * 2.0;
>         asm volatile  ("vsqrt.f32 %0, %1" : "=w" (amp) : "w" (amp) );


Další informace o konferenci Hw-list