diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2012-04-27 01:27:19 +0000 | 
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2012-04-27 01:27:19 +0000 | 
| commit | f52003de566bccd03b5faba69ce868f2689d047a (patch) | |
| tree | 86f3f31e6c1f6a726af552c48d71a4b2c9c76c2b /llvm/lib/Target/ARM | |
| parent | b69bb2e43feaea6e192274731dba9f96cd56e733 (diff) | |
| download | bcm5719-llvm-f52003de566bccd03b5faba69ce868f2689d047a.tar.gz bcm5719-llvm-f52003de566bccd03b5faba69ce868f2689d047a.zip | |
- thumbv6 shouldn't imply +thumb2. Cortex-M0 doesn't suppport 32-bit Thumb2
  instructions.
- However, it does support dmb, dsb, isb, mrs, and msr.
rdar://11331541
llvm-svn: 155685
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 12 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp | 32 | 
2 files changed, 28 insertions, 16 deletions
| diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index bbb7c805722..a166b27042d 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -3017,7 +3017,7 @@ def t2DSB : AInoP<(outs), (ins memb_opt:$opt), ThumbFrm, NoItinerary,  def t2ISB : AInoP<(outs), (ins memb_opt:$opt), ThumbFrm, NoItinerary,                    "isb", "\t$opt", -                  []>, Requires<[IsThumb2, HasDB]> { +                  []>, Requires<[IsThumb, HasDB]> {    bits<4> opt;    let Inst{31-4} = 0xf3bf8f6;    let Inst{3-0} = opt; @@ -3646,7 +3646,7 @@ def t2MRSsys_AR: T2I<(outs GPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, spsr",  // the A/R class (a full msr_mask).  def t2MRS_M : T2I<(outs rGPR:$Rd), (ins msr_mask:$mask), NoItinerary,                    "mrs", "\t$Rd, $mask", []>, -              Requires<[IsThumb2,IsMClass]> { +              Requires<[IsThumb,IsMClass]> {    bits<4> Rd;    bits<8> mask;    let Inst{31-12} = 0b11110011111011111000; @@ -3682,7 +3682,7 @@ def t2MSR_AR : T2I<(outs), (ins msr_mask:$mask, rGPR:$Rn),  // Move from ARM core register to Special Register  def t2MSR_M : T2I<(outs), (ins msr_mask:$SYSm, rGPR:$Rn),                    NoItinerary, "msr", "\t$SYSm, $Rn", []>, -              Requires<[IsThumb2,IsMClass]> { +              Requires<[IsThumb,IsMClass]> {    bits<8> SYSm;    bits<4> Rn;    let Inst{31-21} = 0b11110011100; @@ -4002,9 +4002,9 @@ def : t2InstAlias<"tst${p} $Rn, $Rm",                    (t2TSTrr GPRnopc:$Rn, rGPR:$Rm, pred:$p)>;  // Memory barriers -def : InstAlias<"dmb", (t2DMB 0xf)>, Requires<[IsThumb2, HasDB]>; -def : InstAlias<"dsb", (t2DSB 0xf)>, Requires<[IsThumb2, HasDB]>; -def : InstAlias<"isb", (t2ISB 0xf)>, Requires<[IsThumb2, HasDB]>; +def : InstAlias<"dmb", (t2DMB 0xf)>, Requires<[IsThumb, HasDB]>; +def : InstAlias<"dsb", (t2DSB 0xf)>, Requires<[IsThumb, HasDB]>; +def : InstAlias<"isb", (t2ISB 0xf)>, Requires<[IsThumb, HasDB]>;  // Alias for LDR, LDRB, LDRH, LDRSB, and LDRSH without the ".w" optional  // width specifier. diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp index 67f6f6f3520..5df84c8b103 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp @@ -51,23 +51,32 @@ std::string ARM_MC::ParseARMTriple(StringRef TT, StringRef CPU) {        Idx = 6;    } +  bool NoCPU = CPU == "generic" || CPU.empty();    std::string ARMArchFeature;    if (Idx) {      unsigned SubVer = TT[Idx];      if (SubVer >= '7' && SubVer <= '9') {        if (Len >= Idx+2 && TT[Idx+1] == 'm') { -        // v7m: FeatureNoARM, FeatureDB, FeatureHWDiv, FeatureMClass -        ARMArchFeature = "+v7,+noarm,+db,+hwdiv,+mclass"; +        if (NoCPU) +          // v7m: FeatureNoARM, FeatureDB, FeatureHWDiv, FeatureMClass +          ARMArchFeature = "+v7,+noarm,+db,+hwdiv,+mclass"; +        else +          // Use CPU to figure out the exact features. +          ARMArchFeature = "+v7";        } else if (Len >= Idx+3 && TT[Idx+1] == 'e'&& TT[Idx+2] == 'm') { -        // v7em: FeatureNoARM, FeatureDB, FeatureHWDiv, FeatureDSPThumb2, -        //       FeatureT2XtPk, FeatureMClass -        ARMArchFeature = "+v7,+noarm,+db,+hwdiv,+t2dsp,t2xtpk,+mclass"; +        if (NoCPU) +          // v7em: FeatureNoARM, FeatureDB, FeatureHWDiv, FeatureDSPThumb2, +          //       FeatureT2XtPk, FeatureMClass +          ARMArchFeature = "+v7,+noarm,+db,+hwdiv,+t2dsp,t2xtpk,+mclass"; +        else +          // Use CPU to figure out the exact features. +          ARMArchFeature = "+v7";        } else {          // v7 CPUs have lots of different feature sets. If no CPU is specified,          // then assume v7a (e.g. cortex-a8) feature set. Otherwise, return          // the "minimum" feature set and use CPU string to figure out the exact          // features. -        if (CPU == "generic") +        if (NoCPU)            // v7a: FeatureNEON, FeatureDB, FeatureDSPThumb2, FeatureT2XtPk            ARMArchFeature = "+v7,+neon,+db,+t2dsp,+t2xtpk";          else @@ -77,10 +86,13 @@ std::string ARM_MC::ParseARMTriple(StringRef TT, StringRef CPU) {      } else if (SubVer == '6') {        if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == '2')          ARMArchFeature = "+v6t2"; -      else if (Len >= Idx+2 && TT[Idx+1] == 'm') -        // v6m: FeatureNoARM, FeatureMClass -        ARMArchFeature = "+v6t2,+noarm,+mclass"; -      else +      else if (Len >= Idx+2 && TT[Idx+1] == 'm') { +        if (NoCPU) +          // v6m: FeatureNoARM, FeatureMClass +          ARMArchFeature = "+v6,+noarm,+mclass"; +        else +          ARMArchFeature = "+v6"; +      } else          ARMArchFeature = "+v6";      } else if (SubVer == '5') {        if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == 'e') | 

