From 0077e2b8d59a921c0874354a9eac3ce6ca1410aa Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Mon, 22 May 2017 12:47:41 +0000 Subject: [PATCH] [mips] Support micromips attribute passed by front-end 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 llvm-svn: 303545 --- lib/Target/Mips/MipsTargetMachine.cpp | 9 +++++++ test/CodeGen/Mips/micromips-attr.ll | 39 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 test/CodeGen/Mips/micromips-attr.ll diff --git a/lib/Target/Mips/MipsTargetMachine.cpp b/lib/Target/Mips/MipsTargetMachine.cpp index 9e5935c114e..092de216e9b 100644 --- a/lib/Target/Mips/MipsTargetMachine.cpp +++ b/lib/Target/Mips/MipsTargetMachine.cpp @@ -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 index 00000000000..78bcc04a9b0 --- /dev/null +++ b/test/CodeGen/Mips/micromips-attr.ll @@ -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" +}