From 856ecbc0680beaff74891cac5917678acb080dc9 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Mon, 14 Apr 2014 12:59:52 +0000 Subject: [PATCH] ARM64: remove buggy REV16 pattern. The 32-bit pattern is still valid: 0123 -> 3210 -> 1032. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206172 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM64/ARM64InstrInfo.td | 3 +-- test/CodeGen/ARM64/rev.ll | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Target/ARM64/ARM64InstrInfo.td b/lib/Target/ARM64/ARM64InstrInfo.td index 2af217fe910..6a1154d4369 100644 --- a/lib/Target/ARM64/ARM64InstrInfo.td +++ b/lib/Target/ARM64/ARM64InstrInfo.td @@ -645,8 +645,7 @@ defm CLZ : OneOperandData<0b100, "clz", ctlz>; defm RBIT : OneOperandData<0b000, "rbit">; def REV16Wr : OneWRegData<0b001, "rev16", UnOpFrag<(rotr (bswap node:$LHS), (i64 16))>>; -def REV16Xr : OneXRegData<0b001, "rev16", - UnOpFrag<(rotr (bswap node:$LHS), (i64 16))>>; +def REV16Xr : OneXRegData<0b001, "rev16", null_frag>; def : Pat<(cttz GPR32:$Rn), (CLZWr (RBITWr GPR32:$Rn))>; diff --git a/test/CodeGen/ARM64/rev.ll b/test/CodeGen/ARM64/rev.ll index 867d5b3c513..0006ea33175 100644 --- a/test/CodeGen/ARM64/rev.ll +++ b/test/CodeGen/ARM64/rev.ll @@ -36,10 +36,13 @@ entry: ret i32 %tmp14 } +; 64-bit REV16 is *not* a swap then a 16-bit rotation: +; 01234567 ->(bswap) 76543210 ->(rotr) 10765432 +; 01234567 ->(rev16) 10325476 define i64 @test_rev16_x(i64 %a) nounwind { entry: ; CHECK-LABEL: test_rev16_x: -; CHECK: rev16 x0, x0 +; CHECK-NOT: rev16 x0, x0 %0 = tail call i64 @llvm.bswap.i64(i64 %a) %1 = lshr i64 %0, 16 %2 = shl i64 %0, 48 -- 2.34.1