]> granicus.if.org Git - clang/commitdiff
Mips specific inline assembler constraint 'R'
authorJack Carter <jack.carter@imgtec.com>
Tue, 5 Mar 2013 19:10:54 +0000 (19:10 +0000)
committerJack Carter <jack.carter@imgtec.com>
Tue, 5 Mar 2013 19:10:54 +0000 (19:10 +0000)
'R' An address that can be sued in a non-macro load or store.

Including missing positive test case and fixed typo for r176453.

Thanks to Richard Smith for catching this!

Jack

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

lib/Basic/Targets.cpp
test/CodeGen/mips-constraints-mem.c [new file with mode: 0644]

index a433cc70be8b5e6ae1929dd7dba16acf2959d9c2..5a15145d2e1c571ee7a1849bef93c58c7ee6f6d4 100644 (file)
@@ -4487,7 +4487,7 @@ public:
     case 'x': // hilo register pair
       Info.setAllowsRegister();
       return true;
-    case 'R': // An address tha can be used in a non-macro load or store
+    case 'R': // An address that can be used in a non-macro load or store
       Info.setAllowsMemory();
       return true;
     }
diff --git a/test/CodeGen/mips-constraints-mem.c b/test/CodeGen/mips-constraints-mem.c
new file mode 100644 (file)
index 0000000..ea6bcaf
--- /dev/null
@@ -0,0 +1,26 @@
+// RUN: %clang -target mipsel-unknown-linux -S -o - -emit-llvm %s \
+// RUN: | FileCheck %s
+
+// This checks that the frontend will accept inline asm memory constraints.
+
+int foo()
+{
+
+ // 'R': An address that can be used in a non-macro load or stor'
+ // This test will result in the higher and lower nibbles being
+ // switched due to the lwl/lwr instruction pairs.
+ // CHECK:   %{{[0-9]+}} = call i32 asm sideeffect  "lwl $0, 1 + $1\0A\09lwr $0, 2 + $1\0A\09", "=r,*R"(i32* %{{[0-9,a-f]+}}) #1, !srcloc !0
+
+  int c = 0xffbbccdd;
+
+  int *p = &c;
+  int out = 0;
+
+  __asm volatile (
+    "lwl %0, 1 + %1\n\t"
+    "lwr %0, 2 + %1\n\t"
+    : "=r"(out)
+    : "R"(*p)
+    );
+  return 0;
+}