[ARM] Do not select SMULW[BT] or SMLAW[BT]
authorOliver Stannard <oliver.stannard@arm.com>
Mon, 20 Oct 2014 11:30:35 +0000 (11:30 +0000)
committerOliver Stannard <oliver.stannard@arm.com>
Mon, 20 Oct 2014 11:30:35 +0000 (11:30 +0000)
commit19d010b85136b7491bae94df4698305ee0bfffcd
treecd4a6f208621721de2d8d5e2f13b8311ce4536d6
parent508c39393a29d4524d113293bcab0a1c74a2328a
[ARM] Do not select SMULW[BT] or SMLAW[BT]

The current instruction selection patterns for SMULW[BT] and SMLAW[BT]
are incorrect. These instructions multiply a 32-bit and a 16-bit value
(both signed) and return the top 32 bits of the 48-bit result. This
preserves the 16 bits of overflow, whereas the patterns they currently
match truncate the result to 16 bits then sign extend.

To select these instructions, we would need to match an ISD::SMUL_LOHI,
a sign extend, two shifts and an or. There is no way to match SMUL_LOHI
in an instruction pattern as it defines multiple values, so this would
have to be done in C++. I have raised
http://llvm.org/bugs/show_bug.cgi?id=21297 to cover allowing correct
selection of these instructions.

This fixes http://llvm.org/bugs/show_bug.cgi?id=19396

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220196 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMInstrInfo.td
lib/Target/ARM/ARMInstrThumb2.td
test/CodeGen/ARM/smulw.ll [new file with mode: 0644]