1; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s 2; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s 3 4define i32 @test_madd32(i32 %val0, i32 %val1, i32 %val2) { 5; CHECK-LABEL: test_madd32: 6 %mid = mul i32 %val1, %val2 7 %res = add i32 %val0, %mid 8; CHECK: madd {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 9 ret i32 %res 10} 11 12define i64 @test_madd64(i64 %val0, i64 %val1, i64 %val2) { 13; CHECK-LABEL: test_madd64: 14 %mid = mul i64 %val1, %val2 15 %res = add i64 %val0, %mid 16; CHECK: madd {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 17 ret i64 %res 18} 19 20define i32 @test_msub32(i32 %val0, i32 %val1, i32 %val2) { 21; CHECK-LABEL: test_msub32: 22 %mid = mul i32 %val1, %val2 23 %res = sub i32 %val0, %mid 24; CHECK: msub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 25 ret i32 %res 26} 27 28define i64 @test_msub64(i64 %val0, i64 %val1, i64 %val2) { 29; CHECK-LABEL: test_msub64: 30 %mid = mul i64 %val1, %val2 31 %res = sub i64 %val0, %mid 32; CHECK: msub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 33 ret i64 %res 34} 35 36define i64 @test_smaddl(i64 %acc, i32 %val1, i32 %val2) { 37; CHECK-LABEL: test_smaddl: 38 %ext1 = sext i32 %val1 to i64 39 %ext2 = sext i32 %val2 to i64 40 %prod = mul i64 %ext1, %ext2 41 %res = add i64 %acc, %prod 42; CHECK: smaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 43 ret i64 %res 44} 45 46define i64 @test_smsubl(i64 %acc, i32 %val1, i32 %val2) { 47; CHECK-LABEL: test_smsubl: 48 %ext1 = sext i32 %val1 to i64 49 %ext2 = sext i32 %val2 to i64 50 %prod = mul i64 %ext1, %ext2 51 %res = sub i64 %acc, %prod 52; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 53 ret i64 %res 54} 55 56define i64 @test_umaddl(i64 %acc, i32 %val1, i32 %val2) { 57; CHECK-LABEL: test_umaddl: 58 %ext1 = zext i32 %val1 to i64 59 %ext2 = zext i32 %val2 to i64 60 %prod = mul i64 %ext1, %ext2 61 %res = add i64 %acc, %prod 62; CHECK: umaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 63 ret i64 %res 64} 65 66define i64 @test_umsubl(i64 %acc, i32 %val1, i32 %val2) { 67; CHECK-LABEL: test_umsubl: 68 %ext1 = zext i32 %val1 to i64 69 %ext2 = zext i32 %val2 to i64 70 %prod = mul i64 %ext1, %ext2 71 %res = sub i64 %acc, %prod 72; CHECK: umsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}} 73 ret i64 %res 74} 75 76define i64 @test_smulh(i64 %lhs, i64 %rhs) { 77; CHECK-LABEL: test_smulh: 78 %ext1 = sext i64 %lhs to i128 79 %ext2 = sext i64 %rhs to i128 80 %res = mul i128 %ext1, %ext2 81 %high = lshr i128 %res, 64 82 %val = trunc i128 %high to i64 83; CHECK: smulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 84 ret i64 %val 85} 86 87define i64 @test_umulh(i64 %lhs, i64 %rhs) { 88; CHECK-LABEL: test_umulh: 89 %ext1 = zext i64 %lhs to i128 90 %ext2 = zext i64 %rhs to i128 91 %res = mul i128 %ext1, %ext2 92 %high = lshr i128 %res, 64 93 %val = trunc i128 %high to i64 94; CHECK: umulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 95 ret i64 %val 96} 97 98define i32 @test_mul32(i32 %lhs, i32 %rhs) { 99; CHECK-LABEL: test_mul32: 100 %res = mul i32 %lhs, %rhs 101; CHECK: mul {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 102 ret i32 %res 103} 104 105define i64 @test_mul64(i64 %lhs, i64 %rhs) { 106; CHECK-LABEL: test_mul64: 107 %res = mul i64 %lhs, %rhs 108; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 109 ret i64 %res 110} 111 112define i32 @test_mneg32(i32 %lhs, i32 %rhs) { 113; CHECK-LABEL: test_mneg32: 114 %prod = mul i32 %lhs, %rhs 115 %res = sub i32 0, %prod 116; CHECK: mneg {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 117 ret i32 %res 118} 119 120define i64 @test_mneg64(i64 %lhs, i64 %rhs) { 121; CHECK-LABEL: test_mneg64: 122 %prod = mul i64 %lhs, %rhs 123 %res = sub i64 0, %prod 124; CHECK: mneg {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 125 ret i64 %res 126} 127 128define i64 @test_smull(i32 %lhs, i32 %rhs) { 129; CHECK-LABEL: test_smull: 130 %ext1 = sext i32 %lhs to i64 131 %ext2 = sext i32 %rhs to i64 132 %res = mul i64 %ext1, %ext2 133; CHECK: smull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 134 ret i64 %res 135} 136 137define i64 @test_umull(i32 %lhs, i32 %rhs) { 138; CHECK-LABEL: test_umull: 139 %ext1 = zext i32 %lhs to i64 140 %ext2 = zext i32 %rhs to i64 141 %res = mul i64 %ext1, %ext2 142; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 143 ret i64 %res 144} 145 146define i64 @test_smnegl(i32 %lhs, i32 %rhs) { 147; CHECK-LABEL: test_smnegl: 148 %ext1 = sext i32 %lhs to i64 149 %ext2 = sext i32 %rhs to i64 150 %prod = mul i64 %ext1, %ext2 151 %res = sub i64 0, %prod 152; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 153 ret i64 %res 154} 155 156define i64 @test_umnegl(i32 %lhs, i32 %rhs) { 157; CHECK-LABEL: test_umnegl: 158 %ext1 = zext i32 %lhs to i64 159 %ext2 = zext i32 %rhs to i64 160 %prod = mul i64 %ext1, %ext2 161 %res = sub i64 0, %prod 162; CHECK: umnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 163 ret i64 %res 164} 165