summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r262261-llvm-r198280-sparc.diff
blob: 8f0f4446f2aba767d218e146404f8f51f0d6f552 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Pull in r198280 from upstream llvm trunk (by Venkatraman Govindaraju):

  [SparcV9]: Use SRL instead of SLL to clear top 32-bits in ctpop:i32. SLL does not clear top 32 bit, only SRL does.

Introduced here: http://svnweb.freebsd.org/changeset/base/262261

Index: lib/Target/Sparc/SparcInstrInfo.td
===================================================================
--- lib/Target/Sparc/SparcInstrInfo.td
+++ lib/Target/Sparc/SparcInstrInfo.td
@@ -967,13 +967,13 @@ let Predicates = [HasV9] in {
 }
 
 // POPCrr - This does a ctpop of a 64-bit register.  As such, we have to clear
-// the top 32-bits before using it.  To do this clearing, we use a SLLri X,0.
+// the top 32-bits before using it.  To do this clearing, we use a SRLri X,0.
 let rs1 = 0 in
   def POPCrr : F3_1<2, 0b101110,
                     (outs IntRegs:$dst), (ins IntRegs:$src),
                     "popc $src, $dst", []>, Requires<[HasV9]>;
 def : Pat<(ctpop i32:$src),
-          (POPCrr (SLLri $src, 0))>;
+          (POPCrr (SRLri $src, 0))>;
 
 //===----------------------------------------------------------------------===//
 // Non-Instruction Patterns
Index: test/CodeGen/SPARC/ctpop.ll
===================================================================
--- test/CodeGen/SPARC/ctpop.ll
+++ test/CodeGen/SPARC/ctpop.ll
@@ -1,8 +1,22 @@
-; RUN: llc < %s -march=sparc -mattr=-v9 | not grep popc
-; RUN: llc < %s -march=sparc -mattr=+v9 | grep popc
+; RUN: llc < %s -march=sparc -mattr=-v9 | FileCheck %s -check-prefix=V8
+; RUN: llc < %s -march=sparc -mattr=+v9 | FileCheck %s -check-prefix=V9
+; RUN: llc < %s -march=sparcv9 | FileCheck %s -check-prefix=SPARC64
 
 declare i32 @llvm.ctpop.i32(i32)
 
+; V8-LABEL: test
+; V8-NOT  : popc
+
+; V9-LABEL: test
+; V9:       srl %o0, 0, %o0
+; V9-NEXT:  jmp %o7+8
+; V9-NEXT:  popc %o0, %o0
+
+; SPARC64-LABEL: test
+; SPARC64:       srl %o0, 0, %o0
+; SPARC64:       jmp %o7+8
+; SPARC64:       popc %o0, %o0
+
 define i32 @test(i32 %X) {
         %Y = call i32 @llvm.ctpop.i32( i32 %X )         ; <i32> [#uses=1]
         ret i32 %Y
OpenPOWER on IntegriCloud