[LLVMdev] build a machine instruction by itself

Reed Kotler rkotler at mips.com
Sat Feb 16 01:59:37 PST 2013


I ended up settling on a scheme which I'm not completely happy with but 
it's the best I can see to do.

   const MCInstrDesc& AddiuSpImm(int64_t Imm) const;

and then

       if (isInt<16>(-Remainder))
         BuildMI(MBB, I, DL, AddiuSpImm(-Remainder)).addImm(-Remainder);

So the AddiuSpImm choses which instruction description to use depending 
on the immediate value and then I'm adding rest of the instruction.

I think that probably I could make a template class based on 
MachineInstrBuilder but it's more work than I have time to do right now.

I don't like the fact that I'm repeating -Remainder. If I make a single 
builder function then it does not have that problem but them I'm 
restricted to having that one builder function.

Maybe I should just keep the builder function I have an layer it on this 
new one; and just add additional builder functions as needed.


On 02/15/2013 03:40 PM, reed kotler wrote:
> On 02/15/2013 03:07 PM, Jakob Stoklund Olesen wrote:
>> On Feb 15, 2013, at 1:21 PM, Reed Kotler <rkotler at mips.com> wrote:
>>
>>> I want to have some functions that create machine instructions, not
>>> specifying which machine function or basic block or iterator they are
>>> part of.
>> All machine instructions must be created by a machine function. It
>> provides the context for memory allocation etc.
>>
>>> And then I want to use that result when adding that instruction to a
>>> basic block.
>>>
>>> I'm pretty sure you can do this but we have not done this in the Mips
>>> port so far. We just use instruction builder.
>>>
>>> Anyone know how to do this best, or can point me to some code where
>>> this is done?
>> Did you look at BuildMI?
> For example, what I did already was create the folllowing:
>
>    void BuildAddiuSpImm(MachineBasicBlock &MBB,
>                             MachineBasicBlock::iterator II, DebugLoc DL,
>                             int64_t Imm) const;
>
> this will insert one of two Addiu SP, Immediate instruction forms at the
> point of the iterator,
> based on the value of the Immediate field. It does this by using BuildMI.
>
> Probably I should have returned a MachineInstructionBuilder.
>
> I would like to use the function I create in various contexts but just
> have one base function, that is used to build a proper Addiu Sp,
> Immediate field. There are various BuildMi forms.
>
> To me, creating a MachineInstr is not related this context of how you
> are placing it.
>
> So I guess I could use:
>
>    /// CreateMachineInstr - Allocate a new MachineInstr. Use this instead
>    /// of `new MachineInstr'.
>    ///
>    MachineInstr *CreateMachineInstr(const MCInstrDesc &MCID,
>                                     DebugLoc DL,
>                                     bool NoImp = false);
>
> so my creator function needs to at least have a parameter of type
> MachineFunction
> I can get the MachineFunction from any MachineBasicBlock using getParent
>
>    MachineInstr BuildAddiuSpImm(MachineFunction &MF, int64_t Imm) const;
>
> I did not want to have to pass any more arguments than Imm.
>
>
>> /jakob
>>





More information about the llvm-dev mailing list