[Sparc] Use addxcc/subxcc for adde/sube instead of addx/subx.
authorVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Sun, 6 Oct 2013 02:11:10 +0000 (02:11 +0000)
committerVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Sun, 6 Oct 2013 02:11:10 +0000 (02:11 +0000)
addx/subx does not modify conditional codes whereas addxcc/subxx does.

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

lib/Target/Sparc/SparcInstrInfo.td
test/CodeGen/SPARC/2011-01-11-CC.ll

index fcab5b3f724489960460c978b329361999e51e16..470de70b45780e03d4420db006dad5e1b91d0973 100644 (file)
@@ -504,13 +504,13 @@ def LEA_ADDri   : F3_2<2, 0b000000,
 let Defs = [ICC] in
   defm ADDCC  : F3_12<"addcc", 0b010000, addc>;
 
-let Uses = [ICC] in
-  defm ADDX  : F3_12<"addx", 0b001000, adde>;
+let Uses = [ICC], Defs = [ICC] in
+  defm ADDX  : F3_12<"addxcc", 0b001000, adde>;
 
 // Section B.15 - Subtract Instructions, p. 110
 defm SUB    : F3_12  <"sub"  , 0b000100, sub>;
-let Uses = [ICC] in
-  defm SUBX   : F3_12  <"subx" , 0b001100, sube>;
+let Uses = [ICC], Defs = [ICC] in
+  defm SUBX   : F3_12  <"subxcc" , 0b001100, sube>;
 
 let Defs = [ICC] in
   defm SUBCC  : F3_12  <"subcc", 0b010100, subc>;
index ba90ca1a72115816d30e284cd1fa0b4fd67f8092..30f7134722aaa6d69e2b2c0d8a22a26fca317014 100644 (file)
@@ -135,3 +135,42 @@ exit.0:
 exit.1:
    ret i32 1
 }
+
+; V8-LABEL: test_adde_sube
+; V8:       addcc
+; V8:       addxcc
+; V8:       addxcc
+; V8:       addxcc
+; V8:       subcc
+; V8:       subxcc
+; V8:       subxcc
+; V8:       subxcc
+
+
+; V9-LABEL: test_adde_sube
+; V9:       addcc
+; V9:       addxcc
+; V9:       addxcc
+; V9:       addxcc
+; V9:       subcc
+; V9:       subxcc
+; V9:       subxcc
+; V9:       subxcc
+
+
+define void @test_adde_sube(i8* %a, i8* %b, i8* %sum, i8* %diff) {
+entry:
+   %0 = bitcast i8* %a to i128*
+   %1 = bitcast i8* %b to i128*
+   %2 = load i128* %0
+   %3 = load i128* %1
+   %4 = add i128 %2, %3
+   %5 = bitcast i8* %sum to i128*
+   store i128 %4, i128* %5
+   tail call void asm sideeffect "", "=*m,*m"(i128 *%0, i128* %5) nounwind
+   %6 = load i128* %0
+   %7 = sub i128 %2, %6
+   %8 = bitcast i8* %diff to i128*
+   store i128 %7, i128* %8
+   ret void
+}