1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s 3 4declare i16 @llvm.convert.to.fp16.f32(float %a) 5declare i16 @llvm.convert.to.fp16.f64(double %a) 6 7declare float @llvm.convert.from.fp16.f32(i16 %a) 8declare double @llvm.convert.from.fp16.f64(i16 %a) 9 10define float @func_i16fp32(ptr %a) { 11; CHECK-LABEL: func_i16fp32: 12; CHECK: # %bb.0: 13; CHECK-NEXT: st %s9, (, %s11) 14; CHECK-NEXT: st %s10, 8(, %s11) 15; CHECK-NEXT: or %s9, 0, %s11 16; CHECK-NEXT: lea %s11, -240(, %s11) 17; CHECK-NEXT: brge.l.t %s11, %s8, .LBB0_2 18; CHECK-NEXT: # %bb.1: 19; CHECK-NEXT: ld %s61, 24(, %s14) 20; CHECK-NEXT: or %s62, 0, %s0 21; CHECK-NEXT: lea %s63, 315 22; CHECK-NEXT: shm.l %s63, (%s61) 23; CHECK-NEXT: shm.l %s8, 8(%s61) 24; CHECK-NEXT: shm.l %s11, 16(%s61) 25; CHECK-NEXT: monc 26; CHECK-NEXT: or %s0, 0, %s62 27; CHECK-NEXT: .LBB0_2: 28; CHECK-NEXT: ld2b.zx %s0, (, %s0) 29; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo 30; CHECK-NEXT: and %s1, %s1, (32)0 31; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1) 32; CHECK-NEXT: bsic %s10, (, %s12) 33; CHECK-NEXT: or %s11, 0, %s9 34; CHECK-NEXT: ld %s10, 8(, %s11) 35; CHECK-NEXT: ld %s9, (, %s11) 36; CHECK-NEXT: b.l.t (, %s10) 37 %a.val = load i16, ptr %a, align 4 38 %a.asd = call float @llvm.convert.from.fp16.f32(i16 %a.val) 39 ret float %a.asd 40} 41 42define double @func_i16fp64(ptr %a) { 43; CHECK-LABEL: func_i16fp64: 44; CHECK: # %bb.0: 45; CHECK-NEXT: st %s9, (, %s11) 46; CHECK-NEXT: st %s10, 8(, %s11) 47; CHECK-NEXT: or %s9, 0, %s11 48; CHECK-NEXT: lea %s11, -240(, %s11) 49; CHECK-NEXT: brge.l.t %s11, %s8, .LBB1_2 50; CHECK-NEXT: # %bb.1: 51; CHECK-NEXT: ld %s61, 24(, %s14) 52; CHECK-NEXT: or %s62, 0, %s0 53; CHECK-NEXT: lea %s63, 315 54; CHECK-NEXT: shm.l %s63, (%s61) 55; CHECK-NEXT: shm.l %s8, 8(%s61) 56; CHECK-NEXT: shm.l %s11, 16(%s61) 57; CHECK-NEXT: monc 58; CHECK-NEXT: or %s0, 0, %s62 59; CHECK-NEXT: .LBB1_2: 60; CHECK-NEXT: ld2b.zx %s0, (, %s0) 61; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo 62; CHECK-NEXT: and %s1, %s1, (32)0 63; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1) 64; CHECK-NEXT: bsic %s10, (, %s12) 65; CHECK-NEXT: cvt.d.s %s0, %s0 66; CHECK-NEXT: or %s11, 0, %s9 67; CHECK-NEXT: ld %s10, 8(, %s11) 68; CHECK-NEXT: ld %s9, (, %s11) 69; CHECK-NEXT: b.l.t (, %s10) 70 %a.val = load i16, ptr %a, align 4 71 %a.asd = call double @llvm.convert.from.fp16.f64(i16 %a.val) 72 ret double %a.asd 73} 74 75define float @func_fp16fp32(ptr %a) { 76; CHECK-LABEL: func_fp16fp32: 77; CHECK: # %bb.0: 78; CHECK-NEXT: st %s9, (, %s11) 79; CHECK-NEXT: st %s10, 8(, %s11) 80; CHECK-NEXT: or %s9, 0, %s11 81; CHECK-NEXT: lea %s11, -240(, %s11) 82; CHECK-NEXT: brge.l.t %s11, %s8, .LBB2_2 83; CHECK-NEXT: # %bb.1: 84; CHECK-NEXT: ld %s61, 24(, %s14) 85; CHECK-NEXT: or %s62, 0, %s0 86; CHECK-NEXT: lea %s63, 315 87; CHECK-NEXT: shm.l %s63, (%s61) 88; CHECK-NEXT: shm.l %s8, 8(%s61) 89; CHECK-NEXT: shm.l %s11, 16(%s61) 90; CHECK-NEXT: monc 91; CHECK-NEXT: or %s0, 0, %s62 92; CHECK-NEXT: .LBB2_2: 93; CHECK-NEXT: ld2b.zx %s0, (, %s0) 94; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo 95; CHECK-NEXT: and %s1, %s1, (32)0 96; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1) 97; CHECK-NEXT: bsic %s10, (, %s12) 98; CHECK-NEXT: or %s11, 0, %s9 99; CHECK-NEXT: ld %s10, 8(, %s11) 100; CHECK-NEXT: ld %s9, (, %s11) 101; CHECK-NEXT: b.l.t (, %s10) 102 %a.val = load half, ptr %a, align 4 103 %a.asd = fpext half %a.val to float 104 ret float %a.asd 105} 106 107define double @func_fp16fp64(ptr %a) { 108; CHECK-LABEL: func_fp16fp64: 109; CHECK: # %bb.0: 110; CHECK-NEXT: st %s9, (, %s11) 111; CHECK-NEXT: st %s10, 8(, %s11) 112; CHECK-NEXT: or %s9, 0, %s11 113; CHECK-NEXT: lea %s11, -240(, %s11) 114; CHECK-NEXT: brge.l.t %s11, %s8, .LBB3_2 115; CHECK-NEXT: # %bb.1: 116; CHECK-NEXT: ld %s61, 24(, %s14) 117; CHECK-NEXT: or %s62, 0, %s0 118; CHECK-NEXT: lea %s63, 315 119; CHECK-NEXT: shm.l %s63, (%s61) 120; CHECK-NEXT: shm.l %s8, 8(%s61) 121; CHECK-NEXT: shm.l %s11, 16(%s61) 122; CHECK-NEXT: monc 123; CHECK-NEXT: or %s0, 0, %s62 124; CHECK-NEXT: .LBB3_2: 125; CHECK-NEXT: ld2b.zx %s0, (, %s0) 126; CHECK-NEXT: lea %s1, __gnu_h2f_ieee@lo 127; CHECK-NEXT: and %s1, %s1, (32)0 128; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s1) 129; CHECK-NEXT: bsic %s10, (, %s12) 130; CHECK-NEXT: cvt.d.s %s0, %s0 131; CHECK-NEXT: or %s11, 0, %s9 132; CHECK-NEXT: ld %s10, 8(, %s11) 133; CHECK-NEXT: ld %s9, (, %s11) 134; CHECK-NEXT: b.l.t (, %s10) 135 %a.val = load half, ptr %a, align 4 136 %a.asd = fpext half %a.val to double 137 ret double %a.asd 138} 139 140define void @func_fp32i16(ptr %fl.ptr, float %val) { 141; CHECK-LABEL: func_fp32i16: 142; CHECK: # %bb.0: 143; CHECK-NEXT: st %s9, (, %s11) 144; CHECK-NEXT: st %s10, 8(, %s11) 145; CHECK-NEXT: or %s9, 0, %s11 146; CHECK-NEXT: lea %s11, -240(, %s11) 147; CHECK-NEXT: brge.l.t %s11, %s8, .LBB4_2 148; CHECK-NEXT: # %bb.1: 149; CHECK-NEXT: ld %s61, 24(, %s14) 150; CHECK-NEXT: or %s62, 0, %s0 151; CHECK-NEXT: lea %s63, 315 152; CHECK-NEXT: shm.l %s63, (%s61) 153; CHECK-NEXT: shm.l %s8, 8(%s61) 154; CHECK-NEXT: shm.l %s11, 16(%s61) 155; CHECK-NEXT: monc 156; CHECK-NEXT: or %s0, 0, %s62 157; CHECK-NEXT: .LBB4_2: 158; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill 159; CHECK-NEXT: or %s18, 0, %s0 160; CHECK-NEXT: lea %s0, __gnu_f2h_ieee@lo 161; CHECK-NEXT: and %s0, %s0, (32)0 162; CHECK-NEXT: lea.sl %s12, __gnu_f2h_ieee@hi(, %s0) 163; CHECK-NEXT: or %s0, 0, %s1 164; CHECK-NEXT: bsic %s10, (, %s12) 165; CHECK-NEXT: st2b %s0, (, %s18) 166; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload 167; CHECK-NEXT: or %s11, 0, %s9 168; CHECK-NEXT: ld %s10, 8(, %s11) 169; CHECK-NEXT: ld %s9, (, %s11) 170; CHECK-NEXT: b.l.t (, %s10) 171 %val.asf = call i16 @llvm.convert.to.fp16.f32(float %val) 172 store i16 %val.asf, ptr %fl.ptr 173 ret void 174} 175 176define half @func_fp32fp16(ptr %fl.ptr, float %a) { 177; CHECK-LABEL: func_fp32fp16: 178; CHECK: # %bb.0: 179; CHECK-NEXT: st %s9, (, %s11) 180; CHECK-NEXT: st %s10, 8(, %s11) 181; CHECK-NEXT: or %s9, 0, %s11 182; CHECK-NEXT: lea %s11, -240(, %s11) 183; CHECK-NEXT: brge.l.t %s11, %s8, .LBB5_2 184; CHECK-NEXT: # %bb.1: 185; CHECK-NEXT: ld %s61, 24(, %s14) 186; CHECK-NEXT: or %s62, 0, %s0 187; CHECK-NEXT: lea %s63, 315 188; CHECK-NEXT: shm.l %s63, (%s61) 189; CHECK-NEXT: shm.l %s8, 8(%s61) 190; CHECK-NEXT: shm.l %s11, 16(%s61) 191; CHECK-NEXT: monc 192; CHECK-NEXT: or %s0, 0, %s62 193; CHECK-NEXT: .LBB5_2: 194; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill 195; CHECK-NEXT: st %s19, 296(, %s11) # 8-byte Folded Spill 196; CHECK-NEXT: or %s18, 0, %s0 197; CHECK-NEXT: lea %s0, __gnu_f2h_ieee@lo 198; CHECK-NEXT: and %s0, %s0, (32)0 199; CHECK-NEXT: lea.sl %s12, __gnu_f2h_ieee@hi(, %s0) 200; CHECK-NEXT: or %s0, 0, %s1 201; CHECK-NEXT: bsic %s10, (, %s12) 202; CHECK-NEXT: or %s19, 0, %s0 203; CHECK-NEXT: lea %s0, __gnu_h2f_ieee@lo 204; CHECK-NEXT: and %s0, %s0, (32)0 205; CHECK-NEXT: lea.sl %s12, __gnu_h2f_ieee@hi(, %s0) 206; CHECK-NEXT: or %s0, 0, %s19 207; CHECK-NEXT: bsic %s10, (, %s12) 208; CHECK-NEXT: st2b %s19, (, %s18) 209; CHECK-NEXT: ld %s19, 296(, %s11) # 8-byte Folded Reload 210; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload 211; CHECK-NEXT: or %s11, 0, %s9 212; CHECK-NEXT: ld %s10, 8(, %s11) 213; CHECK-NEXT: ld %s9, (, %s11) 214; CHECK-NEXT: b.l.t (, %s10) 215 %a.asd = fptrunc float %a to half 216 store half %a.asd, ptr %fl.ptr 217 ret half %a.asd 218} 219 220define double @func_fp32fp64(ptr %a) { 221; CHECK-LABEL: func_fp32fp64: 222; CHECK: # %bb.0: 223; CHECK-NEXT: ldu %s0, (, %s0) 224; CHECK-NEXT: cvt.d.s %s0, %s0 225; CHECK-NEXT: b.l.t (, %s10) 226 %a.val = load float, ptr %a, align 4 227 %a.asd = fpext float %a.val to double 228 ret double %a.asd 229} 230 231define void @func_fp64i16(ptr %fl.ptr, double %val) { 232; CHECK-LABEL: func_fp64i16: 233; CHECK: # %bb.0: 234; CHECK-NEXT: st %s9, (, %s11) 235; CHECK-NEXT: st %s10, 8(, %s11) 236; CHECK-NEXT: or %s9, 0, %s11 237; CHECK-NEXT: lea %s11, -240(, %s11) 238; CHECK-NEXT: brge.l.t %s11, %s8, .LBB7_2 239; CHECK-NEXT: # %bb.1: 240; CHECK-NEXT: ld %s61, 24(, %s14) 241; CHECK-NEXT: or %s62, 0, %s0 242; CHECK-NEXT: lea %s63, 315 243; CHECK-NEXT: shm.l %s63, (%s61) 244; CHECK-NEXT: shm.l %s8, 8(%s61) 245; CHECK-NEXT: shm.l %s11, 16(%s61) 246; CHECK-NEXT: monc 247; CHECK-NEXT: or %s0, 0, %s62 248; CHECK-NEXT: .LBB7_2: 249; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill 250; CHECK-NEXT: or %s18, 0, %s0 251; CHECK-NEXT: lea %s0, __truncdfhf2@lo 252; CHECK-NEXT: and %s0, %s0, (32)0 253; CHECK-NEXT: lea.sl %s12, __truncdfhf2@hi(, %s0) 254; CHECK-NEXT: or %s0, 0, %s1 255; CHECK-NEXT: bsic %s10, (, %s12) 256; CHECK-NEXT: st2b %s0, (, %s18) 257; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload 258; CHECK-NEXT: or %s11, 0, %s9 259; CHECK-NEXT: ld %s10, 8(, %s11) 260; CHECK-NEXT: ld %s9, (, %s11) 261; CHECK-NEXT: b.l.t (, %s10) 262 %val.asf = call i16 @llvm.convert.to.fp16.f64(double %val) 263 store i16 %val.asf, ptr %fl.ptr 264 ret void 265} 266 267define void @func_fp64fp16(ptr %fl.ptr, double %val) { 268; CHECK-LABEL: func_fp64fp16: 269; CHECK: # %bb.0: 270; CHECK-NEXT: st %s9, (, %s11) 271; CHECK-NEXT: st %s10, 8(, %s11) 272; CHECK-NEXT: or %s9, 0, %s11 273; CHECK-NEXT: lea %s11, -240(, %s11) 274; CHECK-NEXT: brge.l.t %s11, %s8, .LBB8_2 275; CHECK-NEXT: # %bb.1: 276; CHECK-NEXT: ld %s61, 24(, %s14) 277; CHECK-NEXT: or %s62, 0, %s0 278; CHECK-NEXT: lea %s63, 315 279; CHECK-NEXT: shm.l %s63, (%s61) 280; CHECK-NEXT: shm.l %s8, 8(%s61) 281; CHECK-NEXT: shm.l %s11, 16(%s61) 282; CHECK-NEXT: monc 283; CHECK-NEXT: or %s0, 0, %s62 284; CHECK-NEXT: .LBB8_2: 285; CHECK-NEXT: st %s18, 288(, %s11) # 8-byte Folded Spill 286; CHECK-NEXT: or %s18, 0, %s0 287; CHECK-NEXT: lea %s0, __truncdfhf2@lo 288; CHECK-NEXT: and %s0, %s0, (32)0 289; CHECK-NEXT: lea.sl %s12, __truncdfhf2@hi(, %s0) 290; CHECK-NEXT: or %s0, 0, %s1 291; CHECK-NEXT: bsic %s10, (, %s12) 292; CHECK-NEXT: st2b %s0, (, %s18) 293; CHECK-NEXT: ld %s18, 288(, %s11) # 8-byte Folded Reload 294; CHECK-NEXT: or %s11, 0, %s9 295; CHECK-NEXT: ld %s10, 8(, %s11) 296; CHECK-NEXT: ld %s9, (, %s11) 297; CHECK-NEXT: b.l.t (, %s10) 298 %val.asf = fptrunc double %val to half 299 store half %val.asf, ptr %fl.ptr 300 ret void 301} 302 303define void @func_fp64fp32(ptr %fl.ptr, double %val) { 304; CHECK-LABEL: func_fp64fp32: 305; CHECK: # %bb.0: 306; CHECK-NEXT: cvt.s.d %s1, %s1 307; CHECK-NEXT: stu %s1, (, %s0) 308; CHECK-NEXT: b.l.t (, %s10) 309 %val.asf = fptrunc double %val to float 310 store float %val.asf, ptr %fl.ptr 311 ret void 312} 313