1; RUN: llc < %s -asm-verbose=false | FileCheck %s 2 3; Test that basic 32-bit integer operations assemble as expected. 4 5target datalayout = "e-p:32:32-i64:64-n32:64-S128" 6target triple = "wasm32-unknown-unknown" 7 8declare i32 @llvm.ctlz.i32(i32, i1) 9declare i32 @llvm.cttz.i32(i32, i1) 10declare i32 @llvm.ctpop.i32(i32) 11 12; CHECK-LABEL: (func $add32 13; CHECK-NEXT: (param i32) (param i32) (result i32) 14; CHECK-NEXT: (set_local @0 (argument 1)) 15; CHECK-NEXT: (set_local @1 (argument 0)) 16; CHECK-NEXT: (set_local @2 (add @1 @0)) 17; CHECK-NEXT: (return @2) 18define i32 @add32(i32 %x, i32 %y) { 19 %a = add i32 %x, %y 20 ret i32 %a 21} 22 23; CHECK-LABEL: (func $sub32 24; CHECK-NEXT: (param i32) (param i32) (result i32) 25; CHECK-NEXT: (set_local @0 (argument 1)) 26; CHECK-NEXT: (set_local @1 (argument 0)) 27; CHECK-NEXT: (set_local @2 (sub @1 @0)) 28; CHECK-NEXT: (return @2) 29define i32 @sub32(i32 %x, i32 %y) { 30 %a = sub i32 %x, %y 31 ret i32 %a 32} 33 34; CHECK-LABEL: (func $mul32 35; CHECK-NEXT: (param i32) (param i32) (result i32) 36; CHECK-NEXT: (set_local @0 (argument 1)) 37; CHECK-NEXT: (set_local @1 (argument 0)) 38; CHECK-NEXT: (set_local @2 (mul @1 @0)) 39; CHECK-NEXT: (return @2) 40define i32 @mul32(i32 %x, i32 %y) { 41 %a = mul i32 %x, %y 42 ret i32 %a 43} 44 45; CHECK-LABEL: (func $sdiv32 46; CHECK-NEXT: (param i32) (param i32) (result i32) 47; CHECK-NEXT: (set_local @0 (argument 1)) 48; CHECK-NEXT: (set_local @1 (argument 0)) 49; CHECK-NEXT: (set_local @2 (sdiv @1 @0)) 50; CHECK-NEXT: (return @2) 51define i32 @sdiv32(i32 %x, i32 %y) { 52 %a = sdiv i32 %x, %y 53 ret i32 %a 54} 55 56; CHECK-LABEL: (func $udiv32 57; CHECK-NEXT: (param i32) (param i32) (result i32) 58; CHECK-NEXT: (set_local @0 (argument 1)) 59; CHECK-NEXT: (set_local @1 (argument 0)) 60; CHECK-NEXT: (set_local @2 (udiv @1 @0)) 61; CHECK-NEXT: (return @2) 62define i32 @udiv32(i32 %x, i32 %y) { 63 %a = udiv i32 %x, %y 64 ret i32 %a 65} 66 67; CHECK-LABEL: (func $srem32 68; CHECK-NEXT: (param i32) (param i32) (result i32) 69; CHECK-NEXT: (set_local @0 (argument 1)) 70; CHECK-NEXT: (set_local @1 (argument 0)) 71; CHECK-NEXT: (set_local @2 (srem @1 @0)) 72; CHECK-NEXT: (return @2) 73define i32 @srem32(i32 %x, i32 %y) { 74 %a = srem i32 %x, %y 75 ret i32 %a 76} 77 78; CHECK-LABEL: (func $urem32 79; CHECK-NEXT: (param i32) (param i32) (result i32) 80; CHECK-NEXT: (set_local @0 (argument 1)) 81; CHECK-NEXT: (set_local @1 (argument 0)) 82; CHECK-NEXT: (set_local @2 (urem @1 @0)) 83; CHECK-NEXT: (return @2) 84define i32 @urem32(i32 %x, i32 %y) { 85 %a = urem i32 %x, %y 86 ret i32 %a 87} 88 89; CHECK-LABEL: (func $and32 90; CHECK-NEXT: (param i32) (param i32) (result i32) 91; CHECK-NEXT: (set_local @0 (argument 1)) 92; CHECK-NEXT: (set_local @1 (argument 0)) 93; CHECK-NEXT: (set_local @2 (and @1 @0)) 94; CHECK-NEXT: (return @2) 95define i32 @and32(i32 %x, i32 %y) { 96 %a = and i32 %x, %y 97 ret i32 %a 98} 99 100; CHECK-LABEL: (func $ior32 101; CHECK-NEXT: (param i32) (param i32) (result i32) 102; CHECK-NEXT: (set_local @0 (argument 1)) 103; CHECK-NEXT: (set_local @1 (argument 0)) 104; CHECK-NEXT: (set_local @2 (ior @1 @0)) 105; CHECK-NEXT: (return @2) 106define i32 @ior32(i32 %x, i32 %y) { 107 %a = or i32 %x, %y 108 ret i32 %a 109} 110 111; CHECK-LABEL: (func $xor32 112; CHECK-NEXT: (param i32) (param i32) (result i32) 113; CHECK-NEXT: (set_local @0 (argument 1)) 114; CHECK-NEXT: (set_local @1 (argument 0)) 115; CHECK-NEXT: (set_local @2 (xor @1 @0)) 116; CHECK-NEXT: (return @2) 117define i32 @xor32(i32 %x, i32 %y) { 118 %a = xor i32 %x, %y 119 ret i32 %a 120} 121 122; CHECK-LABEL: (func $shl32 123; CHECK-NEXT: (param i32) (param i32) (result i32) 124; CHECK-NEXT: (set_local @0 (argument 1)) 125; CHECK-NEXT: (set_local @1 (argument 0)) 126; CHECK-NEXT: (set_local @2 (shl @1 @0)) 127; CHECK-NEXT: (return @2) 128define i32 @shl32(i32 %x, i32 %y) { 129 %a = shl i32 %x, %y 130 ret i32 %a 131} 132 133; CHECK-LABEL: (func $shr32 134; CHECK-NEXT: (param i32) (param i32) (result i32) 135; CHECK-NEXT: (set_local @0 (argument 1)) 136; CHECK-NEXT: (set_local @1 (argument 0)) 137; CHECK-NEXT: (set_local @2 (shr_u @1 @0)) 138; CHECK-NEXT: (return @2) 139define i32 @shr32(i32 %x, i32 %y) { 140 %a = lshr i32 %x, %y 141 ret i32 %a 142} 143 144; CHECK-LABEL: (func $sar32 145; CHECK-NEXT: (param i32) (param i32) (result i32) 146; CHECK-NEXT: (set_local @0 (argument 1)) 147; CHECK-NEXT: (set_local @1 (argument 0)) 148; CHECK-NEXT: (set_local @2 (shr_s @1 @0)) 149; CHECK-NEXT: (return @2) 150define i32 @sar32(i32 %x, i32 %y) { 151 %a = ashr i32 %x, %y 152 ret i32 %a 153} 154 155; CHECK-LABEL: (func $clz32 156; CHECK-NEXT: (param i32) (result i32) 157; CHECK-NEXT: (set_local @0 (argument 0)) 158; CHECK-NEXT: (set_local @1 (clz @0)) 159; CHECK-NEXT: (return @1) 160define i32 @clz32(i32 %x) { 161 %a = call i32 @llvm.ctlz.i32(i32 %x, i1 false) 162 ret i32 %a 163} 164 165; CHECK-LABEL: (func $clz32_zero_undef 166; CHECK-NEXT: (param i32) (result i32) 167; CHECK-NEXT: (set_local @0 (argument 0)) 168; CHECK-NEXT: (set_local @1 (clz @0)) 169; CHECK-NEXT: (return @1) 170define i32 @clz32_zero_undef(i32 %x) { 171 %a = call i32 @llvm.ctlz.i32(i32 %x, i1 true) 172 ret i32 %a 173} 174 175; CHECK-LABEL: (func $ctz32 176; CHECK-NEXT: (param i32) (result i32) 177; CHECK-NEXT: (set_local @0 (argument 0)) 178; CHECK-NEXT: (set_local @1 (ctz @0)) 179; CHECK-NEXT: (return @1) 180define i32 @ctz32(i32 %x) { 181 %a = call i32 @llvm.cttz.i32(i32 %x, i1 false) 182 ret i32 %a 183} 184 185; CHECK-LABEL: (func $ctz32_zero_undef 186; CHECK-NEXT: (param i32) (result i32) 187; CHECK-NEXT: (set_local @0 (argument 0)) 188; CHECK-NEXT: (set_local @1 (ctz @0)) 189; CHECK-NEXT: (return @1) 190define i32 @ctz32_zero_undef(i32 %x) { 191 %a = call i32 @llvm.cttz.i32(i32 %x, i1 true) 192 ret i32 %a 193} 194 195; CHECK-LABEL: (func $popcnt32 196; CHECK-NEXT: (param i32) (result i32) 197; CHECK-NEXT: (set_local @0 (argument 0)) 198; CHECK-NEXT: (set_local @1 (popcnt @0)) 199; CHECK-NEXT: (return @1) 200define i32 @popcnt32(i32 %x) { 201 %a = call i32 @llvm.ctpop.i32(i32 %x) 202 ret i32 %a 203} 204