1; RUN: llc < %s -asm-verbose=false | FileCheck %s 2 3; Test that basic conversion operations assemble as expected. 4 5target datalayout = "e-p:32:32-i64:64-n32:64-S128" 6target triple = "wasm32-unknown-unknown" 7 8; CHECK-LABEL: i32_wrap_i64: 9; CHECK-NEXT: .param i64{{$}} 10; CHECK-NEXT: .result i32{{$}} 11; CHECK-NEXT: @0{{$}} 12; CHECK-NEXT: set_local @1, pop{{$}} 13; CHECK-NEXT: i32_wrap @1{{$}} 14; CHECK-NEXT: set_local @2, pop{{$}} 15; CHECK-NEXT: return @2{{$}} 16define i32 @i32_wrap_i64(i64 %x) { 17 %a = trunc i64 %x to i32 18 ret i32 %a 19} 20 21; CHECK-LABEL: i64_extend_s_i32: 22; CHECK-NEXT: .param i32 23; CHECK-NEXT: .result i64 24; CHECK-NEXT: @0{{$}} 25; CHECK-NEXT: set_local @1, pop{{$}} 26; CHECK-NEXT: i64_extend_s @1{{$}} 27; CHECK-NEXT: set_local @2, pop{{$}} 28; CHECK-NEXT: return @2{{$}} 29define i64 @i64_extend_s_i32(i32 %x) { 30 %a = sext i32 %x to i64 31 ret i64 %a 32} 33 34; CHECK-LABEL: i64_extend_u_i32: 35; CHECK-NEXT: .param i32 36; CHECK-NEXT: .result i64 37; CHECK-NEXT: @0{{$}} 38; CHECK-NEXT: set_local @1, pop{{$}} 39; CHECK-NEXT: i64_extend_u @1{{$}} 40; CHECK-NEXT: set_local @2, pop{{$}} 41; CHECK-NEXT: return @2{{$}} 42define i64 @i64_extend_u_i32(i32 %x) { 43 %a = zext i32 %x to i64 44 ret i64 %a 45} 46 47; CHECK-LABEL: i32_trunc_s_f32: 48; CHECK-NEXT: .param f32 49; CHECK-NEXT: .result i32 50; CHECK-NEXT: @0{{$}} 51; CHECK-NEXT: set_local @1, pop{{$}} 52; CHECK-NEXT: i32_trunc_s @1{{$}} 53; CHECK-NEXT: set_local @2, pop{{$}} 54; CHECK-NEXT: return @2{{$}} 55define i32 @i32_trunc_s_f32(float %x) { 56 %a = fptosi float %x to i32 57 ret i32 %a 58} 59 60; CHECK-LABEL: i32_trunc_u_f32: 61; CHECK-NEXT: .param f32 62; CHECK-NEXT: .result i32 63; CHECK-NEXT: @0{{$}} 64; CHECK-NEXT: set_local @1, pop{{$}} 65; CHECK-NEXT: i32_trunc_u @1{{$}} 66; CHECK-NEXT: set_local @2, pop{{$}} 67; CHECK-NEXT: return @2{{$}} 68define i32 @i32_trunc_u_f32(float %x) { 69 %a = fptoui float %x to i32 70 ret i32 %a 71} 72 73; CHECK-LABEL: i32_trunc_s_f64: 74; CHECK-NEXT: .param f64 75; CHECK-NEXT: .result i32 76; CHECK-NEXT: @0{{$}} 77; CHECK-NEXT: set_local @1, pop{{$}} 78; CHECK-NEXT: i32_trunc_s @1{{$}} 79; CHECK-NEXT: set_local @2, pop{{$}} 80; CHECK-NEXT: return @2{{$}} 81define i32 @i32_trunc_s_f64(double %x) { 82 %a = fptosi double %x to i32 83 ret i32 %a 84} 85 86; CHECK-LABEL: i32_trunc_u_f64: 87; CHECK-NEXT: .param f64 88; CHECK-NEXT: .result i32 89; CHECK-NEXT: @0{{$}} 90; CHECK-NEXT: set_local @1, pop{{$}} 91; CHECK-NEXT: i32_trunc_u @1{{$}} 92; CHECK-NEXT: set_local @2, pop{{$}} 93; CHECK-NEXT: return @2{{$}} 94define i32 @i32_trunc_u_f64(double %x) { 95 %a = fptoui double %x to i32 96 ret i32 %a 97} 98 99; CHECK-LABEL: i64_trunc_s_f32: 100; CHECK-NEXT: .param f32 101; CHECK-NEXT: .result i64 102; CHECK-NEXT: @0{{$}} 103; CHECK-NEXT: set_local @1, pop{{$}} 104; CHECK-NEXT: i64_trunc_s @1{{$}} 105; CHECK-NEXT: set_local @2, pop{{$}} 106; CHECK-NEXT: return @2{{$}} 107define i64 @i64_trunc_s_f32(float %x) { 108 %a = fptosi float %x to i64 109 ret i64 %a 110} 111 112; CHECK-LABEL: i64_trunc_u_f32: 113; CHECK-NEXT: .param f32 114; CHECK-NEXT: .result i64 115; CHECK-NEXT: @0{{$}} 116; CHECK-NEXT: set_local @1, pop{{$}} 117; CHECK-NEXT: i64_trunc_u @1{{$}} 118; CHECK-NEXT: set_local @2, pop{{$}} 119; CHECK-NEXT: return @2{{$}} 120define i64 @i64_trunc_u_f32(float %x) { 121 %a = fptoui float %x to i64 122 ret i64 %a 123} 124 125; CHECK-LABEL: i64_trunc_s_f64: 126; CHECK-NEXT: .param f64 127; CHECK-NEXT: .result i64 128; CHECK-NEXT: @0{{$}} 129; CHECK-NEXT: set_local @1, pop{{$}} 130; CHECK-NEXT: i64_trunc_s @1{{$}} 131; CHECK-NEXT: set_local @2, pop{{$}} 132; CHECK-NEXT: return @2{{$}} 133define i64 @i64_trunc_s_f64(double %x) { 134 %a = fptosi double %x to i64 135 ret i64 %a 136} 137 138; CHECK-LABEL: i64_trunc_u_f64: 139; CHECK-NEXT: .param f64 140; CHECK-NEXT: .result i64 141; CHECK-NEXT: @0{{$}} 142; CHECK-NEXT: set_local @1, pop{{$}} 143; CHECK-NEXT: i64_trunc_u @1{{$}} 144; CHECK-NEXT: set_local @2, pop{{$}} 145; CHECK-NEXT: return @2{{$}} 146define i64 @i64_trunc_u_f64(double %x) { 147 %a = fptoui double %x to i64 148 ret i64 %a 149} 150 151; CHECK-LABEL: f32_convert_s_i32: 152; CHECK-NEXT: .param i32 153; CHECK-NEXT: .result f32 154; CHECK-NEXT: @0{{$}} 155; CHECK-NEXT: set_local @1, pop{{$}} 156; CHECK-NEXT: f32_convert_s @1{{$}} 157; CHECK-NEXT: set_local @2, pop{{$}} 158; CHECK-NEXT: return @2{{$}} 159define float @f32_convert_s_i32(i32 %x) { 160 %a = sitofp i32 %x to float 161 ret float %a 162} 163 164; CHECK-LABEL: f32_convert_u_i32: 165; CHECK-NEXT: .param i32 166; CHECK-NEXT: .result f32 167; CHECK-NEXT: @0{{$}} 168; CHECK-NEXT: set_local @1, pop{{$}} 169; CHECK-NEXT: f32_convert_u @1{{$}} 170; CHECK-NEXT: set_local @2, pop{{$}} 171; CHECK-NEXT: return @2{{$}} 172define float @f32_convert_u_i32(i32 %x) { 173 %a = uitofp i32 %x to float 174 ret float %a 175} 176 177; CHECK-LABEL: f64_convert_s_i32: 178; CHECK-NEXT: .param i32 179; CHECK-NEXT: .result f64 180; CHECK-NEXT: @0{{$}} 181; CHECK-NEXT: set_local @1, pop{{$}} 182; CHECK-NEXT: f64_convert_s @1{{$}} 183; CHECK-NEXT: set_local @2, pop{{$}} 184; CHECK-NEXT: return @2{{$}} 185define double @f64_convert_s_i32(i32 %x) { 186 %a = sitofp i32 %x to double 187 ret double %a 188} 189 190; CHECK-LABEL: f64_convert_u_i32: 191; CHECK-NEXT: .param i32 192; CHECK-NEXT: .result f64 193; CHECK-NEXT: @0{{$}} 194; CHECK-NEXT: set_local @1, pop{{$}} 195; CHECK-NEXT: f64_convert_u @1{{$}} 196; CHECK-NEXT: set_local @2, pop{{$}} 197; CHECK-NEXT: return @2{{$}} 198define double @f64_convert_u_i32(i32 %x) { 199 %a = uitofp i32 %x to double 200 ret double %a 201} 202 203; CHECK-LABEL: f32_convert_s_i64: 204; CHECK-NEXT: .param i64 205; CHECK-NEXT: .result f32 206; CHECK-NEXT: @0{{$}} 207; CHECK-NEXT: set_local @1, pop{{$}} 208; CHECK-NEXT: f32_convert_s @1{{$}} 209; CHECK-NEXT: set_local @2, pop{{$}} 210; CHECK-NEXT: return @2{{$}} 211define float @f32_convert_s_i64(i64 %x) { 212 %a = sitofp i64 %x to float 213 ret float %a 214} 215 216; CHECK-LABEL: f32_convert_u_i64: 217; CHECK-NEXT: .param i64 218; CHECK-NEXT: .result f32 219; CHECK-NEXT: @0{{$}} 220; CHECK-NEXT: set_local @1, pop{{$}} 221; CHECK-NEXT: f32_convert_u @1{{$}} 222; CHECK-NEXT: set_local @2, pop{{$}} 223; CHECK-NEXT: return @2{{$}} 224define float @f32_convert_u_i64(i64 %x) { 225 %a = uitofp i64 %x to float 226 ret float %a 227} 228 229; CHECK-LABEL: f64_convert_s_i64: 230; CHECK-NEXT: .param i64 231; CHECK-NEXT: .result f64 232; CHECK-NEXT: @0{{$}} 233; CHECK-NEXT: set_local @1, pop{{$}} 234; CHECK-NEXT: f64_convert_s @1{{$}} 235; CHECK-NEXT: set_local @2, pop{{$}} 236; CHECK-NEXT: return @2{{$}} 237define double @f64_convert_s_i64(i64 %x) { 238 %a = sitofp i64 %x to double 239 ret double %a 240} 241 242; CHECK-LABEL: f64_convert_u_i64: 243; CHECK-NEXT: .param i64 244; CHECK-NEXT: .result f64 245; CHECK-NEXT: @0{{$}} 246; CHECK-NEXT: set_local @1, pop{{$}} 247; CHECK-NEXT: f64_convert_u @1{{$}} 248; CHECK-NEXT: set_local @2, pop{{$}} 249; CHECK-NEXT: return @2{{$}} 250define double @f64_convert_u_i64(i64 %x) { 251 %a = uitofp i64 %x to double 252 ret double %a 253} 254 255; CHECK-LABEL: f64_promote_f32: 256; CHECK-NEXT: .param f32 257; CHECK-NEXT: .result f64 258; CHECK-NEXT: @0{{$}} 259; CHECK-NEXT: set_local @1, pop{{$}} 260; CHECK-NEXT: f64_promote @1{{$}} 261; CHECK-NEXT: set_local @2, pop{{$}} 262; CHECK-NEXT: return @2{{$}} 263define double @f64_promote_f32(float %x) { 264 %a = fpext float %x to double 265 ret double %a 266} 267 268; CHECK-LABEL: f32_demote_f64: 269; CHECK-NEXT: .param f64 270; CHECK-NEXT: .result f32 271; CHECK-NEXT: @0{{$}} 272; CHECK-NEXT: set_local @1, pop{{$}} 273; CHECK-NEXT: f32_demote @1{{$}} 274; CHECK-NEXT: set_local @2, pop{{$}} 275; CHECK-NEXT: return @2{{$}} 276define float @f32_demote_f64(double %x) { 277 %a = fptrunc double %x to float 278 ret float %a 279} 280