Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DO NOT MERGE:Experimental:Adding -ffast-math #6863

Closed
wants to merge 1 commit into from

Conversation

Projects
None yet
6 participants
@davids5
Copy link
Member

davids5 commented Mar 20, 2017

No description provided.

David Sidrane

@davids5 davids5 changed the title DO NOT MERGR:Experimental:Adding -ffast-math DO NOT MERGE:Experimental:Adding -ffast-math Mar 20, 2017

@davids5

This comment has been minimized.

Copy link
Member Author

davids5 commented Mar 20, 2017

This PR will require extensive testing! @PX4TestFlights

See Compiler is not emitting vsqrt.f32 on ARM Cortex M4F targets #6838
I did some experiments with adding -ffast-math
FYI:-funsafe-math-optimizations has always been in the build

-ffast-math
Sets -fno-math-errno, -funsafe-math-optimizations, 
-fno-trapping-math, -ffinite-math-only, -fno-rounding-math and -fno-signaling-nans.
This option causes the preprocessor macro __FAST_MATH__ to be defined.

This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions. 

-fno-math-errno
Do not set ERRNO after calling math functions that are executed with a single instruction, e.g., sqrt. A program that relies on IEEE exceptions for math error handling may want to use this flag for speed while maintaining IEEE arithmetic compatibility.
This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.

The default is -fmath-errno. 

-funsafe-math-optimizations
Allow optimizations for floating-point arithmetic that (a) assume that arguments and results are valid and (b) may violate IEEE or ANSI standards. When used at link-time, it may include libraries or startup files that change the default FPU control word or other similar optimizations.
This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.

The default is -fno-unsafe-math-optimizations. 

-ffinite-math-only
Allow optimizations for floating-point arithmetic that assume that arguments and results are not NaNs or +-Infs.
This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications.

The default is -fno-finite-math-only. 

-fno-trapping-math
Compile code assuming that floating-point operations cannot generate user-visible traps. These traps include division by zero, overflow, underflow, inexact result and invalid operation. This option implies -fno-signaling-nans. Setting this option may allow faster code if one relies on “non-stop” IEEE arithmetic, for example.
This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.

The default is -ftrapping-math. 

-frounding-math
Disable transformations and optimizations that assume default floating point rounding behavior. This is round-to-zero for all floating point to integer conversions, and round-to-nearest for all other arithmetic truncations. This option should be specified for programs that change the FP rounding mode dynamically, or that may be executed with a non-default rounding mode. This option disables constant folding of floating point expressions at compile-time (which may be affected by rounding mode) and arithmetic transformations that are unsafe in the presence of sign-dependent rounding modes.
The default is -fno-rounding-math.

This option is experimental and does not currently guarantee to disable all GCC optimizations that are affected by rounding mode. Future versions of GCC may provide finer control of this setting using C99's FENV_ACCESS pragma. This command line option will be used to specify the default state for FENV_ACCESS. 

-fsignaling-nans
Compile code assuming that IEEE signaling NaNs may generate user-visible traps during floating-point operations. Setting this option disables optimizations that may change the number of exceptions visible with signaling NaNs. This option implies -ftrapping-math.
This option causes the preprocessor macro __SUPPORT_SNAN__ to be defined.

The default is -fno-signaling-nans.

This option is experimental and does not currently guarantee to disable all GCC optimizations that affect signaling NaN behavior. 

Master:f2164b135d5c3327cbb2352ba86d2389016911e6

Here we note what @pavel-kirienko had commented on: the sqrtf functions is called and therefore vsqrt.f32 is not used.

    text    data     bss     dec     hex filename
1440572    6140   20724 1467436  16642c build_px4fmu-v3_default/src/firmware/nuttx/firmware_nuttx

