1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -asm-verbose=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @t1(i32 %a, i32 %b) nounwind readnone ssp { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1: 6*9880d681SAndroid Build Coastguard Worker; CHECK: add w0, w1, w0 7*9880d681SAndroid Build Coastguard Worker; CHECK: ret 8*9880d681SAndroid Build Coastguard Worker %add = add i32 %b, %a 9*9880d681SAndroid Build Coastguard Worker ret i32 %add 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i32 @t2(i32 %a, i32 %b) nounwind readnone ssp { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2: 15*9880d681SAndroid Build Coastguard Worker; CHECK: udiv w0, w0, w1 16*9880d681SAndroid Build Coastguard Worker; CHECK: ret 17*9880d681SAndroid Build Coastguard Worker %udiv = udiv i32 %a, %b 18*9880d681SAndroid Build Coastguard Worker ret i32 %udiv 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i64 @t3(i64 %a, i64 %b) nounwind readnone ssp { 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3: 24*9880d681SAndroid Build Coastguard Worker; CHECK: udiv x0, x0, x1 25*9880d681SAndroid Build Coastguard Worker; CHECK: ret 26*9880d681SAndroid Build Coastguard Worker %udiv = udiv i64 %a, %b 27*9880d681SAndroid Build Coastguard Worker ret i64 %udiv 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i32 @t4(i32 %a, i32 %b) nounwind readnone ssp { 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4: 33*9880d681SAndroid Build Coastguard Worker; CHECK: sdiv w0, w0, w1 34*9880d681SAndroid Build Coastguard Worker; CHECK: ret 35*9880d681SAndroid Build Coastguard Worker %sdiv = sdiv i32 %a, %b 36*9880d681SAndroid Build Coastguard Worker ret i32 %sdiv 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i64 @t5(i64 %a, i64 %b) nounwind readnone ssp { 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5: 42*9880d681SAndroid Build Coastguard Worker; CHECK: sdiv x0, x0, x1 43*9880d681SAndroid Build Coastguard Worker; CHECK: ret 44*9880d681SAndroid Build Coastguard Worker %sdiv = sdiv i64 %a, %b 45*9880d681SAndroid Build Coastguard Worker ret i64 %sdiv 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @t6(i32 %a, i32 %b) nounwind readnone ssp { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t6: 51*9880d681SAndroid Build Coastguard Worker; CHECK: lsl w0, w0, w1 52*9880d681SAndroid Build Coastguard Worker; CHECK: ret 53*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %a, %b 54*9880d681SAndroid Build Coastguard Worker ret i32 %shl 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i64 @t7(i64 %a, i64 %b) nounwind readnone ssp { 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t7: 60*9880d681SAndroid Build Coastguard Worker; CHECK: lsl x0, x0, x1 61*9880d681SAndroid Build Coastguard Worker; CHECK: ret 62*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %a, %b 63*9880d681SAndroid Build Coastguard Worker ret i64 %shl 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine i32 @t8(i32 %a, i32 %b) nounwind readnone ssp { 67*9880d681SAndroid Build Coastguard Workerentry: 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t8: 69*9880d681SAndroid Build Coastguard Worker; CHECK: lsr w0, w0, w1 70*9880d681SAndroid Build Coastguard Worker; CHECK: ret 71*9880d681SAndroid Build Coastguard Worker %lshr = lshr i32 %a, %b 72*9880d681SAndroid Build Coastguard Worker ret i32 %lshr 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine i64 @t9(i64 %a, i64 %b) nounwind readnone ssp { 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t9: 78*9880d681SAndroid Build Coastguard Worker; CHECK: lsr x0, x0, x1 79*9880d681SAndroid Build Coastguard Worker; CHECK: ret 80*9880d681SAndroid Build Coastguard Worker %lshr = lshr i64 %a, %b 81*9880d681SAndroid Build Coastguard Worker ret i64 %lshr 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine i32 @t10(i32 %a, i32 %b) nounwind readnone ssp { 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t10: 87*9880d681SAndroid Build Coastguard Worker; CHECK: asr w0, w0, w1 88*9880d681SAndroid Build Coastguard Worker; CHECK: ret 89*9880d681SAndroid Build Coastguard Worker %ashr = ashr i32 %a, %b 90*9880d681SAndroid Build Coastguard Worker ret i32 %ashr 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i64 @t11(i64 %a, i64 %b) nounwind readnone ssp { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t11: 96*9880d681SAndroid Build Coastguard Worker; CHECK: asr x0, x0, x1 97*9880d681SAndroid Build Coastguard Worker; CHECK: ret 98*9880d681SAndroid Build Coastguard Worker %ashr = ashr i64 %a, %b 99*9880d681SAndroid Build Coastguard Worker ret i64 %ashr 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine i32 @t12(i16 %a, i32 %x) nounwind ssp { 103*9880d681SAndroid Build Coastguard Workerentry: 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t12: 105*9880d681SAndroid Build Coastguard Worker; CHECK: add w0, w1, w0, sxth 106*9880d681SAndroid Build Coastguard Worker; CHECK: ret 107*9880d681SAndroid Build Coastguard Worker %c = sext i16 %a to i32 108*9880d681SAndroid Build Coastguard Worker %e = add i32 %x, %c 109*9880d681SAndroid Build Coastguard Worker ret i32 %e 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine i32 @t13(i16 %a, i32 %x) nounwind ssp { 113*9880d681SAndroid Build Coastguard Workerentry: 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t13: 115*9880d681SAndroid Build Coastguard Worker; CHECK: add w0, w1, w0, sxth #2 116*9880d681SAndroid Build Coastguard Worker; CHECK: ret 117*9880d681SAndroid Build Coastguard Worker %c = sext i16 %a to i32 118*9880d681SAndroid Build Coastguard Worker %d = shl i32 %c, 2 119*9880d681SAndroid Build Coastguard Worker %e = add i32 %x, %d 120*9880d681SAndroid Build Coastguard Worker ret i32 %e 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine i64 @t14(i16 %a, i64 %x) nounwind ssp { 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t14: 126*9880d681SAndroid Build Coastguard Worker; CHECK: and w8, w0, #0xffff 127*9880d681SAndroid Build Coastguard Worker; CHECK: add x0, x1, w8, uxtw #3 128*9880d681SAndroid Build Coastguard Worker; CHECK: ret 129*9880d681SAndroid Build Coastguard Worker %c = zext i16 %a to i64 130*9880d681SAndroid Build Coastguard Worker %d = shl i64 %c, 3 131*9880d681SAndroid Build Coastguard Worker %e = add i64 %x, %d 132*9880d681SAndroid Build Coastguard Worker ret i64 %e 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; rdar://9160598 136*9880d681SAndroid Build Coastguard Workerdefine i64 @t15(i64 %a, i64 %x) nounwind ssp { 137*9880d681SAndroid Build Coastguard Workerentry: 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t15: 139*9880d681SAndroid Build Coastguard Worker; CHECK: add x0, x1, w0, uxtw 140*9880d681SAndroid Build Coastguard Worker; CHECK: ret 141*9880d681SAndroid Build Coastguard Worker %b = and i64 %a, 4294967295 142*9880d681SAndroid Build Coastguard Worker %c = add i64 %x, %b 143*9880d681SAndroid Build Coastguard Worker ret i64 %c 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine i64 @t16(i64 %x) nounwind ssp { 147*9880d681SAndroid Build Coastguard Workerentry: 148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t16: 149*9880d681SAndroid Build Coastguard Worker; CHECK: lsl x0, x0, #1 150*9880d681SAndroid Build Coastguard Worker; CHECK: ret 151*9880d681SAndroid Build Coastguard Worker %a = shl i64 %x, 1 152*9880d681SAndroid Build Coastguard Worker ret i64 %a 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker; rdar://9166974 156*9880d681SAndroid Build Coastguard Workerdefine i64 @t17(i16 %a, i64 %x) nounwind ssp { 157*9880d681SAndroid Build Coastguard Workerentry: 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t17: 159*9880d681SAndroid Build Coastguard Worker; CHECK: sxth [[REG:x[0-9]+]], w0 160*9880d681SAndroid Build Coastguard Worker; CHECK: neg x0, [[REG]], lsl #32 161*9880d681SAndroid Build Coastguard Worker; CHECK: ret 162*9880d681SAndroid Build Coastguard Worker %tmp16 = sext i16 %a to i64 163*9880d681SAndroid Build Coastguard Worker %tmp17 = mul i64 %tmp16, -4294967296 164*9880d681SAndroid Build Coastguard Worker ret i64 %tmp17 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerdefine i32 @t18(i32 %a, i32 %b) nounwind readnone ssp { 168*9880d681SAndroid Build Coastguard Workerentry: 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t18: 170*9880d681SAndroid Build Coastguard Worker; CHECK: sdiv w0, w0, w1 171*9880d681SAndroid Build Coastguard Worker; CHECK: ret 172*9880d681SAndroid Build Coastguard Worker %sdiv = call i32 @llvm.aarch64.sdiv.i32(i32 %a, i32 %b) 173*9880d681SAndroid Build Coastguard Worker ret i32 %sdiv 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdefine i64 @t19(i64 %a, i64 %b) nounwind readnone ssp { 177*9880d681SAndroid Build Coastguard Workerentry: 178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t19: 179*9880d681SAndroid Build Coastguard Worker; CHECK: sdiv x0, x0, x1 180*9880d681SAndroid Build Coastguard Worker; CHECK: ret 181*9880d681SAndroid Build Coastguard Worker %sdiv = call i64 @llvm.aarch64.sdiv.i64(i64 %a, i64 %b) 182*9880d681SAndroid Build Coastguard Worker ret i64 %sdiv 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine i32 @t20(i32 %a, i32 %b) nounwind readnone ssp { 186*9880d681SAndroid Build Coastguard Workerentry: 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t20: 188*9880d681SAndroid Build Coastguard Worker; CHECK: udiv w0, w0, w1 189*9880d681SAndroid Build Coastguard Worker; CHECK: ret 190*9880d681SAndroid Build Coastguard Worker %udiv = call i32 @llvm.aarch64.udiv.i32(i32 %a, i32 %b) 191*9880d681SAndroid Build Coastguard Worker ret i32 %udiv 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine i64 @t21(i64 %a, i64 %b) nounwind readnone ssp { 195*9880d681SAndroid Build Coastguard Workerentry: 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t21: 197*9880d681SAndroid Build Coastguard Worker; CHECK: udiv x0, x0, x1 198*9880d681SAndroid Build Coastguard Worker; CHECK: ret 199*9880d681SAndroid Build Coastguard Worker %udiv = call i64 @llvm.aarch64.udiv.i64(i64 %a, i64 %b) 200*9880d681SAndroid Build Coastguard Worker ret i64 %udiv 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.sdiv.i32(i32, i32) nounwind readnone 204*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.sdiv.i64(i64, i64) nounwind readnone 205*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.udiv.i32(i32, i32) nounwind readnone 206*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.udiv.i64(i64, i64) nounwind readnone 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; 32-bit not. 209*9880d681SAndroid Build Coastguard Workerdefine i32 @inv_32(i32 %x) nounwind ssp { 210*9880d681SAndroid Build Coastguard Workerentry: 211*9880d681SAndroid Build Coastguard Worker; CHECK: inv_32 212*9880d681SAndroid Build Coastguard Worker; CHECK: mvn w0, w0 213*9880d681SAndroid Build Coastguard Worker; CHECK: ret 214*9880d681SAndroid Build Coastguard Worker %inv = xor i32 %x, -1 215*9880d681SAndroid Build Coastguard Worker ret i32 %inv 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; 64-bit not. 219*9880d681SAndroid Build Coastguard Workerdefine i64 @inv_64(i64 %x) nounwind ssp { 220*9880d681SAndroid Build Coastguard Workerentry: 221*9880d681SAndroid Build Coastguard Worker; CHECK: inv_64 222*9880d681SAndroid Build Coastguard Worker; CHECK: mvn x0, x0 223*9880d681SAndroid Build Coastguard Worker; CHECK: ret 224*9880d681SAndroid Build Coastguard Worker %inv = xor i64 %x, -1 225*9880d681SAndroid Build Coastguard Worker ret i64 %inv 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker; Multiplying by a power of two plus or minus one is better done via shift 229*9880d681SAndroid Build Coastguard Worker; and add/sub rather than the madd/msub instructions. The latter are 4+ cycles, 230*9880d681SAndroid Build Coastguard Worker; and the former are two (total for the two instruction sequence for subtract). 231*9880d681SAndroid Build Coastguard Workerdefine i32 @f0(i32 %a) nounwind readnone ssp { 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f0: 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add w0, w0, w0, lsl #3 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 235*9880d681SAndroid Build Coastguard Worker %res = mul i32 %a, 9 236*9880d681SAndroid Build Coastguard Worker ret i32 %res 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerdefine i64 @f1(i64 %a) nounwind readnone ssp { 240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: lsl x8, x0, #4 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub x0, x8, x0 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 244*9880d681SAndroid Build Coastguard Worker %res = mul i64 %a, 15 245*9880d681SAndroid Build Coastguard Worker ret i64 %res 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %a) nounwind readnone ssp { 249*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: lsl w8, w0, #3 251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub w0, w8, w0 252*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 253*9880d681SAndroid Build Coastguard Worker %res = mul nsw i32 %a, 7 254*9880d681SAndroid Build Coastguard Worker ret i32 %res 255*9880d681SAndroid Build Coastguard Worker} 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workerdefine i64 @f3(i64 %a) nounwind readnone ssp { 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x0, x0, x0, lsl #4 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 261*9880d681SAndroid Build Coastguard Worker %res = mul nsw i64 %a, 17 262*9880d681SAndroid Build Coastguard Worker ret i64 %res 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %a) nounwind readnone ssp { 266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add w0, w0, w0, lsl #1 268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 269*9880d681SAndroid Build Coastguard Worker %res = mul i32 %a, 3 270*9880d681SAndroid Build Coastguard Worker ret i32 %res 271*9880d681SAndroid Build Coastguard Worker} 272