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) (result i32) 10; CHECK-NEXT: (set_local @0 (argument 0)) 11; CHECK-NEXT: (set_local @1 (i32_wrap @0)) 12; CHECK-NEXT: (return @1) 13define i32 @i32_wrap_i64(i64 %x) { 14 %a = trunc i64 %x to i32 15 ret i32 %a 16} 17 18; CHECK-LABEL: $i64_extend_s_i32 19; CHECK-NEXT: (param i32) (result i64) 20; CHECK-NEXT: (set_local @0 (argument 0)) 21; CHECK-NEXT: (set_local @1 (i64_extend_s @0)) 22; CHECK-NEXT: (return @1) 23define i64 @i64_extend_s_i32(i32 %x) { 24 %a = sext i32 %x to i64 25 ret i64 %a 26} 27 28; CHECK-LABEL: $i64_extend_u_i32 29; CHECK-NEXT: (param i32) (result i64) 30; CHECK-NEXT: (set_local @0 (argument 0)) 31; CHECK-NEXT: (set_local @1 (i64_extend_u @0)) 32; CHECK-NEXT: (return @1) 33define i64 @i64_extend_u_i32(i32 %x) { 34 %a = zext i32 %x to i64 35 ret i64 %a 36} 37 38; CHECK-LABEL: $i32_trunc_s_f32 39; CHECK-NEXT: (param f32) (result i32) 40; CHECK-NEXT: (set_local @0 (argument 0)) 41; CHECK-NEXT: (set_local @1 (i32_trunc_s @0)) 42; CHECK-NEXT: (return @1) 43define i32 @i32_trunc_s_f32(float %x) { 44 %a = fptosi float %x to i32 45 ret i32 %a 46} 47 48; CHECK-LABEL: $i32_trunc_u_f32 49; CHECK-NEXT: (param f32) (result i32) 50; CHECK-NEXT: (set_local @0 (argument 0)) 51; CHECK-NEXT: (set_local @1 (i32_trunc_u @0)) 52; CHECK-NEXT: (return @1) 53define i32 @i32_trunc_u_f32(float %x) { 54 %a = fptoui float %x to i32 55 ret i32 %a 56} 57 58; CHECK-LABEL: $i32_trunc_s_f64 59; CHECK-NEXT: (param f64) (result i32) 60; CHECK-NEXT: (set_local @0 (argument 0)) 61; CHECK-NEXT: (set_local @1 (i32_trunc_s @0)) 62; CHECK-NEXT: (return @1) 63define i32 @i32_trunc_s_f64(double %x) { 64 %a = fptosi double %x to i32 65 ret i32 %a 66} 67 68; CHECK-LABEL: $i32_trunc_u_f64 69; CHECK-NEXT: (param f64) (result i32) 70; CHECK-NEXT: (set_local @0 (argument 0)) 71; CHECK-NEXT: (set_local @1 (i32_trunc_u @0)) 72; CHECK-NEXT: (return @1) 73define i32 @i32_trunc_u_f64(double %x) { 74 %a = fptoui double %x to i32 75 ret i32 %a 76} 77 78; CHECK-LABEL: $i64_trunc_s_f32 79; CHECK-NEXT: (param f32) (result i64) 80; CHECK-NEXT: (set_local @0 (argument 0)) 81; CHECK-NEXT: (set_local @1 (i64_trunc_s @0)) 82; CHECK-NEXT: (return @1) 83define i64 @i64_trunc_s_f32(float %x) { 84 %a = fptosi float %x to i64 85 ret i64 %a 86} 87 88; CHECK-LABEL: $i64_trunc_u_f32 89; CHECK-NEXT: (param f32) (result i64) 90; CHECK-NEXT: (set_local @0 (argument 0)) 91; CHECK-NEXT: (set_local @1 (i64_trunc_u @0)) 92; CHECK-NEXT: (return @1) 93define i64 @i64_trunc_u_f32(float %x) { 94 %a = fptoui float %x to i64 95 ret i64 %a 96} 97 98; CHECK-LABEL: $i64_trunc_s_f64 99; CHECK-NEXT: (param f64) (result i64) 100; CHECK-NEXT: (set_local @0 (argument 0)) 101; CHECK-NEXT: (set_local @1 (i64_trunc_s @0)) 102; CHECK-NEXT: (return @1) 103define i64 @i64_trunc_s_f64(double %x) { 104 %a = fptosi double %x to i64 105 ret i64 %a 106} 107 108; CHECK-LABEL: $i64_trunc_u_f64 109; CHECK-NEXT: (param f64) (result i64) 110; CHECK-NEXT: (set_local @0 (argument 0)) 111; CHECK-NEXT: (set_local @1 (i64_trunc_u @0)) 112; CHECK-NEXT: (return @1) 113define i64 @i64_trunc_u_f64(double %x) { 114 %a = fptoui double %x to i64 115 ret i64 %a 116} 117 118; CHECK-LABEL: $f32_convert_s_i32 119; CHECK-NEXT: (param i32) (result f32) 120; CHECK-NEXT: (set_local @0 (argument 0)) 121; CHECK-NEXT: (set_local @1 (f32_convert_s @0)) 122; CHECK-NEXT: (return @1) 123define float @f32_convert_s_i32(i32 %x) { 124 %a = sitofp i32 %x to float 125 ret float %a 126} 127 128; CHECK-LABEL: $f32_convert_u_i32 129; CHECK-NEXT: (param i32) (result f32) 130; CHECK-NEXT: (set_local @0 (argument 0)) 131; CHECK-NEXT: (set_local @1 (f32_convert_u @0)) 132; CHECK-NEXT: (return @1) 133define float @f32_convert_u_i32(i32 %x) { 134 %a = uitofp i32 %x to float 135 ret float %a 136} 137 138; CHECK-LABEL: $f64_convert_s_i32 139; CHECK-NEXT: (param i32) (result f64) 140; CHECK-NEXT: (set_local @0 (argument 0)) 141; CHECK-NEXT: (set_local @1 (f64_convert_s @0)) 142; CHECK-NEXT: (return @1) 143define double @f64_convert_s_i32(i32 %x) { 144 %a = sitofp i32 %x to double 145 ret double %a 146} 147 148; CHECK-LABEL: $f64_convert_u_i32 149; CHECK-NEXT: (param i32) (result f64) 150; CHECK-NEXT: (set_local @0 (argument 0)) 151; CHECK-NEXT: (set_local @1 (f64_convert_u @0)) 152; CHECK-NEXT: (return @1) 153define double @f64_convert_u_i32(i32 %x) { 154 %a = uitofp i32 %x to double 155 ret double %a 156} 157 158; CHECK-LABEL: $f32_convert_s_i64 159; CHECK-NEXT: (param i64) (result f32) 160; CHECK-NEXT: (set_local @0 (argument 0)) 161; CHECK-NEXT: (set_local @1 (f32_convert_s @0)) 162; CHECK-NEXT: (return @1) 163define float @f32_convert_s_i64(i64 %x) { 164 %a = sitofp i64 %x to float 165 ret float %a 166} 167 168; CHECK-LABEL: $f32_convert_u_i64 169; CHECK-NEXT: (param i64) (result f32) 170; CHECK-NEXT: (set_local @0 (argument 0)) 171; CHECK-NEXT: (set_local @1 (f32_convert_u @0)) 172; CHECK-NEXT: (return @1) 173define float @f32_convert_u_i64(i64 %x) { 174 %a = uitofp i64 %x to float 175 ret float %a 176} 177 178; CHECK-LABEL: $f64_convert_s_i64 179; CHECK-NEXT: (param i64) (result f64) 180; CHECK-NEXT: (set_local @0 (argument 0)) 181; CHECK-NEXT: (set_local @1 (f64_convert_s @0)) 182; CHECK-NEXT: (return @1) 183define double @f64_convert_s_i64(i64 %x) { 184 %a = sitofp i64 %x to double 185 ret double %a 186} 187 188; CHECK-LABEL: $f64_convert_u_i64 189; CHECK-NEXT: (param i64) (result f64) 190; CHECK-NEXT: (set_local @0 (argument 0)) 191; CHECK-NEXT: (set_local @1 (f64_convert_u @0)) 192; CHECK-NEXT: (return @1) 193define double @f64_convert_u_i64(i64 %x) { 194 %a = uitofp i64 %x to double 195 ret double %a 196} 197 198; CHECK-LABEL: $f64_promote_f32 199; CHECK-NEXT: (param f32) (result f64) 200; CHECK-NEXT: (set_local @0 (argument 0)) 201; CHECK-NEXT: (set_local @1 (f64_promote @0)) 202; CHECK-NEXT: (return @1) 203define double @f64_promote_f32(float %x) { 204 %a = fpext float %x to double 205 ret double %a 206} 207 208; CHECK-LABEL: $f32_demote_f64 209; CHECK-NEXT: (param f64) (result f32) 210; CHECK-NEXT: (set_local @0 (argument 0)) 211; CHECK-NEXT: (set_local @1 (f32_demote @0)) 212; CHECK-NEXT: (return @1) 213define float @f32_demote_f64(double %x) { 214 %a = fptrunc double %x to float 215 ret float %a 216} 217