brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.9 KiB · 8033ec5 Raw
374 lines · plain
1; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+fp16,+simd128 | FileCheck %s2 3; Tests for `llvm.wasm.*.*f16` intrinsics4 5declare float @llvm.wasm.loadf32.f16(ptr)6declare void @llvm.wasm.storef16.f32(float, ptr)7 8; CHECK-LABEL: ldf16_32:9; CHECK:      f32.load_f16 $push[[NUM0:[0-9]+]]=, 0($0){{$}}10; CHECK-NEXT: return $pop[[NUM0]]{{$}}11define float @ldf16_32(ptr %p) {12  %v = call float @llvm.wasm.loadf16.f32(ptr %p)13  ret float %v14}15 16; CHECK-LABEL: stf16_32:17; CHECK:       f32.store_f16 0($1), $018; CHECK-NEXT:  return19define void @stf16_32(float %v, ptr %p) {20  tail call void @llvm.wasm.storef16.f32(float %v, ptr %p)21  ret void22}23 24; CHECK-LABEL: splat_v8f16:25; CHECK:       f16x8.splat $push0=, $026; CHECK-NEXT:  return $pop027define <8 x half> @splat_v8f16(float %x) {28  %v = call <8 x half> @llvm.wasm.splat.f16x8(float %x)29  ret <8 x half> %v30}31 32; CHECK-LABEL: const_splat_v8f16:33; CHECK:       v128.const      $push0=, 20800, 0, 0, 0, 0, 0, 0, 2080034; CHECK-NEXT:  return $pop035define <8 x half> @const_splat_v8f16() {36  ret <8 x half> <half 42., half 0., half 0., half 0., half 0., half 0., half 0., half 42.>37}38 39; CHECK-LABEL: extract_lane_v8f16:40; CHECK:       f16x8.extract_lane $push0=, $0, 141; CHECK-NEXT:  return $pop042define float @extract_lane_v8f16(<8 x half> %v) {43  %r = call float @llvm.wasm.extract.lane.f16x8(<8 x half> %v, i32 1)44  ret float %r45}46 47; CHECK-LABEL: replace_lane_v8f16:48; CHECK:       f16x8.replace_lane $push0=, $0, 1, $149; CHECK-NEXT:  return $pop050define <8 x half> @replace_lane_v8f16(<8 x half> %v, float %f) {51  %r = call <8 x half> @llvm.wasm.replace.lane.f16x8(<8 x half> %v, i32 1, float %f)52  ret <8 x half> %r53}54 55; CHECK-LABEL: add_v8f16:56; CHECK:       f16x8.add $push0=, $0, $157; CHECK-NEXT:  return $pop058define <8 x half> @add_v8f16(<8 x half> %a, <8 x half> %b) {59  %r = fadd <8 x half> %a, %b60  ret <8 x half> %r61}62 63; CHECK-LABEL: sub_v8f16:64; CHECK:       f16x8.sub $push0=, $0, $165; CHECK-NEXT:  return $pop066define <8 x half> @sub_v8f16(<8 x half> %a, <8 x half> %b) {67  %r = fsub <8 x half> %a, %b68  ret <8 x half> %r69}70 71; CHECK-LABEL: mul_v8f16:72; CHECK:       f16x8.mul $push0=, $0, $173; CHECK-NEXT:  return $pop074define <8 x half> @mul_v8f16(<8 x half> %a, <8 x half> %b) {75  %r = fmul <8 x half> %a, %b76  ret <8 x half> %r77}78 79; CHECK-LABEL: div_v8f16:80; CHECK:       f16x8.div $push0=, $0, $181; CHECK-NEXT:  return $pop082define <8 x half> @div_v8f16(<8 x half> %a, <8 x half> %b) {83  %r = fdiv <8 x half> %a, %b84  ret <8 x half> %r85}86 87; CHECK-LABEL: min_intrinsic_v8f16:88; CHECK:       f16x8.min $push0=, $0, $189; CHECK-NEXT:  return $pop090declare <8 x half> @llvm.minimum.v8f16(<8 x half>, <8 x half>)91define <8 x half> @min_intrinsic_v8f16(<8 x half> %x, <8 x half> %y) {92  %a = call <8 x half> @llvm.minimum.v8f16(<8 x half> %x, <8 x half> %y)93  ret <8 x half> %a94}95 96; CHECK-LABEL: max_intrinsic_v8f16:97; CHECK:       f16x8.max $push0=, $0, $198; CHECK-NEXT:  return $pop099declare <8 x half> @llvm.maximum.v8f16(<8 x half>, <8 x half>)100define <8 x half> @max_intrinsic_v8f16(<8 x half> %x, <8 x half> %y) {101  %a = call <8 x half> @llvm.maximum.v8f16(<8 x half> %x, <8 x half> %y)102  ret <8 x half> %a103}104 105; CHECK-LABEL: pmin_intrinsic_v8f16:106; CHECK:       f16x8.pmin $push0=, $0, $1107; CHECK-NEXT:  return $pop0108declare <8 x half> @llvm.wasm.pmin.v8f16(<8 x half>, <8 x half>)109define <8 x half> @pmin_intrinsic_v8f16(<8 x half> %a, <8 x half> %b) {110  %v = call <8 x half> @llvm.wasm.pmin.v8f16(<8 x half> %a, <8 x half> %b)111  ret <8 x half> %v112}113 114; CHECK-LABEL: pmax_intrinsic_v8f16:115; CHECK:       f16x8.pmax $push0=, $0, $1116; CHECK-NEXT:  return $pop0117declare <8 x half> @llvm.wasm.pmax.v8f16(<8 x half>, <8 x half>)118define <8 x half> @pmax_intrinsic_v8f16(<8 x half> %a, <8 x half> %b) {119  %v = call <8 x half> @llvm.wasm.pmax.v8f16(<8 x half> %a, <8 x half> %b)120  ret <8 x half> %v121}122 123; CHECK-LABEL: compare_oeq_v8f16:124; CHECK-NEXT: .functype compare_oeq_v8f16 (v128, v128) -> (v128){{$}}125; CHECK-NEXT: f16x8.eq $push[[R:[0-9]+]]=, $0, $1{{$}}126; CHECK-NEXT: return $pop[[R]]{{$}}127define <8 x i1> @compare_oeq_v8f16 (<8 x half> %x, <8 x half> %y) {128  %res = fcmp oeq <8 x half> %x, %y129  ret <8 x i1> %res130}131 132; CHECK-LABEL: compare_une_v8f16:133; CHECK-NEXT: .functype compare_une_v8f16 (v128, v128) -> (v128){{$}}134; CHECK-NEXT: f16x8.ne $push[[R:[0-9]+]]=, $0, $1{{$}}135; CHECK-NEXT: return $pop[[R]]{{$}}136define <8 x i1> @compare_une_v8f16 (<8 x half> %x, <8 x half> %y) {137  %res = fcmp une <8 x half> %x, %y138  ret <8 x i1> %res139}140 141; CHECK-LABEL: compare_olt_v8f16:142; CHECK-NEXT: .functype compare_olt_v8f16 (v128, v128) -> (v128){{$}}143; CHECK-NEXT: f16x8.lt $push[[R:[0-9]+]]=, $0, $1{{$}}144; CHECK-NEXT: return $pop[[R]]{{$}}145define <8 x i1> @compare_olt_v8f16 (<8 x half> %x, <8 x half> %y) {146  %res = fcmp olt <8 x half> %x, %y147  ret <8 x i1> %res148}149 150; CHECK-LABEL: compare_ogt_v8f16:151; CHECK-NEXT: .functype compare_ogt_v8f16 (v128, v128) -> (v128){{$}}152; CHECK-NEXT: f16x8.gt $push[[R:[0-9]+]]=, $0, $1{{$}}153; CHECK-NEXT: return $pop[[R]]{{$}}154define <8 x i1> @compare_ogt_v8f16 (<8 x half> %x, <8 x half> %y) {155  %res = fcmp ogt <8 x half> %x, %y156  ret <8 x i1> %res157}158 159; CHECK-LABEL: compare_ole_v8f16:160; CHECK-NEXT: .functype compare_ole_v8f16 (v128, v128) -> (v128){{$}}161; CHECK-NEXT: f16x8.le $push[[R:[0-9]+]]=, $0, $1{{$}}162; CHECK-NEXT: return $pop[[R]]{{$}}163define <8 x i1> @compare_ole_v8f16 (<8 x half> %x, <8 x half> %y) {164  %res = fcmp ole <8 x half> %x, %y165  ret <8 x i1> %res166}167 168; CHECK-LABEL: compare_oge_v8f16:169; CHECK-NEXT: .functype compare_oge_v8f16 (v128, v128) -> (v128){{$}}170; CHECK-NEXT: f16x8.ge $push[[R:[0-9]+]]=, $0, $1{{$}}171; CHECK-NEXT: return $pop[[R]]{{$}}172define <8 x i1> @compare_oge_v8f16 (<8 x half> %x, <8 x half> %y) {173  %res = fcmp oge <8 x half> %x, %y174  ret <8 x i1> %res175}176 177; CHECK-LABEL: compare_ule_v8f16:178; CHECK-NEXT: .functype compare_ule_v8f16 (v128, v128) -> (v128){{$}}179; CHECK-NEXT: f16x8.gt $push[[T0:[0-9]+]]=, $0, $1{{$}}180; CHECK-NEXT: v128.not $push[[R:[0-9]+]]=, $pop[[T0]]{{$}}181; CHECK-NEXT: return $pop[[R]]{{$}}182define <8 x i1> @compare_ule_v8f16 (<8 x half> %x, <8 x half> %y) {183  %res = fcmp ule <8 x half> %x, %y184  ret <8 x i1> %res185}186 187; CHECK-LABEL: abs_v8f16:188; CHECK-NEXT:  .functype abs_v8f16 (v128) -> (v128)189; CHECK-NEXT:  f16x8.abs $push0=, $0190; CHECK-NEXT:  return $pop0191declare <8 x half> @llvm.fabs.v8f16(<8 x half>) nounwind readnone192define <8 x half> @abs_v8f16(<8 x half> %x) {193  %a = call <8 x half> @llvm.fabs.v8f16(<8 x half> %x)194  ret <8 x half> %a195}196 197; CHECK-LABEL: neg_v8f16:198; CHECK-NEXT:  .functype neg_v8f16 (v128) -> (v128)199; CHECK-NEXT:  f16x8.neg $push0=, $0200; CHECK-NEXT:  return $pop0201define <8 x half> @neg_v8f16(<8 x half> %x) {202  %a = fsub nsz <8 x half> <half 0., half 0., half 0., half 0., half 0., half 0., half 0., half 0.>, %x203  ret <8 x half> %a204}205 206; CHECK-LABEL: sqrt_v8f16:207; CHECK-NEXT:  .functype sqrt_v8f16 (v128) -> (v128)208; CHECK-NEXT:  f16x8.sqrt $push0=, $0209; CHECK-NEXT:  return $pop0210declare <8 x half> @llvm.sqrt.v8f16(<8 x half> %x)211define <8 x half> @sqrt_v8f16(<8 x half> %x) {212  %a = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %x)213  ret <8 x half> %a214}215 216; CHECK-LABEL: ceil_v8f16:217; CHECK-NEXT:  .functype ceil_v8f16 (v128) -> (v128){{$}}218; CHECK-NEXT:  f16x8.ceil $push[[R:[0-9]+]]=, $0{{$}}219; CHECK-NEXT:  return $pop[[R]]{{$}}220declare <8 x half> @llvm.ceil.v8f16(<8 x half>)221define <8 x half> @ceil_v8f16(<8 x half> %a) {222  %v = call <8 x half> @llvm.ceil.v8f16(<8 x half> %a)223  ret <8 x half> %v224}225 226; CHECK-LABEL: floor_v8f16:227; CHECK-NEXT:  .functype floor_v8f16 (v128) -> (v128){{$}}228; CHECK-NEXT:  f16x8.floor $push[[R:[0-9]+]]=, $0{{$}}229; CHECK-NEXT:  return $pop[[R]]{{$}}230declare <8 x half> @llvm.floor.v8f16(<8 x half>)231define <8 x half> @floor_v8f16(<8 x half> %a) {232  %v = call <8 x half> @llvm.floor.v8f16(<8 x half> %a)233  ret <8 x half> %v234}235 236; CHECK-LABEL: trunc_v8f16:237; CHECK-NEXT:  .functype trunc_v8f16 (v128) -> (v128){{$}}238; CHECK-NEXT:  f16x8.trunc $push[[R:[0-9]+]]=, $0{{$}}239; CHECK-NEXT:  return $pop[[R]]{{$}}240declare <8 x half> @llvm.trunc.v8f16(<8 x half>)241define <8 x half> @trunc_v8f16(<8 x half> %a) {242  %v = call <8 x half> @llvm.trunc.v8f16(<8 x half> %a)243  ret <8 x half> %v244}245 246; CHECK-LABEL: nearest_v8f16:247; CHECK-NEXT:  .functype nearest_v8f16 (v128) -> (v128){{$}}248; CHECK-NEXT:  f16x8.nearest $push[[R:[0-9]+]]=, $0{{$}}249; CHECK-NEXT:  return $pop[[R]]{{$}}250declare <8 x half> @llvm.nearbyint.v8f16(<8 x half>)251define <8 x half> @nearest_v8f16(<8 x half> %a) {252  %v = call <8 x half> @llvm.nearbyint.v8f16(<8 x half> %a)253  ret <8 x half> %v254}255 256; CHECK-LABEL: nearest_v8f16_via_rint:257; CHECK-NEXT:  .functype nearest_v8f16_via_rint (v128) -> (v128){{$}}258; CHECK-NEXT:  f16x8.nearest $push[[R:[0-9]+]]=, $0{{$}}259; CHECK-NEXT:  return $pop[[R]]{{$}}260declare <8 x half> @llvm.rint.v8f16(<8 x half>)261define <8 x half> @nearest_v8f16_via_rint(<8 x half> %a) {262  %v = call <8 x half> @llvm.rint.v8f16(<8 x half> %a)263  ret <8 x half> %v264}265 266; CHECK-LABEL: nearest_v8f16_via_roundeven:267; CHECK-NEXT:  .functype nearest_v8f16_via_roundeven (v128) -> (v128){{$}}268; CHECK-NEXT:  f16x8.nearest $push[[R:[0-9]+]]=, $0{{$}}269; CHECK-NEXT:  return $pop[[R]]{{$}}270declare <8 x half> @llvm.roundeven.v8f16(<8 x half>)271define <8 x half> @nearest_v8f16_via_roundeven(<8 x half> %a) {272  %v = call <8 x half> @llvm.roundeven.v8f16(<8 x half> %a)273  ret <8 x half> %v274}275 276define <8 x half> @convert_s_v8f16(<8 x i16> %x) {277; CHECK-LABEL: convert_s_v8f16:278; CHECK:         .functype convert_s_v8f16 (v128) -> (v128)279; CHECK-NEXT:    f16x8.convert_i16x8_s $push0=, $0280; CHECK-NEXT:    return $pop[[R]]{{$}}281  %a = sitofp <8 x i16> %x to <8 x half>282  ret <8 x half> %a283}284 285define <8 x half> @convert_u_v8f16(<8 x i16> %x) {286; CHECK-LABEL: convert_u_v8f16:287; CHECK:         .functype convert_u_v8f16 (v128) -> (v128)288; CHECK-NEXT:    f16x8.convert_i16x8_u $push0=, $0289; CHECK-NEXT:    return $pop[[R]]{{$}}290  %a = uitofp <8 x i16> %x to <8 x half>291  ret <8 x half> %a292}293 294define <8 x i16> @trunc_sat_s_v8i16(<8 x half> %x) {295; CHECK-LABEL: trunc_sat_s_v8i16:296; CHECK:         .functype trunc_sat_s_v8i16 (v128) -> (v128)297; CHECK-NEXT:    i16x8.trunc_sat_f16x8_s $push0=, $0298; CHECK-NEXT:    return $pop[[R]]{{$}}299  %a = fptosi <8 x half> %x to <8 x i16>300  ret <8 x i16> %a301}302 303define <8 x i16> @trunc_sat_u_v8i16(<8 x half> %x) {304; CHECK-LABEL: trunc_sat_u_v8i16:305; CHECK:         .functype trunc_sat_u_v8i16 (v128) -> (v128)306; CHECK-NEXT:    i16x8.trunc_sat_f16x8_u $push0=, $0307; CHECK-NEXT:    return $pop[[R]]{{$}}308  %a = fptoui <8 x half> %x to <8 x i16>309  ret <8 x i16> %a310}311 312define <8 x i16> @trunc_sat_s_v8i16_sat(<8 x half> %x) {313; CHECK-LABEL: trunc_sat_s_v8i16_sat:314; CHECK:         .functype trunc_sat_s_v8i16_sat (v128) -> (v128)315; CHECK-NEXT:    i16x8.trunc_sat_f16x8_s $push0=, $0316; CHECK-NEXT:    return $pop[[R]]{{$}}317  %a = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> %x)318  ret <8 x i16> %a319}320 321define <8 x i16> @trunc_sat_u_v8i16_sat(<8 x half> %x) {322; CHECK-LABEL: trunc_sat_u_v8i16_sat:323; CHECK:         .functype trunc_sat_u_v8i16_sat (v128) -> (v128)324; CHECK-NEXT:    i16x8.trunc_sat_f16x8_u $push0=, $0325; CHECK-NEXT:    return $pop[[R]]{{$}}326  %a = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> %x)327  ret <8 x i16> %a328}329 330; ==============================================================================331; Load and Store332; ==============================================================================333define <8 x half> @load_v8f16(ptr %p) {334; CHECK-LABEL: load_v8f16:335; CHECK:         .functype load_v8f16 (i32) -> (v128)336; CHECK-NEXT:    v128.load $push0=, 0($0)337; CHECK-NEXT:    return $pop0338  %v = load <8 x half>, ptr %p339  ret <8 x half> %v340}341 342define void @store_v8f16(<8 x half> %v, ptr %p) {343; CHECK-LABEL: store_v8f16:344; CHECK:         .functype store_v8f16 (v128, i32) -> ()345; CHECK-NEXT:    v128.store 0($1), $0346; CHECK-NEXT:    return347  store <8 x half> %v , ptr %p348  ret void349}350 351; ==============================================================================352; Shuffle353; ==============================================================================354define <8 x half> @shuffle_v8f16(<8 x half> %x, <8 x half> %y) {355; CHECK-LABEL: shuffle_v8f16:356; CHECK:         .functype shuffle_v8f16 (v128, v128) -> (v128)357; CHECK-NEXT:    i8x16.shuffle $push0=, $0, $1, 0, 1, 18, 19, 4, 5, 22, 23, 8, 9, 26, 27, 12, 13, 30, 31358; CHECK-NEXT:    return $pop0359  %res = shufflevector <8 x half> %x, <8 x half> %y,360    <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>361  ret <8 x half> %res362}363 364define <8 x half> @shuffle_poison_v8f16(<8 x half> %x, <8 x half> %y) {365; CHECK-LABEL: shuffle_poison_v8f16:366; CHECK:         .functype shuffle_poison_v8f16 (v128, v128) -> (v128)367; CHECK-NEXT:    i8x16.shuffle $push0=, $0, $0, 2, 3, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1368; CHECK-NEXT:    return $pop0369  %res = shufflevector <8 x half> %x, <8 x half> %y,370    <8 x i32> <i32 1, i32 poison, i32 poison, i32 poison,371               i32 poison, i32 poison, i32 poison, i32 poison>372  ret <8 x half> %res373}374