xref: /llvm-project/llvm/test/CodeGen/RISCV/xtheadmac.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1d4012bc4SManolis Tsamis; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2d4012bc4SManolis Tsamis; RUN: llc -mtriple=riscv32 -mattr=+xtheadmac -mattr=+m -verify-machineinstrs < %s \
3d4012bc4SManolis Tsamis; RUN:   | FileCheck %s -check-prefix=RV32XTHEADMAC
4d4012bc4SManolis Tsamis; RUN: llc -mtriple=riscv64 -mattr=+xtheadmac -mattr=+m -verify-machineinstrs < %s \
5d4012bc4SManolis Tsamis; RUN:   | FileCheck %s -check-prefix=RV64XTHEADMAC
6d4012bc4SManolis Tsamis
7d4012bc4SManolis Tsamisdefine i32 @mula_i32(i32 %a, i32 %b, i32 %c) {
8d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: mula_i32:
9d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
10d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a0, a1, a2
11d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
12d4012bc4SManolis Tsamis;
13d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: mula_i32:
14d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
15d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulaw a0, a1, a2
16d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
17d4012bc4SManolis Tsamis  %d = mul i32 %b, %c
18d4012bc4SManolis Tsamis  %e = add i32 %a, %d
19d4012bc4SManolis Tsamis  ret i32 %e
20d4012bc4SManolis Tsamis}
21d4012bc4SManolis Tsamis
22d4012bc4SManolis Tsamisdefine i32 @muls_i32(i32 %a, i32 %b, i32 %c) {
23d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: muls_i32:
24d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
25d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.muls a0, a1, a2
26d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
27d4012bc4SManolis Tsamis;
28d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: muls_i32:
29d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
30d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulsw a0, a1, a2
31d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
32d4012bc4SManolis Tsamis  %d = mul i32 %b, %c
33d4012bc4SManolis Tsamis  %e = sub i32 %a, %d
34d4012bc4SManolis Tsamis  ret i32 %e
35d4012bc4SManolis Tsamis}
36d4012bc4SManolis Tsamis
37d4012bc4SManolis Tsamisdefine i64 @mula_i64(i64 %a, i64 %b, i64 %c) {
38d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: mula_i64:
39d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
40d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    mulhu a6, a2, a4
41d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a6, a2, a5
42*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    mv a5, a0
43*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    th.mula a5, a2, a4
44d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a6, a3, a4
45*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    sltu a0, a5, a0
46d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    add a0, a1, a0
47d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    add a1, a0, a6
48*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    mv a0, a5
49d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
50d4012bc4SManolis Tsamis;
51d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: mula_i64:
52d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
53d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mula a0, a1, a2
54d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
55d4012bc4SManolis Tsamis  %d = mul i64 %b, %c
56d4012bc4SManolis Tsamis  %f = add i64 %a, %d
57d4012bc4SManolis Tsamis  ret i64 %f
58d4012bc4SManolis Tsamis}
59d4012bc4SManolis Tsamis
60d4012bc4SManolis Tsamisdefine i64 @mulaw_i64(i32 %a, i32 %b, i32 %c) {
61d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: mulaw_i64:
62d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
63d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a0, a1, a2
64d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    srai a1, a0, 31
65d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
66d4012bc4SManolis Tsamis;
67d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: mulaw_i64:
68d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
69d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulaw a0, a1, a2
70d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
71d4012bc4SManolis Tsamis  %d = mul i32 %b, %c
72d4012bc4SManolis Tsamis  %e = add i32 %a, %d
73d4012bc4SManolis Tsamis  %f = sext i32 %e to i64
74d4012bc4SManolis Tsamis  ret i64 %f
75d4012bc4SManolis Tsamis}
76d4012bc4SManolis Tsamis
77d4012bc4SManolis Tsamisdefine i64 @mulah_i64(i32 %a, i16 %b, i16 %c) {
78d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: mulah_i64:
79d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
80d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mulah a0, a1, a2
81d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    srai a1, a0, 31
82d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
83d4012bc4SManolis Tsamis;
84d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: mulah_i64:
85d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
86d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulah a0, a1, a2
87d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
88d4012bc4SManolis Tsamis  %d = sext i16 %b to i32
89d4012bc4SManolis Tsamis  %e = sext i16 %c to i32
90d4012bc4SManolis Tsamis  %f = mul i32 %d, %e
91d4012bc4SManolis Tsamis  %g = add i32 %a, %f
92d4012bc4SManolis Tsamis  %h = sext i32 %g to i64
93d4012bc4SManolis Tsamis  ret i64 %h
94d4012bc4SManolis Tsamis}
95d4012bc4SManolis Tsamis
96d4012bc4SManolis Tsamisdefine i64 @muls_i64(i64 %a, i64 %b, i64 %c) {
97d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: muls_i64:
98d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
99d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    mulhu a6, a2, a4
100d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a6, a2, a5
101*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    mul a5, a2, a4
102*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    sltu a5, a0, a5
1036774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.muls a0, a2, a4
104*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    th.mula a6, a3, a4
105*9122c523SPengcheng Wang; RV32XTHEADMAC-NEXT:    sub a1, a1, a5
106d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    sub a1, a1, a6
107d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
108d4012bc4SManolis Tsamis;
109d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: muls_i64:
110d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
111d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.muls a0, a1, a2
112d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
113d4012bc4SManolis Tsamis  %d = mul i64 %b, %c
114d4012bc4SManolis Tsamis  %f = sub i64 %a, %d
115d4012bc4SManolis Tsamis  ret i64 %f
116d4012bc4SManolis Tsamis}
117d4012bc4SManolis Tsamis
118d4012bc4SManolis Tsamisdefine i64 @mulsw_i64(i32 %a, i32 %b, i32 %c) {
119d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: mulsw_i64:
120d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
121d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.muls a0, a1, a2
122d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    srai a1, a0, 31
123d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
124d4012bc4SManolis Tsamis;
125d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: mulsw_i64:
126d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
127d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulsw a0, a1, a2
128d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
129d4012bc4SManolis Tsamis  %d = mul i32 %b, %c
130d4012bc4SManolis Tsamis  %e = sub i32 %a, %d
131d4012bc4SManolis Tsamis  %f = sext i32 %e to i64
132d4012bc4SManolis Tsamis  ret i64 %f
133d4012bc4SManolis Tsamis}
134d4012bc4SManolis Tsamis
135d4012bc4SManolis Tsamisdefine i64 @mulsh_i64(i32 %a, i16 %b, i16 %c) {
136d4012bc4SManolis Tsamis; RV32XTHEADMAC-LABEL: mulsh_i64:
137d4012bc4SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
138d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mulsh a0, a1, a2
139d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    srai a1, a0, 31
140d4012bc4SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
141d4012bc4SManolis Tsamis;
142d4012bc4SManolis Tsamis; RV64XTHEADMAC-LABEL: mulsh_i64:
143d4012bc4SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
144d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulsh a0, a1, a2
145d4012bc4SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
146d4012bc4SManolis Tsamis  %d = sext i16 %b to i32
147d4012bc4SManolis Tsamis  %e = sext i16 %c to i32
148d4012bc4SManolis Tsamis  %f = mul i32 %d, %e
149d4012bc4SManolis Tsamis  %g = sub i32 %a, %f
150d4012bc4SManolis Tsamis  %h = sext i32 %g to i64
151d4012bc4SManolis Tsamis  ret i64 %h
152d4012bc4SManolis Tsamis}
1536774ba84SManolis Tsamis
1546774ba84SManolis Tsamisdefine i32 @commutative1(i32 %A, i32 %B, i32 %C) {
1556774ba84SManolis Tsamis; RV32XTHEADMAC-LABEL: commutative1:
1566774ba84SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
1576774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a2, a1, a0
1586774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    mv a0, a2
1596774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
1606774ba84SManolis Tsamis;
1616774ba84SManolis Tsamis; RV64XTHEADMAC-LABEL: commutative1:
1626774ba84SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
1636774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulaw a2, a1, a0
1646774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    mv a0, a2
1656774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
1666774ba84SManolis Tsamis  %mul = mul nsw i32 %B, %A
1676774ba84SManolis Tsamis  %add = add i32 %mul, %C
1686774ba84SManolis Tsamis  ret i32 %add
1696774ba84SManolis Tsamis}
1706774ba84SManolis Tsamis
1716774ba84SManolis Tsamisdefine i32 @commutative2(i32 %A, i32 %B, i32 %C) {
1726774ba84SManolis Tsamis; RV32XTHEADMAC-LABEL: commutative2:
1736774ba84SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
1746774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a0, a1, a2
1756774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
1766774ba84SManolis Tsamis;
1776774ba84SManolis Tsamis; RV64XTHEADMAC-LABEL: commutative2:
1786774ba84SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
1796774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulaw a0, a1, a2
1806774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
1816774ba84SManolis Tsamis  %mul = mul nsw i32 %B, %C
1826774ba84SManolis Tsamis  %add = add i32 %mul, %A
1836774ba84SManolis Tsamis  ret i32 %add
1846774ba84SManolis Tsamis}
1856774ba84SManolis Tsamis
1866774ba84SManolis Tsamisdefine i32 @commutative3(i32 %A, i32 %B, i32 %C) {
1876774ba84SManolis Tsamis; RV32XTHEADMAC-LABEL: commutative3:
1886774ba84SManolis Tsamis; RV32XTHEADMAC:       # %bb.0:
1896774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    th.mula a1, a2, a0
1906774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    mv a0, a1
1916774ba84SManolis Tsamis; RV32XTHEADMAC-NEXT:    ret
1926774ba84SManolis Tsamis;
1936774ba84SManolis Tsamis; RV64XTHEADMAC-LABEL: commutative3:
1946774ba84SManolis Tsamis; RV64XTHEADMAC:       # %bb.0:
1956774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    th.mulaw a1, a2, a0
1966774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    mv a0, a1
1976774ba84SManolis Tsamis; RV64XTHEADMAC-NEXT:    ret
1986774ba84SManolis Tsamis  %mul = mul nsw i32 %C, %A
1996774ba84SManolis Tsamis  %add = add i32 %mul, %B
2006774ba84SManolis Tsamis  ret i32 %add
2016774ba84SManolis Tsamis}
202