Evan's patch to avoid FPreg->intreg copy for cvt; store to mem
authorDale Johannesen <dalej@apple.com>
Thu, 3 May 2007 20:54:42 +0000 (20:54 +0000)
committerDale Johannesen <dalej@apple.com>
Thu, 3 May 2007 20:54:42 +0000 (20:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36693 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrVFP.td
test/CodeGen/ARM/fptoint.ll [new file with mode: 0644]

index 671e1a48c184343ae8613b074e430a48ee7e9c0b..a8a72ed72c8bd727b37e794694afcad1c763e50d 100644 (file)
@@ -78,6 +78,11 @@ def FSTS  : ASI5<(ops SPR:$src, addrmode5:$addr),
                  [(store SPR:$src, addrmode5:$addr)]>;
 } // isStore
 
+// avoid copying result of FTOUIZ to int reg when we're just storing it
+let AddedComplexity = 1 in
+def : ARMPat<(store (i32 (bitconvert SPR:$src)), addrmode5:$addr),
+             (FSTS SPR:$src, addrmode5:$addr)>;
+
 //===----------------------------------------------------------------------===//
 //  Load / store multiple Instructions.
 //
diff --git a/test/CodeGen/ARM/fptoint.ll b/test/CodeGen/ARM/fptoint.ll
new file mode 100644 (file)
index 0000000..45be89c
--- /dev/null
@@ -0,0 +1,33 @@
+; RUN: llvm-as < %s | llc -march=arm -mattr=+v6,+vfp2 > %t
+; RUN: not grep fmrs %t
+
+@i = weak global i32 0         ; <i32*> [#uses=2]
+@u = weak global i32 0         ; <i32*> [#uses=2]
+
+define void @foo5(float %x) {
+entry:
+       %tmp1 = fptosi float %x to i32          ; <i32> [#uses=1]
+       store i32 %tmp1, i32* @i
+       ret void
+}
+
+define void @foo6(float %x) {
+entry:
+       %tmp1 = fptoui float %x to i32          ; <i32> [#uses=1]
+       store i32 %tmp1, i32* @u
+       ret void
+}
+
+define void @foo7(double %x) {
+entry:
+       %tmp1 = fptosi double %x to i32         ; <i32> [#uses=1]
+       store i32 %tmp1, i32* @i
+       ret void
+}
+
+define void @foo8(double %x) {
+entry:
+       %tmp1 = fptoui double %x to i32         ; <i32> [#uses=1]
+       store i32 %tmp1, i32* @u
+       ret void
+}