09:37:33 (master $=) ~/Desktop/dev/PX4/repos/mainline/Firmware$ arm-none-eabi-objdump -d -C build_px4fmu-v3_default/src/firmware/nuttx/firmware_nuttx | grep '<sqrt'
 80086ba:       f0f6 fb45       bl      80fed48 <sqrtf>
 800acde:       f0f4 f833       bl      80fed48 <sqrtf>
 800b2f4:       f0f3 fd28       bl      80fed48 <sqrtf>
 800b470:       f0f3 fc6a       bl      80fed48 <sqrtf>
 800d198:       f0f1 fdd6       bl      80fed48 <sqrtf>
 8030a30:       f0ce f98a       bl      80fed48 <sqrtf>
 8032d18:       f0cc f816       bl      80fed48 <sqrtf>
 8032dd2:       f0cb ffb9       bl      80fed48 <sqrtf>
 80425b0:       f0bc fbca       bl      80fed48 <sqrtf>
 804332a:       f0bb f8f9       bl      80fe520 <sqrt>
 8048034:       f0b6 be88       b.w     80fed48 <sqrtf>
 8048108:       f0b6 fe1e       bl      80fed48 <sqrtf>
 8048292:       f0b6 fd59       bl      80fed48 <sqrtf>
 8048a6c:       f0b6 b96c       b.w     80fed48 <sqrtf>
 8048adc:       f0b6 f934       bl      80fed48 <sqrtf>
 8048b42:       f0b6 f901       bl      80fed48 <sqrtf>
 8048ba6:       f0b6 f8cf       bl      80fed48 <sqrtf>
 8048bf4:       f0b6 f8a8       bl      80fed48 <sqrtf>
 804970e:       f0b5 fb1b       bl      80fed48 <sqrtf>
 8049f48:       f0b4 fefe       bl      80fed48 <sqrtf>
 804a6fc:       f0b4 fb24       bl      80fed48 <sqrtf>
 804a824:       f0b4 fa90       bl      80fed48 <sqrtf>
 804f35a:       f0af fcf5       bl      80fed48 <sqrtf>
 804f3e4:       f0af fcb0       bl      80fed48 <sqrtf>
 804fe04:       f0ae ffa0       bl      80fed48 <sqrtf>
 80526e8:       f0ac bb2e       b.w     80fed48 <sqrtf>
 8052d4c:       f0ab bffc       b.w     80fed48 <sqrtf>
 8052ed0:       f0ab ff3a       bl      80fed48 <sqrtf>
 8053b08:       f0ab b91e       b.w     80fed48 <sqrtf>
 80543b8:       f0aa fcc6       bl      80fed48 <sqrtf>
 805442e:       f0aa fc8b       bl      80fed48 <sqrtf>
 8054842:       f0aa fa81       bl      80fed48 <sqrtf>
 805499a:       f0aa f9d5       bl      80fed48 <sqrtf>
 8056668:       f0a7 ff5a       bl      80fe520 <sqrt>
 8058522:       f0a6 fc11       bl      80fed48 <sqrtf>
 805860a:       f0a6 fb9d       bl      80fed48 <sqrtf>
 805871a:       f0a6 fb15       bl      80fed48 <sqrtf>
 806005e:       f09e fe73       bl      80fed48 <sqrtf>
 80600a6:       f09e fe4f       bl      80fed48 <sqrtf>
 8061760:       f09d faf2       bl      80fed48 <sqrtf>
 8061998:       f09d f9d6       bl      80fed48 <sqrtf>
 8061a18:       f09d f996       bl      80fed48 <sqrtf>
 8061a30:       f09d f98a       bl      80fed48 <sqrtf>
 8061a3c:       f09d f984       bl      80fed48 <sqrtf>
 8061bfc:       f09d f8a4       bl      80fed48 <sqrtf>
 8061ed6:       f09c ff37       bl      80fed48 <sqrtf>
 8061f56:       f09c fef7       bl      80fed48 <sqrtf>
 8061f70:       f09c feea       bl      80fed48 <sqrtf>
 8061f7c:       f09c fee4       bl      80fed48 <sqrtf>
 8065428:       f099 fc8e       bl      80fed48 <sqrtf>
 806573c:       f099 fb04       bl      80fed48 <sqrtf>
 806598c:       f099 f9dc       bl      80fed48 <sqrtf>
 806fa9a:       f08f f955       bl      80fed48 <sqrtf>
 806fc24:       f08f f890       bl      80fed48 <sqrtf>
 807227c:       f08c fd64       bl      80fed48 <sqrtf>
 8072288:       f08c fd5e       bl      80fed48 <sqrtf>
 8073504:       f08b fc20       bl      80fed48 <sqrtf>
 807c6ea:       f082 fb2d       bl      80fed48 <sqrtf>

