summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2006-12-05 17:37:31 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2006-12-05 17:37:31 +0000
commit462af9a2e0e3667bc35203be2d14086bf14f0a02 (patch)
treeb8ba0a1dc66a5d0ba67251a70ab2f2e8b9eeecee
parentaf21f4f6f9d6ef5085d927900a2aae364444d64e (diff)
downloadllvm-462af9a2e0e3667bc35203be2d14086bf14f0a02.tar.gz
llvm-462af9a2e0e3667bc35203be2d14086bf14f0a02.tar.bz2
llvm-462af9a2e0e3667bc35203be2d14086bf14f0a02.tar.xz
add support for the "r" asm constraint
patch by Lauro Ramos Venancio git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32224 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/ARM/ARMISelDAGToDAG.cpp27
-rw-r--r--test/CodeGen/ARM/arm-asm.ll7
2 files changed, 34 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp
index a7e4703a66..7f5e35a993 100644
--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -18,6 +18,7 @@
#include "llvm/Function.h"
#include "llvm/Constants.h"
#include "llvm/Intrinsics.h"
+#include "llvm/ADT/VectorExtras.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
@@ -37,6 +38,9 @@ namespace {
ARMTargetLowering(TargetMachine &TM);
virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG);
virtual const char *getTargetNodeName(unsigned Opcode) const;
+ std::vector<unsigned>
+ getRegClassForInlineAsmConstraint(const std::string &Constraint,
+ MVT::ValueType VT) const;
};
}
@@ -200,6 +204,29 @@ static ARMCC::CondCodes DAGIntCCToARMCC(ISD::CondCode CC) {
}
}
+std::vector<unsigned> ARMTargetLowering::
+getRegClassForInlineAsmConstraint(const std::string &Constraint,
+ MVT::ValueType VT) const {
+ if (Constraint.size() == 1) {
+ // FIXME: handling only r regs
+ switch (Constraint[0]) {
+ default: break; // Unknown constraint letter
+
+ case 'r': // GENERAL_REGS
+ case 'R': // LEGACY_REGS
+ if (VT == MVT::i32)
+ return make_vector<unsigned>(ARM::R0, ARM::R1, ARM::R2, ARM::R3,
+ ARM::R4, ARM::R5, ARM::R6, ARM::R7,
+ ARM::R8, ARM::R9, ARM::R10, ARM::R11,
+ ARM::R12, ARM::R13, ARM::R14, 0);
+ break;
+
+ }
+ }
+
+ return std::vector<unsigned>();
+}
+
const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
switch (Opcode) {
default: return 0;
diff --git a/test/CodeGen/ARM/arm-asm.ll b/test/CodeGen/ARM/arm-asm.ll
new file mode 100644
index 0000000000..46c57db50b
--- /dev/null
+++ b/test/CodeGen/ARM/arm-asm.ll
@@ -0,0 +1,7 @@
+; RUN: llvm-as < %s | llc -march=arm
+
+void %frame_dummy() {
+entry:
+ %tmp1 = tail call void (sbyte*)* (void (sbyte*)*)* asm "", "=r,0,~{dirflag},~{fpsr},~{flags}"( void (sbyte*)* null )
+ ret void
+}