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 conversion 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 Worker; CHECK-LABEL: i32_wrap_i64: 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.wrap/i64 $push[[NUM:[0-9]+]]=, $0{{$}} 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 13*9880d681SAndroid Build Coastguard Workerdefine i32 @i32_wrap_i64(i64 %x) { 14*9880d681SAndroid Build Coastguard Worker %a = trunc i64 %x to i32 15*9880d681SAndroid Build Coastguard Worker ret i32 %a 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i64_extend_s_i32: 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.extend_s/i32 $push[[NUM:[0-9]+]]=, $0{{$}} 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 23*9880d681SAndroid Build Coastguard Workerdefine i64 @i64_extend_s_i32(i32 %x) { 24*9880d681SAndroid Build Coastguard Worker %a = sext i32 %x to i64 25*9880d681SAndroid Build Coastguard Worker ret i64 %a 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i64_extend_u_i32: 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.extend_u/i32 $push[[NUM:[0-9]+]]=, $0{{$}} 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 33*9880d681SAndroid Build Coastguard Workerdefine i64 @i64_extend_u_i32(i32 %x) { 34*9880d681SAndroid Build Coastguard Worker %a = zext i32 %x to i64 35*9880d681SAndroid Build Coastguard Worker ret i64 %a 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i32_trunc_s_f32: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f32{{$}} 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}} 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 43*9880d681SAndroid Build Coastguard Workerdefine i32 @i32_trunc_s_f32(float %x) { 44*9880d681SAndroid Build Coastguard Worker %a = fptosi float %x to i32 45*9880d681SAndroid Build Coastguard Worker ret i32 %a 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i32_trunc_u_f32: 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f32{{$}} 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}} 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 53*9880d681SAndroid Build Coastguard Workerdefine i32 @i32_trunc_u_f32(float %x) { 54*9880d681SAndroid Build Coastguard Worker %a = fptoui float %x to i32 55*9880d681SAndroid Build Coastguard Worker ret i32 %a 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i32_trunc_s_f64: 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64{{$}} 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}} 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 63*9880d681SAndroid Build Coastguard Workerdefine i32 @i32_trunc_s_f64(double %x) { 64*9880d681SAndroid Build Coastguard Worker %a = fptosi double %x to i32 65*9880d681SAndroid Build Coastguard Worker ret i32 %a 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i32_trunc_u_f64: 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64{{$}} 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}} 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 73*9880d681SAndroid Build Coastguard Workerdefine i32 @i32_trunc_u_f64(double %x) { 74*9880d681SAndroid Build Coastguard Worker %a = fptoui double %x to i32 75*9880d681SAndroid Build Coastguard Worker ret i32 %a 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i64_trunc_s_f32: 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f32{{$}} 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}} 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 83*9880d681SAndroid Build Coastguard Workerdefine i64 @i64_trunc_s_f32(float %x) { 84*9880d681SAndroid Build Coastguard Worker %a = fptosi float %x to i64 85*9880d681SAndroid Build Coastguard Worker ret i64 %a 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i64_trunc_u_f32: 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f32{{$}} 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}} 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 93*9880d681SAndroid Build Coastguard Workerdefine i64 @i64_trunc_u_f32(float %x) { 94*9880d681SAndroid Build Coastguard Worker %a = fptoui float %x to i64 95*9880d681SAndroid Build Coastguard Worker ret i64 %a 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i64_trunc_s_f64: 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64{{$}} 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}} 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 103*9880d681SAndroid Build Coastguard Workerdefine i64 @i64_trunc_s_f64(double %x) { 104*9880d681SAndroid Build Coastguard Worker %a = fptosi double %x to i64 105*9880d681SAndroid Build Coastguard Worker ret i64 %a 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i64_trunc_u_f64: 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64{{$}} 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i64{{$}} 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}} 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 113*9880d681SAndroid Build Coastguard Workerdefine i64 @i64_trunc_u_f64(double %x) { 114*9880d681SAndroid Build Coastguard Worker %a = fptoui double %x to i64 115*9880d681SAndroid Build Coastguard Worker ret i64 %a 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32_convert_s_i32: 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f32{{$}} 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f32.convert_s/i32 $push[[NUM:[0-9]+]]=, $0{{$}} 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 123*9880d681SAndroid Build Coastguard Workerdefine float @f32_convert_s_i32(i32 %x) { 124*9880d681SAndroid Build Coastguard Worker %a = sitofp i32 %x to float 125*9880d681SAndroid Build Coastguard Worker ret float %a 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32_convert_u_i32: 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f32{{$}} 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f32.convert_u/i32 $push[[NUM:[0-9]+]]=, $0{{$}} 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 133*9880d681SAndroid Build Coastguard Workerdefine float @f32_convert_u_i32(i32 %x) { 134*9880d681SAndroid Build Coastguard Worker %a = uitofp i32 %x to float 135*9880d681SAndroid Build Coastguard Worker ret float %a 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f64_convert_s_i32: 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f64{{$}} 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.convert_s/i32 $push[[NUM:[0-9]+]]=, $0{{$}} 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 143*9880d681SAndroid Build Coastguard Workerdefine double @f64_convert_s_i32(i32 %x) { 144*9880d681SAndroid Build Coastguard Worker %a = sitofp i32 %x to double 145*9880d681SAndroid Build Coastguard Worker ret double %a 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f64_convert_u_i32: 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i32{{$}} 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f64{{$}} 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.convert_u/i32 $push[[NUM:[0-9]+]]=, $0{{$}} 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 153*9880d681SAndroid Build Coastguard Workerdefine double @f64_convert_u_i32(i32 %x) { 154*9880d681SAndroid Build Coastguard Worker %a = uitofp i32 %x to double 155*9880d681SAndroid Build Coastguard Worker ret double %a 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32_convert_s_i64: 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f32{{$}} 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f32.convert_s/i64 $push[[NUM:[0-9]+]]=, $0{{$}} 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 163*9880d681SAndroid Build Coastguard Workerdefine float @f32_convert_s_i64(i64 %x) { 164*9880d681SAndroid Build Coastguard Worker %a = sitofp i64 %x to float 165*9880d681SAndroid Build Coastguard Worker ret float %a 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32_convert_u_i64: 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f32{{$}} 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f32.convert_u/i64 $push[[NUM:[0-9]+]]=, $0{{$}} 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 173*9880d681SAndroid Build Coastguard Workerdefine float @f32_convert_u_i64(i64 %x) { 174*9880d681SAndroid Build Coastguard Worker %a = uitofp i64 %x to float 175*9880d681SAndroid Build Coastguard Worker ret float %a 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f64_convert_s_i64: 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f64{{$}} 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.convert_s/i64 $push[[NUM:[0-9]+]]=, $0{{$}} 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 183*9880d681SAndroid Build Coastguard Workerdefine double @f64_convert_s_i64(i64 %x) { 184*9880d681SAndroid Build Coastguard Worker %a = sitofp i64 %x to double 185*9880d681SAndroid Build Coastguard Worker ret double %a 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f64_convert_u_i64: 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param i64{{$}} 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f64{{$}} 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.convert_u/i64 $push[[NUM:[0-9]+]]=, $0{{$}} 192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 193*9880d681SAndroid Build Coastguard Workerdefine double @f64_convert_u_i64(i64 %x) { 194*9880d681SAndroid Build Coastguard Worker %a = uitofp i64 %x to double 195*9880d681SAndroid Build Coastguard Worker ret double %a 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f64_promote_f32: 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f32{{$}} 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f64{{$}} 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.promote/f32 $push[[NUM:[0-9]+]]=, $0{{$}} 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 203*9880d681SAndroid Build Coastguard Workerdefine double @f64_promote_f32(float %x) { 204*9880d681SAndroid Build Coastguard Worker %a = fpext float %x to double 205*9880d681SAndroid Build Coastguard Worker ret double %a 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32_demote_f64: 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64{{$}} 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f32{{$}} 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f32.demote/f64 $push[[NUM:[0-9]+]]=, $0{{$}} 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 213*9880d681SAndroid Build Coastguard Workerdefine float @f32_demote_f64(double %x) { 214*9880d681SAndroid Build Coastguard Worker %a = fptrunc double %x to float 215*9880d681SAndroid Build Coastguard Worker ret float %a 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; If the high its are unused, LLVM will optimize sext/zext into anyext, which 219*9880d681SAndroid Build Coastguard Worker; we need to patterm-match back to a specific instruction. 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: anyext: 222*9880d681SAndroid Build Coastguard Worker; CHECK: i64.extend_u/i32 $push0=, $0{{$}} 223*9880d681SAndroid Build Coastguard Workerdefine i64 @anyext(i32 %x) { 224*9880d681SAndroid Build Coastguard Worker %y = sext i32 %x to i64 225*9880d681SAndroid Build Coastguard Worker %w = shl i64 %y, 32 226*9880d681SAndroid Build Coastguard Worker ret i64 %w 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_i32_to_float: 230*9880d681SAndroid Build Coastguard Worker; CHECK: f32.reinterpret/i32 $push0=, $0{{$}} 231*9880d681SAndroid Build Coastguard Workerdefine float @bitcast_i32_to_float(i32 %a) { 232*9880d681SAndroid Build Coastguard Worker %t = bitcast i32 %a to float 233*9880d681SAndroid Build Coastguard Worker ret float %t 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_float_to_i32: 237*9880d681SAndroid Build Coastguard Worker; CHECK: i32.reinterpret/f32 $push0=, $0{{$}} 238*9880d681SAndroid Build Coastguard Workerdefine i32 @bitcast_float_to_i32(float %a) { 239*9880d681SAndroid Build Coastguard Worker %t = bitcast float %a to i32 240*9880d681SAndroid Build Coastguard Worker ret i32 %t 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_i64_to_double: 244*9880d681SAndroid Build Coastguard Worker; CHECK: f64.reinterpret/i64 $push0=, $0{{$}} 245*9880d681SAndroid Build Coastguard Workerdefine double @bitcast_i64_to_double(i64 %a) { 246*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 %a to double 247*9880d681SAndroid Build Coastguard Worker ret double %t 248*9880d681SAndroid Build Coastguard Worker} 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_double_to_i64: 251*9880d681SAndroid Build Coastguard Worker; CHECK: i64.reinterpret/f64 $push0=, $0{{$}} 252*9880d681SAndroid Build Coastguard Workerdefine i64 @bitcast_double_to_i64(double %a) { 253*9880d681SAndroid Build Coastguard Worker %t = bitcast double %a to i64 254*9880d681SAndroid Build Coastguard Worker ret i64 %t 255*9880d681SAndroid Build Coastguard Worker} 256