Rail Shafigulin via llvm-dev
2015-Dec-30 02:38 UTC
[llvm-dev] Substitute instruction with a jump to a library code
I'm trying to find a way to emulate a floating point instruction, say a
floating point add. My understanding is that in order to do that I need to
execute
setOperationAction(ISD::FADD, (MVT::f32, Expand);
setOperationAction(ISD::FADD, (MVT::f64, Expand);
in MyTargetISelLowering.cpp, MyTargetLowering::MyTargetLowering(...).
However for some reason I'm still seeing a floating point add in the final
assembly. I tried running my test code (provided below) on MSP430 and can
see it execute a jump instruction to a label that is clearly located in the
library code.
Here is my test code:
; ModuleID = 'simple-fadd.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: nounwind readnone uwtable
define float @fadd(float %a, float %b) #0 {
%1 = fadd float %a, %b
ret float %1
}
attributes #0 = { nounwind readnone uwtable
"less-precise-fpmad"="false"
"no-frame-pointer-elim"="false"
"no-infs-fp-math"="false"
"no-nans-fp-math"="false"
"stack-protector-buffer-size"="8"
"unsafe-fp-math"="false"
"use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"Ubuntu clang version 3.4.0-2ubuntu1~trusty1
(tags/RELEASE_340/final) (based on LLVM 3.4.0)"}
And here is what I see in MSP430
.text
.syntax unified
.cpu msp430
.eabi_attribute 6, 1 @ Tag_CPU_arch
.eabi_attribute 8, 1 @ Tag_ARM_ISA_use
.eabi_attribute 20, 1 @ Tag_ABI_FP_denormal
.eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions
.eabi_attribute 23, 3 @ Tag_ABI_FP_number_model
.eabi_attribute 24, 1 @ Tag_ABI_align_needed
.eabi_attribute 25, 1 @ Tag_ABI_align_preserved
.file "simple-fadd.ll"
.globl fadd
.align 2
.type fadd,%function
fadd: @ @fadd
.fnstart
.Leh_func_begin0:
@ BB#0:
push {lr}
bl __addsf3
pop {lr}
mov pc, lr
.Ltmp0:
.size fadd, .Ltmp0-fadd
.Leh_func_end0:
.fnend
.ident "Ubuntu clang version 3.6.0-2ubuntu1~trusty1
(tags/RELEASE_360/final) (based on LLVM 3.6.0)"
One can clearly see a bl __addsf3 instruction. However for some reason my
target produces a lf.add.s (which is a floating point add) instead of
branching to a library code. Clearly I'm missing something, but I can't
figure out what exactly. Would anyone care to help?
--
Rail Shafigulin
Software Engineer
Esencia Technologies
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20151229/0e7d7d61/attachment.html>
Anton Korobeynikov via llvm-dev
2015-Dec-30 10:48 UTC
[llvm-dev] Substitute instruction with a jump to a library code
Just a side note - the assembly posted is clearly ARM, not MSP430 :) On Wed, Dec 30, 2015 at 5:38 AM, Rail Shafigulin via llvm-dev <llvm-dev at lists.llvm.org> wrote:> I'm trying to find a way to emulate a floating point instruction, say a > floating point add. My understanding is that in order to do that I need to > execute > > setOperationAction(ISD::FADD, (MVT::f32, Expand); > setOperationAction(ISD::FADD, (MVT::f64, Expand); > > in MyTargetISelLowering.cpp, MyTargetLowering::MyTargetLowering(...). > > However for some reason I'm still seeing a floating point add in the final > assembly. I tried running my test code (provided below) on MSP430 and can > see it execute a jump instruction to a label that is clearly located in the > library code. > > Here is my test code: > > ; ModuleID = 'simple-fadd.c' > target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" > target triple = "x86_64-pc-linux-gnu" > > ; Function Attrs: nounwind readnone uwtable > define float @fadd(float %a, float %b) #0 { > %1 = fadd float %a, %b > ret float %1 > } > > attributes #0 = { nounwind readnone uwtable "less-precise-fpmad"="false" > "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" > "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" > "unsafe-fp-math"="false" "use-soft-float"="false" } > > !llvm.ident = !{!0} > > !0 = metadata !{metadata !"Ubuntu clang version 3.4.0-2ubuntu1~trusty1 > (tags/RELEASE_340/final) (based on LLVM 3.4.0)"} > > > And here is what I see in MSP430 > > .text > .syntax unified > .cpu msp430 > .eabi_attribute 6, 1 @ Tag_CPU_arch > .eabi_attribute 8, 1 @ Tag_ARM_ISA_use > .eabi_attribute 20, 1 @ Tag_ABI_FP_denormal > .eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions > .eabi_attribute 23, 3 @ Tag_ABI_FP_number_model > .eabi_attribute 24, 1 @ Tag_ABI_align_needed > .eabi_attribute 25, 1 @ Tag_ABI_align_preserved > .file "simple-fadd.ll" > .globl fadd > .align 2 > .type fadd,%function > fadd: @ @fadd > .fnstart > .Leh_func_begin0: > @ BB#0: > push {lr} > bl __addsf3 > pop {lr} > mov pc, lr > .Ltmp0: > .size fadd, .Ltmp0-fadd > .Leh_func_end0: > .fnend > > > .ident "Ubuntu clang version 3.6.0-2ubuntu1~trusty1 (tags/RELEASE_360/final) > (based on LLVM 3.6.0)" > > One can clearly see a bl __addsf3 instruction. However for some reason my > target produces a lf.add.s (which is a floating point add) instead of > branching to a library code. Clearly I'm missing something, but I can't > figure out what exactly. Would anyone care to help? > > > -- > Rail Shafigulin > Software Engineer > Esencia Technologies > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University
Rail Shafigulin via llvm-dev
2015-Dec-30 18:21 UTC
[llvm-dev] Substitute instruction with a jump to a library code
On Wed, Dec 30, 2015 at 2:48 AM, Anton Korobeynikov <anton at korobeynikov.info> wrote:> Just a side note - the assembly posted is clearly ARM, not MSP430 :)Isn't MSP430 an ARM based chip? -- Rail Shafigulin Software Engineer Esencia Technologies -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151230/5617a13c/attachment.html>
Apparently Analagous Threads
- Why LR is saved before calling a 'noreturn' function ?
- [ARM/Thumb] Make a function in arm while in Thumb triple
- [LLVMdev] Setting up a cross-compiler for cortex-m3
- [LLVMdev] Setting up a cross-compiler for cortex-m3
- [LLVMdev] Setting up a cross-compiler for cortex-m3