This repository has been archived by the owner on Dec 20, 2019. It is now read-only.
forked from earl/llvm-mirror
-
Notifications
You must be signed in to change notification settings - Fork 28
[mono] respect hardfloat/softloat setting in ARM ABI #16
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, mono#40 ; 0x28 > 8: e58d0018 str r0, [sp, mono#24] > c: e59d0018 ldr r0, [sp, mono#24] > 10: ed900b00 vldr d0, [r0] > 14: ed8d0b08 vstr d0, [sp, mono#32] > 18: eb00000e bl 0x58 > 1c: e1a01000 mov r1, r0 > 20: ed9d0b08 vldr d0, [sp, mono#32] > 24: e3a00000 mov r0, #0 > 28: eb000007 bl 0x4c > 2c: e28dd028 add sp, sp, mono#40 ; 0x28 > 30: e8bd8100 pop {r8, pc} Both are passing the floating point argument correctly via `d0`. Fixes mono/mono#11095
Does this change require rebuilding the Mono runtime, or only shipping an updated llc/opt? |
It requires rebuilding LLVM that we ship, so no Mono runtime rebuilding needed. However, for Mono 5.16, we use mono/llvm:master (which is 3.6), while for Mono master we use |
lewurm
added a commit
that referenced
this pull request
Nov 8, 2018
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#11095
vargaz
pushed a commit
that referenced
this pull request
Oct 1, 2019
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#11095
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Mono's LLVM backend was always emitting code like this:
despite the correct setting passed to
llc
. Note that passing the floatingpoint value (
d8
) in the integer registersr0
andr1
is wrong.With this change we get the following:
Which matches with what the Mono JIT emits:
Both are passing the floating point argument correctly via
d0
.Fixes mono/mono#11095