Processes: 22 total, 2 running, 20 sleeping
CPU usage: 43.63% tasks, 1.97% sched, 54.40% idle
DMA Memory: 5120 total, 1536 used 1536 peak
Uptime: 249.398s total, 139.580s idle

 PID COMMAND                   CPU(ms) CPU(%)  USED/STACK PRIO(BASE) STATE
   0 Idle Task                  139580 54.400   652/  748   0 (  0)  READY
   1 hpwork                       8161  3.338   888/ 1780 192 (192)  w:sig
   2 lpwork                        396  0.151   644/ 1780  50 ( 50)  w:sig
   3 init                        45923  0.000  1664/ 2484 100 (100)  w:sem
 310 top                          5492  2.959  1248/ 1684 100 (100)  RUN
 107 gps                           733  0.075   936/ 1372 220 (220)  w:sem
 110 dataman                       146  0.000   704/ 1180  90 ( 90)  w:sem
 151 sensors                     10265  4.324  1344/ 1980 250 (250)  w:sem
 153 commander                    6201  2.427  2856/ 3548 140 (140)  w:sig
 164 px4io                        7393  3.034   968/ 1380 240 (240)  w:sem
 173 mavlink_if0                  4455  1.669  1736/ 2436 100 (100)  w:sig
 175 mavlink_rcv_if0                17  0.000   952/ 2100 175 (175)  w:sem
 186 mavlink_if1                  3108  1.289  1632/ 2388 100 (100)  w:sig
 187 mavlink_rcv_if1                16  0.000   952/ 2100 175 (175)  w:sem
 307 commander_low_prio              8  0.000   592/ 2996  50 ( 50)  w:sem
 223 mavlink_if2                 10603  4.248  1632/ 2388 100 (100)  w:sig
 229 mavlink_rcv_if2                18  0.000   952/ 2100 175 (175)  w:sem
 234 sdlog2                        123  0.000  1696/ 3316 177 (177)  w:sig
 277 ekf2                        29594 12.518  5072/ 5780 250 (250)  w:sem
 284 mc_att_control              10766  4.704  1280/ 1676 250 (250)  w:sem
 286 mc_pos_control               6464  2.883   616/ 1876 250 (250)  w:sem
 296 navigator                      26  0.000   952/ 1572 105 (105)  w:sem

             total       used       free    largest
Mem:        235024     189072      45952      42912

Master: with -ffast-math #6863
Here we note that there are only 2 calls to the sqrt function. The reset have been replaced with vsqrt.f32

with -ffast-math

   text    data     bss     dec     hex filename
1435836    6140   20724 1462700  1651ac build_px4fmu-v3_default/src/firmware/nuttx/firmware_nuttx

09:33:05 (master_hw_fpu $) ~/Desktop/dev/PX4/repos/mainline/Firmware$ arm-none-eabi-objdump -d -C build_px4fmu-v3_default/src/firmware/nuttx/firmware_nuttx | grep '<sqrt>'
 8043202:       f0ba fa19       bl      80fd638 <sqrt>
 805601c:       f0a7 fb0c       bl      80fd638 <sqrt>

