Dark Sorrow
Dark Sorrow

Reputation: 1947

ARM Floating Point Operations

I have two questions regarding floating point operations regarding ARM Cortex M4, Cortex M33 and Cortex M0 core with floating point co-processor.

Though optional, almost all major ARM Cortex M4 and Cortex M33 implementation generally have a FPU built-in the core.

While Cortex M0 may have an FPU or Math co-processor as an peripheral.

My questions

  1. To use FPU for floating point operation do I have to use functions like __aeabi_fadd given in the link or simple mathematical operators like +, -, /, * will suffice.
    I believe Cortex M0 that may have an FPU or Math co-processor as an peripheral we will require such functions as in the case of RP2040 (Raspberry Pi Pico).

  2. Why do we have separate __aeabi_fsub and __aeabi_frsub, should reversing the parameters suffice or am I missing something.

    __aeabi_fsub 2 float float Return x minus y __aeabi_frsub 2 float float Return y minus x

Cortex M4

ARM Cortex M4

Cortex M33 ARM Cortex M33

Upvotes: 2

Views: 1704

Answers (1)

old_timer
old_timer

Reputation: 71586

float fun1 ( float a )
{
    return(a+2.0F);
}
double fun2 ( double a )
{
    return(a+3.0);
}

arm-none-eabi-gcc -O2 -c -mcpu=cortex-m4 -mfpu=vfp -mfloat-abi=hard so.c -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <fun1>:
   0:   eddf 7a02   vldr    s15, [pc, #8]   ; c <fun1+0xc>
   4:   ee30 0a27   vadd.f32    s0, s0, s15
   8:   4770        bx  lr
   a:   bf00        nop
   c:   40000000    .word   0x40000000

00000010 <fun2>:
  10:   ed9f 7b03   vldr    d7, [pc, #12]   ; 20 <fun2+0x10>
  14:   ee30 0b07   vadd.f64    d0, d0, d7
  18:   4770        bx  lr
  1a:   bf00        nop
  1c:   f3af 8000   nop.w
  20:   00000000    .word   0x00000000
  24:   40080000    .word   0x40080000

arm-none-eabi-gcc -O2 -c -mcpu=cortex-m4 so.c -o so.o

arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <fun1>:
   0:   b508        push    {r3, lr}
   2:   f04f 4180   mov.w   r1, #1073741824 ; 0x40000000
   6:   f7ff fffe   bl  0 <__aeabi_fadd>
   a:   bd08        pop {r3, pc}

0000000c <fun2>:
   c:   b508        push    {r3, lr}
   e:   2200        movs    r2, #0
  10:   4b01        ldr r3, [pc, #4]    ; (18 <fun2+0xc>)
  12:   f7ff fffe   bl  0 <__aeabi_dadd>
  16:   bd08        pop {r3, pc}
  18:   40080000    .word   0x40080000


arm-none-eabi-gcc -O2 -c -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard so.c -o so.o
arm-none-eabi-objdump -d so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <fun1>:
   0:   eef0 7a00   vmov.f32    s15, #0 ; 0x40000000  2.0
   4:   ee30 0a27   vadd.f32    s0, s0, s15
   8:   4770        bx  lr
   a:   bf00        nop

0000000c <fun2>:
   c:   b508        push    {r3, lr}
   e:   ec51 0b10   vmov    r0, r1, d0
  12:   4b03        ldr r3, [pc, #12]   ; (20 <fun2+0x14>)
  14:   2200        movs    r2, #0
  16:   f7ff fffe   bl  0 <__aeabi_dadd>
  1a:   ec41 0b10   vmov    d0, r0, r1
  1e:   bd08        pop {r3, pc}
  20:   40080000    .word   0x40080000

Upvotes: 4

Related Questions