This repository was archived by the owner on Dec 20, 2019. It is now read-only.
Commit c975102
[mono] respect hardfloat/softloat setting in ARM ABI (#16)
Mono's LLVM backend was always emitting code like this:
> 000d7234 <double_ToString>:
> d7234: e92d4800 push {fp, lr}
> d7238: ed2d8b02 vpush {d8}
> d723c: ed908b00 vldr d8, [r0]
> d7240: eb12e4e2 bl 5905d0 <plt_System_Globalization_NumberFormatInfo_get_CurrentInfo>
> d7244: e1a03000 mov r3, r0
> d7248: ec510b18 vmov r0, r1, d8
> d724c: e3a02000 mov r2, #0
> d7250: eb12e91a bl 5916c0 <plt_System_Number_FormatDouble_double_string_System_Globalization_NumberFormatInfo>
> d7254: ecbd8b02 vpop {d8}
> d7258: e8bd8800 pop {fp, pc}
despite the correct setting passed to `llc`. Note that passing the floating
point value (`d8`) in the integer registers `r0` and `r1` is wrong.
With this change we get the following:
> 000d9934 <double_ToString>:
> d9934: e92d4800 push {fp, lr}
> d9938: ed2d8b02 vpush {d8}
> d993c: ed908b00 vldr d8, [r0]
> d9940: eb137c2e bl 5b8a00 <plt_System_Globalization_NumberFormatInfo_get_CurrentInfo>
> d9944: eeb00b48 vmov.f64 d0, d8
> d9948: e1a01000 mov r1, r0
> d994c: e3a00000 mov r0, #0
> d9950: eb138066 bl 5b9af0 <plt_System_Number_FormatDouble_double_string_System_Globalization_NumberFormatInfo>
> d9954: ecbd8b02 vpop {d8}
> d9958: e8bd4800 pop {fp, lr}
> d995c: e1a0f00e mov pc, lr
Which matches with what the Mono JIT emits:
> 0: e92d4100 push {r8, lr}
> 4: e24dd028 sub sp, sp, #40 ; 0x28
> 8: e58d0018 str r0, [sp, #24]
> c: e59d0018 ldr r0, [sp, #24]
> 10: ed900b00 vldr d0, [r0]
> 14: ed8d0b08 vstr d0, [sp, #32]
> 18: eb00000e bl 0x58
> 1c: e1a01000 mov r1, r0
> 20: ed9d0b08 vldr d0, [sp, #32]
> 24: e3a00000 mov r0, #0
> 28: eb000007 bl 0x4c
> 2c: e28dd028 add sp, sp, #40 ; 0x28
> 30: e8bd8100 pop {r8, pc}
Both are passing the floating point argument correctly via `d0`.
Fixes mono/mono#110951 parent 8415fd8 commit c975102
2 files changed
+15
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
334 | 334 | | |
335 | 335 | | |
336 | 336 | | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1623 | 1623 | | |
1624 | 1624 | | |
1625 | 1625 | | |
1626 | | - | |
1627 | | - | |
1628 | | - | |
1629 | | - | |
| 1626 | + | |
| 1627 | + | |
| 1628 | + | |
| 1629 | + | |
| 1630 | + | |
| 1631 | + | |
| 1632 | + | |
1630 | 1633 | | |
1631 | 1634 | | |
1632 | 1635 | | |
| |||
0 commit comments