[LLVMdev] build a machine instruction by itself

Jim Grosbach grosbach at apple.com
Mon Feb 18 13:28:14 PST 2013


Hi Reed,

You may find how ARM does this a useful reference. It's not the prettiest code in the world, but it is roughly analogous to the problem you're trying to solve, so it may be useful. In particular, have a look at emitT2RegPlusImmediate() and emitARMRegPlusImmediate() and the helper functions they call.

-Jim

On Feb 16, 2013, at 1:59 AM, Reed Kotler <rkotler at mips.com> wrote:

> 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
>>> 
> 
> 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list