forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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
- Loading branch information
Showing
3 changed files
with
34 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
; RUN: llc -mtriple=arm--none-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s | ||
; RUN: llc -mtriple=thumb--none-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s | ||
|
||
; We cannot codegen the smulw[bt] or smlaw[bt] instructions for these functions, | ||
; as the top 16 bits of the result would differ | ||
|
||
define i32 @f1(i32 %a, i16 %b) { | ||
; CHECK-LABEL: f1: | ||
; CHECK: mul | ||
; CHECK: asr | ||
%tmp1 = sext i16 %b to i32 | ||
%tmp2 = mul i32 %a, %tmp1 | ||
%tmp3 = ashr i32 %tmp2, 16 | ||
ret i32 %tmp3 | ||
} | ||
|
||
define i32 @f2(i32 %a, i16 %b, i32 %c) { | ||
; CHECK-LABEL: f2: | ||
; CHECK: mul | ||
; CHECK: add{{.*}}, asr #16 | ||
%tmp1 = sext i16 %b to i32 | ||
%tmp2 = mul i32 %a, %tmp1 | ||
%tmp3 = ashr i32 %tmp2, 16 | ||
%tmp4 = add i32 %tmp3, %c | ||
ret i32 %tmp4 | ||
} |