Processes: 22 total, 2 running, 20 sleeping
CPU usage: 42.24% tasks, 1.90% sched, 55.86% idle
DMA Memory: 5120 total, 1536 used 1536 peak
Uptime: 249.073s total, 147.554s idle

 PID COMMAND                   CPU(ms) CPU(%)  USED/STACK PRIO(BASE) STATE
   0 Idle Task                  147553 55.859   652/  748   0 (  0)  READY
   1 hpwork                       8484  3.500   960/ 1780 192 (192)  w:sem
   2 lpwork                        403  0.152   644/ 1780  50 ( 50)  w:sig
   3 init                        37662  0.000  1660/ 2484 100 (100)  w:sem
 303 top                          1099  2.968  1248/ 1684 100 (100)  RUN
 100 gps                           781  0.532   936/ 1372 220 (220)  w:sem
 103 dataman                       145  0.000   704/ 1180  90 ( 90)  w:sem
 144 sensors                      8668  3.424  1328/ 1980 250 (250)  w:sem
 146 commander                    6500  2.968  2848/ 3548 140 (140)  w:sig
 153 px4io                        7102  2.891  1056/ 1380 240 (240)  w:sem
 166 mavlink_if0                  4582  1.826  1736/ 2436 100 (100)  w:sig
 168 mavlink_rcv_if0                16  0.000   952/ 2100 175 (175)  w:sem
 179 mavlink_if1                  3190  1.217  1632/ 2388 100 (100)  w:sig
 180 mavlink_rcv_if1                16  0.000   952/ 2100 175 (175)  w:sem
 300 commander_low_prio              8  0.000   592/ 2996  50 ( 50)  w:sem
 216 mavlink_if2                 11284  4.642  1632/ 2388 100 (100)  w:sig
 218 mavlink_rcv_if2                17  0.000   952/ 2100 175 (175)  w:sem
 223 sdlog2                        123  0.000  1696/ 3316 177 (177)  w:sig
 270 ekf2                        27796 11.339  5064/ 5780 250 (250)  w:sem
 277 mc_att_control              10659  4.261  1280/ 1676 250 (250)  w:sem
 279 mc_pos_control               6208  2.511   664/ 1876 250 (250)  w:sem
 285 navigator                      28  0.000   952/ 1572 105 (105)  w:sem

nsh> free
             total       used       free    largest
Mem:        235024     187904      47120      44256
nsh>

The replacements with -ffast-math

8008654:       eeb1 7ae7       vsqrt.f32       s14, s15
 800ac76:       eef1 7ac7       vsqrt.f32       s15, s14
 800b284:       eeb1 7ae7       vsqrt.f32       s14, s15
 800b3f8:       eeb1 7ae7       vsqrt.f32       s14, s15
 800d114:       eeb1 7ae7       vsqrt.f32       s14, s15
 8030960:       eef1 0ae0       vsqrt.f32       s1, s1
 8032be8:       eef1 7ac7       vsqrt.f32       s15, s14
 8032c9e:       eef1 7ac7       vsqrt.f32       s15, s14
 8042488:       eeb1 7ae7       vsqrt.f32       s14, s15
 8043202:       f0ba fa19       bl      80fd638 <sqrt>
 8047e90:       eeb1 0ac0       vsqrt.f32       s0, s0
 8047f62:       eef1 6ac6       vsqrt.f32       s13, s12
 80480e6:       eeb1 8ac0       vsqrt.f32       s16, s0
 80488b8:       eeb1 0ac0       vsqrt.f32       s0, s0
 8048924:       eef1 7ae6       vsqrt.f32       s15, s13
 804898a:       eeb1 7ae7       vsqrt.f32       s14, s15
 80489ee:       eef1 7ae6       vsqrt.f32       s15, s13
 8048a3c:       eeb1 7ae7       vsqrt.f32       s14, s15
 8049556:       eef1 6ac6       vsqrt.f32       s13, s12
 8049d86:       eeb1 aae7       vsqrt.f32       s20, s15
 804a4f8:       eef1 6ae7       vsqrt.f32       s13, s15
 804f120:       eeb1 7ae7       vsqrt.f32       s14, s15
 804f1a8:       eef1 7ac7       vsqrt.f32       s15, s14
 80523f0:       eeb1 0ac0       vsqrt.f32       s0, s0
 8052a1c:       eeb1 0ac0       vsqrt.f32       s0, s0
 8052ba4:       eeb1 8ae7       vsqrt.f32       s16, s15
 80537d8:       eeb1 0ac0       vsqrt.f32       s0, s0
 8054014:       eef1 7ac0       vsqrt.f32       s15, s0
 80540be:       eeb1 7ae7       vsqrt.f32       s14, s15
 80545ae:       eeb1 7ae7       vsqrt.f32       s14, s15
 80545f0:       eeb1 7ae7       vsqrt.f32       s14, s15
 805601c:       f0a7 fb0c       bl      80fd638 <sqrt>
 8057ed2:       eeb1 7ae7       vsqrt.f32       s14, s15
 8057fba:       eeb1 7ae7       vsqrt.f32       s14, s15
 80580ca:       eeb1 7ae7       vsqrt.f32       s14, s15
 805f98c:       eeb1 7ae7       vsqrt.f32       s14, s15
 805f9be:       eeb1 7ae7       vsqrt.f32       s14, s15
 806109c:       eeb1 5ae4       vsqrt.f32       s10, s9
 80612b8:       eeb1 6ac7       vsqrt.f32       s12, s14
 80612f0:       eeb1 7ae7       vsqrt.f32       s14, s15
 80612fe:       eeb1 7ac5       vsqrt.f32       s14, s10
 8061306:       eeb1 7ae5       vsqrt.f32       s14, s11
 80614d4:       eef1 5ac4       vsqrt.f32       s11, s8
 8061782:       eeb1 eae7       vsqrt.f32       s28, s15
 80617c8:       eeb1 7ae7       vsqrt.f32       s14, s15
 80617d6:       eeb1 7ac9       vsqrt.f32       s14, s18
 80617de:       eeb1 7ae6       vsqrt.f32       s14, s13
 8064c74:       eef1 6ae7       vsqrt.f32       s13, s15
 8064fa8:       eeb1 6ac7       vsqrt.f32       s12, s14
 80651f0:       eef1 7ac7       vsqrt.f32       s15, s14
 806f312:       eeb1 7ae7       vsqrt.f32       s14, s15
 806f4a0:       eeb1 7ae7       vsqrt.f32       s14, s15
 8071adc:       eeb1 7ae7       vsqrt.f32       s14, s15
 8071b0e:       eef1 7ac7       vsqrt.f32       s15, s14
 8072d8e:       eeb1 7ae7       vsqrt.f32       s14, s15
 807bf7c:       eef1 8ae7       vsqrt.f32       s17, s15
