[LLVMdev] making emitInlineAsm protected
rkotler at mips.com
Wed Jan 29 16:23:24 PST 2014
On 01/29/2014 04:14 PM, reed kotler wrote:
> On 01/29/2014 10:01 AM, Eric Christopher wrote:
>> On Wed, Jan 29, 2014 at 9:54 AM, Reed Kotler<rkotler at mips.com> wrote:
>>> On 01/28/2014 06:29 PM, Eric Christopher wrote:
>>>> On Tue, Jan 28, 2014 at 4:56 PM, reed kotler<rkotler at mips.com> wrote:
>>>>> I would like to make the following member of AsmPrinter be protected
>>>>> void EmitInlineAsm(StringRef Str, const MDNode *LocMDNode = 0,
>>>>> InlineAsm::AsmDialect AsmDialect =
>>>>> InlineAsm::AD_ATT) const;
>>>>> I have some stubs that I want to emit in MipsAsmParser .
>>>>> Are there any objections to doing this?
>>>>> LLVM Developers mailing list
>>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>> Stubs to emit in MipsAsmPrinter
>>> I think you were one of the people that was against me emitting the inline
>>> asm earlier as part of the IR.
>>> Well, now I am starting to move that to the back end of code generation due
>>> to other issues that were not apparent when I first implemented this mips16
>>> hard float.
>>> Also, it was agreed at that time that it would be better if possible to do
>>> things this way.
>> Why not just note that you need to emit the functions as you output
>> and then emit them during MC?
> Let me go back one step...
> You are saying that instead of using EmitRawText, that I try and do
> this with the higher level AsmPrinter methods.
> Here is a little snipped that does not even include instructions:
> OutStreamer.EmitRawText("\t.section\t.mips16.call.fp"+Twine(Symbol)+",\"ax\", at progbits");
> OutStreamer.EmitRawText(".align 2");
> OutStreamer.EmitRawText("\t.ent\t__call_stub_fp_" + Twine(Symbol));
> OutStreamer.EmitRawText("\t.type\t__call_stub_fp_" + Twine(Symbol)
> + ", @function");
> OutStreamer.EmitRawText("\t__call_stub_fp_" + Twine(Symbol) + ":");
> OutStreamer.EmitRawText("\t.size __call_stub_fp_" + Twine(Symbol) +
> ", .-__call_stub_fp_" + Twine(Symbol));
> OutStreamer.EmitRawText("\t.end __call_stub_fp_" + Twine(Symbol));
> (I have other code that generates the exact instructions).
> Here is the code it wants to generate:
> .globl __floatdidf
> # Stub function to call double __floatdidf ()
> .section .mips16.call.fp.__floatdidf,"ax", at progbits
> .align 2
> .set nomips16
> .set nomicromips
> .ent __call_stub_fp___floatdidf
> .type __call_stub_fp___floatdidf, @function
> move $18,$31
> jal __floatdidf
> mfc1 $2,$f0
> mfc1 $3,$f1
> jr $18
> .size __call_stub_fp___floatdidf, .-__call_stub_fp___floatdidf
> .end __call_stub_fp___floatdidf
> .globl __mips16_muldf3
> .globl __mips16_truncdfsf2
> This requires a lot of pseudo ops.
This stub comes up when I realize that we are compiling mips16 and the
compiler is emitting a call to _floatdidf
There are several of these functions that cause problems for mips16.
This function, when it comes from the c++ linking, does not properly
wrap this as a mips16 function.
I need to create this function that the linker will substitute for the
call to _floatdidf which, in this case, calls _floatdidf and then moves
the return value from
floating point f0 and f1 into integer registers $2 and $3
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev