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