@pavel-kirienko

This comment has been minimized.

Copy link
Member

pavel-kirienko commented Mar 20, 2017

@davids5

This comment has been minimized.

Copy link
Member Author

davids5 commented Mar 20, 2017

@pavel-kirienko - see #6838 (comment)

I do not think I am configured to show off the gain,

@davids5

This comment has been minimized.

Copy link
Member Author

davids5 commented Mar 20, 2017

@pavel-kirienko Here are the last 2 where double precision sqrt is used

080431e4 <control::BlockStats<float, 1u>::getStdDev()>:
 80431e4:       b513            push    {r0, r1, r4, lr}
 80431e6:       4604            mov     r4, r0
 80431e8:       4668            mov     r0, sp
 80431ea:       f7ff ffbd       bl      8043168 <control::BlockStats<float, 1u>::getVar()>
 80431ee:       4620            mov     r0, r4
 80431f0:       f7ff ff58       bl      80430a4 <matrix::Matrix<float, 1u, 1u>::Matrix()>
 80431f4:       4b08            ldr     r3, [pc, #32]   ; (8043218 <control::BlockStats<float, 1u>::getStdDev()+0x34>)
 80431f6:       6023            str     r3, [r4, #0]
 80431f8:       9801            ldr     r0, [sp, #4]
 80431fa:       f0bf ff0d       bl      8103018 <__aeabi_f2d>
 80431fe:       ec41 0b10       vmov    d0, r0, r1
 8043202:       f0ba fa19       bl      80fd638 <sqrt>
--
08055ea8 <MatrixTest::vectorTests()>:
 8055ea8:       e92d 4ff0       stmdb   sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
 8055eac:       4c70            ldr     r4, [pc, #448]  ; (8056070 <MatrixTest::vectorTests()+0x1c8>)
...
 8055fe6:       692b            ldr     r3, [r5, #16]
 8055fe8:       4e2c            ldr     r6, [pc, #176]  ; (805609c <MatrixTest::vectorTests()+0x1f4>)
 8055fea:       3301            adds    r3, #1
 8055fec:       612b            str     r3, [r5, #16]
 8055fee:       ce0f            ldmia   r6!, {r0, r1, r2, r3}
 8055ff0:       ac0d            add     r4, sp, #52     ; 0x34
 8055ff2:       c40f            stmia   r4!, {r0, r1, r2, r3}
 8055ff4:       6833            ldr     r3, [r6, #0]
 8055ff6:       6023            str     r3, [r4, #0]
 8055ff8:       a90d            add     r1, sp, #52     ; 0x34
 8055ffa:       a824            add     r0, sp, #144    ; 0x90
 8055ffc:       f7fc fe26       bl      8052c4c <matrix::Matrix<float, 5u, 1u>::Matrix(float const*)>
 8056000:       4640            mov     r0, r8
 8056002:       f8cd b090       str.w   fp, [sp, #144]  ; 0x90
 8056006:       ac25            add     r4, sp, #148    ; 0x94
 8056008:       f7ff ff3e       bl      8055e88 <matrix::Matrix<float, 5u, 1u>::Matrix()>
 805600c:       f8cd b0a8       str.w   fp, [sp, #168]  ; 0xa8
 8056010:       f854 0b04       ldr.w   r0, [r4], #4
 8056014:       f0ad f800       bl      8103018 <__aeabi_f2d>
 8056018:       ec41 0b10       vmov    d0, r0, r1
 805601c:       f0a7 fb0c       bl      80fd638 <sqrt>
@davids5

This comment has been minimized.

Copy link
Member Author

davids5 commented Mar 20, 2017

@priseborough @pavel-kirienko

Just an FYI:Here is one path that is still is calling __ieee754_sqrtf

image

@davids5

This comment has been minimized.

Copy link
Member Author

davids5 commented Mar 20, 2017

Given @NaterGator Benchmark

This looks like a dead end. @pavel-kirienko do see any merit in pursuing this?

@pavel-kirienko

This comment has been minimized.

Copy link
Member

pavel-kirienko commented Mar 20, 2017

Here is one path that is still is calling __ieee754_sqrtf

This seems to be invoked from the library, whose code is probably not affected by the optimization flags.

Concerning whether we should pursue this further I will reply in the original issue thread.

@LorenzMeier

This comment has been minimized.

Copy link
Member

LorenzMeier commented Mar 22, 2017

We had -ffast-math enabled earlier and it probably got rather accidentally dropped.

@davids5

This comment has been minimized.

Copy link
Member Author

davids5 commented Mar 22, 2017

@LorenzMeier

We had -ffast-math enabled earlier and it probably got rather accidentally dropped.

That history puts me a bit at ease.

I am not sure when or why it was dropped. I looked for it back in a pre cmake version from Nov 2014. As noted above I only found -funsafe-math-optimizations

There is one notable change that I think came about in the cmake transition.
Pre cmake, we carried version of matherr that always returned 1 in the fmu_init.c file.

If the matherr() function returns a nonzero value, then the system
does not set errno, and doesn't print an error message.:
image

Post cmake that was removed and the current definition (irrespective of -ffast-math):

If the matherr() function returns zero, then the system sets errno as
described above, and may print an error message on standard error
(see below).

image

@jgoppert can you shed some light on this?

Strictly by the numbers --ffast-math

Gives us a smaller build saving 4736 bytes. (master:1440572 master_hw_fpu:1435836) and better math performance.

So this PR, once vetted will help on 2 fronts.

@NaterGator

This comment has been minimized.

Copy link
Contributor

NaterGator commented Mar 22, 2017

I have concerns regarding fast-math's implicit enabling of finite-math-only. We need to be certain we don't use NaNs anywhere in firmware to detect numeric instability or uninitialized values.

@francisco3dr

This comment has been minimized.

Copy link

francisco3dr commented Mar 22, 2017

Went to try this in the field with a DJI F450.

  • Connected battery
  • Drone acquired GPS
  • Activated safety switch
  • Motors turned on by themselves (No arming sequence on Radio)
  • Drone started gaining altitude real fast, I tried to recover it but it was out of control, eventually had to enable the killswitch and lost the vehicle (flyaway)
@dagar

This comment has been minimized.

Copy link
Member

dagar commented Dec 9, 2017

Closing as stale, but keeping the branch. There's actually a lot more to discuss here before we do anything.

@dagar dagar closed this Dec 9, 2017

@dagar dagar deleted the master_hw_fpu branch Mar 30, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.