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 32-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 i32 @llvm.ctlz.i32(i32, i1) 9*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) 10*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctpop.i32(i32) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add32: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.add $push0=, $0, $1{{$}} 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 17*9880d681SAndroid Build Coastguard Workerdefine i32 @add32(i32 %x, i32 %y) { 18*9880d681SAndroid Build Coastguard Worker %a = add i32 %x, %y 19*9880d681SAndroid Build Coastguard Worker ret i32 %a 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub32: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.sub $push0=, $0, $1{{$}} 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 27*9880d681SAndroid Build Coastguard Workerdefine i32 @sub32(i32 %x, i32 %y) { 28*9880d681SAndroid Build Coastguard Worker %a = sub i32 %x, %y 29*9880d681SAndroid Build Coastguard Worker ret i32 %a 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mul32: 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.mul $push0=, $0, $1{{$}} 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 37*9880d681SAndroid Build Coastguard Workerdefine i32 @mul32(i32 %x, i32 %y) { 38*9880d681SAndroid Build Coastguard Worker %a = mul i32 %x, %y 39*9880d681SAndroid Build Coastguard Worker ret i32 %a 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sdiv32: 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.div_s $push0=, $0, $1{{$}} 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 47*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv32(i32 %x, i32 %y) { 48*9880d681SAndroid Build Coastguard Worker %a = sdiv i32 %x, %y 49*9880d681SAndroid Build Coastguard Worker ret i32 %a 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: udiv32: 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.div_u $push0=, $0, $1{{$}} 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 57*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv32(i32 %x, i32 %y) { 58*9880d681SAndroid Build Coastguard Worker %a = udiv i32 %x, %y 59*9880d681SAndroid Build Coastguard Worker ret i32 %a 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: srem32: 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.rem_s $push0=, $0, $1{{$}} 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 67*9880d681SAndroid Build Coastguard Workerdefine i32 @srem32(i32 %x, i32 %y) { 68*9880d681SAndroid Build Coastguard Worker %a = srem i32 %x, %y 69*9880d681SAndroid Build Coastguard Worker ret i32 %a 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: urem32: 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.rem_u $push0=, $0, $1{{$}} 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 77*9880d681SAndroid Build Coastguard Workerdefine i32 @urem32(i32 %x, i32 %y) { 78*9880d681SAndroid Build Coastguard Worker %a = urem i32 %x, %y 79*9880d681SAndroid Build Coastguard Worker ret i32 %a 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: and32: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.and $push0=, $0, $1{{$}} 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 87*9880d681SAndroid Build Coastguard Workerdefine i32 @and32(i32 %x, i32 %y) { 88*9880d681SAndroid Build Coastguard Worker %a = and i32 %x, %y 89*9880d681SAndroid Build Coastguard Worker ret i32 %a 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: or32: 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push0=, $0, $1{{$}} 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 97*9880d681SAndroid Build Coastguard Workerdefine i32 @or32(i32 %x, i32 %y) { 98*9880d681SAndroid Build Coastguard Worker %a = or i32 %x, %y 99*9880d681SAndroid Build Coastguard Worker ret i32 %a 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xor32: 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.xor $push0=, $0, $1{{$}} 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 107*9880d681SAndroid Build Coastguard Workerdefine i32 @xor32(i32 %x, i32 %y) { 108*9880d681SAndroid Build Coastguard Worker %a = xor i32 %x, %y 109*9880d681SAndroid Build Coastguard Worker ret i32 %a 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl32: 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.shl $push0=, $0, $1{{$}} 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 117*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32(i32 %x, i32 %y) { 118*9880d681SAndroid Build Coastguard Worker %a = shl i32 %x, %y 119*9880d681SAndroid Build Coastguard Worker ret i32 %a 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr32: 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.shr_u $push0=, $0, $1{{$}} 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 127*9880d681SAndroid Build Coastguard Workerdefine i32 @shr32(i32 %x, i32 %y) { 128*9880d681SAndroid Build Coastguard Worker %a = lshr i32 %x, %y 129*9880d681SAndroid Build Coastguard Worker ret i32 %a 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sar32: 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32, i32{{$}} 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.shr_s $push0=, $0, $1{{$}} 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 137*9880d681SAndroid Build Coastguard Workerdefine i32 @sar32(i32 %x, i32 %y) { 138*9880d681SAndroid Build Coastguard Worker %a = ashr i32 %x, %y 139*9880d681SAndroid Build Coastguard Worker ret i32 %a 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz32: 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.clz $push0=, $0{{$}} 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 147*9880d681SAndroid Build Coastguard Workerdefine i32 @clz32(i32 %x) { 148*9880d681SAndroid Build Coastguard Worker %a = call i32 @llvm.ctlz.i32(i32 %x, i1 false) 149*9880d681SAndroid Build Coastguard Worker ret i32 %a 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz32_zero_undef: 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.clz $push0=, $0{{$}} 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 157*9880d681SAndroid Build Coastguard Workerdefine i32 @clz32_zero_undef(i32 %x) { 158*9880d681SAndroid Build Coastguard Worker %a = call i32 @llvm.ctlz.i32(i32 %x, i1 true) 159*9880d681SAndroid Build Coastguard Worker ret i32 %a 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctz32: 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.ctz $push0=, $0{{$}} 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 167*9880d681SAndroid Build Coastguard Workerdefine i32 @ctz32(i32 %x) { 168*9880d681SAndroid Build Coastguard Worker %a = call i32 @llvm.cttz.i32(i32 %x, i1 false) 169*9880d681SAndroid Build Coastguard Worker ret i32 %a 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctz32_zero_undef: 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.ctz $push0=, $0{{$}} 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 177*9880d681SAndroid Build Coastguard Workerdefine i32 @ctz32_zero_undef(i32 %x) { 178*9880d681SAndroid Build Coastguard Worker %a = call i32 @llvm.cttz.i32(i32 %x, i1 true) 179*9880d681SAndroid Build Coastguard Worker ret i32 %a 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: popcnt32: 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.popcnt $push0=, $0{{$}} 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 187*9880d681SAndroid Build Coastguard Workerdefine i32 @popcnt32(i32 %x) { 188*9880d681SAndroid Build Coastguard Worker %a = call i32 @llvm.ctpop.i32(i32 %x) 189*9880d681SAndroid Build Coastguard Worker ret i32 %a 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: eqz32: 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.eqz $push0=, $0{{$}} 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 197*9880d681SAndroid Build Coastguard Workerdefine i32 @eqz32(i32 %x) { 198*9880d681SAndroid Build Coastguard Worker %a = icmp eq i32 %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 i32, i32{{$}} 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 206*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.rotl $push0=, $0, $1 207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 208*9880d681SAndroid Build Coastguard Workerdefine i32 @rotl(i32 %x, i32 %y) { 209*9880d681SAndroid Build Coastguard Worker %z = sub i32 32, %y 210*9880d681SAndroid Build Coastguard Worker %b = shl i32 %x, %y 211*9880d681SAndroid Build Coastguard Worker %c = lshr i32 %x, %z 212*9880d681SAndroid Build Coastguard Worker %d = or i32 %b, %c 213*9880d681SAndroid Build Coastguard Worker ret i32 %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 i32, i32{{$}} 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.rotl $push0=, $0, $1 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 221*9880d681SAndroid Build Coastguard Workerdefine i32 @masked_rotl(i32 %x, i32 %y) { 222*9880d681SAndroid Build Coastguard Worker %a = and i32 %y, 31 223*9880d681SAndroid Build Coastguard Worker %z = sub i32 32, %a 224*9880d681SAndroid Build Coastguard Worker %b = shl i32 %x, %a 225*9880d681SAndroid Build Coastguard Worker %c = lshr i32 %x, %z 226*9880d681SAndroid Build Coastguard Worker %d = or i32 %b, %c 227*9880d681SAndroid Build Coastguard Worker ret i32 %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 i32, i32{{$}} 232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.rotr $push0=, $0, $1 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 235*9880d681SAndroid Build Coastguard Workerdefine i32 @rotr(i32 %x, i32 %y) { 236*9880d681SAndroid Build Coastguard Worker %z = sub i32 32, %y 237*9880d681SAndroid Build Coastguard Worker %b = lshr i32 %x, %y 238*9880d681SAndroid Build Coastguard Worker %c = shl i32 %x, %z 239*9880d681SAndroid Build Coastguard Worker %d = or i32 %b, %c 240*9880d681SAndroid Build Coastguard Worker ret i32 %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 i32, i32{{$}} 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.rotr $push0=, $0, $1 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 248*9880d681SAndroid Build Coastguard Workerdefine i32 @masked_rotr(i32 %x, i32 %y) { 249*9880d681SAndroid Build Coastguard Worker %a = and i32 %y, 31 250*9880d681SAndroid Build Coastguard Worker %z = sub i32 32, %a 251*9880d681SAndroid Build Coastguard Worker %b = lshr i32 %x, %a 252*9880d681SAndroid Build Coastguard Worker %c = shl i32 %x, %z 253*9880d681SAndroid Build Coastguard Worker %d = or i32 %b, %c 254*9880d681SAndroid Build Coastguard Worker ret i32 %d 255*9880d681SAndroid Build Coastguard Worker} 256