From: Nemanja Ivanovic Date: Fri, 24 Feb 2017 18:16:06 +0000 (+0000) Subject: [PowerPC] Use subfic instruction for subtract from immediate X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ab05c2009de0fc1759efb0a44e412afdb1a14ebb;p=llvm [PowerPC] Use subfic instruction for subtract from immediate Provide a 64-bit pattern to use SUBFIC for subtracting from a 16-bit immediate. The corresponding pattern already exists for 32-bit integers. Committing on behalf of Hiroshi Inoue. Differential Revision: https://reviews.llvm.org/D29387 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296144 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/PowerPC/PPCInstr64Bit.td b/lib/Target/PowerPC/PPCInstr64Bit.td index 0f12aa1aaa8..997b96ca6ec 100644 --- a/lib/Target/PowerPC/PPCInstr64Bit.td +++ b/lib/Target/PowerPC/PPCInstr64Bit.td @@ -1232,6 +1232,10 @@ def : Pat<(srl i64:$rS, i32:$rB), def : Pat<(shl i64:$rS, i32:$rB), (SLD $rS, $rB)>; +// SUBFIC +def : Pat<(sub imm64SExt16:$imm, i64:$in), + (SUBFIC8 $in, imm:$imm)>; + // SHL/SRL def : Pat<(shl i64:$in, (i32 imm:$imm)), (RLDICR $in, imm:$imm, (SHL64 imm:$imm))>; diff --git a/test/CodeGen/PowerPC/subtract_from_imm.ll b/test/CodeGen/PowerPC/subtract_from_imm.ll new file mode 100644 index 00000000000..8fa07b671a3 --- /dev/null +++ b/test/CodeGen/PowerPC/subtract_from_imm.ll @@ -0,0 +1,41 @@ +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s + +; Make sure that the subfic is generated iff possible + +define i64 @subtract_from_imm1(i64 %v) nounwind readnone { +entry: +; CHECK-LABEL: subtract_from_imm1 +; CHECK: subfic 3, 3, 32767 +; CHECK: blr + %sub = sub i64 32767, %v + ret i64 %sub +} + +define i64 @subtract_from_imm2(i64 %v) nounwind readnone { +entry: +; CHECK-LABEL: subtract_from_imm2 +; CHECK-NOT: subfic +; CHECK: blr + %sub = sub i64 32768, %v + ret i64 %sub +} + +define i64 @subtract_from_imm3(i64 %v) nounwind readnone { +entry: +; CHECK-LABEL: subtract_from_imm3 +; CHECK: subfic 3, 3, -32768 +; CHECK: blr + %sub = sub i64 -32768, %v + ret i64 %sub +} + +define i64 @subtract_from_imm4(i64 %v) nounwind readnone { +entry: +; CHECK-LABEL: subtract_from_imm4 +; CHECK-NOT: subfic +; CHECK: blr + %sub = sub i64 -32769, %v + ret i64 %sub +} +