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