xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/mulhi.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+v6 %s -o - | FileCheck %s -check-prefix=V6
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s -check-prefix=V4
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumb-eabi -mcpu=cortex-m3 %s -o - | FileCheck %s -check-prefix=M3
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i32 @smulhi(i32 %x, i32 %y) nounwind {
6*9880d681SAndroid Build Coastguard Worker; V6-LABEL: smulhi:
7*9880d681SAndroid Build Coastguard Worker; V6: smmul
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; V4-LABEL: smulhi:
10*9880d681SAndroid Build Coastguard Worker; V4: smull
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; M3-LABEL: smulhi:
13*9880d681SAndroid Build Coastguard Worker; M3: smull
14*9880d681SAndroid Build Coastguard Worker        %tmp = sext i32 %x to i64               ; <i64> [#uses=1]
15*9880d681SAndroid Build Coastguard Worker        %tmp1 = sext i32 %y to i64              ; <i64> [#uses=1]
16*9880d681SAndroid Build Coastguard Worker        %tmp2 = mul i64 %tmp1, %tmp             ; <i64> [#uses=1]
17*9880d681SAndroid Build Coastguard Worker        %tmp3 = lshr i64 %tmp2, 32              ; <i64> [#uses=1]
18*9880d681SAndroid Build Coastguard Worker        %tmp3.upgrd.1 = trunc i64 %tmp3 to i32          ; <i32> [#uses=1]
19*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp3.upgrd.1
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdefine i32 @umulhi(i32 %x, i32 %y) nounwind {
23*9880d681SAndroid Build Coastguard Worker; V6-LABEL: umulhi:
24*9880d681SAndroid Build Coastguard Worker; V6: umull
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; V4-LABEL: umulhi:
27*9880d681SAndroid Build Coastguard Worker; V4: umull
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; M3-LABEL: umulhi:
30*9880d681SAndroid Build Coastguard Worker; M3: umull
31*9880d681SAndroid Build Coastguard Worker        %tmp = zext i32 %x to i64               ; <i64> [#uses=1]
32*9880d681SAndroid Build Coastguard Worker        %tmp1 = zext i32 %y to i64              ; <i64> [#uses=1]
33*9880d681SAndroid Build Coastguard Worker        %tmp2 = mul i64 %tmp1, %tmp             ; <i64> [#uses=1]
34*9880d681SAndroid Build Coastguard Worker        %tmp3 = lshr i64 %tmp2, 32              ; <i64> [#uses=1]
35*9880d681SAndroid Build Coastguard Worker        %tmp3.upgrd.2 = trunc i64 %tmp3 to i32          ; <i32> [#uses=1]
36*9880d681SAndroid Build Coastguard Worker        ret i32 %tmp3.upgrd.2
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; rdar://r10152911
40*9880d681SAndroid Build Coastguard Workerdefine i32 @t3(i32 %a) nounwind {
41*9880d681SAndroid Build Coastguard Worker; V6-LABEL: t3:
42*9880d681SAndroid Build Coastguard Worker; V6: smmla
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; V4-LABEL: t3:
45*9880d681SAndroid Build Coastguard Worker; V4: smull
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; M3-LABEL: t3:
48*9880d681SAndroid Build Coastguard Worker; M3-NOT: smmla
49*9880d681SAndroid Build Coastguard Worker; M3: smull
50*9880d681SAndroid Build Coastguard Workerentry:
51*9880d681SAndroid Build Coastguard Worker  %tmp1 = mul nsw i32 %a, 3
52*9880d681SAndroid Build Coastguard Worker  %tmp2 = sdiv i32 %tmp1, 23
53*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp2
54*9880d681SAndroid Build Coastguard Worker}
55