1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test that basic 64-bit integer operations assemble as expected. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 6*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctlz.i64(i64, i1) 9*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64(i64, i1) 10*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctpop.i64(i64) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add64: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.add $push0=, $0, $1{{$}} 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 17*9880d681SAndroid Build Coastguard Workerdefine i64 @add64(i64 %x, i64 %y) { 18*9880d681SAndroid Build Coastguard Worker %a = add i64 %x, %y 19*9880d681SAndroid Build Coastguard Worker ret i64 %a 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub64: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.sub $push0=, $0, $1{{$}} 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 27*9880d681SAndroid Build Coastguard Workerdefine i64 @sub64(i64 %x, i64 %y) { 28*9880d681SAndroid Build Coastguard Worker %a = sub i64 %x, %y 29*9880d681SAndroid Build Coastguard Worker ret i64 %a 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mul64: 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.mul $push0=, $0, $1{{$}} 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 37*9880d681SAndroid Build Coastguard Workerdefine i64 @mul64(i64 %x, i64 %y) { 38*9880d681SAndroid Build Coastguard Worker %a = mul i64 %x, %y 39*9880d681SAndroid Build Coastguard Worker ret i64 %a 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sdiv64: 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.div_s $push0=, $0, $1{{$}} 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 47*9880d681SAndroid Build Coastguard Workerdefine i64 @sdiv64(i64 %x, i64 %y) { 48*9880d681SAndroid Build Coastguard Worker %a = sdiv i64 %x, %y 49*9880d681SAndroid Build Coastguard Worker ret i64 %a 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: udiv64: 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.div_u $push0=, $0, $1{{$}} 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 57*9880d681SAndroid Build Coastguard Workerdefine i64 @udiv64(i64 %x, i64 %y) { 58*9880d681SAndroid Build Coastguard Worker %a = udiv i64 %x, %y 59*9880d681SAndroid Build Coastguard Worker ret i64 %a 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: srem64: 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.rem_s $push0=, $0, $1{{$}} 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 67*9880d681SAndroid Build Coastguard Workerdefine i64 @srem64(i64 %x, i64 %y) { 68*9880d681SAndroid Build Coastguard Worker %a = srem i64 %x, %y 69*9880d681SAndroid Build Coastguard Worker ret i64 %a 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: urem64: 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.rem_u $push0=, $0, $1{{$}} 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 77*9880d681SAndroid Build Coastguard Workerdefine i64 @urem64(i64 %x, i64 %y) { 78*9880d681SAndroid Build Coastguard Worker %a = urem i64 %x, %y 79*9880d681SAndroid Build Coastguard Worker ret i64 %a 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and64: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.and $push0=, $0, $1{{$}} 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 87*9880d681SAndroid Build Coastguard Workerdefine i64 @and64(i64 %x, i64 %y) { 88*9880d681SAndroid Build Coastguard Worker %a = and i64 %x, %y 89*9880d681SAndroid Build Coastguard Worker ret i64 %a 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or64: 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.or $push0=, $0, $1{{$}} 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 97*9880d681SAndroid Build Coastguard Workerdefine i64 @or64(i64 %x, i64 %y) { 98*9880d681SAndroid Build Coastguard Worker %a = or i64 %x, %y 99*9880d681SAndroid Build Coastguard Worker ret i64 %a 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor64: 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.xor $push0=, $0, $1{{$}} 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 107*9880d681SAndroid Build Coastguard Workerdefine i64 @xor64(i64 %x, i64 %y) { 108*9880d681SAndroid Build Coastguard Worker %a = xor i64 %x, %y 109*9880d681SAndroid Build Coastguard Worker ret i64 %a 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl64: 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.shl $push0=, $0, $1{{$}} 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 117*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64(i64 %x, i64 %y) { 118*9880d681SAndroid Build Coastguard Worker %a = shl i64 %x, %y 119*9880d681SAndroid Build Coastguard Worker ret i64 %a 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr64: 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.shr_u $push0=, $0, $1{{$}} 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 127*9880d681SAndroid Build Coastguard Workerdefine i64 @shr64(i64 %x, i64 %y) { 128*9880d681SAndroid Build Coastguard Worker %a = lshr i64 %x, %y 129*9880d681SAndroid Build Coastguard Worker ret i64 %a 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sar64: 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.shr_s $push0=, $0, $1{{$}} 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 137*9880d681SAndroid Build Coastguard Workerdefine i64 @sar64(i64 %x, i64 %y) { 138*9880d681SAndroid Build Coastguard Worker %a = ashr i64 %x, %y 139*9880d681SAndroid Build Coastguard Worker ret i64 %a 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz64: 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.clz $push0=, $0{{$}} 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 147*9880d681SAndroid Build Coastguard Workerdefine i64 @clz64(i64 %x) { 148*9880d681SAndroid Build Coastguard Worker %a = call i64 @llvm.ctlz.i64(i64 %x, i1 false) 149*9880d681SAndroid Build Coastguard Worker ret i64 %a 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz64_zero_undef: 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.clz $push0=, $0{{$}} 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 157*9880d681SAndroid Build Coastguard Workerdefine i64 @clz64_zero_undef(i64 %x) { 158*9880d681SAndroid Build Coastguard Worker %a = call i64 @llvm.ctlz.i64(i64 %x, i1 true) 159*9880d681SAndroid Build Coastguard Worker ret i64 %a 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctz64: 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.ctz $push0=, $0{{$}} 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 167*9880d681SAndroid Build Coastguard Workerdefine i64 @ctz64(i64 %x) { 168*9880d681SAndroid Build Coastguard Worker %a = call i64 @llvm.cttz.i64(i64 %x, i1 false) 169*9880d681SAndroid Build Coastguard Worker ret i64 %a 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctz64_zero_undef: 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.ctz $push0=, $0{{$}} 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 177*9880d681SAndroid Build Coastguard Workerdefine i64 @ctz64_zero_undef(i64 %x) { 178*9880d681SAndroid Build Coastguard Worker %a = call i64 @llvm.cttz.i64(i64 %x, i1 true) 179*9880d681SAndroid Build Coastguard Worker ret i64 %a 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: popcnt64: 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.popcnt $push0=, $0{{$}} 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 187*9880d681SAndroid Build Coastguard Workerdefine i64 @popcnt64(i64 %x) { 188*9880d681SAndroid Build Coastguard Worker %a = call i64 @llvm.ctpop.i64(i64 %x) 189*9880d681SAndroid Build Coastguard Worker ret i64 %a 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: eqz64: 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.eqz $push0=, $0{{$}} 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 197*9880d681SAndroid Build Coastguard Workerdefine i32 @eqz64(i64 %x) { 198*9880d681SAndroid Build Coastguard Worker %a = icmp eq i64 %x, 0 199*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 200*9880d681SAndroid Build Coastguard Worker ret i32 %b 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rotl: 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.rotl $push0=, $0, $1 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 208*9880d681SAndroid Build Coastguard Workerdefine i64 @rotl(i64 %x, i64 %y) { 209*9880d681SAndroid Build Coastguard Worker %z = sub i64 64, %y 210*9880d681SAndroid Build Coastguard Worker %b = shl i64 %x, %y 211*9880d681SAndroid Build Coastguard Worker %c = lshr i64 %x, %z 212*9880d681SAndroid Build Coastguard Worker %d = or i64 %b, %c 213*9880d681SAndroid Build Coastguard Worker ret i64 %d 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: masked_rotl: 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.rotl $push0=, $0, $1 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 221*9880d681SAndroid Build Coastguard Workerdefine i64 @masked_rotl(i64 %x, i64 %y) { 222*9880d681SAndroid Build Coastguard Worker %a = and i64 %y, 63 223*9880d681SAndroid Build Coastguard Worker %z = sub i64 64, %a 224*9880d681SAndroid Build Coastguard Worker %b = shl i64 %x, %a 225*9880d681SAndroid Build Coastguard Worker %c = lshr i64 %x, %z 226*9880d681SAndroid Build Coastguard Worker %d = or i64 %b, %c 227*9880d681SAndroid Build Coastguard Worker ret i64 %d 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rotr: 231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.rotr $push0=, $0, $1 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 235*9880d681SAndroid Build Coastguard Workerdefine i64 @rotr(i64 %x, i64 %y) { 236*9880d681SAndroid Build Coastguard Worker %z = sub i64 64, %y 237*9880d681SAndroid Build Coastguard Worker %b = lshr i64 %x, %y 238*9880d681SAndroid Build Coastguard Worker %c = shl i64 %x, %z 239*9880d681SAndroid Build Coastguard Worker %d = or i64 %b, %c 240*9880d681SAndroid Build Coastguard Worker ret i64 %d 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: masked_rotr: 244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64, i64{{$}} 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.rotr $push0=, $0, $1 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 248*9880d681SAndroid Build Coastguard Workerdefine i64 @masked_rotr(i64 %x, i64 %y) { 249*9880d681SAndroid Build Coastguard Worker %a = and i64 %y, 63 250*9880d681SAndroid Build Coastguard Worker %z = sub i64 64, %a 251*9880d681SAndroid Build Coastguard Worker %b = lshr i64 %x, %a 252*9880d681SAndroid Build Coastguard Worker %c = shl i64 %x, %z 253*9880d681SAndroid Build Coastguard Worker %d = or i64 %b, %c 254*9880d681SAndroid Build Coastguard Worker ret i64 %d 255*9880d681SAndroid Build Coastguard Worker} 256