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