1; RUN: llc < %s -asm-verbose=false | FileCheck %s 2 3; Test that basic 64-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 i64 @llvm.ctlz.i64(i64, i1) 9declare i64 @llvm.cttz.i64(i64, i1) 10declare i64 @llvm.ctpop.i64(i64) 11 12; CHECK-LABEL: (func $add64 13; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @add64(i64 %x, i64 %y) { 19 %a = add i64 %x, %y 20 ret i64 %a 21} 22 23; CHECK-LABEL: (func $sub64 24; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @sub64(i64 %x, i64 %y) { 30 %a = sub i64 %x, %y 31 ret i64 %a 32} 33 34; CHECK-LABEL: (func $mul64 35; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @mul64(i64 %x, i64 %y) { 41 %a = mul i64 %x, %y 42 ret i64 %a 43} 44 45; CHECK-LABEL: (func $sdiv64 46; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @sdiv64(i64 %x, i64 %y) { 52 %a = sdiv i64 %x, %y 53 ret i64 %a 54} 55 56; CHECK-LABEL: (func $udiv64 57; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @udiv64(i64 %x, i64 %y) { 63 %a = udiv i64 %x, %y 64 ret i64 %a 65} 66 67; CHECK-LABEL: (func $srem64 68; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @srem64(i64 %x, i64 %y) { 74 %a = srem i64 %x, %y 75 ret i64 %a 76} 77 78; CHECK-LABEL: (func $urem64 79; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @urem64(i64 %x, i64 %y) { 85 %a = urem i64 %x, %y 86 ret i64 %a 87} 88 89; CHECK-LABEL: (func $and64 90; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @and64(i64 %x, i64 %y) { 96 %a = and i64 %x, %y 97 ret i64 %a 98} 99 100; CHECK-LABEL: (func $ior64 101; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @ior64(i64 %x, i64 %y) { 107 %a = or i64 %x, %y 108 ret i64 %a 109} 110 111; CHECK-LABEL: (func $xor64 112; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @xor64(i64 %x, i64 %y) { 118 %a = xor i64 %x, %y 119 ret i64 %a 120} 121 122; CHECK-LABEL: (func $shl64 123; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @shl64(i64 %x, i64 %y) { 129 %a = shl i64 %x, %y 130 ret i64 %a 131} 132 133; CHECK-LABEL: (func $shr64 134; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @shr64(i64 %x, i64 %y) { 140 %a = lshr i64 %x, %y 141 ret i64 %a 142} 143 144; CHECK-LABEL: (func $sar64 145; CHECK-NEXT: (param i64) (param i64) (result i64) 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 i64 @sar64(i64 %x, i64 %y) { 151 %a = ashr i64 %x, %y 152 ret i64 %a 153} 154 155; CHECK-LABEL: (func $clz64 156; CHECK-NEXT: (param i64) (result i64) 157; CHECK-NEXT: (set_local @0 (argument 0)) 158; CHECK-NEXT: (set_local @1 (clz @0)) 159; CHECK-NEXT: (return @1) 160define i64 @clz64(i64 %x) { 161 %a = call i64 @llvm.ctlz.i64(i64 %x, i1 false) 162 ret i64 %a 163} 164 165; CHECK-LABEL: (func $clz64_zero_undef 166; CHECK-NEXT: (param i64) (result i64) 167; CHECK-NEXT: (set_local @0 (argument 0)) 168; CHECK-NEXT: (set_local @1 (clz @0)) 169; CHECK-NEXT: (return @1) 170define i64 @clz64_zero_undef(i64 %x) { 171 %a = call i64 @llvm.ctlz.i64(i64 %x, i1 true) 172 ret i64 %a 173} 174 175; CHECK-LABEL: (func $ctz64 176; CHECK-NEXT: (param i64) (result i64) 177; CHECK-NEXT: (set_local @0 (argument 0)) 178; CHECK-NEXT: (set_local @1 (ctz @0)) 179; CHECK-NEXT: (return @1) 180define i64 @ctz64(i64 %x) { 181 %a = call i64 @llvm.cttz.i64(i64 %x, i1 false) 182 ret i64 %a 183} 184 185; CHECK-LABEL: (func $ctz64_zero_undef 186; CHECK-NEXT: (param i64) (result i64) 187; CHECK-NEXT: (set_local @0 (argument 0)) 188; CHECK-NEXT: (set_local @1 (ctz @0)) 189; CHECK-NEXT: (return @1) 190define i64 @ctz64_zero_undef(i64 %x) { 191 %a = call i64 @llvm.cttz.i64(i64 %x, i1 true) 192 ret i64 %a 193} 194 195; CHECK-LABEL: (func $popcnt64 196; CHECK-NEXT: (param i64) (result i64) 197; CHECK-NEXT: (set_local @0 (argument 0)) 198; CHECK-NEXT: (set_local @1 (popcnt @0)) 199; CHECK-NEXT: (return @1) 200define i64 @popcnt64(i64 %x) { 201 %a = call i64 @llvm.ctpop.i64(i64 %x) 202 ret i64 %a 203} 204