[llvm-commits] [llvm] r58626 - in /llvm/trunk/lib/Target/ARM: ARMCodeEmitter.cpp ARMInstrFormats.td ARMInstrInfo.h ARMInstrInfo.td

Evan Cheng evan.cheng at apple.com
Mon Nov 3 12:44:57 PST 2008


Ok. It's not just a naming issue. AddrMode information is used by  
other ARM routines to determine instruction properties. Currently  
AddrMode6 is only used by the code emitter to determine instruction  
encoding. That seems wrong. You should be using instruction format  
bits to determine how to encode these instructions instead. See


// Format specifies the encoding used by the instruction.  This is  
part of the
// ad-hoc solution used to emit machine instruction encodings by our  
machine
// code emitter.
class Format<bits<5> val> {
   bits<5> Value = val;
}

def Pseudo      : Format<1>;
def MulFrm      : Format<2>;
def MulSMLAW    : Format<3>;

Evan


On Nov 3, 2008, at 11:41 AM, Jim Grosbach wrote:

> I have no real preference for what name to use. I chose that to be
> consistent with the other operations doing similar things (choosing
> how to encode operands for a class of instructions). If there's an
> alternative nomenclature that's preferable, that's fine with me.
>
>
> On Nov 3, 2008, at 11:17 AM, Evan Cheng wrote:
>
>> Thanks. But is addrmode6 the right name? I don't see ARM manuals  
>> using
>> that name.
>>
>> Evan
>>
>> On Nov 3, 2008, at 10:38 AM, Jim Grosbach wrote:
>>
>>> Author: grosbach
>>> Date: Mon Nov  3 12:38:31 2008
>>> New Revision: 58626
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=58626&view=rev
>>> Log:
>>> Add binary encoding support for multiply instructions. Some blanks
>>> left to fill in, but the basics are there.
>>>
>>> Modified:
>>>  llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp
>>>  llvm/trunk/lib/Target/ARM/ARMInstrFormats.td
>>>  llvm/trunk/lib/Target/ARM/ARMInstrInfo.h
>>>  llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
>>>
>>> Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=58626&r1=58625&r2=58626&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> ====================================================================
>>> --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original)
>>> +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Mon Nov  3 12:38:31
>>> 2008
>>> @@ -82,8 +82,8 @@
>>>                                   const TargetInstrDesc &TID,
>>>                                   const MachineOperand &MO);
>>>
>>> -    unsigned getAddrMode1SBit(const MachineInstr &MI,
>>> -                              const TargetInstrDesc &TID) const;
>>> +    unsigned getAddrModeSBit(const MachineInstr &MI,
>>> +                             const TargetInstrDesc &TID) const;
>>>
>>>   unsigned getAddrMode1InstrBinary(const MachineInstr &MI,
>>>                                    const TargetInstrDesc &TID,
>>> @@ -97,6 +97,9 @@
>>>   unsigned getAddrMode4InstrBinary(const MachineInstr &MI,
>>>                                    const TargetInstrDesc &TID,
>>>                                    unsigned Binary);
>>> +    unsigned getAddrMode6InstrBinary(const MachineInstr &MI,
>>> +                                     const TargetInstrDesc &TID,
>>> +                                     unsigned Binary);
>>>
>>>   /// getInstrBinary - Return binary encoding for the specified
>>>   /// machine instruction.
>>> @@ -432,8 +435,8 @@
>>> return Binary;
>>> }
>>>
>>> -unsigned ARMCodeEmitter::getAddrMode1SBit(const MachineInstr &MI,
>>> -                                          const TargetInstrDesc
>>> &TID) const {
>>> +unsigned ARMCodeEmitter::getAddrModeSBit(const MachineInstr &MI,
>>> +                                         const TargetInstrDesc
>>> &TID) const {
>>> for (unsigned i = MI.getNumOperands(), e = TID.getNumOperands();
>>> i != e; --i){
>>>   const MachineOperand &MO = MI.getOperand(i-1);
>>>   if (MO.isReg() && MO.isDef() && MO.getReg() == ARM::CPSR)
>>> @@ -449,7 +452,7 @@
>>> Binary |= II->getPredicate(&MI) << 28;
>>>
>>> // Encode S bit if MI modifies CPSR.
>>> -  Binary |= getAddrMode1SBit(MI, TID);
>>> +  Binary |= getAddrModeSBit(MI, TID);
>>>
>>> // Encode register def if there is one.
>>> unsigned NumDefs = TID.getNumDefs();
>>> @@ -618,6 +621,33 @@
>>> return Binary;
>>> }
>>>
>>> +unsigned ARMCodeEmitter::getAddrMode6InstrBinary(const MachineInstr
>>> &MI,
>>> +                                                 const
>>> TargetInstrDesc &TID,
>>> +                                                 unsigned Binary) {
>>> +  // Set the conditional execution predicate
>>> +  Binary |= II->getPredicate(&MI) << 28;
>>> +
>>> +  // Encode S bit if MI modifies CPSR.
>>> +  Binary |= getAddrModeSBit(MI, TID);
>>> +
>>> +  // 32x32->64bit operations have two destination registers. The
>>> number
>>> +  // of register definitions will tell us if that's what we're
>>> dealing with.
>>> +  int OpIdx = 0;
>>> +  if (TID.getNumDefs() == 2)
>>> +    Binary |= getMachineOpValue (MI, OpIdx++) <<
>>> ARMII::RegRdLoShift;
>>> +
>>> +  // Encode Rd
>>> +  Binary |= getMachineOpValue(MI, OpIdx++) << ARMII::RegRdHiShift;
>>> +
>>> +  // Encode Rm
>>> +  Binary |= getMachineOpValue(MI, OpIdx++);
>>> +
>>> +  // Encode Rs
>>> +  Binary |= getMachineOpValue(MI, OpIdx++) << ARMII::RegRsShift;
>>> +
>>> +  return Binary;
>>> +}
>>> +
>>> /// getInstrBinary - Return binary encoding for the specified
>>> /// machine instruction.
>>> unsigned ARMCodeEmitter::getInstrBinary(const MachineInstr &MI) {
>>> @@ -636,6 +666,8 @@
>>>   return getAddrMode3InstrBinary(MI, TID, Binary);
>>> case ARMII::AddrMode4:
>>>   return getAddrMode4InstrBinary(MI, TID, Binary);
>>> +  case ARMII::AddrMode6:
>>> +    return getAddrMode6InstrBinary(MI, TID, Binary);
>>> }
>>>
>>> abort();
>>>
>>> Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=58626&r1=58625&r2=58626&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> ====================================================================
>>> --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original)
>>> +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Mon Nov  3 12:38:31
>>> 2008
>>> @@ -659,6 +659,28 @@
>>> let Inst{27-25} = 0b100;
>>> }
>>>
>>> +// addrmode6
>>> +// Unsigned multiply, multiply-accumulate instructions.
>>> +class AI6<bits<4> opcod, dag oops, dag iops, Format f, string opc,
>>> +         string asm, list<dag> pattern>
>>> +  : I<opcod, oops, iops, AddrMode6, Size4Bytes, IndexModeNone, f,
>>> opc,
>>> +      asm,"",pattern>
>>> +{
>>> +  // FIXME: bits 7-4 should be a sub-mode (for SMLAxx, SMLAWy, ...)
>>> +  let Inst{7-4}   = 0b1001;
>>> +  let Inst{27-24} = 0b0000;
>>> +  let Inst{23-20} = opcod;
>>> +}
>>> +class AsI6<bits<4> opcod, dag oops, dag iops, Format f, string opc,
>>> +          string asm, list<dag> pattern>
>>> +  : sI<opcod, oops, iops, AddrMode6, Size4Bytes, IndexModeNone, f,
>>> opc,
>>> +       asm,"",pattern>
>>> +{
>>> +  // FIXME: bits 7-4 should be a sub-mode (for SMLAxx, SMLAWy, ...)
>>> +  let Inst{7-4}   = 0b1001;
>>> +  let Inst{27-24} = 0b0000;
>>> +  let Inst{23-20} = opcod;
>>> +}
>>>
>>> //
>>> =
>>> =
>>> =
>>> ----------------------------------------------------------------------=
>>> ==//
>>>
>>>
>>> Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.h?rev=58626&r1=58625&r2=58626&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> ====================================================================
>>> --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.h (original)
>>> +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.h Mon Nov  3 12:38:31  
>>> 2008
>>> @@ -30,8 +30,7 @@
>>>   // Instruction Flags.
>>>
>>>   //
>>> = 
>>> ==------------------------------------------------------------------
>>> ===//
>>> -    // This three-bit field describes the addressing mode used.
>>> Zero is unused
>>> -    // so that we can tell if we forgot to set a value.
>>> +    // This four-bit field describes the addressing mode used.
>>>
>>>   AddrModeMask  = 0xf,
>>>   AddrModeNone  = 0,
>>> @@ -40,10 +39,11 @@
>>>   AddrMode3     = 3,
>>>   AddrMode4     = 4,
>>>   AddrMode5     = 5,
>>> -    AddrModeT1    = 6,
>>> -    AddrModeT2    = 7,
>>> -    AddrModeT4    = 8,
>>> -    AddrModeTs    = 9,   // i8 * 4 for pc and sp relative data
>>> +    AddrMode6     = 6,
>>> +    AddrModeT1    = 7,
>>> +    AddrModeT2    = 8,
>>> +    AddrModeT4    = 9,
>>> +    AddrModeTs    = 10,  // i8 * 4 for pc and sp relative data
>>>
>>>   // Size* - Flags to keep track of the size of an instruction.
>>>   SizeShift     = 4,
>>> @@ -115,15 +115,17 @@
>>>
>>>   // Field shifts - such shifts are used to set field while
>>> generating
>>>   // machine instructions.
>>> -    RotImmShift = 8,
>>> -    RegRsShift  = 8,
>>> -    RegRdShift  = 12,
>>> -    RegRnShift  = 16,
>>> -    L_BitShift  = 20,
>>> -    S_BitShift  = 20,
>>> -    U_BitShift  = 23,
>>> -    IndexShift  = 24,
>>> -    I_BitShift  = 25
>>> +    RotImmShift  = 8,
>>> +    RegRsShift   = 8,
>>> +    RegRdLoShift = 12,
>>> +    RegRdShift   = 12,
>>> +    RegRdHiShift = 16,
>>> +    RegRnShift   = 16,
>>> +    L_BitShift   = 20,
>>> +    S_BitShift   = 20,
>>> +    U_BitShift   = 23,
>>> +    IndexShift   = 24,
>>> +    I_BitShift   = 25
>>> };
>>> }
>>>
>>>
>>> Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=58626&r1=58625&r2=58626&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> ====================================================================
>>> --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original)
>>> +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov  3 12:38:31
>>> 2008
>>> @@ -310,10 +310,11 @@
>>> def AddrMode3    : AddrMode<3>;
>>> def AddrMode4    : AddrMode<4>;
>>> def AddrMode5    : AddrMode<5>;
>>> -def AddrModeT1   : AddrMode<6>;
>>> -def AddrModeT2   : AddrMode<7>;
>>> -def AddrModeT4   : AddrMode<8>;
>>> -def AddrModeTs   : AddrMode<9>;
>>> +def AddrMode6    : AddrMode<6>;
>>> +def AddrModeT1   : AddrMode<7>;
>>> +def AddrModeT2   : AddrMode<8>;
>>> +def AddrModeT4   : AddrMode<9>;
>>> +def AddrModeTs   : AddrMode<10>;
>>>
>>> // Instruction size.
>>> class SizeFlagVal<bits<3> val> {
>>> @@ -910,49 +911,53 @@
>>> //  Multiply Instructions.
>>> //
>>>
>>> -def MUL  : AsI<0x0, (outs GPR:$dst), (ins GPR:$a, GPR:$b), MulFrm,
>>> -               "mul", " $dst, $a, $b",
>>> -               [(set GPR:$dst, (mul GPR:$a, GPR:$b))]>;
>>> -
>>> -def MLA  : AsI<0x2, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
>>> -               MulFrm, "mla", " $dst, $a, $b, $c",
>>> -               [(set GPR:$dst, (add (mul GPR:$a, GPR:$b), GPR:
>>> $c))]>;
>>> +def MUL   : AsI6<0b0000, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
>>> MulFrm,
>>> +                 "mul", " $dst, $a, $b",
>>> +                 [(set GPR:$dst, (mul GPR:$a, GPR:$b))]>;
>>> +
>>> +def MLA   : AsI6<0b0010, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:
>>> $c),
>>> +                 MulFrm, "mla", " $dst, $a, $b, $c",
>>> +                 [(set GPR:$dst, (add (mul GPR:$a, GPR:$b), GPR:
>>> $c))]>;
>>>
>>> // Extra precision multiplies with low / high results
>>> -def SMULL : AsI<0xC, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:
>>> $b),
>>> -                MulFrm, "smull", " $ldst, $hdst, $a, $b", []>;
>>> +def SMULL : AsI6<0b1100, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a,
>>> GPR:$b),
>>> +                 MulFrm, "smull", " $ldst, $hdst, $a, $b", []>;
>>>
>>> -def UMULL : AsI<0x8, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:
>>> $b),
>>> -                MulFrm, "umull", " $ldst, $hdst, $a, $b", []>;
>>> +def UMULL : AsI6<0b1000, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a,
>>> GPR:$b),
>>> +                 MulFrm, "umull", " $ldst, $hdst, $a, $b", []>;
>>>
>>> // Multiply + accumulate
>>> -def SMLAL : AsI<0xE, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:
>>> $b),
>>> -                MulFrm, "smlal", " $ldst, $hdst, $a, $b", []>;
>>> +def SMLAL : AsI6<0b1110, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a,
>>> GPR:$b),
>>> +                 MulFrm, "smlal", " $ldst, $hdst, $a, $b", []>;
>>>
>>> -def UMLAL : AsI<0xA, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:
>>> $b),
>>> -                MulFrm, "umlal", " $ldst, $hdst, $a, $b", []>;
>>> +def UMLAL : AsI6<0b1010, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a,
>>> GPR:$b),
>>> +                 MulFrm, "umlal", " $ldst, $hdst, $a, $b", []>;
>>>
>>> -def UMAAL : AI<0x0, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:
>>> $b), MulFrm,
>>> -               "umaal", " $ldst, $hdst, $a, $b", []>,
>>> -            Requires<[IsARM, HasV6]>;
>>> +def UMAAL : AI6 <0b0000, (outs GPR:$ldst, GPR:$hdst), (ins GPR:$a,
>>> GPR:$b),
>>> +                 MulFrm, "umaal", " $ldst, $hdst, $a, $b", []>,
>>> +                 Requires<[IsARM, HasV6]>;
>>>
>>> // Most significant word multiply
>>> +// FIXME: encoding
>>> def SMMUL : AI<0x0, (outs GPR:$dst), (ins GPR:$a, GPR:$b), MulFrm,
>>>              "smmul", " $dst, $a, $b",
>>>              [(set GPR:$dst, (mulhs GPR:$a, GPR:$b))]>,
>>>           Requires<[IsARM, HasV6]>;
>>>
>>> +// FIXME: encoding
>>> def SMMLA : AI<0x0, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
>>> MulFrm,
>>>              "smmla", " $dst, $a, $b, $c",
>>>              [(set GPR:$dst, (add (mulhs GPR:$a, GPR:$b), GPR:
>>> $c))]>,
>>>           Requires<[IsARM, HasV6]>;
>>>
>>>
>>> +// FIXME: encoding
>>> def SMMLS : AI<0x0, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
>>> MulFrm,
>>>              "smmls", " $dst, $a, $b, $c",
>>>              [(set GPR:$dst, (sub GPR:$c, (mulhs GPR:$a, GPR:
>>> $b)))]>,
>>>              Requires<[IsARM, HasV6]>;
>>>
>>> +// FIXME: encoding
>>> multiclass AI_smul<string opc, PatFrag opnode> {
>>> def BB : AI<0x8, (outs GPR:$dst), (ins GPR:$a, GPR:$b), MulSMUL,
>>>             !strconcat(opc, "bb"), " $dst, $a, $b",
>>> @@ -992,6 +997,7 @@
>>> }
>>>
>>>
>>> +// FIXME: encoding
>>> multiclass AI_smla<string opc, PatFrag opnode> {
>>> def BB : AI<0x8, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
>>> MulSMLA,
>>>             !strconcat(opc, "bb"), " $dst, $a, $b, $acc",
>>> @@ -1031,7 +1037,9 @@
>>>           Requires<[IsARM, HasV5TE]>;
>>> }
>>>
>>> +// FIXME: encoding
>>> defm SMUL : AI_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
>>> +// FIXME: encoding
>>> defm SMLA : AI_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
>>>
>>> // TODO: Halfword multiple accumulate long: SMLAL<x><y>
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list