]> granicus.if.org Git - llvm/commitdiff
[mips] Support micromips attribute passed by front-end
authorSimon Atanasyan <simon@atanasyan.com>
Mon, 22 May 2017 12:47:41 +0000 (12:47 +0000)
committerSimon Atanasyan <simon@atanasyan.com>
Mon, 22 May 2017 12:47:41 +0000 (12:47 +0000)
This patch adds handling of the `micromips` and `nomicromips` attributes
passed by front-end. The patch depends on D33363.

Differential revision: https://reviews.llvm.org/D33364

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303545 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsTargetMachine.cpp
test/CodeGen/Mips/micromips-attr.ll [new file with mode: 0644]

index 9e5935c114e97f37241e5ce24207156f24afe2ad..092de216e9b89e9bc5feabc34be669f3c6dae442 100644 (file)
@@ -154,6 +154,11 @@ MipsTargetMachine::getSubtargetImpl(const Function &F) const {
   bool hasNoMips16Attr =
       !F.getFnAttribute("nomips16").hasAttribute(Attribute::None);
 
+  bool HasMicroMipsAttr =
+      !F.getFnAttribute("micromips").hasAttribute(Attribute::None);
+  bool HasNoMicroMipsAttr =
+      !F.getFnAttribute("nomicromips").hasAttribute(Attribute::None);
+
   // FIXME: This is related to the code below to reset the target options,
   // we need to know whether or not the soft float flag is set on the
   // function, so we can enable it as a subtarget feature.
@@ -165,6 +170,10 @@ MipsTargetMachine::getSubtargetImpl(const Function &F) const {
     FS += FS.empty() ? "+mips16" : ",+mips16";
   else if (hasNoMips16Attr)
     FS += FS.empty() ? "-mips16" : ",-mips16";
+  if (HasMicroMipsAttr)
+    FS += FS.empty() ? "+micromips" : ",+micromips";
+  else if (HasNoMicroMipsAttr)
+    FS += FS.empty() ? "-micromips" : ",-micromips";
   if (softFloat)
     FS += FS.empty() ? "+soft-float" : ",+soft-float";
 
diff --git a/test/CodeGen/Mips/micromips-attr.ll b/test/CodeGen/Mips/micromips-attr.ll
new file mode 100644 (file)
index 0000000..78bcc04
--- /dev/null
@@ -0,0 +1,39 @@
+; RUN: llc -march=mips -mcpu=mips32 --mattr=-micromips < %s | FileCheck %s 
+
+define void @foo() #0 {
+entry:
+  ret void
+}
+; CHECK:        .set    micromips
+; CHECK-NEXT:   .set    nomips16
+; CHECK-NEXT:   .ent    foo
+; CHECK-NEXT: foo:
+
+define void @bar() #1 {
+entry:
+  ret void
+}
+; CHECK:        .set    nomicromips
+; CHECK-NEXT:   .set    nomips16
+; CHECK-NEXT:   .ent    bar
+; CHECK-NEXT: bar:
+
+attributes #0 = {
+  nounwind "micromips"
+  "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false"
+  "less-precise-fpmad"="false" "no-frame-pointer-elim"="false"
+  "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false"
+  "no-signed-zeros-fp-math"="false" "no-trapping-math"="false"
+  "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
+  "use-soft-float"="false"
+}
+
+attributes #1 = {
+  nounwind
+  "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false"
+  "less-precise-fpmad"="false" "no-frame-pointer-elim"="false"
+  "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false"
+  "no-signed-zeros-fp-math"="false" "no-trapping-math"="false"
+  "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
+  "use-soft-float"="false"
+}