| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc < %s -mtriple=nvptx64-unknown-unknown | FileCheck %s |
| |
| ; Test llvm.convert.to.arbitrary.fp intrinsic expansion. |
| |
| declare i8 @llvm.convert.to.arbitrary.fp.i8.f32(float, metadata, metadata, i1) |
| declare i6 @llvm.convert.to.arbitrary.fp.i6.f32(float, metadata, metadata, i1) |
| declare i4 @llvm.convert.to.arbitrary.fp.i4.f32(float, metadata, metadata, i1) |
| declare <4 x i4> @llvm.convert.to.arbitrary.fp.v4i4.v4f32(<4 x float>, metadata, metadata, i1) |
| declare <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f32(<2 x float>, metadata, metadata, i1) |
| declare <3 x i8> @llvm.convert.to.arbitrary.fp.v3i8.v3f32(<3 x float>, metadata, metadata, i1) |
| declare <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(<4 x float>, metadata, metadata, i1) |
| declare <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f16(<2 x half>, metadata, metadata, i1) |
| |
| declare i8 @llvm.convert.to.arbitrary.fp.i8.f16(half, metadata, metadata, i1) |
| declare i8 @llvm.convert.to.arbitrary.fp.i8.bf16(bfloat, metadata, metadata, i1) |
| declare i8 @llvm.convert.to.arbitrary.fp.i8.f64(double, metadata, metadata, i1) |
| |
| ; Float8E5M2 |
| ; Layout: sign(1) exp(5) mant(2), bias=15 |
| ; Supports: Inf, NaN, signed zero, denormals |
| |
| ; Float8E5M2 runtime arg test |
| define i8 @to_f8e5m2_dynamic(float %x) { |
| ; CHECK-LABEL: to_f8e5m2_dynamic( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<15>; |
| ; CHECK-NEXT: .reg .b32 %r<64>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.b32 %r1, [to_f8e5m2_dynamic_param_0]; |
| ; CHECK-NEXT: mul.rn.f32 %r2, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r3, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r3, 8388608; |
| ; CHECK-NEXT: selp.b32 %r4, %r2, %r1, %p1; |
| ; CHECK-NEXT: and.b32 %r5, %r4, -2139095041; |
| ; CHECK-NEXT: or.b32 %r6, %r5, 1056964608; |
| ; CHECK-NEXT: add.s32 %r7, %r3, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r7, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r8, %r1, %r6, %p2; |
| ; CHECK-NEXT: and.b32 %r9, %r8, 8388607; |
| ; CHECK-NEXT: or.b32 %r10, %r9, 8388608; |
| ; CHECK-NEXT: and.b32 %r11, %r2, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r12, %r11, %r3, %p1; |
| ; CHECK-NEXT: shr.u32 %r13, %r12, 23; |
| ; CHECK-NEXT: selp.b32 %r14, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r15, %r13, %r14; |
| ; CHECK-NEXT: add.s32 %r16, %r15, -126; |
| ; CHECK-NEXT: selp.b32 %r17, 0, %r16, %p2; |
| ; CHECK-NEXT: sub.s32 %r18, 8, %r17; |
| ; CHECK-NEXT: min.u32 %r19, %r18, 31; |
| ; CHECK-NEXT: shr.u32 %r20, %r10, %r19; |
| ; CHECK-NEXT: and.b32 %r21, %r20, 1; |
| ; CHECK-NEXT: max.u32 %r22, %r19, 1; |
| ; CHECK-NEXT: add.s32 %r23, %r22, -1; |
| ; CHECK-NEXT: mov.b32 %r24, 1; |
| ; CHECK-NEXT: shl.b32 %r25, %r24, %r23; |
| ; CHECK-NEXT: add.s32 %r26, %r25, -1; |
| ; CHECK-NEXT: and.b32 %r27, %r10, %r26; |
| ; CHECK-NEXT: setp.ne.b32 %p3, %r27, 0; |
| ; CHECK-NEXT: selp.b32 %r28, 1, 0, %p3; |
| ; CHECK-NEXT: or.b32 %r29, %r28, %r21; |
| ; CHECK-NEXT: shr.u32 %r30, %r10, %r23; |
| ; CHECK-NEXT: and.b32 %r31, %r30, %r29; |
| ; CHECK-NEXT: setp.ne.b32 %p4, %r19, 0; |
| ; CHECK-NEXT: selp.b32 %r32, %r31, 0, %p4; |
| ; CHECK-NEXT: add.s32 %r33, %r20, %r32; |
| ; CHECK-NEXT: setp.gt.s32 %p5, %r33, 3; |
| ; CHECK-NEXT: selp.b32 %r34, 0, %r33, %p5; |
| ; CHECK-NEXT: selp.b32 %r35, 4, 0, %p5; |
| ; CHECK-NEXT: shr.u32 %r36, %r1, 24; |
| ; CHECK-NEXT: and.b32 %r37, %r36, 128; |
| ; CHECK-NEXT: or.b32 %r38, %r37, %r35; |
| ; CHECK-NEXT: or.b32 %r39, %r38, %r34; |
| ; CHECK-NEXT: bfe.u32 %r40, %r9, 21, 1; |
| ; CHECK-NEXT: and.b32 %r41, %r8, 1048575; |
| ; CHECK-NEXT: setp.ne.b32 %p6, %r41, 0; |
| ; CHECK-NEXT: selp.b32 %r42, 1, 0, %p6; |
| ; CHECK-NEXT: or.b32 %r43, %r42, %r40; |
| ; CHECK-NEXT: shr.u32 %r44, %r8, 20; |
| ; CHECK-NEXT: and.b32 %r45, %r44, %r43; |
| ; CHECK-NEXT: bfe.u32 %r46, %r8, 21, 2; |
| ; CHECK-NEXT: add.s32 %r47, %r46, %r45; |
| ; CHECK-NEXT: setp.gt.s32 %p7, %r47, 3; |
| ; CHECK-NEXT: selp.b32 %r48, 0, %r47, %p7; |
| ; CHECK-NEXT: selp.b32 %r49, 1, 0, %p7; |
| ; CHECK-NEXT: add.s32 %r50, %r17, %r49; |
| ; CHECK-NEXT: add.s32 %r51, %r50, 14; |
| ; CHECK-NEXT: shl.b32 %r52, %r51, 2; |
| ; CHECK-NEXT: or.b32 %r53, %r37, %r52; |
| ; CHECK-NEXT: or.b32 %r54, %r53, %r48; |
| ; CHECK-NEXT: setp.lt.s32 %p8, %r51, 1; |
| ; CHECK-NEXT: selp.b32 %r55, %r39, %r54, %p8; |
| ; CHECK-NEXT: setp.gt.s32 %p9, %r48, 3; |
| ; CHECK-NEXT: or.b32 %r56, %r37, 124; |
| ; CHECK-NEXT: selp.b32 %r57, %r56, %r55, %p9; |
| ; CHECK-NEXT: setp.eq.b32 %p10, %r51, 30; |
| ; CHECK-NEXT: selp.b32 %r58, %r57, %r55, %p10; |
| ; CHECK-NEXT: setp.gt.s32 %p11, %r51, 30; |
| ; CHECK-NEXT: selp.b32 %r59, %r56, %r58, %p11; |
| ; CHECK-NEXT: setp.eq.f32 %p12, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r60, %r37, %r59, %p12; |
| ; CHECK-NEXT: abs.f32 %r61, %r1; |
| ; CHECK-NEXT: setp.eq.f32 %p13, %r61, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r62, %r56, %r60, %p13; |
| ; CHECK-NEXT: setp.nan.f32 %p14, %r1, %r1; |
| ; CHECK-NEXT: selp.b32 %r63, 126, %r62, %p14; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r63; |
| ; CHECK-NEXT: ret; |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| ; Rounding mode tests |
| |
| ; Round toward zero with runtime arg |
| define i8 @to_f8e5m2_round_towardzero(float %x) { |
| ; CHECK-LABEL: to_f8e5m2_round_towardzero( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<12>; |
| ; CHECK-NEXT: .reg .b32 %r<42>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.b32 %r1, [to_f8e5m2_round_towardzero_param_0]; |
| ; CHECK-NEXT: mul.rn.f32 %r2, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r3, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r3, 8388608; |
| ; CHECK-NEXT: selp.b32 %r4, %r2, %r1, %p1; |
| ; CHECK-NEXT: add.s32 %r5, %r3, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r5, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r6, %r1, %r4, %p2; |
| ; CHECK-NEXT: bfe.u32 %r7, %r6, 21, 2; |
| ; CHECK-NEXT: setp.gt.s32 %p3, %r7, 3; |
| ; CHECK-NEXT: selp.b32 %r8, 0, %r7, %p3; |
| ; CHECK-NEXT: and.b32 %r9, %r2, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r10, %r9, %r3, %p1; |
| ; CHECK-NEXT: shr.u32 %r11, %r10, 23; |
| ; CHECK-NEXT: selp.b32 %r12, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r13, %r11, %r12; |
| ; CHECK-NEXT: add.s32 %r14, %r13, -126; |
| ; CHECK-NEXT: selp.b32 %r15, 0, %r14, %p2; |
| ; CHECK-NEXT: selp.b32 %r16, 1, 0, %p3; |
| ; CHECK-NEXT: add.s32 %r17, %r15, %r16; |
| ; CHECK-NEXT: add.s32 %r18, %r17, 14; |
| ; CHECK-NEXT: shl.b32 %r19, %r18, 2; |
| ; CHECK-NEXT: shr.u32 %r20, %r1, 24; |
| ; CHECK-NEXT: and.b32 %r21, %r20, 128; |
| ; CHECK-NEXT: or.b32 %r22, %r21, %r19; |
| ; CHECK-NEXT: or.b32 %r23, %r22, %r8; |
| ; CHECK-NEXT: and.b32 %r24, %r6, 8388607; |
| ; CHECK-NEXT: or.b32 %r25, %r24, 8388608; |
| ; CHECK-NEXT: sub.s32 %r26, 8, %r15; |
| ; CHECK-NEXT: min.u32 %r27, %r26, 31; |
| ; CHECK-NEXT: shr.u32 %r28, %r25, %r27; |
| ; CHECK-NEXT: setp.gt.s32 %p4, %r28, 3; |
| ; CHECK-NEXT: selp.b32 %r29, 0, %r28, %p4; |
| ; CHECK-NEXT: selp.b32 %r30, 4, 0, %p4; |
| ; CHECK-NEXT: or.b32 %r31, %r21, %r30; |
| ; CHECK-NEXT: or.b32 %r32, %r31, %r29; |
| ; CHECK-NEXT: setp.lt.s32 %p5, %r18, 1; |
| ; CHECK-NEXT: selp.b32 %r33, %r32, %r23, %p5; |
| ; CHECK-NEXT: setp.gt.s32 %p6, %r8, 3; |
| ; CHECK-NEXT: or.b32 %r34, %r21, 124; |
| ; CHECK-NEXT: selp.b32 %r35, %r34, %r33, %p6; |
| ; CHECK-NEXT: setp.eq.b32 %p7, %r18, 30; |
| ; CHECK-NEXT: selp.b32 %r36, %r35, %r33, %p7; |
| ; CHECK-NEXT: setp.gt.s32 %p8, %r18, 30; |
| ; CHECK-NEXT: selp.b32 %r37, %r34, %r36, %p8; |
| ; CHECK-NEXT: setp.eq.f32 %p9, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r38, %r21, %r37, %p9; |
| ; CHECK-NEXT: abs.f32 %r39, %r1; |
| ; CHECK-NEXT: setp.eq.f32 %p10, %r39, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r40, %r34, %r38, %p10; |
| ; CHECK-NEXT: setp.nan.f32 %p11, %r1, %r1; |
| ; CHECK-NEXT: selp.b32 %r41, 126, %r40, %p11; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r41; |
| ; CHECK-NEXT: ret; |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E5M2", metadata !"round.towardzero", i1 false) |
| ret i8 %r |
| } |
| |
| ; <4 x float> -> <4 x i4> Float4E2M1FN |
| define <4 x i4> @to_f4e2m1fn_v4f32(<4 x float> %x) { |
| ; CHECK-LABEL: to_f4e2m1fn_v4f32( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<37>; |
| ; CHECK-NEXT: .reg .b32 %r<218>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.v4.b32 {%r1, %r2, %r3, %r4}, [to_f4e2m1fn_v4f32_param_0]; |
| ; CHECK-NEXT: mul.rn.f32 %r5, %r4, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r6, %r4, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r6, 8388608; |
| ; CHECK-NEXT: selp.b32 %r7, %r5, %r4, %p1; |
| ; CHECK-NEXT: and.b32 %r8, %r7, -2139095041; |
| ; CHECK-NEXT: or.b32 %r9, %r8, 1056964608; |
| ; CHECK-NEXT: add.s32 %r10, %r6, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r10, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r11, %r4, %r9, %p2; |
| ; CHECK-NEXT: and.b32 %r12, %r11, 8388607; |
| ; CHECK-NEXT: or.b32 %r13, %r12, 8388608; |
| ; CHECK-NEXT: and.b32 %r14, %r5, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r15, %r14, %r6, %p1; |
| ; CHECK-NEXT: shr.u32 %r16, %r15, 23; |
| ; CHECK-NEXT: selp.b32 %r17, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r18, %r16, %r17; |
| ; CHECK-NEXT: add.s32 %r19, %r18, -126; |
| ; CHECK-NEXT: selp.b32 %r20, 0, %r19, %p2; |
| ; CHECK-NEXT: sub.s32 %r21, 23, %r20; |
| ; CHECK-NEXT: min.u32 %r22, %r21, 31; |
| ; CHECK-NEXT: shr.u32 %r23, %r13, %r22; |
| ; CHECK-NEXT: and.b32 %r24, %r23, 1; |
| ; CHECK-NEXT: max.u32 %r25, %r22, 1; |
| ; CHECK-NEXT: add.s32 %r26, %r25, -1; |
| ; CHECK-NEXT: mov.b32 %r27, 1; |
| ; CHECK-NEXT: shl.b32 %r28, %r27, %r26; |
| ; CHECK-NEXT: add.s32 %r29, %r28, -1; |
| ; CHECK-NEXT: and.b32 %r30, %r13, %r29; |
| ; CHECK-NEXT: setp.ne.b32 %p3, %r30, 0; |
| ; CHECK-NEXT: selp.b32 %r31, 1, 0, %p3; |
| ; CHECK-NEXT: or.b32 %r32, %r31, %r24; |
| ; CHECK-NEXT: shr.u32 %r33, %r13, %r26; |
| ; CHECK-NEXT: and.b32 %r34, %r33, %r32; |
| ; CHECK-NEXT: setp.ne.b32 %p4, %r22, 0; |
| ; CHECK-NEXT: selp.b32 %r35, %r34, 0, %p4; |
| ; CHECK-NEXT: add.s32 %r36, %r23, %r35; |
| ; CHECK-NEXT: setp.gt.s32 %p5, %r36, 1; |
| ; CHECK-NEXT: selp.b32 %r37, 0, %r36, %p5; |
| ; CHECK-NEXT: selp.b32 %r38, 2, 0, %p5; |
| ; CHECK-NEXT: shr.u32 %r39, %r4, 28; |
| ; CHECK-NEXT: and.b32 %r40, %r39, 8; |
| ; CHECK-NEXT: or.b32 %r41, %r40, %r38; |
| ; CHECK-NEXT: or.b32 %r42, %r41, %r37; |
| ; CHECK-NEXT: bfe.u32 %r43, %r11, 22, 1; |
| ; CHECK-NEXT: and.b32 %r44, %r11, 2097151; |
| ; CHECK-NEXT: setp.ne.b32 %p6, %r44, 0; |
| ; CHECK-NEXT: selp.b32 %r45, 1, 0, %p6; |
| ; CHECK-NEXT: or.b32 %r46, %r45, %r43; |
| ; CHECK-NEXT: shr.u32 %r47, %r11, 21; |
| ; CHECK-NEXT: and.b32 %r48, %r47, %r46; |
| ; CHECK-NEXT: add.s32 %r49, %r43, %r48; |
| ; CHECK-NEXT: setp.gt.s32 %p7, %r49, 1; |
| ; CHECK-NEXT: selp.b32 %r50, 0, %r49, %p7; |
| ; CHECK-NEXT: selp.b32 %r51, 1, 0, %p7; |
| ; CHECK-NEXT: add.s32 %r52, %r20, %r51; |
| ; CHECK-NEXT: shl.b32 %r53, %r52, 1; |
| ; CHECK-NEXT: or.b32 %r54, %r40, %r53; |
| ; CHECK-NEXT: or.b32 %r55, %r54, %r50; |
| ; CHECK-NEXT: setp.lt.s32 %p8, %r52, 1; |
| ; CHECK-NEXT: selp.b32 %r56, %r42, %r55, %p8; |
| ; CHECK-NEXT: setp.eq.f32 %p9, %r4, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r57, %r40, %r56, %p9; |
| ; CHECK-NEXT: mul.rn.f32 %r58, %r3, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r59, %r3, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p10, %r59, 8388608; |
| ; CHECK-NEXT: selp.b32 %r60, %r58, %r3, %p10; |
| ; CHECK-NEXT: and.b32 %r61, %r60, -2139095041; |
| ; CHECK-NEXT: or.b32 %r62, %r61, 1056964608; |
| ; CHECK-NEXT: add.s32 %r63, %r59, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p11, %r63, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r64, %r3, %r62, %p11; |
| ; CHECK-NEXT: and.b32 %r65, %r64, 8388607; |
| ; CHECK-NEXT: or.b32 %r66, %r65, 8388608; |
| ; CHECK-NEXT: and.b32 %r67, %r58, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r68, %r67, %r59, %p10; |
| ; CHECK-NEXT: shr.u32 %r69, %r68, 23; |
| ; CHECK-NEXT: selp.b32 %r70, -25, 0, %p10; |
| ; CHECK-NEXT: add.s32 %r71, %r69, %r70; |
| ; CHECK-NEXT: add.s32 %r72, %r71, -126; |
| ; CHECK-NEXT: selp.b32 %r73, 0, %r72, %p11; |
| ; CHECK-NEXT: sub.s32 %r74, 23, %r73; |
| ; CHECK-NEXT: min.u32 %r75, %r74, 31; |
| ; CHECK-NEXT: shr.u32 %r76, %r66, %r75; |
| ; CHECK-NEXT: and.b32 %r77, %r76, 1; |
| ; CHECK-NEXT: max.u32 %r78, %r75, 1; |
| ; CHECK-NEXT: add.s32 %r79, %r78, -1; |
| ; CHECK-NEXT: shl.b32 %r80, %r27, %r79; |
| ; CHECK-NEXT: add.s32 %r81, %r80, -1; |
| ; CHECK-NEXT: and.b32 %r82, %r66, %r81; |
| ; CHECK-NEXT: setp.ne.b32 %p12, %r82, 0; |
| ; CHECK-NEXT: selp.b32 %r83, 1, 0, %p12; |
| ; CHECK-NEXT: or.b32 %r84, %r83, %r77; |
| ; CHECK-NEXT: shr.u32 %r85, %r66, %r79; |
| ; CHECK-NEXT: and.b32 %r86, %r85, %r84; |
| ; CHECK-NEXT: setp.ne.b32 %p13, %r75, 0; |
| ; CHECK-NEXT: selp.b32 %r87, %r86, 0, %p13; |
| ; CHECK-NEXT: add.s32 %r88, %r76, %r87; |
| ; CHECK-NEXT: setp.gt.s32 %p14, %r88, 1; |
| ; CHECK-NEXT: selp.b32 %r89, 0, %r88, %p14; |
| ; CHECK-NEXT: selp.b32 %r90, 2, 0, %p14; |
| ; CHECK-NEXT: shr.u32 %r91, %r3, 28; |
| ; CHECK-NEXT: and.b32 %r92, %r91, 8; |
| ; CHECK-NEXT: or.b32 %r93, %r92, %r90; |
| ; CHECK-NEXT: or.b32 %r94, %r93, %r89; |
| ; CHECK-NEXT: bfe.u32 %r95, %r64, 22, 1; |
| ; CHECK-NEXT: and.b32 %r96, %r64, 2097151; |
| ; CHECK-NEXT: setp.ne.b32 %p15, %r96, 0; |
| ; CHECK-NEXT: selp.b32 %r97, 1, 0, %p15; |
| ; CHECK-NEXT: or.b32 %r98, %r97, %r95; |
| ; CHECK-NEXT: shr.u32 %r99, %r64, 21; |
| ; CHECK-NEXT: and.b32 %r100, %r99, %r98; |
| ; CHECK-NEXT: add.s32 %r101, %r95, %r100; |
| ; CHECK-NEXT: setp.gt.s32 %p16, %r101, 1; |
| ; CHECK-NEXT: selp.b32 %r102, 0, %r101, %p16; |
| ; CHECK-NEXT: selp.b32 %r103, 1, 0, %p16; |
| ; CHECK-NEXT: add.s32 %r104, %r73, %r103; |
| ; CHECK-NEXT: shl.b32 %r105, %r104, 1; |
| ; CHECK-NEXT: or.b32 %r106, %r92, %r105; |
| ; CHECK-NEXT: or.b32 %r107, %r106, %r102; |
| ; CHECK-NEXT: setp.lt.s32 %p17, %r104, 1; |
| ; CHECK-NEXT: selp.b32 %r108, %r94, %r107, %p17; |
| ; CHECK-NEXT: setp.eq.f32 %p18, %r3, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r109, %r92, %r108, %p18; |
| ; CHECK-NEXT: prmt.b32 %r110, %r109, %r57, 0x3340U; |
| ; CHECK-NEXT: mul.rn.f32 %r111, %r2, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r112, %r2, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p19, %r112, 8388608; |
| ; CHECK-NEXT: selp.b32 %r113, %r111, %r2, %p19; |
| ; CHECK-NEXT: and.b32 %r114, %r113, -2139095041; |
| ; CHECK-NEXT: or.b32 %r115, %r114, 1056964608; |
| ; CHECK-NEXT: add.s32 %r116, %r112, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p20, %r116, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r117, %r2, %r115, %p20; |
| ; CHECK-NEXT: and.b32 %r118, %r117, 8388607; |
| ; CHECK-NEXT: or.b32 %r119, %r118, 8388608; |
| ; CHECK-NEXT: and.b32 %r120, %r111, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r121, %r120, %r112, %p19; |
| ; CHECK-NEXT: shr.u32 %r122, %r121, 23; |
| ; CHECK-NEXT: selp.b32 %r123, -25, 0, %p19; |
| ; CHECK-NEXT: add.s32 %r124, %r122, %r123; |
| ; CHECK-NEXT: add.s32 %r125, %r124, -126; |
| ; CHECK-NEXT: selp.b32 %r126, 0, %r125, %p20; |
| ; CHECK-NEXT: sub.s32 %r127, 23, %r126; |
| ; CHECK-NEXT: min.u32 %r128, %r127, 31; |
| ; CHECK-NEXT: shr.u32 %r129, %r119, %r128; |
| ; CHECK-NEXT: and.b32 %r130, %r129, 1; |
| ; CHECK-NEXT: max.u32 %r131, %r128, 1; |
| ; CHECK-NEXT: add.s32 %r132, %r131, -1; |
| ; CHECK-NEXT: shl.b32 %r133, %r27, %r132; |
| ; CHECK-NEXT: add.s32 %r134, %r133, -1; |
| ; CHECK-NEXT: and.b32 %r135, %r119, %r134; |
| ; CHECK-NEXT: setp.ne.b32 %p21, %r135, 0; |
| ; CHECK-NEXT: selp.b32 %r136, 1, 0, %p21; |
| ; CHECK-NEXT: or.b32 %r137, %r136, %r130; |
| ; CHECK-NEXT: shr.u32 %r138, %r119, %r132; |
| ; CHECK-NEXT: and.b32 %r139, %r138, %r137; |
| ; CHECK-NEXT: setp.ne.b32 %p22, %r128, 0; |
| ; CHECK-NEXT: selp.b32 %r140, %r139, 0, %p22; |
| ; CHECK-NEXT: add.s32 %r141, %r129, %r140; |
| ; CHECK-NEXT: setp.gt.s32 %p23, %r141, 1; |
| ; CHECK-NEXT: selp.b32 %r142, 0, %r141, %p23; |
| ; CHECK-NEXT: selp.b32 %r143, 2, 0, %p23; |
| ; CHECK-NEXT: shr.u32 %r144, %r2, 28; |
| ; CHECK-NEXT: and.b32 %r145, %r144, 8; |
| ; CHECK-NEXT: or.b32 %r146, %r145, %r143; |
| ; CHECK-NEXT: or.b32 %r147, %r146, %r142; |
| ; CHECK-NEXT: bfe.u32 %r148, %r117, 22, 1; |
| ; CHECK-NEXT: and.b32 %r149, %r117, 2097151; |
| ; CHECK-NEXT: setp.ne.b32 %p24, %r149, 0; |
| ; CHECK-NEXT: selp.b32 %r150, 1, 0, %p24; |
| ; CHECK-NEXT: or.b32 %r151, %r150, %r148; |
| ; CHECK-NEXT: shr.u32 %r152, %r117, 21; |
| ; CHECK-NEXT: and.b32 %r153, %r152, %r151; |
| ; CHECK-NEXT: add.s32 %r154, %r148, %r153; |
| ; CHECK-NEXT: setp.gt.s32 %p25, %r154, 1; |
| ; CHECK-NEXT: selp.b32 %r155, 0, %r154, %p25; |
| ; CHECK-NEXT: selp.b32 %r156, 1, 0, %p25; |
| ; CHECK-NEXT: add.s32 %r157, %r126, %r156; |
| ; CHECK-NEXT: shl.b32 %r158, %r157, 1; |
| ; CHECK-NEXT: or.b32 %r159, %r145, %r158; |
| ; CHECK-NEXT: or.b32 %r160, %r159, %r155; |
| ; CHECK-NEXT: setp.lt.s32 %p26, %r157, 1; |
| ; CHECK-NEXT: selp.b32 %r161, %r147, %r160, %p26; |
| ; CHECK-NEXT: setp.eq.f32 %p27, %r2, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r162, %r145, %r161, %p27; |
| ; CHECK-NEXT: mul.rn.f32 %r163, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r164, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p28, %r164, 8388608; |
| ; CHECK-NEXT: selp.b32 %r165, %r163, %r1, %p28; |
| ; CHECK-NEXT: and.b32 %r166, %r165, -2139095041; |
| ; CHECK-NEXT: or.b32 %r167, %r166, 1056964608; |
| ; CHECK-NEXT: add.s32 %r168, %r164, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p29, %r168, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r169, %r1, %r167, %p29; |
| ; CHECK-NEXT: and.b32 %r170, %r169, 8388607; |
| ; CHECK-NEXT: or.b32 %r171, %r170, 8388608; |
| ; CHECK-NEXT: and.b32 %r172, %r163, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r173, %r172, %r164, %p28; |
| ; CHECK-NEXT: shr.u32 %r174, %r173, 23; |
| ; CHECK-NEXT: selp.b32 %r175, -25, 0, %p28; |
| ; CHECK-NEXT: add.s32 %r176, %r174, %r175; |
| ; CHECK-NEXT: add.s32 %r177, %r176, -126; |
| ; CHECK-NEXT: selp.b32 %r178, 0, %r177, %p29; |
| ; CHECK-NEXT: sub.s32 %r179, 23, %r178; |
| ; CHECK-NEXT: min.u32 %r180, %r179, 31; |
| ; CHECK-NEXT: shr.u32 %r181, %r171, %r180; |
| ; CHECK-NEXT: and.b32 %r182, %r181, 1; |
| ; CHECK-NEXT: max.u32 %r183, %r180, 1; |
| ; CHECK-NEXT: add.s32 %r184, %r183, -1; |
| ; CHECK-NEXT: shl.b32 %r185, %r27, %r184; |
| ; CHECK-NEXT: add.s32 %r186, %r185, -1; |
| ; CHECK-NEXT: and.b32 %r187, %r171, %r186; |
| ; CHECK-NEXT: setp.ne.b32 %p30, %r187, 0; |
| ; CHECK-NEXT: selp.b32 %r188, 1, 0, %p30; |
| ; CHECK-NEXT: or.b32 %r189, %r188, %r182; |
| ; CHECK-NEXT: shr.u32 %r190, %r171, %r184; |
| ; CHECK-NEXT: and.b32 %r191, %r190, %r189; |
| ; CHECK-NEXT: setp.ne.b32 %p31, %r180, 0; |
| ; CHECK-NEXT: selp.b32 %r192, %r191, 0, %p31; |
| ; CHECK-NEXT: add.s32 %r193, %r181, %r192; |
| ; CHECK-NEXT: setp.gt.s32 %p32, %r193, 1; |
| ; CHECK-NEXT: selp.b32 %r194, 0, %r193, %p32; |
| ; CHECK-NEXT: selp.b32 %r195, 2, 0, %p32; |
| ; CHECK-NEXT: shr.u32 %r196, %r1, 28; |
| ; CHECK-NEXT: and.b32 %r197, %r196, 8; |
| ; CHECK-NEXT: or.b32 %r198, %r197, %r195; |
| ; CHECK-NEXT: or.b32 %r199, %r198, %r194; |
| ; CHECK-NEXT: bfe.u32 %r200, %r169, 22, 1; |
| ; CHECK-NEXT: and.b32 %r201, %r169, 2097151; |
| ; CHECK-NEXT: setp.ne.b32 %p33, %r201, 0; |
| ; CHECK-NEXT: selp.b32 %r202, 1, 0, %p33; |
| ; CHECK-NEXT: or.b32 %r203, %r202, %r200; |
| ; CHECK-NEXT: shr.u32 %r204, %r169, 21; |
| ; CHECK-NEXT: and.b32 %r205, %r204, %r203; |
| ; CHECK-NEXT: add.s32 %r206, %r200, %r205; |
| ; CHECK-NEXT: setp.gt.s32 %p34, %r206, 1; |
| ; CHECK-NEXT: selp.b32 %r207, 0, %r206, %p34; |
| ; CHECK-NEXT: selp.b32 %r208, 1, 0, %p34; |
| ; CHECK-NEXT: add.s32 %r209, %r178, %r208; |
| ; CHECK-NEXT: shl.b32 %r210, %r209, 1; |
| ; CHECK-NEXT: or.b32 %r211, %r197, %r210; |
| ; CHECK-NEXT: or.b32 %r212, %r211, %r207; |
| ; CHECK-NEXT: setp.lt.s32 %p35, %r209, 1; |
| ; CHECK-NEXT: selp.b32 %r213, %r199, %r212, %p35; |
| ; CHECK-NEXT: setp.eq.f32 %p36, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r214, %r197, %r213, %p36; |
| ; CHECK-NEXT: prmt.b32 %r215, %r214, %r162, 0x3340U; |
| ; CHECK-NEXT: prmt.b32 %r216, %r215, %r110, 0x5410U; |
| ; CHECK-NEXT: st.param.b16 [func_retval0], %r216; |
| ; CHECK-NEXT: shr.u32 %r217, %r216, 16; |
| ; CHECK-NEXT: st.param.b16 [func_retval0+2], %r217; |
| ; CHECK-NEXT: ret; |
| %r = call <4 x i4> @llvm.convert.to.arbitrary.fp.v4i4.v4f32(<4 x float> %x, metadata !"Float4E2M1FN", metadata !"round.tonearest", i1 false) |
| ret <4 x i4> %r |
| } |
| |
| ; <2 x float> -> <2 x i8> Float8E5M2 |
| define <2 x i8> @to_f8e5m2_v2f32(<2 x float> %x) { |
| ; CHECK-LABEL: to_f8e5m2_v2f32( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<29>; |
| ; CHECK-NEXT: .reg .b16 %rs<3>; |
| ; CHECK-NEXT: .reg .b32 %r<126>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.v2.b32 {%r1, %r2}, [to_f8e5m2_v2f32_param_0]; |
| ; CHECK-NEXT: mul.rn.f32 %r3, %r2, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r4, %r2, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r4, 8388608; |
| ; CHECK-NEXT: selp.b32 %r5, %r3, %r2, %p1; |
| ; CHECK-NEXT: and.b32 %r6, %r5, -2139095041; |
| ; CHECK-NEXT: or.b32 %r7, %r6, 1056964608; |
| ; CHECK-NEXT: add.s32 %r8, %r4, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r8, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r9, %r2, %r7, %p2; |
| ; CHECK-NEXT: and.b32 %r10, %r9, 8388607; |
| ; CHECK-NEXT: or.b32 %r11, %r10, 8388608; |
| ; CHECK-NEXT: and.b32 %r12, %r3, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r13, %r12, %r4, %p1; |
| ; CHECK-NEXT: shr.u32 %r14, %r13, 23; |
| ; CHECK-NEXT: selp.b32 %r15, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r16, %r14, %r15; |
| ; CHECK-NEXT: add.s32 %r17, %r16, -126; |
| ; CHECK-NEXT: selp.b32 %r18, 0, %r17, %p2; |
| ; CHECK-NEXT: sub.s32 %r19, 8, %r18; |
| ; CHECK-NEXT: min.u32 %r20, %r19, 31; |
| ; CHECK-NEXT: shr.u32 %r21, %r11, %r20; |
| ; CHECK-NEXT: and.b32 %r22, %r21, 1; |
| ; CHECK-NEXT: max.u32 %r23, %r20, 1; |
| ; CHECK-NEXT: add.s32 %r24, %r23, -1; |
| ; CHECK-NEXT: mov.b32 %r25, 1; |
| ; CHECK-NEXT: shl.b32 %r26, %r25, %r24; |
| ; CHECK-NEXT: add.s32 %r27, %r26, -1; |
| ; CHECK-NEXT: and.b32 %r28, %r11, %r27; |
| ; CHECK-NEXT: setp.ne.b32 %p3, %r28, 0; |
| ; CHECK-NEXT: selp.b32 %r29, 1, 0, %p3; |
| ; CHECK-NEXT: or.b32 %r30, %r29, %r22; |
| ; CHECK-NEXT: shr.u32 %r31, %r11, %r24; |
| ; CHECK-NEXT: and.b32 %r32, %r31, %r30; |
| ; CHECK-NEXT: setp.ne.b32 %p4, %r20, 0; |
| ; CHECK-NEXT: selp.b32 %r33, %r32, 0, %p4; |
| ; CHECK-NEXT: add.s32 %r34, %r21, %r33; |
| ; CHECK-NEXT: setp.gt.s32 %p5, %r34, 3; |
| ; CHECK-NEXT: selp.b32 %r35, 0, %r34, %p5; |
| ; CHECK-NEXT: selp.b32 %r36, 4, 0, %p5; |
| ; CHECK-NEXT: shr.u32 %r37, %r2, 24; |
| ; CHECK-NEXT: and.b32 %r38, %r37, 128; |
| ; CHECK-NEXT: or.b32 %r39, %r38, %r36; |
| ; CHECK-NEXT: or.b32 %r40, %r39, %r35; |
| ; CHECK-NEXT: bfe.u32 %r41, %r10, 21, 1; |
| ; CHECK-NEXT: and.b32 %r42, %r9, 1048575; |
| ; CHECK-NEXT: setp.ne.b32 %p6, %r42, 0; |
| ; CHECK-NEXT: selp.b32 %r43, 1, 0, %p6; |
| ; CHECK-NEXT: or.b32 %r44, %r43, %r41; |
| ; CHECK-NEXT: shr.u32 %r45, %r9, 20; |
| ; CHECK-NEXT: and.b32 %r46, %r45, %r44; |
| ; CHECK-NEXT: bfe.u32 %r47, %r9, 21, 2; |
| ; CHECK-NEXT: add.s32 %r48, %r47, %r46; |
| ; CHECK-NEXT: setp.gt.s32 %p7, %r48, 3; |
| ; CHECK-NEXT: selp.b32 %r49, 0, %r48, %p7; |
| ; CHECK-NEXT: selp.b32 %r50, 1, 0, %p7; |
| ; CHECK-NEXT: add.s32 %r51, %r18, %r50; |
| ; CHECK-NEXT: add.s32 %r52, %r51, 14; |
| ; CHECK-NEXT: shl.b32 %r53, %r52, 2; |
| ; CHECK-NEXT: or.b32 %r54, %r38, %r53; |
| ; CHECK-NEXT: or.b32 %r55, %r54, %r49; |
| ; CHECK-NEXT: setp.lt.s32 %p8, %r52, 1; |
| ; CHECK-NEXT: selp.b32 %r56, %r40, %r55, %p8; |
| ; CHECK-NEXT: setp.gt.s32 %p9, %r49, 3; |
| ; CHECK-NEXT: or.b32 %r57, %r38, 124; |
| ; CHECK-NEXT: selp.b32 %r58, %r57, %r56, %p9; |
| ; CHECK-NEXT: setp.eq.b32 %p10, %r52, 30; |
| ; CHECK-NEXT: selp.b32 %r59, %r58, %r56, %p10; |
| ; CHECK-NEXT: setp.gt.s32 %p11, %r52, 30; |
| ; CHECK-NEXT: selp.b32 %r60, %r57, %r59, %p11; |
| ; CHECK-NEXT: setp.eq.f32 %p12, %r2, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r61, %r38, %r60, %p12; |
| ; CHECK-NEXT: abs.f32 %r62, %r2; |
| ; CHECK-NEXT: setp.eq.f32 %p13, %r62, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r63, %r57, %r61, %p13; |
| ; CHECK-NEXT: setp.nan.f32 %p14, %r2, %r2; |
| ; CHECK-NEXT: selp.b32 %r64, 126, %r63, %p14; |
| ; CHECK-NEXT: cvt.u16.u32 %rs1, %r64; |
| ; CHECK-NEXT: mul.rn.f32 %r65, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r66, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p15, %r66, 8388608; |
| ; CHECK-NEXT: selp.b32 %r67, %r65, %r1, %p15; |
| ; CHECK-NEXT: and.b32 %r68, %r67, -2139095041; |
| ; CHECK-NEXT: or.b32 %r69, %r68, 1056964608; |
| ; CHECK-NEXT: add.s32 %r70, %r66, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p16, %r70, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r71, %r1, %r69, %p16; |
| ; CHECK-NEXT: and.b32 %r72, %r71, 8388607; |
| ; CHECK-NEXT: or.b32 %r73, %r72, 8388608; |
| ; CHECK-NEXT: and.b32 %r74, %r65, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r75, %r74, %r66, %p15; |
| ; CHECK-NEXT: shr.u32 %r76, %r75, 23; |
| ; CHECK-NEXT: selp.b32 %r77, -25, 0, %p15; |
| ; CHECK-NEXT: add.s32 %r78, %r76, %r77; |
| ; CHECK-NEXT: add.s32 %r79, %r78, -126; |
| ; CHECK-NEXT: selp.b32 %r80, 0, %r79, %p16; |
| ; CHECK-NEXT: sub.s32 %r81, 8, %r80; |
| ; CHECK-NEXT: min.u32 %r82, %r81, 31; |
| ; CHECK-NEXT: shr.u32 %r83, %r73, %r82; |
| ; CHECK-NEXT: and.b32 %r84, %r83, 1; |
| ; CHECK-NEXT: max.u32 %r85, %r82, 1; |
| ; CHECK-NEXT: add.s32 %r86, %r85, -1; |
| ; CHECK-NEXT: shl.b32 %r87, %r25, %r86; |
| ; CHECK-NEXT: add.s32 %r88, %r87, -1; |
| ; CHECK-NEXT: and.b32 %r89, %r73, %r88; |
| ; CHECK-NEXT: setp.ne.b32 %p17, %r89, 0; |
| ; CHECK-NEXT: selp.b32 %r90, 1, 0, %p17; |
| ; CHECK-NEXT: or.b32 %r91, %r90, %r84; |
| ; CHECK-NEXT: shr.u32 %r92, %r73, %r86; |
| ; CHECK-NEXT: and.b32 %r93, %r92, %r91; |
| ; CHECK-NEXT: setp.ne.b32 %p18, %r82, 0; |
| ; CHECK-NEXT: selp.b32 %r94, %r93, 0, %p18; |
| ; CHECK-NEXT: add.s32 %r95, %r83, %r94; |
| ; CHECK-NEXT: setp.gt.s32 %p19, %r95, 3; |
| ; CHECK-NEXT: selp.b32 %r96, 0, %r95, %p19; |
| ; CHECK-NEXT: selp.b32 %r97, 4, 0, %p19; |
| ; CHECK-NEXT: shr.u32 %r98, %r1, 24; |
| ; CHECK-NEXT: and.b32 %r99, %r98, 128; |
| ; CHECK-NEXT: or.b32 %r100, %r99, %r97; |
| ; CHECK-NEXT: or.b32 %r101, %r100, %r96; |
| ; CHECK-NEXT: bfe.u32 %r102, %r72, 21, 1; |
| ; CHECK-NEXT: and.b32 %r103, %r71, 1048575; |
| ; CHECK-NEXT: setp.ne.b32 %p20, %r103, 0; |
| ; CHECK-NEXT: selp.b32 %r104, 1, 0, %p20; |
| ; CHECK-NEXT: or.b32 %r105, %r104, %r102; |
| ; CHECK-NEXT: shr.u32 %r106, %r71, 20; |
| ; CHECK-NEXT: and.b32 %r107, %r106, %r105; |
| ; CHECK-NEXT: bfe.u32 %r108, %r71, 21, 2; |
| ; CHECK-NEXT: add.s32 %r109, %r108, %r107; |
| ; CHECK-NEXT: setp.gt.s32 %p21, %r109, 3; |
| ; CHECK-NEXT: selp.b32 %r110, 0, %r109, %p21; |
| ; CHECK-NEXT: selp.b32 %r111, 1, 0, %p21; |
| ; CHECK-NEXT: add.s32 %r112, %r80, %r111; |
| ; CHECK-NEXT: add.s32 %r113, %r112, 14; |
| ; CHECK-NEXT: shl.b32 %r114, %r113, 2; |
| ; CHECK-NEXT: or.b32 %r115, %r99, %r114; |
| ; CHECK-NEXT: or.b32 %r116, %r115, %r110; |
| ; CHECK-NEXT: setp.lt.s32 %p22, %r113, 1; |
| ; CHECK-NEXT: selp.b32 %r117, %r101, %r116, %p22; |
| ; CHECK-NEXT: setp.gt.s32 %p23, %r110, 3; |
| ; CHECK-NEXT: or.b32 %r118, %r99, 124; |
| ; CHECK-NEXT: selp.b32 %r119, %r118, %r117, %p23; |
| ; CHECK-NEXT: setp.eq.b32 %p24, %r113, 30; |
| ; CHECK-NEXT: selp.b32 %r120, %r119, %r117, %p24; |
| ; CHECK-NEXT: setp.gt.s32 %p25, %r113, 30; |
| ; CHECK-NEXT: selp.b32 %r121, %r118, %r120, %p25; |
| ; CHECK-NEXT: setp.eq.f32 %p26, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r122, %r99, %r121, %p26; |
| ; CHECK-NEXT: abs.f32 %r123, %r1; |
| ; CHECK-NEXT: setp.eq.f32 %p27, %r123, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r124, %r118, %r122, %p27; |
| ; CHECK-NEXT: setp.nan.f32 %p28, %r1, %r1; |
| ; CHECK-NEXT: selp.b32 %r125, 126, %r124, %p28; |
| ; CHECK-NEXT: cvt.u16.u32 %rs2, %r125; |
| ; CHECK-NEXT: st.param.v2.b8 [func_retval0], {%rs2, %rs1}; |
| ; CHECK-NEXT: ret; |
| %r = call <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f32(<2 x float> %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret <2 x i8> %r |
| } |
| |
| ; <2 x float> -> <2 x i8> Float8E4M3FN |
| define <2 x i8> @to_f8e4m3fn_v2f32(<2 x float> %x) { |
| ; CHECK-LABEL: to_f8e4m3fn_v2f32( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<21>; |
| ; CHECK-NEXT: .reg .b16 %rs<3>; |
| ; CHECK-NEXT: .reg .b32 %r<114>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.v2.b32 {%r1, %r2}, [to_f8e4m3fn_v2f32_param_0]; |
| ; CHECK-NEXT: mul.rn.f32 %r3, %r2, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r4, %r2, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r4, 8388608; |
| ; CHECK-NEXT: selp.b32 %r5, %r3, %r2, %p1; |
| ; CHECK-NEXT: and.b32 %r6, %r5, -2139095041; |
| ; CHECK-NEXT: or.b32 %r7, %r6, 1056964608; |
| ; CHECK-NEXT: add.s32 %r8, %r4, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r8, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r9, %r2, %r7, %p2; |
| ; CHECK-NEXT: and.b32 %r10, %r9, 8388607; |
| ; CHECK-NEXT: or.b32 %r11, %r10, 8388608; |
| ; CHECK-NEXT: and.b32 %r12, %r3, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r13, %r12, %r4, %p1; |
| ; CHECK-NEXT: shr.u32 %r14, %r13, 23; |
| ; CHECK-NEXT: selp.b32 %r15, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r16, %r14, %r15; |
| ; CHECK-NEXT: add.s32 %r17, %r16, -126; |
| ; CHECK-NEXT: selp.b32 %r18, 0, %r17, %p2; |
| ; CHECK-NEXT: sub.s32 %r19, 15, %r18; |
| ; CHECK-NEXT: min.u32 %r20, %r19, 31; |
| ; CHECK-NEXT: shr.u32 %r21, %r11, %r20; |
| ; CHECK-NEXT: and.b32 %r22, %r21, 1; |
| ; CHECK-NEXT: max.u32 %r23, %r20, 1; |
| ; CHECK-NEXT: add.s32 %r24, %r23, -1; |
| ; CHECK-NEXT: mov.b32 %r25, 1; |
| ; CHECK-NEXT: shl.b32 %r26, %r25, %r24; |
| ; CHECK-NEXT: add.s32 %r27, %r26, -1; |
| ; CHECK-NEXT: and.b32 %r28, %r11, %r27; |
| ; CHECK-NEXT: setp.ne.b32 %p3, %r28, 0; |
| ; CHECK-NEXT: selp.b32 %r29, 1, 0, %p3; |
| ; CHECK-NEXT: or.b32 %r30, %r29, %r22; |
| ; CHECK-NEXT: shr.u32 %r31, %r11, %r24; |
| ; CHECK-NEXT: and.b32 %r32, %r31, %r30; |
| ; CHECK-NEXT: setp.ne.b32 %p4, %r20, 0; |
| ; CHECK-NEXT: selp.b32 %r33, %r32, 0, %p4; |
| ; CHECK-NEXT: add.s32 %r34, %r21, %r33; |
| ; CHECK-NEXT: setp.gt.s32 %p5, %r34, 7; |
| ; CHECK-NEXT: selp.b32 %r35, 0, %r34, %p5; |
| ; CHECK-NEXT: selp.b32 %r36, 8, 0, %p5; |
| ; CHECK-NEXT: shr.u32 %r37, %r2, 24; |
| ; CHECK-NEXT: and.b32 %r38, %r37, 128; |
| ; CHECK-NEXT: or.b32 %r39, %r38, %r36; |
| ; CHECK-NEXT: or.b32 %r40, %r39, %r35; |
| ; CHECK-NEXT: bfe.u32 %r41, %r10, 20, 1; |
| ; CHECK-NEXT: and.b32 %r42, %r9, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p6, %r42, 0; |
| ; CHECK-NEXT: selp.b32 %r43, 1, 0, %p6; |
| ; CHECK-NEXT: or.b32 %r44, %r43, %r41; |
| ; CHECK-NEXT: shr.u32 %r45, %r9, 19; |
| ; CHECK-NEXT: and.b32 %r46, %r45, %r44; |
| ; CHECK-NEXT: bfe.u32 %r47, %r9, 20, 3; |
| ; CHECK-NEXT: add.s32 %r48, %r47, %r46; |
| ; CHECK-NEXT: setp.gt.s32 %p7, %r48, 7; |
| ; CHECK-NEXT: selp.b32 %r49, 0, %r48, %p7; |
| ; CHECK-NEXT: selp.b32 %r50, 1, 0, %p7; |
| ; CHECK-NEXT: add.s32 %r51, %r18, %r50; |
| ; CHECK-NEXT: add.s32 %r52, %r51, 6; |
| ; CHECK-NEXT: shl.b32 %r53, %r52, 3; |
| ; CHECK-NEXT: or.b32 %r54, %r38, %r53; |
| ; CHECK-NEXT: or.b32 %r55, %r54, %r49; |
| ; CHECK-NEXT: setp.lt.s32 %p8, %r52, 1; |
| ; CHECK-NEXT: selp.b32 %r56, %r40, %r55, %p8; |
| ; CHECK-NEXT: setp.eq.f32 %p9, %r2, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r57, %r38, %r56, %p9; |
| ; CHECK-NEXT: setp.nan.f32 %p10, %r2, %r2; |
| ; CHECK-NEXT: selp.b32 %r58, 127, %r57, %p10; |
| ; CHECK-NEXT: cvt.u16.u32 %rs1, %r58; |
| ; CHECK-NEXT: mul.rn.f32 %r59, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r60, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p11, %r60, 8388608; |
| ; CHECK-NEXT: selp.b32 %r61, %r59, %r1, %p11; |
| ; CHECK-NEXT: and.b32 %r62, %r61, -2139095041; |
| ; CHECK-NEXT: or.b32 %r63, %r62, 1056964608; |
| ; CHECK-NEXT: add.s32 %r64, %r60, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p12, %r64, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r65, %r1, %r63, %p12; |
| ; CHECK-NEXT: and.b32 %r66, %r65, 8388607; |
| ; CHECK-NEXT: or.b32 %r67, %r66, 8388608; |
| ; CHECK-NEXT: and.b32 %r68, %r59, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r69, %r68, %r60, %p11; |
| ; CHECK-NEXT: shr.u32 %r70, %r69, 23; |
| ; CHECK-NEXT: selp.b32 %r71, -25, 0, %p11; |
| ; CHECK-NEXT: add.s32 %r72, %r70, %r71; |
| ; CHECK-NEXT: add.s32 %r73, %r72, -126; |
| ; CHECK-NEXT: selp.b32 %r74, 0, %r73, %p12; |
| ; CHECK-NEXT: sub.s32 %r75, 15, %r74; |
| ; CHECK-NEXT: min.u32 %r76, %r75, 31; |
| ; CHECK-NEXT: shr.u32 %r77, %r67, %r76; |
| ; CHECK-NEXT: and.b32 %r78, %r77, 1; |
| ; CHECK-NEXT: max.u32 %r79, %r76, 1; |
| ; CHECK-NEXT: add.s32 %r80, %r79, -1; |
| ; CHECK-NEXT: shl.b32 %r81, %r25, %r80; |
| ; CHECK-NEXT: add.s32 %r82, %r81, -1; |
| ; CHECK-NEXT: and.b32 %r83, %r67, %r82; |
| ; CHECK-NEXT: setp.ne.b32 %p13, %r83, 0; |
| ; CHECK-NEXT: selp.b32 %r84, 1, 0, %p13; |
| ; CHECK-NEXT: or.b32 %r85, %r84, %r78; |
| ; CHECK-NEXT: shr.u32 %r86, %r67, %r80; |
| ; CHECK-NEXT: and.b32 %r87, %r86, %r85; |
| ; CHECK-NEXT: setp.ne.b32 %p14, %r76, 0; |
| ; CHECK-NEXT: selp.b32 %r88, %r87, 0, %p14; |
| ; CHECK-NEXT: add.s32 %r89, %r77, %r88; |
| ; CHECK-NEXT: setp.gt.s32 %p15, %r89, 7; |
| ; CHECK-NEXT: selp.b32 %r90, 0, %r89, %p15; |
| ; CHECK-NEXT: selp.b32 %r91, 8, 0, %p15; |
| ; CHECK-NEXT: shr.u32 %r92, %r1, 24; |
| ; CHECK-NEXT: and.b32 %r93, %r92, 128; |
| ; CHECK-NEXT: or.b32 %r94, %r93, %r91; |
| ; CHECK-NEXT: or.b32 %r95, %r94, %r90; |
| ; CHECK-NEXT: bfe.u32 %r96, %r66, 20, 1; |
| ; CHECK-NEXT: and.b32 %r97, %r65, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p16, %r97, 0; |
| ; CHECK-NEXT: selp.b32 %r98, 1, 0, %p16; |
| ; CHECK-NEXT: or.b32 %r99, %r98, %r96; |
| ; CHECK-NEXT: shr.u32 %r100, %r65, 19; |
| ; CHECK-NEXT: and.b32 %r101, %r100, %r99; |
| ; CHECK-NEXT: bfe.u32 %r102, %r65, 20, 3; |
| ; CHECK-NEXT: add.s32 %r103, %r102, %r101; |
| ; CHECK-NEXT: setp.gt.s32 %p17, %r103, 7; |
| ; CHECK-NEXT: selp.b32 %r104, 0, %r103, %p17; |
| ; CHECK-NEXT: selp.b32 %r105, 1, 0, %p17; |
| ; CHECK-NEXT: add.s32 %r106, %r74, %r105; |
| ; CHECK-NEXT: add.s32 %r107, %r106, 6; |
| ; CHECK-NEXT: shl.b32 %r108, %r107, 3; |
| ; CHECK-NEXT: or.b32 %r109, %r93, %r108; |
| ; CHECK-NEXT: or.b32 %r110, %r109, %r104; |
| ; CHECK-NEXT: setp.lt.s32 %p18, %r107, 1; |
| ; CHECK-NEXT: selp.b32 %r111, %r95, %r110, %p18; |
| ; CHECK-NEXT: setp.eq.f32 %p19, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r112, %r93, %r111, %p19; |
| ; CHECK-NEXT: setp.nan.f32 %p20, %r1, %r1; |
| ; CHECK-NEXT: selp.b32 %r113, 127, %r112, %p20; |
| ; CHECK-NEXT: cvt.u16.u32 %rs2, %r113; |
| ; CHECK-NEXT: st.param.v2.b8 [func_retval0], {%rs2, %rs1}; |
| ; CHECK-NEXT: ret; |
| %r = call <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f32(<2 x float> %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret <2 x i8> %r |
| } |
| |
| ; <3 x float> -> <3 x i8> Float8E4M3FN |
| define <3 x i8> @to_f8e4m3fn_v3f32(<3 x float> %x) { |
| ; CHECK-LABEL: to_f8e4m3fn_v3f32( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<31>; |
| ; CHECK-NEXT: .reg .b32 %r<174>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.v2.b32 {%r1, %r2}, [to_f8e4m3fn_v3f32_param_0]; |
| ; CHECK-NEXT: ld.param.b32 %r3, [to_f8e4m3fn_v3f32_param_0+8]; |
| ; CHECK-NEXT: mul.rn.f32 %r4, %r3, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r5, %r3, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r5, 8388608; |
| ; CHECK-NEXT: selp.b32 %r6, %r4, %r3, %p1; |
| ; CHECK-NEXT: and.b32 %r7, %r6, -2139095041; |
| ; CHECK-NEXT: or.b32 %r8, %r7, 1056964608; |
| ; CHECK-NEXT: add.s32 %r9, %r5, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r9, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r10, %r3, %r8, %p2; |
| ; CHECK-NEXT: and.b32 %r11, %r10, 8388607; |
| ; CHECK-NEXT: or.b32 %r12, %r11, 8388608; |
| ; CHECK-NEXT: and.b32 %r13, %r4, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r14, %r13, %r5, %p1; |
| ; CHECK-NEXT: shr.u32 %r15, %r14, 23; |
| ; CHECK-NEXT: selp.b32 %r16, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r17, %r15, %r16; |
| ; CHECK-NEXT: add.s32 %r18, %r17, -126; |
| ; CHECK-NEXT: selp.b32 %r19, 0, %r18, %p2; |
| ; CHECK-NEXT: sub.s32 %r20, 15, %r19; |
| ; CHECK-NEXT: min.u32 %r21, %r20, 31; |
| ; CHECK-NEXT: shr.u32 %r22, %r12, %r21; |
| ; CHECK-NEXT: and.b32 %r23, %r22, 1; |
| ; CHECK-NEXT: max.u32 %r24, %r21, 1; |
| ; CHECK-NEXT: add.s32 %r25, %r24, -1; |
| ; CHECK-NEXT: mov.b32 %r26, 1; |
| ; CHECK-NEXT: shl.b32 %r27, %r26, %r25; |
| ; CHECK-NEXT: add.s32 %r28, %r27, -1; |
| ; CHECK-NEXT: and.b32 %r29, %r12, %r28; |
| ; CHECK-NEXT: setp.ne.b32 %p3, %r29, 0; |
| ; CHECK-NEXT: selp.b32 %r30, 1, 0, %p3; |
| ; CHECK-NEXT: or.b32 %r31, %r30, %r23; |
| ; CHECK-NEXT: shr.u32 %r32, %r12, %r25; |
| ; CHECK-NEXT: and.b32 %r33, %r32, %r31; |
| ; CHECK-NEXT: setp.ne.b32 %p4, %r21, 0; |
| ; CHECK-NEXT: selp.b32 %r34, %r33, 0, %p4; |
| ; CHECK-NEXT: add.s32 %r35, %r22, %r34; |
| ; CHECK-NEXT: setp.gt.s32 %p5, %r35, 7; |
| ; CHECK-NEXT: selp.b32 %r36, 0, %r35, %p5; |
| ; CHECK-NEXT: selp.b32 %r37, 8, 0, %p5; |
| ; CHECK-NEXT: shr.u32 %r38, %r3, 24; |
| ; CHECK-NEXT: and.b32 %r39, %r38, 128; |
| ; CHECK-NEXT: or.b32 %r40, %r39, %r37; |
| ; CHECK-NEXT: or.b32 %r41, %r40, %r36; |
| ; CHECK-NEXT: bfe.u32 %r42, %r11, 20, 1; |
| ; CHECK-NEXT: and.b32 %r43, %r10, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p6, %r43, 0; |
| ; CHECK-NEXT: selp.b32 %r44, 1, 0, %p6; |
| ; CHECK-NEXT: or.b32 %r45, %r44, %r42; |
| ; CHECK-NEXT: shr.u32 %r46, %r10, 19; |
| ; CHECK-NEXT: and.b32 %r47, %r46, %r45; |
| ; CHECK-NEXT: bfe.u32 %r48, %r10, 20, 3; |
| ; CHECK-NEXT: add.s32 %r49, %r48, %r47; |
| ; CHECK-NEXT: setp.gt.s32 %p7, %r49, 7; |
| ; CHECK-NEXT: selp.b32 %r50, 0, %r49, %p7; |
| ; CHECK-NEXT: selp.b32 %r51, 1, 0, %p7; |
| ; CHECK-NEXT: add.s32 %r52, %r19, %r51; |
| ; CHECK-NEXT: add.s32 %r53, %r52, 6; |
| ; CHECK-NEXT: shl.b32 %r54, %r53, 3; |
| ; CHECK-NEXT: or.b32 %r55, %r39, %r54; |
| ; CHECK-NEXT: or.b32 %r56, %r55, %r50; |
| ; CHECK-NEXT: setp.lt.s32 %p8, %r53, 1; |
| ; CHECK-NEXT: selp.b32 %r57, %r41, %r56, %p8; |
| ; CHECK-NEXT: setp.eq.f32 %p9, %r3, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r58, %r39, %r57, %p9; |
| ; CHECK-NEXT: setp.nan.f32 %p10, %r3, %r3; |
| ; CHECK-NEXT: selp.b32 %r59, 127, %r58, %p10; |
| ; CHECK-NEXT: mul.rn.f32 %r60, %r2, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r61, %r2, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p11, %r61, 8388608; |
| ; CHECK-NEXT: selp.b32 %r62, %r60, %r2, %p11; |
| ; CHECK-NEXT: and.b32 %r63, %r62, -2139095041; |
| ; CHECK-NEXT: or.b32 %r64, %r63, 1056964608; |
| ; CHECK-NEXT: add.s32 %r65, %r61, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p12, %r65, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r66, %r2, %r64, %p12; |
| ; CHECK-NEXT: and.b32 %r67, %r66, 8388607; |
| ; CHECK-NEXT: or.b32 %r68, %r67, 8388608; |
| ; CHECK-NEXT: and.b32 %r69, %r60, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r70, %r69, %r61, %p11; |
| ; CHECK-NEXT: shr.u32 %r71, %r70, 23; |
| ; CHECK-NEXT: selp.b32 %r72, -25, 0, %p11; |
| ; CHECK-NEXT: add.s32 %r73, %r71, %r72; |
| ; CHECK-NEXT: add.s32 %r74, %r73, -126; |
| ; CHECK-NEXT: selp.b32 %r75, 0, %r74, %p12; |
| ; CHECK-NEXT: sub.s32 %r76, 15, %r75; |
| ; CHECK-NEXT: min.u32 %r77, %r76, 31; |
| ; CHECK-NEXT: shr.u32 %r78, %r68, %r77; |
| ; CHECK-NEXT: and.b32 %r79, %r78, 1; |
| ; CHECK-NEXT: max.u32 %r80, %r77, 1; |
| ; CHECK-NEXT: add.s32 %r81, %r80, -1; |
| ; CHECK-NEXT: shl.b32 %r82, %r26, %r81; |
| ; CHECK-NEXT: add.s32 %r83, %r82, -1; |
| ; CHECK-NEXT: and.b32 %r84, %r68, %r83; |
| ; CHECK-NEXT: setp.ne.b32 %p13, %r84, 0; |
| ; CHECK-NEXT: selp.b32 %r85, 1, 0, %p13; |
| ; CHECK-NEXT: or.b32 %r86, %r85, %r79; |
| ; CHECK-NEXT: shr.u32 %r87, %r68, %r81; |
| ; CHECK-NEXT: and.b32 %r88, %r87, %r86; |
| ; CHECK-NEXT: setp.ne.b32 %p14, %r77, 0; |
| ; CHECK-NEXT: selp.b32 %r89, %r88, 0, %p14; |
| ; CHECK-NEXT: add.s32 %r90, %r78, %r89; |
| ; CHECK-NEXT: setp.gt.s32 %p15, %r90, 7; |
| ; CHECK-NEXT: selp.b32 %r91, 0, %r90, %p15; |
| ; CHECK-NEXT: selp.b32 %r92, 8, 0, %p15; |
| ; CHECK-NEXT: shr.u32 %r93, %r2, 24; |
| ; CHECK-NEXT: and.b32 %r94, %r93, 128; |
| ; CHECK-NEXT: or.b32 %r95, %r94, %r92; |
| ; CHECK-NEXT: or.b32 %r96, %r95, %r91; |
| ; CHECK-NEXT: bfe.u32 %r97, %r67, 20, 1; |
| ; CHECK-NEXT: and.b32 %r98, %r66, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p16, %r98, 0; |
| ; CHECK-NEXT: selp.b32 %r99, 1, 0, %p16; |
| ; CHECK-NEXT: or.b32 %r100, %r99, %r97; |
| ; CHECK-NEXT: shr.u32 %r101, %r66, 19; |
| ; CHECK-NEXT: and.b32 %r102, %r101, %r100; |
| ; CHECK-NEXT: bfe.u32 %r103, %r66, 20, 3; |
| ; CHECK-NEXT: add.s32 %r104, %r103, %r102; |
| ; CHECK-NEXT: setp.gt.s32 %p17, %r104, 7; |
| ; CHECK-NEXT: selp.b32 %r105, 0, %r104, %p17; |
| ; CHECK-NEXT: selp.b32 %r106, 1, 0, %p17; |
| ; CHECK-NEXT: add.s32 %r107, %r75, %r106; |
| ; CHECK-NEXT: add.s32 %r108, %r107, 6; |
| ; CHECK-NEXT: shl.b32 %r109, %r108, 3; |
| ; CHECK-NEXT: or.b32 %r110, %r94, %r109; |
| ; CHECK-NEXT: or.b32 %r111, %r110, %r105; |
| ; CHECK-NEXT: setp.lt.s32 %p18, %r108, 1; |
| ; CHECK-NEXT: selp.b32 %r112, %r96, %r111, %p18; |
| ; CHECK-NEXT: setp.eq.f32 %p19, %r2, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r113, %r94, %r112, %p19; |
| ; CHECK-NEXT: setp.nan.f32 %p20, %r2, %r2; |
| ; CHECK-NEXT: selp.b32 %r114, 127, %r113, %p20; |
| ; CHECK-NEXT: mul.rn.f32 %r115, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r116, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p21, %r116, 8388608; |
| ; CHECK-NEXT: selp.b32 %r117, %r115, %r1, %p21; |
| ; CHECK-NEXT: and.b32 %r118, %r117, -2139095041; |
| ; CHECK-NEXT: or.b32 %r119, %r118, 1056964608; |
| ; CHECK-NEXT: add.s32 %r120, %r116, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p22, %r120, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r121, %r1, %r119, %p22; |
| ; CHECK-NEXT: and.b32 %r122, %r121, 8388607; |
| ; CHECK-NEXT: or.b32 %r123, %r122, 8388608; |
| ; CHECK-NEXT: and.b32 %r124, %r115, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r125, %r124, %r116, %p21; |
| ; CHECK-NEXT: shr.u32 %r126, %r125, 23; |
| ; CHECK-NEXT: selp.b32 %r127, -25, 0, %p21; |
| ; CHECK-NEXT: add.s32 %r128, %r126, %r127; |
| ; CHECK-NEXT: add.s32 %r129, %r128, -126; |
| ; CHECK-NEXT: selp.b32 %r130, 0, %r129, %p22; |
| ; CHECK-NEXT: sub.s32 %r131, 15, %r130; |
| ; CHECK-NEXT: min.u32 %r132, %r131, 31; |
| ; CHECK-NEXT: shr.u32 %r133, %r123, %r132; |
| ; CHECK-NEXT: and.b32 %r134, %r133, 1; |
| ; CHECK-NEXT: max.u32 %r135, %r132, 1; |
| ; CHECK-NEXT: add.s32 %r136, %r135, -1; |
| ; CHECK-NEXT: shl.b32 %r137, %r26, %r136; |
| ; CHECK-NEXT: add.s32 %r138, %r137, -1; |
| ; CHECK-NEXT: and.b32 %r139, %r123, %r138; |
| ; CHECK-NEXT: setp.ne.b32 %p23, %r139, 0; |
| ; CHECK-NEXT: selp.b32 %r140, 1, 0, %p23; |
| ; CHECK-NEXT: or.b32 %r141, %r140, %r134; |
| ; CHECK-NEXT: shr.u32 %r142, %r123, %r136; |
| ; CHECK-NEXT: and.b32 %r143, %r142, %r141; |
| ; CHECK-NEXT: setp.ne.b32 %p24, %r132, 0; |
| ; CHECK-NEXT: selp.b32 %r144, %r143, 0, %p24; |
| ; CHECK-NEXT: add.s32 %r145, %r133, %r144; |
| ; CHECK-NEXT: setp.gt.s32 %p25, %r145, 7; |
| ; CHECK-NEXT: selp.b32 %r146, 0, %r145, %p25; |
| ; CHECK-NEXT: selp.b32 %r147, 8, 0, %p25; |
| ; CHECK-NEXT: shr.u32 %r148, %r1, 24; |
| ; CHECK-NEXT: and.b32 %r149, %r148, 128; |
| ; CHECK-NEXT: or.b32 %r150, %r149, %r147; |
| ; CHECK-NEXT: or.b32 %r151, %r150, %r146; |
| ; CHECK-NEXT: bfe.u32 %r152, %r122, 20, 1; |
| ; CHECK-NEXT: and.b32 %r153, %r121, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p26, %r153, 0; |
| ; CHECK-NEXT: selp.b32 %r154, 1, 0, %p26; |
| ; CHECK-NEXT: or.b32 %r155, %r154, %r152; |
| ; CHECK-NEXT: shr.u32 %r156, %r121, 19; |
| ; CHECK-NEXT: and.b32 %r157, %r156, %r155; |
| ; CHECK-NEXT: bfe.u32 %r158, %r121, 20, 3; |
| ; CHECK-NEXT: add.s32 %r159, %r158, %r157; |
| ; CHECK-NEXT: setp.gt.s32 %p27, %r159, 7; |
| ; CHECK-NEXT: selp.b32 %r160, 0, %r159, %p27; |
| ; CHECK-NEXT: selp.b32 %r161, 1, 0, %p27; |
| ; CHECK-NEXT: add.s32 %r162, %r130, %r161; |
| ; CHECK-NEXT: add.s32 %r163, %r162, 6; |
| ; CHECK-NEXT: shl.b32 %r164, %r163, 3; |
| ; CHECK-NEXT: or.b32 %r165, %r149, %r164; |
| ; CHECK-NEXT: or.b32 %r166, %r165, %r160; |
| ; CHECK-NEXT: setp.lt.s32 %p28, %r163, 1; |
| ; CHECK-NEXT: selp.b32 %r167, %r151, %r166, %p28; |
| ; CHECK-NEXT: setp.eq.f32 %p29, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r168, %r149, %r167, %p29; |
| ; CHECK-NEXT: setp.nan.f32 %p30, %r1, %r1; |
| ; CHECK-NEXT: selp.b32 %r169, 127, %r168, %p30; |
| ; CHECK-NEXT: prmt.b32 %r170, %r169, %r114, 0x3340U; |
| ; CHECK-NEXT: prmt.b32 %r171, %r59, %r172, 0x3340U; |
| ; CHECK-NEXT: prmt.b32 %r173, %r170, %r171, 0x5410U; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r173; |
| ; CHECK-NEXT: ret; |
| %r = call <3 x i8> @llvm.convert.to.arbitrary.fp.v3i8.v3f32(<3 x float> %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret <3 x i8> %r |
| } |
| |
| ; <4 x float> -> <4 x i8> Float8E4M3FN |
| define <4 x i8> @to_f8e4m3fn_v4f32(<4 x float> %x) { |
| ; CHECK-LABEL: to_f8e4m3fn_v4f32( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<41>; |
| ; CHECK-NEXT: .reg .b32 %r<229>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.v4.b32 {%r1, %r2, %r3, %r4}, [to_f8e4m3fn_v4f32_param_0]; |
| ; CHECK-NEXT: mul.rn.f32 %r5, %r4, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r6, %r4, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r6, 8388608; |
| ; CHECK-NEXT: selp.b32 %r7, %r5, %r4, %p1; |
| ; CHECK-NEXT: and.b32 %r8, %r7, -2139095041; |
| ; CHECK-NEXT: or.b32 %r9, %r8, 1056964608; |
| ; CHECK-NEXT: add.s32 %r10, %r6, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r10, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r11, %r4, %r9, %p2; |
| ; CHECK-NEXT: and.b32 %r12, %r11, 8388607; |
| ; CHECK-NEXT: or.b32 %r13, %r12, 8388608; |
| ; CHECK-NEXT: and.b32 %r14, %r5, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r15, %r14, %r6, %p1; |
| ; CHECK-NEXT: shr.u32 %r16, %r15, 23; |
| ; CHECK-NEXT: selp.b32 %r17, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r18, %r16, %r17; |
| ; CHECK-NEXT: add.s32 %r19, %r18, -126; |
| ; CHECK-NEXT: selp.b32 %r20, 0, %r19, %p2; |
| ; CHECK-NEXT: sub.s32 %r21, 15, %r20; |
| ; CHECK-NEXT: min.u32 %r22, %r21, 31; |
| ; CHECK-NEXT: shr.u32 %r23, %r13, %r22; |
| ; CHECK-NEXT: and.b32 %r24, %r23, 1; |
| ; CHECK-NEXT: max.u32 %r25, %r22, 1; |
| ; CHECK-NEXT: add.s32 %r26, %r25, -1; |
| ; CHECK-NEXT: mov.b32 %r27, 1; |
| ; CHECK-NEXT: shl.b32 %r28, %r27, %r26; |
| ; CHECK-NEXT: add.s32 %r29, %r28, -1; |
| ; CHECK-NEXT: and.b32 %r30, %r13, %r29; |
| ; CHECK-NEXT: setp.ne.b32 %p3, %r30, 0; |
| ; CHECK-NEXT: selp.b32 %r31, 1, 0, %p3; |
| ; CHECK-NEXT: or.b32 %r32, %r31, %r24; |
| ; CHECK-NEXT: shr.u32 %r33, %r13, %r26; |
| ; CHECK-NEXT: and.b32 %r34, %r33, %r32; |
| ; CHECK-NEXT: setp.ne.b32 %p4, %r22, 0; |
| ; CHECK-NEXT: selp.b32 %r35, %r34, 0, %p4; |
| ; CHECK-NEXT: add.s32 %r36, %r23, %r35; |
| ; CHECK-NEXT: setp.gt.s32 %p5, %r36, 7; |
| ; CHECK-NEXT: selp.b32 %r37, 0, %r36, %p5; |
| ; CHECK-NEXT: selp.b32 %r38, 8, 0, %p5; |
| ; CHECK-NEXT: shr.u32 %r39, %r4, 24; |
| ; CHECK-NEXT: and.b32 %r40, %r39, 128; |
| ; CHECK-NEXT: or.b32 %r41, %r40, %r38; |
| ; CHECK-NEXT: or.b32 %r42, %r41, %r37; |
| ; CHECK-NEXT: bfe.u32 %r43, %r12, 20, 1; |
| ; CHECK-NEXT: and.b32 %r44, %r11, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p6, %r44, 0; |
| ; CHECK-NEXT: selp.b32 %r45, 1, 0, %p6; |
| ; CHECK-NEXT: or.b32 %r46, %r45, %r43; |
| ; CHECK-NEXT: shr.u32 %r47, %r11, 19; |
| ; CHECK-NEXT: and.b32 %r48, %r47, %r46; |
| ; CHECK-NEXT: bfe.u32 %r49, %r11, 20, 3; |
| ; CHECK-NEXT: add.s32 %r50, %r49, %r48; |
| ; CHECK-NEXT: setp.gt.s32 %p7, %r50, 7; |
| ; CHECK-NEXT: selp.b32 %r51, 0, %r50, %p7; |
| ; CHECK-NEXT: selp.b32 %r52, 1, 0, %p7; |
| ; CHECK-NEXT: add.s32 %r53, %r20, %r52; |
| ; CHECK-NEXT: add.s32 %r54, %r53, 6; |
| ; CHECK-NEXT: shl.b32 %r55, %r54, 3; |
| ; CHECK-NEXT: or.b32 %r56, %r40, %r55; |
| ; CHECK-NEXT: or.b32 %r57, %r56, %r51; |
| ; CHECK-NEXT: setp.lt.s32 %p8, %r54, 1; |
| ; CHECK-NEXT: selp.b32 %r58, %r42, %r57, %p8; |
| ; CHECK-NEXT: setp.eq.f32 %p9, %r4, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r59, %r40, %r58, %p9; |
| ; CHECK-NEXT: setp.nan.f32 %p10, %r4, %r4; |
| ; CHECK-NEXT: selp.b32 %r60, 127, %r59, %p10; |
| ; CHECK-NEXT: mul.rn.f32 %r61, %r3, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r62, %r3, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p11, %r62, 8388608; |
| ; CHECK-NEXT: selp.b32 %r63, %r61, %r3, %p11; |
| ; CHECK-NEXT: and.b32 %r64, %r63, -2139095041; |
| ; CHECK-NEXT: or.b32 %r65, %r64, 1056964608; |
| ; CHECK-NEXT: add.s32 %r66, %r62, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p12, %r66, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r67, %r3, %r65, %p12; |
| ; CHECK-NEXT: and.b32 %r68, %r67, 8388607; |
| ; CHECK-NEXT: or.b32 %r69, %r68, 8388608; |
| ; CHECK-NEXT: and.b32 %r70, %r61, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r71, %r70, %r62, %p11; |
| ; CHECK-NEXT: shr.u32 %r72, %r71, 23; |
| ; CHECK-NEXT: selp.b32 %r73, -25, 0, %p11; |
| ; CHECK-NEXT: add.s32 %r74, %r72, %r73; |
| ; CHECK-NEXT: add.s32 %r75, %r74, -126; |
| ; CHECK-NEXT: selp.b32 %r76, 0, %r75, %p12; |
| ; CHECK-NEXT: sub.s32 %r77, 15, %r76; |
| ; CHECK-NEXT: min.u32 %r78, %r77, 31; |
| ; CHECK-NEXT: shr.u32 %r79, %r69, %r78; |
| ; CHECK-NEXT: and.b32 %r80, %r79, 1; |
| ; CHECK-NEXT: max.u32 %r81, %r78, 1; |
| ; CHECK-NEXT: add.s32 %r82, %r81, -1; |
| ; CHECK-NEXT: shl.b32 %r83, %r27, %r82; |
| ; CHECK-NEXT: add.s32 %r84, %r83, -1; |
| ; CHECK-NEXT: and.b32 %r85, %r69, %r84; |
| ; CHECK-NEXT: setp.ne.b32 %p13, %r85, 0; |
| ; CHECK-NEXT: selp.b32 %r86, 1, 0, %p13; |
| ; CHECK-NEXT: or.b32 %r87, %r86, %r80; |
| ; CHECK-NEXT: shr.u32 %r88, %r69, %r82; |
| ; CHECK-NEXT: and.b32 %r89, %r88, %r87; |
| ; CHECK-NEXT: setp.ne.b32 %p14, %r78, 0; |
| ; CHECK-NEXT: selp.b32 %r90, %r89, 0, %p14; |
| ; CHECK-NEXT: add.s32 %r91, %r79, %r90; |
| ; CHECK-NEXT: setp.gt.s32 %p15, %r91, 7; |
| ; CHECK-NEXT: selp.b32 %r92, 0, %r91, %p15; |
| ; CHECK-NEXT: selp.b32 %r93, 8, 0, %p15; |
| ; CHECK-NEXT: shr.u32 %r94, %r3, 24; |
| ; CHECK-NEXT: and.b32 %r95, %r94, 128; |
| ; CHECK-NEXT: or.b32 %r96, %r95, %r93; |
| ; CHECK-NEXT: or.b32 %r97, %r96, %r92; |
| ; CHECK-NEXT: bfe.u32 %r98, %r68, 20, 1; |
| ; CHECK-NEXT: and.b32 %r99, %r67, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p16, %r99, 0; |
| ; CHECK-NEXT: selp.b32 %r100, 1, 0, %p16; |
| ; CHECK-NEXT: or.b32 %r101, %r100, %r98; |
| ; CHECK-NEXT: shr.u32 %r102, %r67, 19; |
| ; CHECK-NEXT: and.b32 %r103, %r102, %r101; |
| ; CHECK-NEXT: bfe.u32 %r104, %r67, 20, 3; |
| ; CHECK-NEXT: add.s32 %r105, %r104, %r103; |
| ; CHECK-NEXT: setp.gt.s32 %p17, %r105, 7; |
| ; CHECK-NEXT: selp.b32 %r106, 0, %r105, %p17; |
| ; CHECK-NEXT: selp.b32 %r107, 1, 0, %p17; |
| ; CHECK-NEXT: add.s32 %r108, %r76, %r107; |
| ; CHECK-NEXT: add.s32 %r109, %r108, 6; |
| ; CHECK-NEXT: shl.b32 %r110, %r109, 3; |
| ; CHECK-NEXT: or.b32 %r111, %r95, %r110; |
| ; CHECK-NEXT: or.b32 %r112, %r111, %r106; |
| ; CHECK-NEXT: setp.lt.s32 %p18, %r109, 1; |
| ; CHECK-NEXT: selp.b32 %r113, %r97, %r112, %p18; |
| ; CHECK-NEXT: setp.eq.f32 %p19, %r3, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r114, %r95, %r113, %p19; |
| ; CHECK-NEXT: setp.nan.f32 %p20, %r3, %r3; |
| ; CHECK-NEXT: selp.b32 %r115, 127, %r114, %p20; |
| ; CHECK-NEXT: prmt.b32 %r116, %r115, %r60, 0x3340U; |
| ; CHECK-NEXT: mul.rn.f32 %r117, %r2, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r118, %r2, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p21, %r118, 8388608; |
| ; CHECK-NEXT: selp.b32 %r119, %r117, %r2, %p21; |
| ; CHECK-NEXT: and.b32 %r120, %r119, -2139095041; |
| ; CHECK-NEXT: or.b32 %r121, %r120, 1056964608; |
| ; CHECK-NEXT: add.s32 %r122, %r118, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p22, %r122, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r123, %r2, %r121, %p22; |
| ; CHECK-NEXT: and.b32 %r124, %r123, 8388607; |
| ; CHECK-NEXT: or.b32 %r125, %r124, 8388608; |
| ; CHECK-NEXT: and.b32 %r126, %r117, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r127, %r126, %r118, %p21; |
| ; CHECK-NEXT: shr.u32 %r128, %r127, 23; |
| ; CHECK-NEXT: selp.b32 %r129, -25, 0, %p21; |
| ; CHECK-NEXT: add.s32 %r130, %r128, %r129; |
| ; CHECK-NEXT: add.s32 %r131, %r130, -126; |
| ; CHECK-NEXT: selp.b32 %r132, 0, %r131, %p22; |
| ; CHECK-NEXT: sub.s32 %r133, 15, %r132; |
| ; CHECK-NEXT: min.u32 %r134, %r133, 31; |
| ; CHECK-NEXT: shr.u32 %r135, %r125, %r134; |
| ; CHECK-NEXT: and.b32 %r136, %r135, 1; |
| ; CHECK-NEXT: max.u32 %r137, %r134, 1; |
| ; CHECK-NEXT: add.s32 %r138, %r137, -1; |
| ; CHECK-NEXT: shl.b32 %r139, %r27, %r138; |
| ; CHECK-NEXT: add.s32 %r140, %r139, -1; |
| ; CHECK-NEXT: and.b32 %r141, %r125, %r140; |
| ; CHECK-NEXT: setp.ne.b32 %p23, %r141, 0; |
| ; CHECK-NEXT: selp.b32 %r142, 1, 0, %p23; |
| ; CHECK-NEXT: or.b32 %r143, %r142, %r136; |
| ; CHECK-NEXT: shr.u32 %r144, %r125, %r138; |
| ; CHECK-NEXT: and.b32 %r145, %r144, %r143; |
| ; CHECK-NEXT: setp.ne.b32 %p24, %r134, 0; |
| ; CHECK-NEXT: selp.b32 %r146, %r145, 0, %p24; |
| ; CHECK-NEXT: add.s32 %r147, %r135, %r146; |
| ; CHECK-NEXT: setp.gt.s32 %p25, %r147, 7; |
| ; CHECK-NEXT: selp.b32 %r148, 0, %r147, %p25; |
| ; CHECK-NEXT: selp.b32 %r149, 8, 0, %p25; |
| ; CHECK-NEXT: shr.u32 %r150, %r2, 24; |
| ; CHECK-NEXT: and.b32 %r151, %r150, 128; |
| ; CHECK-NEXT: or.b32 %r152, %r151, %r149; |
| ; CHECK-NEXT: or.b32 %r153, %r152, %r148; |
| ; CHECK-NEXT: bfe.u32 %r154, %r124, 20, 1; |
| ; CHECK-NEXT: and.b32 %r155, %r123, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p26, %r155, 0; |
| ; CHECK-NEXT: selp.b32 %r156, 1, 0, %p26; |
| ; CHECK-NEXT: or.b32 %r157, %r156, %r154; |
| ; CHECK-NEXT: shr.u32 %r158, %r123, 19; |
| ; CHECK-NEXT: and.b32 %r159, %r158, %r157; |
| ; CHECK-NEXT: bfe.u32 %r160, %r123, 20, 3; |
| ; CHECK-NEXT: add.s32 %r161, %r160, %r159; |
| ; CHECK-NEXT: setp.gt.s32 %p27, %r161, 7; |
| ; CHECK-NEXT: selp.b32 %r162, 0, %r161, %p27; |
| ; CHECK-NEXT: selp.b32 %r163, 1, 0, %p27; |
| ; CHECK-NEXT: add.s32 %r164, %r132, %r163; |
| ; CHECK-NEXT: add.s32 %r165, %r164, 6; |
| ; CHECK-NEXT: shl.b32 %r166, %r165, 3; |
| ; CHECK-NEXT: or.b32 %r167, %r151, %r166; |
| ; CHECK-NEXT: or.b32 %r168, %r167, %r162; |
| ; CHECK-NEXT: setp.lt.s32 %p28, %r165, 1; |
| ; CHECK-NEXT: selp.b32 %r169, %r153, %r168, %p28; |
| ; CHECK-NEXT: setp.eq.f32 %p29, %r2, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r170, %r151, %r169, %p29; |
| ; CHECK-NEXT: setp.nan.f32 %p30, %r2, %r2; |
| ; CHECK-NEXT: selp.b32 %r171, 127, %r170, %p30; |
| ; CHECK-NEXT: mul.rn.f32 %r172, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r173, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p31, %r173, 8388608; |
| ; CHECK-NEXT: selp.b32 %r174, %r172, %r1, %p31; |
| ; CHECK-NEXT: and.b32 %r175, %r174, -2139095041; |
| ; CHECK-NEXT: or.b32 %r176, %r175, 1056964608; |
| ; CHECK-NEXT: add.s32 %r177, %r173, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p32, %r177, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r178, %r1, %r176, %p32; |
| ; CHECK-NEXT: and.b32 %r179, %r178, 8388607; |
| ; CHECK-NEXT: or.b32 %r180, %r179, 8388608; |
| ; CHECK-NEXT: and.b32 %r181, %r172, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r182, %r181, %r173, %p31; |
| ; CHECK-NEXT: shr.u32 %r183, %r182, 23; |
| ; CHECK-NEXT: selp.b32 %r184, -25, 0, %p31; |
| ; CHECK-NEXT: add.s32 %r185, %r183, %r184; |
| ; CHECK-NEXT: add.s32 %r186, %r185, -126; |
| ; CHECK-NEXT: selp.b32 %r187, 0, %r186, %p32; |
| ; CHECK-NEXT: sub.s32 %r188, 15, %r187; |
| ; CHECK-NEXT: min.u32 %r189, %r188, 31; |
| ; CHECK-NEXT: shr.u32 %r190, %r180, %r189; |
| ; CHECK-NEXT: and.b32 %r191, %r190, 1; |
| ; CHECK-NEXT: max.u32 %r192, %r189, 1; |
| ; CHECK-NEXT: add.s32 %r193, %r192, -1; |
| ; CHECK-NEXT: shl.b32 %r194, %r27, %r193; |
| ; CHECK-NEXT: add.s32 %r195, %r194, -1; |
| ; CHECK-NEXT: and.b32 %r196, %r180, %r195; |
| ; CHECK-NEXT: setp.ne.b32 %p33, %r196, 0; |
| ; CHECK-NEXT: selp.b32 %r197, 1, 0, %p33; |
| ; CHECK-NEXT: or.b32 %r198, %r197, %r191; |
| ; CHECK-NEXT: shr.u32 %r199, %r180, %r193; |
| ; CHECK-NEXT: and.b32 %r200, %r199, %r198; |
| ; CHECK-NEXT: setp.ne.b32 %p34, %r189, 0; |
| ; CHECK-NEXT: selp.b32 %r201, %r200, 0, %p34; |
| ; CHECK-NEXT: add.s32 %r202, %r190, %r201; |
| ; CHECK-NEXT: setp.gt.s32 %p35, %r202, 7; |
| ; CHECK-NEXT: selp.b32 %r203, 0, %r202, %p35; |
| ; CHECK-NEXT: selp.b32 %r204, 8, 0, %p35; |
| ; CHECK-NEXT: shr.u32 %r205, %r1, 24; |
| ; CHECK-NEXT: and.b32 %r206, %r205, 128; |
| ; CHECK-NEXT: or.b32 %r207, %r206, %r204; |
| ; CHECK-NEXT: or.b32 %r208, %r207, %r203; |
| ; CHECK-NEXT: bfe.u32 %r209, %r179, 20, 1; |
| ; CHECK-NEXT: and.b32 %r210, %r178, 524287; |
| ; CHECK-NEXT: setp.ne.b32 %p36, %r210, 0; |
| ; CHECK-NEXT: selp.b32 %r211, 1, 0, %p36; |
| ; CHECK-NEXT: or.b32 %r212, %r211, %r209; |
| ; CHECK-NEXT: shr.u32 %r213, %r178, 19; |
| ; CHECK-NEXT: and.b32 %r214, %r213, %r212; |
| ; CHECK-NEXT: bfe.u32 %r215, %r178, 20, 3; |
| ; CHECK-NEXT: add.s32 %r216, %r215, %r214; |
| ; CHECK-NEXT: setp.gt.s32 %p37, %r216, 7; |
| ; CHECK-NEXT: selp.b32 %r217, 0, %r216, %p37; |
| ; CHECK-NEXT: selp.b32 %r218, 1, 0, %p37; |
| ; CHECK-NEXT: add.s32 %r219, %r187, %r218; |
| ; CHECK-NEXT: add.s32 %r220, %r219, 6; |
| ; CHECK-NEXT: shl.b32 %r221, %r220, 3; |
| ; CHECK-NEXT: or.b32 %r222, %r206, %r221; |
| ; CHECK-NEXT: or.b32 %r223, %r222, %r217; |
| ; CHECK-NEXT: setp.lt.s32 %p38, %r220, 1; |
| ; CHECK-NEXT: selp.b32 %r224, %r208, %r223, %p38; |
| ; CHECK-NEXT: setp.eq.f32 %p39, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r225, %r206, %r224, %p39; |
| ; CHECK-NEXT: setp.nan.f32 %p40, %r1, %r1; |
| ; CHECK-NEXT: selp.b32 %r226, 127, %r225, %p40; |
| ; CHECK-NEXT: prmt.b32 %r227, %r226, %r171, 0x3340U; |
| ; CHECK-NEXT: prmt.b32 %r228, %r227, %r116, 0x5410U; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r228; |
| ; CHECK-NEXT: ret; |
| %r = call <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(<4 x float> %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret <4 x i8> %r |
| } |
| |
| ; <4 x float> -> <4 x i8> Float8E5M2 |
| define <4 x i8> @to_f8e5m2_v4f32(<4 x float> %x) { |
| ; CHECK-LABEL: to_f8e5m2_v4f32( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<57>; |
| ; CHECK-NEXT: .reg .b32 %r<253>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.v4.b32 {%r1, %r2, %r3, %r4}, [to_f8e5m2_v4f32_param_0]; |
| ; CHECK-NEXT: mul.rn.f32 %r5, %r4, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r6, %r4, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p1, %r6, 8388608; |
| ; CHECK-NEXT: selp.b32 %r7, %r5, %r4, %p1; |
| ; CHECK-NEXT: and.b32 %r8, %r7, -2139095041; |
| ; CHECK-NEXT: or.b32 %r9, %r8, 1056964608; |
| ; CHECK-NEXT: add.s32 %r10, %r6, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p2, %r10, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r11, %r4, %r9, %p2; |
| ; CHECK-NEXT: and.b32 %r12, %r11, 8388607; |
| ; CHECK-NEXT: or.b32 %r13, %r12, 8388608; |
| ; CHECK-NEXT: and.b32 %r14, %r5, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r15, %r14, %r6, %p1; |
| ; CHECK-NEXT: shr.u32 %r16, %r15, 23; |
| ; CHECK-NEXT: selp.b32 %r17, -25, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r18, %r16, %r17; |
| ; CHECK-NEXT: add.s32 %r19, %r18, -126; |
| ; CHECK-NEXT: selp.b32 %r20, 0, %r19, %p2; |
| ; CHECK-NEXT: sub.s32 %r21, 8, %r20; |
| ; CHECK-NEXT: min.u32 %r22, %r21, 31; |
| ; CHECK-NEXT: shr.u32 %r23, %r13, %r22; |
| ; CHECK-NEXT: and.b32 %r24, %r23, 1; |
| ; CHECK-NEXT: max.u32 %r25, %r22, 1; |
| ; CHECK-NEXT: add.s32 %r26, %r25, -1; |
| ; CHECK-NEXT: mov.b32 %r27, 1; |
| ; CHECK-NEXT: shl.b32 %r28, %r27, %r26; |
| ; CHECK-NEXT: add.s32 %r29, %r28, -1; |
| ; CHECK-NEXT: and.b32 %r30, %r13, %r29; |
| ; CHECK-NEXT: setp.ne.b32 %p3, %r30, 0; |
| ; CHECK-NEXT: selp.b32 %r31, 1, 0, %p3; |
| ; CHECK-NEXT: or.b32 %r32, %r31, %r24; |
| ; CHECK-NEXT: shr.u32 %r33, %r13, %r26; |
| ; CHECK-NEXT: and.b32 %r34, %r33, %r32; |
| ; CHECK-NEXT: setp.ne.b32 %p4, %r22, 0; |
| ; CHECK-NEXT: selp.b32 %r35, %r34, 0, %p4; |
| ; CHECK-NEXT: add.s32 %r36, %r23, %r35; |
| ; CHECK-NEXT: setp.gt.s32 %p5, %r36, 3; |
| ; CHECK-NEXT: selp.b32 %r37, 0, %r36, %p5; |
| ; CHECK-NEXT: selp.b32 %r38, 4, 0, %p5; |
| ; CHECK-NEXT: shr.u32 %r39, %r4, 24; |
| ; CHECK-NEXT: and.b32 %r40, %r39, 128; |
| ; CHECK-NEXT: or.b32 %r41, %r40, %r38; |
| ; CHECK-NEXT: or.b32 %r42, %r41, %r37; |
| ; CHECK-NEXT: bfe.u32 %r43, %r12, 21, 1; |
| ; CHECK-NEXT: and.b32 %r44, %r11, 1048575; |
| ; CHECK-NEXT: setp.ne.b32 %p6, %r44, 0; |
| ; CHECK-NEXT: selp.b32 %r45, 1, 0, %p6; |
| ; CHECK-NEXT: or.b32 %r46, %r45, %r43; |
| ; CHECK-NEXT: shr.u32 %r47, %r11, 20; |
| ; CHECK-NEXT: and.b32 %r48, %r47, %r46; |
| ; CHECK-NEXT: bfe.u32 %r49, %r11, 21, 2; |
| ; CHECK-NEXT: add.s32 %r50, %r49, %r48; |
| ; CHECK-NEXT: setp.gt.s32 %p7, %r50, 3; |
| ; CHECK-NEXT: selp.b32 %r51, 0, %r50, %p7; |
| ; CHECK-NEXT: selp.b32 %r52, 1, 0, %p7; |
| ; CHECK-NEXT: add.s32 %r53, %r20, %r52; |
| ; CHECK-NEXT: add.s32 %r54, %r53, 14; |
| ; CHECK-NEXT: shl.b32 %r55, %r54, 2; |
| ; CHECK-NEXT: or.b32 %r56, %r40, %r55; |
| ; CHECK-NEXT: or.b32 %r57, %r56, %r51; |
| ; CHECK-NEXT: setp.lt.s32 %p8, %r54, 1; |
| ; CHECK-NEXT: selp.b32 %r58, %r42, %r57, %p8; |
| ; CHECK-NEXT: setp.gt.s32 %p9, %r51, 3; |
| ; CHECK-NEXT: or.b32 %r59, %r40, 124; |
| ; CHECK-NEXT: selp.b32 %r60, %r59, %r58, %p9; |
| ; CHECK-NEXT: setp.eq.b32 %p10, %r54, 30; |
| ; CHECK-NEXT: selp.b32 %r61, %r60, %r58, %p10; |
| ; CHECK-NEXT: setp.gt.s32 %p11, %r54, 30; |
| ; CHECK-NEXT: selp.b32 %r62, %r59, %r61, %p11; |
| ; CHECK-NEXT: setp.eq.f32 %p12, %r4, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r63, %r40, %r62, %p12; |
| ; CHECK-NEXT: abs.f32 %r64, %r4; |
| ; CHECK-NEXT: setp.eq.f32 %p13, %r64, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r65, %r59, %r63, %p13; |
| ; CHECK-NEXT: setp.nan.f32 %p14, %r4, %r4; |
| ; CHECK-NEXT: selp.b32 %r66, 126, %r65, %p14; |
| ; CHECK-NEXT: mul.rn.f32 %r67, %r3, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r68, %r3, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p15, %r68, 8388608; |
| ; CHECK-NEXT: selp.b32 %r69, %r67, %r3, %p15; |
| ; CHECK-NEXT: and.b32 %r70, %r69, -2139095041; |
| ; CHECK-NEXT: or.b32 %r71, %r70, 1056964608; |
| ; CHECK-NEXT: add.s32 %r72, %r68, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p16, %r72, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r73, %r3, %r71, %p16; |
| ; CHECK-NEXT: and.b32 %r74, %r73, 8388607; |
| ; CHECK-NEXT: or.b32 %r75, %r74, 8388608; |
| ; CHECK-NEXT: and.b32 %r76, %r67, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r77, %r76, %r68, %p15; |
| ; CHECK-NEXT: shr.u32 %r78, %r77, 23; |
| ; CHECK-NEXT: selp.b32 %r79, -25, 0, %p15; |
| ; CHECK-NEXT: add.s32 %r80, %r78, %r79; |
| ; CHECK-NEXT: add.s32 %r81, %r80, -126; |
| ; CHECK-NEXT: selp.b32 %r82, 0, %r81, %p16; |
| ; CHECK-NEXT: sub.s32 %r83, 8, %r82; |
| ; CHECK-NEXT: min.u32 %r84, %r83, 31; |
| ; CHECK-NEXT: shr.u32 %r85, %r75, %r84; |
| ; CHECK-NEXT: and.b32 %r86, %r85, 1; |
| ; CHECK-NEXT: max.u32 %r87, %r84, 1; |
| ; CHECK-NEXT: add.s32 %r88, %r87, -1; |
| ; CHECK-NEXT: shl.b32 %r89, %r27, %r88; |
| ; CHECK-NEXT: add.s32 %r90, %r89, -1; |
| ; CHECK-NEXT: and.b32 %r91, %r75, %r90; |
| ; CHECK-NEXT: setp.ne.b32 %p17, %r91, 0; |
| ; CHECK-NEXT: selp.b32 %r92, 1, 0, %p17; |
| ; CHECK-NEXT: or.b32 %r93, %r92, %r86; |
| ; CHECK-NEXT: shr.u32 %r94, %r75, %r88; |
| ; CHECK-NEXT: and.b32 %r95, %r94, %r93; |
| ; CHECK-NEXT: setp.ne.b32 %p18, %r84, 0; |
| ; CHECK-NEXT: selp.b32 %r96, %r95, 0, %p18; |
| ; CHECK-NEXT: add.s32 %r97, %r85, %r96; |
| ; CHECK-NEXT: setp.gt.s32 %p19, %r97, 3; |
| ; CHECK-NEXT: selp.b32 %r98, 0, %r97, %p19; |
| ; CHECK-NEXT: selp.b32 %r99, 4, 0, %p19; |
| ; CHECK-NEXT: shr.u32 %r100, %r3, 24; |
| ; CHECK-NEXT: and.b32 %r101, %r100, 128; |
| ; CHECK-NEXT: or.b32 %r102, %r101, %r99; |
| ; CHECK-NEXT: or.b32 %r103, %r102, %r98; |
| ; CHECK-NEXT: bfe.u32 %r104, %r74, 21, 1; |
| ; CHECK-NEXT: and.b32 %r105, %r73, 1048575; |
| ; CHECK-NEXT: setp.ne.b32 %p20, %r105, 0; |
| ; CHECK-NEXT: selp.b32 %r106, 1, 0, %p20; |
| ; CHECK-NEXT: or.b32 %r107, %r106, %r104; |
| ; CHECK-NEXT: shr.u32 %r108, %r73, 20; |
| ; CHECK-NEXT: and.b32 %r109, %r108, %r107; |
| ; CHECK-NEXT: bfe.u32 %r110, %r73, 21, 2; |
| ; CHECK-NEXT: add.s32 %r111, %r110, %r109; |
| ; CHECK-NEXT: setp.gt.s32 %p21, %r111, 3; |
| ; CHECK-NEXT: selp.b32 %r112, 0, %r111, %p21; |
| ; CHECK-NEXT: selp.b32 %r113, 1, 0, %p21; |
| ; CHECK-NEXT: add.s32 %r114, %r82, %r113; |
| ; CHECK-NEXT: add.s32 %r115, %r114, 14; |
| ; CHECK-NEXT: shl.b32 %r116, %r115, 2; |
| ; CHECK-NEXT: or.b32 %r117, %r101, %r116; |
| ; CHECK-NEXT: or.b32 %r118, %r117, %r112; |
| ; CHECK-NEXT: setp.lt.s32 %p22, %r115, 1; |
| ; CHECK-NEXT: selp.b32 %r119, %r103, %r118, %p22; |
| ; CHECK-NEXT: setp.gt.s32 %p23, %r112, 3; |
| ; CHECK-NEXT: or.b32 %r120, %r101, 124; |
| ; CHECK-NEXT: selp.b32 %r121, %r120, %r119, %p23; |
| ; CHECK-NEXT: setp.eq.b32 %p24, %r115, 30; |
| ; CHECK-NEXT: selp.b32 %r122, %r121, %r119, %p24; |
| ; CHECK-NEXT: setp.gt.s32 %p25, %r115, 30; |
| ; CHECK-NEXT: selp.b32 %r123, %r120, %r122, %p25; |
| ; CHECK-NEXT: setp.eq.f32 %p26, %r3, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r124, %r101, %r123, %p26; |
| ; CHECK-NEXT: abs.f32 %r125, %r3; |
| ; CHECK-NEXT: setp.eq.f32 %p27, %r125, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r126, %r120, %r124, %p27; |
| ; CHECK-NEXT: setp.nan.f32 %p28, %r3, %r3; |
| ; CHECK-NEXT: selp.b32 %r127, 126, %r126, %p28; |
| ; CHECK-NEXT: prmt.b32 %r128, %r127, %r66, 0x3340U; |
| ; CHECK-NEXT: mul.rn.f32 %r129, %r2, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r130, %r2, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p29, %r130, 8388608; |
| ; CHECK-NEXT: selp.b32 %r131, %r129, %r2, %p29; |
| ; CHECK-NEXT: and.b32 %r132, %r131, -2139095041; |
| ; CHECK-NEXT: or.b32 %r133, %r132, 1056964608; |
| ; CHECK-NEXT: add.s32 %r134, %r130, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p30, %r134, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r135, %r2, %r133, %p30; |
| ; CHECK-NEXT: and.b32 %r136, %r135, 8388607; |
| ; CHECK-NEXT: or.b32 %r137, %r136, 8388608; |
| ; CHECK-NEXT: and.b32 %r138, %r129, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r139, %r138, %r130, %p29; |
| ; CHECK-NEXT: shr.u32 %r140, %r139, 23; |
| ; CHECK-NEXT: selp.b32 %r141, -25, 0, %p29; |
| ; CHECK-NEXT: add.s32 %r142, %r140, %r141; |
| ; CHECK-NEXT: add.s32 %r143, %r142, -126; |
| ; CHECK-NEXT: selp.b32 %r144, 0, %r143, %p30; |
| ; CHECK-NEXT: sub.s32 %r145, 8, %r144; |
| ; CHECK-NEXT: min.u32 %r146, %r145, 31; |
| ; CHECK-NEXT: shr.u32 %r147, %r137, %r146; |
| ; CHECK-NEXT: and.b32 %r148, %r147, 1; |
| ; CHECK-NEXT: max.u32 %r149, %r146, 1; |
| ; CHECK-NEXT: add.s32 %r150, %r149, -1; |
| ; CHECK-NEXT: shl.b32 %r151, %r27, %r150; |
| ; CHECK-NEXT: add.s32 %r152, %r151, -1; |
| ; CHECK-NEXT: and.b32 %r153, %r137, %r152; |
| ; CHECK-NEXT: setp.ne.b32 %p31, %r153, 0; |
| ; CHECK-NEXT: selp.b32 %r154, 1, 0, %p31; |
| ; CHECK-NEXT: or.b32 %r155, %r154, %r148; |
| ; CHECK-NEXT: shr.u32 %r156, %r137, %r150; |
| ; CHECK-NEXT: and.b32 %r157, %r156, %r155; |
| ; CHECK-NEXT: setp.ne.b32 %p32, %r146, 0; |
| ; CHECK-NEXT: selp.b32 %r158, %r157, 0, %p32; |
| ; CHECK-NEXT: add.s32 %r159, %r147, %r158; |
| ; CHECK-NEXT: setp.gt.s32 %p33, %r159, 3; |
| ; CHECK-NEXT: selp.b32 %r160, 0, %r159, %p33; |
| ; CHECK-NEXT: selp.b32 %r161, 4, 0, %p33; |
| ; CHECK-NEXT: shr.u32 %r162, %r2, 24; |
| ; CHECK-NEXT: and.b32 %r163, %r162, 128; |
| ; CHECK-NEXT: or.b32 %r164, %r163, %r161; |
| ; CHECK-NEXT: or.b32 %r165, %r164, %r160; |
| ; CHECK-NEXT: bfe.u32 %r166, %r136, 21, 1; |
| ; CHECK-NEXT: and.b32 %r167, %r135, 1048575; |
| ; CHECK-NEXT: setp.ne.b32 %p34, %r167, 0; |
| ; CHECK-NEXT: selp.b32 %r168, 1, 0, %p34; |
| ; CHECK-NEXT: or.b32 %r169, %r168, %r166; |
| ; CHECK-NEXT: shr.u32 %r170, %r135, 20; |
| ; CHECK-NEXT: and.b32 %r171, %r170, %r169; |
| ; CHECK-NEXT: bfe.u32 %r172, %r135, 21, 2; |
| ; CHECK-NEXT: add.s32 %r173, %r172, %r171; |
| ; CHECK-NEXT: setp.gt.s32 %p35, %r173, 3; |
| ; CHECK-NEXT: selp.b32 %r174, 0, %r173, %p35; |
| ; CHECK-NEXT: selp.b32 %r175, 1, 0, %p35; |
| ; CHECK-NEXT: add.s32 %r176, %r144, %r175; |
| ; CHECK-NEXT: add.s32 %r177, %r176, 14; |
| ; CHECK-NEXT: shl.b32 %r178, %r177, 2; |
| ; CHECK-NEXT: or.b32 %r179, %r163, %r178; |
| ; CHECK-NEXT: or.b32 %r180, %r179, %r174; |
| ; CHECK-NEXT: setp.lt.s32 %p36, %r177, 1; |
| ; CHECK-NEXT: selp.b32 %r181, %r165, %r180, %p36; |
| ; CHECK-NEXT: setp.gt.s32 %p37, %r174, 3; |
| ; CHECK-NEXT: or.b32 %r182, %r163, 124; |
| ; CHECK-NEXT: selp.b32 %r183, %r182, %r181, %p37; |
| ; CHECK-NEXT: setp.eq.b32 %p38, %r177, 30; |
| ; CHECK-NEXT: selp.b32 %r184, %r183, %r181, %p38; |
| ; CHECK-NEXT: setp.gt.s32 %p39, %r177, 30; |
| ; CHECK-NEXT: selp.b32 %r185, %r182, %r184, %p39; |
| ; CHECK-NEXT: setp.eq.f32 %p40, %r2, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r186, %r163, %r185, %p40; |
| ; CHECK-NEXT: abs.f32 %r187, %r2; |
| ; CHECK-NEXT: setp.eq.f32 %p41, %r187, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r188, %r182, %r186, %p41; |
| ; CHECK-NEXT: setp.nan.f32 %p42, %r2, %r2; |
| ; CHECK-NEXT: selp.b32 %r189, 126, %r188, %p42; |
| ; CHECK-NEXT: mul.rn.f32 %r190, %r1, 0f4C000000; |
| ; CHECK-NEXT: and.b32 %r191, %r1, 2147483647; |
| ; CHECK-NEXT: setp.lt.u32 %p43, %r191, 8388608; |
| ; CHECK-NEXT: selp.b32 %r192, %r190, %r1, %p43; |
| ; CHECK-NEXT: and.b32 %r193, %r192, -2139095041; |
| ; CHECK-NEXT: or.b32 %r194, %r193, 1056964608; |
| ; CHECK-NEXT: add.s32 %r195, %r191, -2139095040; |
| ; CHECK-NEXT: setp.lt.u32 %p44, %r195, -2139095039; |
| ; CHECK-NEXT: selp.f32 %r196, %r1, %r194, %p44; |
| ; CHECK-NEXT: and.b32 %r197, %r196, 8388607; |
| ; CHECK-NEXT: or.b32 %r198, %r197, 8388608; |
| ; CHECK-NEXT: and.b32 %r199, %r190, 2139095040; |
| ; CHECK-NEXT: selp.b32 %r200, %r199, %r191, %p43; |
| ; CHECK-NEXT: shr.u32 %r201, %r200, 23; |
| ; CHECK-NEXT: selp.b32 %r202, -25, 0, %p43; |
| ; CHECK-NEXT: add.s32 %r203, %r201, %r202; |
| ; CHECK-NEXT: add.s32 %r204, %r203, -126; |
| ; CHECK-NEXT: selp.b32 %r205, 0, %r204, %p44; |
| ; CHECK-NEXT: sub.s32 %r206, 8, %r205; |
| ; CHECK-NEXT: min.u32 %r207, %r206, 31; |
| ; CHECK-NEXT: shr.u32 %r208, %r198, %r207; |
| ; CHECK-NEXT: and.b32 %r209, %r208, 1; |
| ; CHECK-NEXT: max.u32 %r210, %r207, 1; |
| ; CHECK-NEXT: add.s32 %r211, %r210, -1; |
| ; CHECK-NEXT: shl.b32 %r212, %r27, %r211; |
| ; CHECK-NEXT: add.s32 %r213, %r212, -1; |
| ; CHECK-NEXT: and.b32 %r214, %r198, %r213; |
| ; CHECK-NEXT: setp.ne.b32 %p45, %r214, 0; |
| ; CHECK-NEXT: selp.b32 %r215, 1, 0, %p45; |
| ; CHECK-NEXT: or.b32 %r216, %r215, %r209; |
| ; CHECK-NEXT: shr.u32 %r217, %r198, %r211; |
| ; CHECK-NEXT: and.b32 %r218, %r217, %r216; |
| ; CHECK-NEXT: setp.ne.b32 %p46, %r207, 0; |
| ; CHECK-NEXT: selp.b32 %r219, %r218, 0, %p46; |
| ; CHECK-NEXT: add.s32 %r220, %r208, %r219; |
| ; CHECK-NEXT: setp.gt.s32 %p47, %r220, 3; |
| ; CHECK-NEXT: selp.b32 %r221, 0, %r220, %p47; |
| ; CHECK-NEXT: selp.b32 %r222, 4, 0, %p47; |
| ; CHECK-NEXT: shr.u32 %r223, %r1, 24; |
| ; CHECK-NEXT: and.b32 %r224, %r223, 128; |
| ; CHECK-NEXT: or.b32 %r225, %r224, %r222; |
| ; CHECK-NEXT: or.b32 %r226, %r225, %r221; |
| ; CHECK-NEXT: bfe.u32 %r227, %r197, 21, 1; |
| ; CHECK-NEXT: and.b32 %r228, %r196, 1048575; |
| ; CHECK-NEXT: setp.ne.b32 %p48, %r228, 0; |
| ; CHECK-NEXT: selp.b32 %r229, 1, 0, %p48; |
| ; CHECK-NEXT: or.b32 %r230, %r229, %r227; |
| ; CHECK-NEXT: shr.u32 %r231, %r196, 20; |
| ; CHECK-NEXT: and.b32 %r232, %r231, %r230; |
| ; CHECK-NEXT: bfe.u32 %r233, %r196, 21, 2; |
| ; CHECK-NEXT: add.s32 %r234, %r233, %r232; |
| ; CHECK-NEXT: setp.gt.s32 %p49, %r234, 3; |
| ; CHECK-NEXT: selp.b32 %r235, 0, %r234, %p49; |
| ; CHECK-NEXT: selp.b32 %r236, 1, 0, %p49; |
| ; CHECK-NEXT: add.s32 %r237, %r205, %r236; |
| ; CHECK-NEXT: add.s32 %r238, %r237, 14; |
| ; CHECK-NEXT: shl.b32 %r239, %r238, 2; |
| ; CHECK-NEXT: or.b32 %r240, %r224, %r239; |
| ; CHECK-NEXT: or.b32 %r241, %r240, %r235; |
| ; CHECK-NEXT: setp.lt.s32 %p50, %r238, 1; |
| ; CHECK-NEXT: selp.b32 %r242, %r226, %r241, %p50; |
| ; CHECK-NEXT: setp.gt.s32 %p51, %r235, 3; |
| ; CHECK-NEXT: or.b32 %r243, %r224, 124; |
| ; CHECK-NEXT: selp.b32 %r244, %r243, %r242, %p51; |
| ; CHECK-NEXT: setp.eq.b32 %p52, %r238, 30; |
| ; CHECK-NEXT: selp.b32 %r245, %r244, %r242, %p52; |
| ; CHECK-NEXT: setp.gt.s32 %p53, %r238, 30; |
| ; CHECK-NEXT: selp.b32 %r246, %r243, %r245, %p53; |
| ; CHECK-NEXT: setp.eq.f32 %p54, %r1, 0f00000000; |
| ; CHECK-NEXT: selp.b32 %r247, %r224, %r246, %p54; |
| ; CHECK-NEXT: abs.f32 %r248, %r1; |
| ; CHECK-NEXT: setp.eq.f32 %p55, %r248, 0f7F800000; |
| ; CHECK-NEXT: selp.b32 %r249, %r243, %r247, %p55; |
| ; CHECK-NEXT: setp.nan.f32 %p56, %r1, %r1; |
| ; CHECK-NEXT: selp.b32 %r250, 126, %r249, %p56; |
| ; CHECK-NEXT: prmt.b32 %r251, %r250, %r189, 0x3340U; |
| ; CHECK-NEXT: prmt.b32 %r252, %r251, %r128, 0x5410U; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r252; |
| ; CHECK-NEXT: ret; |
| %r = call <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(<4 x float> %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret <4 x i8> %r |
| } |
| |
| ; <2 x half> -> <2 x i8> Float8E4M3FN |
| define <2 x i8> @to_f8e4m3fn_v2f16(<2 x half> %x) { |
| ; CHECK-LABEL: to_f8e4m3fn_v2f16( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<21>; |
| ; CHECK-NEXT: .reg .b16 %rs<98>; |
| ; CHECK-NEXT: .reg .b32 %r<43>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.b32 %r1, [to_f8e4m3fn_v2f16_param_0]; |
| ; CHECK-NEXT: mov.b32 {%rs1, %rs2}, %r1; |
| ; CHECK-NEXT: mov.b16 %rs3, 0x6C00; |
| ; CHECK-NEXT: mul.rn.f16 %rs4, %rs2, %rs3; |
| ; CHECK-NEXT: and.b16 %rs5, %rs2, 32767; |
| ; CHECK-NEXT: setp.lt.u16 %p1, %rs5, 1024; |
| ; CHECK-NEXT: selp.b16 %rs6, %rs4, %rs2, %p1; |
| ; CHECK-NEXT: and.b16 %rs7, %rs6, -31745; |
| ; CHECK-NEXT: or.b16 %rs8, %rs7, 14336; |
| ; CHECK-NEXT: add.s16 %rs9, %rs5, -31744; |
| ; CHECK-NEXT: setp.lt.u16 %p2, %rs9, -31743; |
| ; CHECK-NEXT: selp.b16 %rs10, %rs2, %rs8, %p2; |
| ; CHECK-NEXT: mul.rn.f16 %rs11, %rs1, %rs3; |
| ; CHECK-NEXT: and.b16 %rs12, %rs1, 32767; |
| ; CHECK-NEXT: setp.lt.u16 %p3, %rs12, 1024; |
| ; CHECK-NEXT: selp.b16 %rs13, %rs11, %rs1, %p3; |
| ; CHECK-NEXT: and.b16 %rs14, %rs13, -31745; |
| ; CHECK-NEXT: or.b16 %rs15, %rs14, 14336; |
| ; CHECK-NEXT: add.s16 %rs16, %rs12, -31744; |
| ; CHECK-NEXT: setp.lt.u16 %p4, %rs16, -31743; |
| ; CHECK-NEXT: selp.b16 %rs17, %rs1, %rs15, %p4; |
| ; CHECK-NEXT: mov.b32 %r2, {%rs17, %rs10}; |
| ; CHECK-NEXT: and.b32 %r3, %r2, 4128831; |
| ; CHECK-NEXT: mov.b32 {%rs18, %rs19}, %r3; |
| ; CHECK-NEXT: setp.ne.b16 %p5, %rs19, 0; |
| ; CHECK-NEXT: selp.b16 %rs20, 1, 0, %p5; |
| ; CHECK-NEXT: setp.ne.b16 %p6, %rs18, 0; |
| ; CHECK-NEXT: selp.b16 %rs21, 1, 0, %p6; |
| ; CHECK-NEXT: mov.b32 %r4, {%rs21, %rs20}; |
| ; CHECK-NEXT: and.b32 %r5, %r2, 67044351; |
| ; CHECK-NEXT: mov.b32 {%rs22, %rs23}, %r5; |
| ; CHECK-NEXT: shr.u16 %rs24, %rs23, 7; |
| ; CHECK-NEXT: shr.u16 %rs25, %rs22, 7; |
| ; CHECK-NEXT: mov.b32 %r6, {%rs25, %rs24}; |
| ; CHECK-NEXT: and.b32 %r7, %r6, 65537; |
| ; CHECK-NEXT: or.b32 %r8, %r4, %r7; |
| ; CHECK-NEXT: shr.u16 %rs26, %rs23, 6; |
| ; CHECK-NEXT: shr.u16 %rs27, %rs22, 6; |
| ; CHECK-NEXT: mov.b32 %r9, {%rs27, %rs26}; |
| ; CHECK-NEXT: and.b32 %r10, %r9, %r8; |
| ; CHECK-NEXT: mov.b32 {%rs28, %rs29}, %r10; |
| ; CHECK-NEXT: add.s16 %rs30, %rs24, %rs29; |
| ; CHECK-NEXT: setp.gt.s16 %p7, %rs30, 7; |
| ; CHECK-NEXT: selp.b16 %rs31, 0, %rs30, %p7; |
| ; CHECK-NEXT: add.s16 %rs32, %rs25, %rs28; |
| ; CHECK-NEXT: setp.gt.s16 %p8, %rs32, 7; |
| ; CHECK-NEXT: selp.b16 %rs33, 0, %rs32, %p8; |
| ; CHECK-NEXT: mov.b32 %r11, {%rs33, %rs31}; |
| ; CHECK-NEXT: selp.b16 %rs34, 1, 0, %p7; |
| ; CHECK-NEXT: and.b16 %rs35, %rs4, 31744; |
| ; CHECK-NEXT: selp.b16 %rs36, %rs35, %rs5, %p1; |
| ; CHECK-NEXT: shr.u16 %rs37, %rs36, 10; |
| ; CHECK-NEXT: cvt.u32.u16 %r12, %rs37; |
| ; CHECK-NEXT: selp.b32 %r13, -12, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r14, %r12, %r13; |
| ; CHECK-NEXT: add.s32 %r15, %r14, -14; |
| ; CHECK-NEXT: selp.b32 %r16, 0, %r15, %p2; |
| ; CHECK-NEXT: cvt.u16.u32 %rs38, %r16; |
| ; CHECK-NEXT: add.s16 %rs39, %rs38, %rs34; |
| ; CHECK-NEXT: add.s16 %rs40, %rs39, 6; |
| ; CHECK-NEXT: shl.b16 %rs41, %rs40, 3; |
| ; CHECK-NEXT: selp.b16 %rs42, 1, 0, %p8; |
| ; CHECK-NEXT: and.b16 %rs43, %rs11, 31744; |
| ; CHECK-NEXT: selp.b16 %rs44, %rs43, %rs12, %p3; |
| ; CHECK-NEXT: shr.u16 %rs45, %rs44, 10; |
| ; CHECK-NEXT: cvt.u32.u16 %r17, %rs45; |
| ; CHECK-NEXT: selp.b32 %r18, -12, 0, %p3; |
| ; CHECK-NEXT: add.s32 %r19, %r17, %r18; |
| ; CHECK-NEXT: add.s32 %r20, %r19, -14; |
| ; CHECK-NEXT: selp.b32 %r21, 0, %r20, %p4; |
| ; CHECK-NEXT: cvt.u16.u32 %rs46, %r21; |
| ; CHECK-NEXT: add.s16 %rs47, %rs46, %rs42; |
| ; CHECK-NEXT: add.s16 %rs48, %rs47, 6; |
| ; CHECK-NEXT: shl.b16 %rs49, %rs48, 3; |
| ; CHECK-NEXT: mov.b32 %r22, {%rs49, %rs41}; |
| ; CHECK-NEXT: shr.u16 %rs50, %rs2, 8; |
| ; CHECK-NEXT: and.b16 %rs51, %rs50, 128; |
| ; CHECK-NEXT: shr.u16 %rs52, %rs1, 8; |
| ; CHECK-NEXT: and.b16 %rs53, %rs52, 128; |
| ; CHECK-NEXT: mov.b32 %r23, {%rs53, %rs51}; |
| ; CHECK-NEXT: or.b32 %r24, %r23, %r22; |
| ; CHECK-NEXT: or.b32 %r25, %r24, %r11; |
| ; CHECK-NEXT: mov.b32 {%rs54, %rs55}, %r25; |
| ; CHECK-NEXT: sub.s16 %rs56, 2, %rs38; |
| ; CHECK-NEXT: min.u16 %rs57, %rs56, 15; |
| ; CHECK-NEXT: max.u16 %rs58, %rs57, 1; |
| ; CHECK-NEXT: add.s16 %rs59, %rs58, -1; |
| ; CHECK-NEXT: cvt.u32.u16 %r26, %rs59; |
| ; CHECK-NEXT: mov.b16 %rs60, 1; |
| ; CHECK-NEXT: shl.b16 %rs61, %rs60, %r26; |
| ; CHECK-NEXT: add.s16 %rs62, %rs61, -1; |
| ; CHECK-NEXT: sub.s16 %rs63, 2, %rs46; |
| ; CHECK-NEXT: min.u16 %rs64, %rs63, 15; |
| ; CHECK-NEXT: max.u16 %rs65, %rs64, 1; |
| ; CHECK-NEXT: add.s16 %rs66, %rs65, -1; |
| ; CHECK-NEXT: cvt.u32.u16 %r27, %rs66; |
| ; CHECK-NEXT: shl.b16 %rs67, %rs60, %r27; |
| ; CHECK-NEXT: add.s16 %rs68, %rs67, -1; |
| ; CHECK-NEXT: mov.b32 %r28, {%rs68, %rs62}; |
| ; CHECK-NEXT: or.b32 %r29, %r5, 67109888; |
| ; CHECK-NEXT: and.b32 %r30, %r29, %r28; |
| ; CHECK-NEXT: mov.b32 {%rs69, %rs70}, %r30; |
| ; CHECK-NEXT: setp.ne.b16 %p9, %rs70, 0; |
| ; CHECK-NEXT: selp.b16 %rs71, 1, 0, %p9; |
| ; CHECK-NEXT: setp.ne.b16 %p10, %rs69, 0; |
| ; CHECK-NEXT: selp.b16 %rs72, 1, 0, %p10; |
| ; CHECK-NEXT: mov.b32 %r31, {%rs72, %rs71}; |
| ; CHECK-NEXT: mov.b32 {%rs73, %rs74}, %r29; |
| ; CHECK-NEXT: cvt.u32.u16 %r32, %rs57; |
| ; CHECK-NEXT: shr.u16 %rs75, %rs74, %r32; |
| ; CHECK-NEXT: cvt.u32.u16 %r33, %rs64; |
| ; CHECK-NEXT: shr.u16 %rs76, %rs73, %r33; |
| ; CHECK-NEXT: mov.b32 %r34, {%rs76, %rs75}; |
| ; CHECK-NEXT: and.b32 %r35, %r34, 65537; |
| ; CHECK-NEXT: or.b32 %r36, %r31, %r35; |
| ; CHECK-NEXT: shr.u16 %rs77, %rs74, %r26; |
| ; CHECK-NEXT: shr.u16 %rs78, %rs73, %r27; |
| ; CHECK-NEXT: mov.b32 %r37, {%rs78, %rs77}; |
| ; CHECK-NEXT: and.b32 %r38, %r37, %r36; |
| ; CHECK-NEXT: mov.b32 {%rs79, %rs80}, %r38; |
| ; CHECK-NEXT: setp.ne.b16 %p11, %rs57, 0; |
| ; CHECK-NEXT: selp.b16 %rs81, %rs80, 0, %p11; |
| ; CHECK-NEXT: add.s16 %rs82, %rs75, %rs81; |
| ; CHECK-NEXT: setp.gt.s16 %p12, %rs82, 7; |
| ; CHECK-NEXT: selp.b16 %rs83, 0, %rs82, %p12; |
| ; CHECK-NEXT: setp.ne.b16 %p13, %rs64, 0; |
| ; CHECK-NEXT: selp.b16 %rs84, %rs79, 0, %p13; |
| ; CHECK-NEXT: add.s16 %rs85, %rs76, %rs84; |
| ; CHECK-NEXT: setp.gt.s16 %p14, %rs85, 7; |
| ; CHECK-NEXT: selp.b16 %rs86, 0, %rs85, %p14; |
| ; CHECK-NEXT: mov.b32 %r39, {%rs86, %rs83}; |
| ; CHECK-NEXT: selp.b16 %rs87, 8, 0, %p12; |
| ; CHECK-NEXT: selp.b16 %rs88, 8, 0, %p14; |
| ; CHECK-NEXT: mov.b32 %r40, {%rs88, %rs87}; |
| ; CHECK-NEXT: or.b32 %r41, %r23, %r40; |
| ; CHECK-NEXT: or.b32 %r42, %r41, %r39; |
| ; CHECK-NEXT: mov.b32 {%rs89, %rs90}, %r42; |
| ; CHECK-NEXT: setp.lt.s16 %p15, %rs40, 1; |
| ; CHECK-NEXT: selp.b16 %rs91, %rs90, %rs55, %p15; |
| ; CHECK-NEXT: mov.b16 %rs92, 0x0000; |
| ; CHECK-NEXT: setp.eq.f16 %p16, %rs2, %rs92; |
| ; CHECK-NEXT: selp.b16 %rs93, %rs51, %rs91, %p16; |
| ; CHECK-NEXT: setp.nan.f16 %p17, %rs2, %rs2; |
| ; CHECK-NEXT: selp.b16 %rs94, 127, %rs93, %p17; |
| ; CHECK-NEXT: setp.lt.s16 %p18, %rs48, 1; |
| ; CHECK-NEXT: selp.b16 %rs95, %rs89, %rs54, %p18; |
| ; CHECK-NEXT: setp.eq.f16 %p19, %rs1, %rs92; |
| ; CHECK-NEXT: selp.b16 %rs96, %rs53, %rs95, %p19; |
| ; CHECK-NEXT: setp.nan.f16 %p20, %rs1, %rs1; |
| ; CHECK-NEXT: selp.b16 %rs97, 127, %rs96, %p20; |
| ; CHECK-NEXT: st.param.v2.b8 [func_retval0], {%rs97, %rs94}; |
| ; CHECK-NEXT: ret; |
| %r = call <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f16(<2 x half> %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret <2 x i8> %r |
| } |
| |
| ; Float8E5M2 from f16: half -> i8 |
| define i8 @to_f8e5m2_from_f16(half %x) { |
| ; CHECK-LABEL: to_f8e5m2_from_f16( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<15>; |
| ; CHECK-NEXT: .reg .b16 %rs<64>; |
| ; CHECK-NEXT: .reg .b32 %r<11>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.b16 %rs1, [to_f8e5m2_from_f16_param_0]; |
| ; CHECK-NEXT: mov.b16 %rs2, 0x6C00; |
| ; CHECK-NEXT: mul.rn.f16 %rs3, %rs1, %rs2; |
| ; CHECK-NEXT: and.b16 %rs4, %rs1, 32767; |
| ; CHECK-NEXT: setp.lt.u16 %p1, %rs4, 1024; |
| ; CHECK-NEXT: selp.b16 %rs5, %rs3, %rs1, %p1; |
| ; CHECK-NEXT: and.b16 %rs6, %rs5, -31745; |
| ; CHECK-NEXT: or.b16 %rs7, %rs6, 14336; |
| ; CHECK-NEXT: add.s16 %rs8, %rs4, -31744; |
| ; CHECK-NEXT: setp.lt.u16 %p2, %rs8, -31743; |
| ; CHECK-NEXT: selp.b16 %rs9, %rs1, %rs7, %p2; |
| ; CHECK-NEXT: and.b16 %rs10, %rs9, 1023; |
| ; CHECK-NEXT: or.b16 %rs11, %rs10, 1024; |
| ; CHECK-NEXT: and.b16 %rs12, %rs3, 31744; |
| ; CHECK-NEXT: selp.b16 %rs13, %rs12, %rs4, %p1; |
| ; CHECK-NEXT: shr.u16 %rs14, %rs13, 10; |
| ; CHECK-NEXT: cvt.u32.u16 %r1, %rs14; |
| ; CHECK-NEXT: selp.b32 %r2, -12, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r3, %r1, %r2; |
| ; CHECK-NEXT: add.s32 %r4, %r3, -14; |
| ; CHECK-NEXT: selp.b32 %r5, 0, %r4, %p2; |
| ; CHECK-NEXT: cvt.u16.u32 %rs15, %r5; |
| ; CHECK-NEXT: sub.s16 %rs16, -5, %rs15; |
| ; CHECK-NEXT: min.u16 %rs17, %rs16, 15; |
| ; CHECK-NEXT: cvt.u32.u16 %r6, %rs17; |
| ; CHECK-NEXT: shr.u16 %rs18, %rs11, %r6; |
| ; CHECK-NEXT: and.b16 %rs19, %rs18, 1; |
| ; CHECK-NEXT: max.u16 %rs20, %rs17, 1; |
| ; CHECK-NEXT: add.s16 %rs21, %rs20, -1; |
| ; CHECK-NEXT: cvt.u32.u16 %r7, %rs21; |
| ; CHECK-NEXT: mov.b16 %rs22, 1; |
| ; CHECK-NEXT: shl.b16 %rs23, %rs22, %r7; |
| ; CHECK-NEXT: add.s16 %rs24, %rs23, -1; |
| ; CHECK-NEXT: and.b16 %rs25, %rs11, %rs24; |
| ; CHECK-NEXT: setp.ne.b16 %p3, %rs25, 0; |
| ; CHECK-NEXT: selp.b16 %rs26, 1, 0, %p3; |
| ; CHECK-NEXT: or.b16 %rs27, %rs26, %rs19; |
| ; CHECK-NEXT: shr.u16 %rs28, %rs11, %r7; |
| ; CHECK-NEXT: and.b16 %rs29, %rs28, %rs27; |
| ; CHECK-NEXT: setp.ne.b16 %p4, %rs17, 0; |
| ; CHECK-NEXT: selp.b16 %rs30, %rs29, 0, %p4; |
| ; CHECK-NEXT: add.s16 %rs31, %rs18, %rs30; |
| ; CHECK-NEXT: setp.gt.s16 %p5, %rs31, 3; |
| ; CHECK-NEXT: selp.b16 %rs32, 0, %rs31, %p5; |
| ; CHECK-NEXT: selp.b16 %rs33, 4, 0, %p5; |
| ; CHECK-NEXT: shr.u16 %rs34, %rs1, 8; |
| ; CHECK-NEXT: and.b16 %rs35, %rs34, 128; |
| ; CHECK-NEXT: or.b16 %rs36, %rs35, %rs33; |
| ; CHECK-NEXT: or.b16 %rs37, %rs36, %rs32; |
| ; CHECK-NEXT: shr.u16 %rs38, %rs10, 8; |
| ; CHECK-NEXT: and.b16 %rs39, %rs38, 1; |
| ; CHECK-NEXT: and.b16 %rs40, %rs9, 127; |
| ; CHECK-NEXT: setp.ne.b16 %p6, %rs40, 0; |
| ; CHECK-NEXT: selp.b16 %rs41, 1, 0, %p6; |
| ; CHECK-NEXT: or.b16 %rs42, %rs41, %rs39; |
| ; CHECK-NEXT: shr.u16 %rs43, %rs9, 7; |
| ; CHECK-NEXT: and.b16 %rs44, %rs43, %rs42; |
| ; CHECK-NEXT: add.s16 %rs45, %rs38, %rs44; |
| ; CHECK-NEXT: setp.gt.s16 %p7, %rs45, 3; |
| ; CHECK-NEXT: selp.b16 %rs46, 0, %rs45, %p7; |
| ; CHECK-NEXT: selp.b16 %rs47, 1, 0, %p7; |
| ; CHECK-NEXT: add.s16 %rs48, %rs15, %rs47; |
| ; CHECK-NEXT: add.s16 %rs49, %rs48, 14; |
| ; CHECK-NEXT: shl.b16 %rs50, %rs49, 2; |
| ; CHECK-NEXT: or.b16 %rs51, %rs35, %rs50; |
| ; CHECK-NEXT: or.b16 %rs52, %rs51, %rs46; |
| ; CHECK-NEXT: setp.lt.s16 %p8, %rs49, 1; |
| ; CHECK-NEXT: selp.b16 %rs53, %rs37, %rs52, %p8; |
| ; CHECK-NEXT: setp.gt.s16 %p9, %rs46, 3; |
| ; CHECK-NEXT: or.b16 %rs54, %rs35, 124; |
| ; CHECK-NEXT: selp.b16 %rs55, %rs54, %rs53, %p9; |
| ; CHECK-NEXT: setp.eq.b16 %p10, %rs49, 30; |
| ; CHECK-NEXT: selp.b16 %rs56, %rs55, %rs53, %p10; |
| ; CHECK-NEXT: setp.gt.s16 %p11, %rs49, 30; |
| ; CHECK-NEXT: selp.b16 %rs57, %rs54, %rs56, %p11; |
| ; CHECK-NEXT: mov.b16 %rs58, 0x0000; |
| ; CHECK-NEXT: setp.eq.f16 %p12, %rs1, %rs58; |
| ; CHECK-NEXT: selp.b16 %rs59, %rs35, %rs57, %p12; |
| ; CHECK-NEXT: cvt.f32.f16 %r8, %rs1; |
| ; CHECK-NEXT: abs.f32 %r9, %r8; |
| ; CHECK-NEXT: cvt.rn.f16.f32 %rs60, %r9; |
| ; CHECK-NEXT: mov.b16 %rs61, 0x7C00; |
| ; CHECK-NEXT: setp.eq.f16 %p13, %rs60, %rs61; |
| ; CHECK-NEXT: selp.b16 %rs62, %rs54, %rs59, %p13; |
| ; CHECK-NEXT: setp.nan.f16 %p14, %rs1, %rs1; |
| ; CHECK-NEXT: selp.b16 %rs63, 126, %rs62, %p14; |
| ; CHECK-NEXT: cvt.u32.u16 %r10, %rs63; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r10; |
| ; CHECK-NEXT: ret; |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(half %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| ; Float8E5M2 from bf16: bfloat -> i8 |
| define i8 @to_f8e5m2_from_bf16(bfloat %x) { |
| ; CHECK-LABEL: to_f8e5m2_from_bf16( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<17>; |
| ; CHECK-NEXT: .reg .b16 %rs<60>; |
| ; CHECK-NEXT: .reg .b32 %r<24>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.b16 %rs1, [to_f8e5m2_from_bf16_param_0]; |
| ; CHECK-NEXT: cvt.u32.u16 %r1, %rs1; |
| ; CHECK-NEXT: shl.b32 %r2, %r1, 16; |
| ; CHECK-NEXT: mul.rn.f32 %r3, %r2, 0f44000000; |
| ; CHECK-NEXT: bfe.u32 %r4, %r3, 16, 1; |
| ; CHECK-NEXT: add.s32 %r5, %r4, %r3; |
| ; CHECK-NEXT: add.s32 %r6, %r5, 32767; |
| ; CHECK-NEXT: setp.nan.f32 %p1, %r3, %r3; |
| ; CHECK-NEXT: or.b32 %r7, %r3, 4194304; |
| ; CHECK-NEXT: selp.b32 %r8, %r7, %r6, %p1; |
| ; CHECK-NEXT: { .reg .b16 tmp; mov.b32 {tmp, %rs2}, %r8; } |
| ; CHECK-NEXT: and.b16 %rs3, %rs1, 32767; |
| ; CHECK-NEXT: setp.lt.u16 %p2, %rs3, 128; |
| ; CHECK-NEXT: selp.b16 %rs4, %rs2, %rs1, %p2; |
| ; CHECK-NEXT: and.b16 %rs5, %rs4, -32641; |
| ; CHECK-NEXT: or.b16 %rs6, %rs5, 16128; |
| ; CHECK-NEXT: add.s16 %rs7, %rs3, -32640; |
| ; CHECK-NEXT: setp.lt.u16 %p3, %rs7, -32639; |
| ; CHECK-NEXT: selp.b16 %rs8, %rs1, %rs6, %p3; |
| ; CHECK-NEXT: and.b16 %rs9, %rs8, 127; |
| ; CHECK-NEXT: or.b16 %rs10, %rs9, 128; |
| ; CHECK-NEXT: and.b16 %rs11, %rs2, 32640; |
| ; CHECK-NEXT: selp.b16 %rs12, %rs11, %rs3, %p2; |
| ; CHECK-NEXT: shr.u16 %rs13, %rs12, 7; |
| ; CHECK-NEXT: cvt.u32.u16 %r9, %rs13; |
| ; CHECK-NEXT: selp.b32 %r10, -9, 0, %p2; |
| ; CHECK-NEXT: add.s32 %r11, %r9, %r10; |
| ; CHECK-NEXT: add.s32 %r12, %r11, -126; |
| ; CHECK-NEXT: selp.b32 %r13, 0, %r12, %p3; |
| ; CHECK-NEXT: cvt.u16.u32 %rs14, %r13; |
| ; CHECK-NEXT: sub.s16 %rs15, -8, %rs14; |
| ; CHECK-NEXT: min.u16 %rs16, %rs15, 15; |
| ; CHECK-NEXT: cvt.u32.u16 %r14, %rs16; |
| ; CHECK-NEXT: shr.u16 %rs17, %rs10, %r14; |
| ; CHECK-NEXT: and.b16 %rs18, %rs17, 1; |
| ; CHECK-NEXT: max.u16 %rs19, %rs16, 1; |
| ; CHECK-NEXT: add.s16 %rs20, %rs19, -1; |
| ; CHECK-NEXT: cvt.u32.u16 %r15, %rs20; |
| ; CHECK-NEXT: mov.b16 %rs21, 1; |
| ; CHECK-NEXT: shl.b16 %rs22, %rs21, %r15; |
| ; CHECK-NEXT: add.s16 %rs23, %rs22, -1; |
| ; CHECK-NEXT: and.b16 %rs24, %rs10, %rs23; |
| ; CHECK-NEXT: setp.ne.b16 %p4, %rs24, 0; |
| ; CHECK-NEXT: selp.b16 %rs25, 1, 0, %p4; |
| ; CHECK-NEXT: or.b16 %rs26, %rs25, %rs18; |
| ; CHECK-NEXT: shr.u16 %rs27, %rs10, %r15; |
| ; CHECK-NEXT: and.b16 %rs28, %rs27, %rs26; |
| ; CHECK-NEXT: setp.ne.b16 %p5, %rs16, 0; |
| ; CHECK-NEXT: selp.b16 %rs29, %rs28, 0, %p5; |
| ; CHECK-NEXT: add.s16 %rs30, %rs17, %rs29; |
| ; CHECK-NEXT: setp.gt.s16 %p6, %rs30, 3; |
| ; CHECK-NEXT: selp.b16 %rs31, 0, %rs30, %p6; |
| ; CHECK-NEXT: selp.b16 %rs32, 4, 0, %p6; |
| ; CHECK-NEXT: shr.u16 %rs33, %rs1, 8; |
| ; CHECK-NEXT: and.b16 %rs34, %rs33, 128; |
| ; CHECK-NEXT: or.b16 %rs35, %rs34, %rs32; |
| ; CHECK-NEXT: or.b16 %rs36, %rs35, %rs31; |
| ; CHECK-NEXT: shr.u16 %rs37, %rs9, 5; |
| ; CHECK-NEXT: and.b16 %rs38, %rs37, 1; |
| ; CHECK-NEXT: and.b16 %rs39, %rs8, 15; |
| ; CHECK-NEXT: setp.ne.b16 %p7, %rs39, 0; |
| ; CHECK-NEXT: selp.b16 %rs40, 1, 0, %p7; |
| ; CHECK-NEXT: or.b16 %rs41, %rs40, %rs38; |
| ; CHECK-NEXT: shr.u16 %rs42, %rs8, 4; |
| ; CHECK-NEXT: and.b16 %rs43, %rs42, %rs41; |
| ; CHECK-NEXT: add.s16 %rs44, %rs37, %rs43; |
| ; CHECK-NEXT: setp.gt.s16 %p8, %rs44, 3; |
| ; CHECK-NEXT: selp.b16 %rs45, 0, %rs44, %p8; |
| ; CHECK-NEXT: selp.b16 %rs46, 1, 0, %p8; |
| ; CHECK-NEXT: add.s16 %rs47, %rs14, %rs46; |
| ; CHECK-NEXT: add.s16 %rs48, %rs47, 14; |
| ; CHECK-NEXT: shl.b16 %rs49, %rs48, 2; |
| ; CHECK-NEXT: or.b16 %rs50, %rs34, %rs49; |
| ; CHECK-NEXT: or.b16 %rs51, %rs50, %rs45; |
| ; CHECK-NEXT: setp.lt.s16 %p9, %rs48, 1; |
| ; CHECK-NEXT: selp.b16 %rs52, %rs36, %rs51, %p9; |
| ; CHECK-NEXT: setp.gt.s16 %p10, %rs45, 3; |
| ; CHECK-NEXT: or.b16 %rs53, %rs34, 124; |
| ; CHECK-NEXT: selp.b16 %rs54, %rs53, %rs52, %p10; |
| ; CHECK-NEXT: setp.eq.b16 %p11, %rs48, 30; |
| ; CHECK-NEXT: selp.b16 %rs55, %rs54, %rs52, %p11; |
| ; CHECK-NEXT: setp.gt.s16 %p12, %rs48, 30; |
| ; CHECK-NEXT: selp.b16 %rs56, %rs53, %rs55, %p12; |
| ; CHECK-NEXT: setp.eq.f32 %p13, %r2, 0f00000000; |
| ; CHECK-NEXT: selp.b16 %rs57, %rs34, %rs56, %p13; |
| ; CHECK-NEXT: abs.f32 %r16, %r2; |
| ; CHECK-NEXT: bfe.u32 %r17, %r16, 16, 1; |
| ; CHECK-NEXT: or.b32 %r18, %r17, %r16; |
| ; CHECK-NEXT: add.s32 %r19, %r18, 32767; |
| ; CHECK-NEXT: setp.nan.f32 %p14, %r16, %r16; |
| ; CHECK-NEXT: or.b32 %r20, %r16, 4194304; |
| ; CHECK-NEXT: selp.b32 %r21, %r20, %r19, %p14; |
| ; CHECK-NEXT: and.b32 %r22, %r21, 2147418112; |
| ; CHECK-NEXT: setp.eq.f32 %p15, %r22, 0f7F800000; |
| ; CHECK-NEXT: selp.b16 %rs58, %rs53, %rs57, %p15; |
| ; CHECK-NEXT: setp.nan.f32 %p16, %r2, %r2; |
| ; CHECK-NEXT: selp.b16 %rs59, 126, %rs58, %p16; |
| ; CHECK-NEXT: cvt.u32.u16 %r23, %rs59; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %r23; |
| ; CHECK-NEXT: ret; |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.bf16(bfloat %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| ; Float8E5M2 from f64: double -> i8 |
| define i8 @to_f8e5m2_from_f64(double %x) { |
| ; CHECK-LABEL: to_f8e5m2_from_f64( |
| ; CHECK: { |
| ; CHECK-NEXT: .reg .pred %p<15>; |
| ; CHECK-NEXT: .reg .b32 %r<8>; |
| ; CHECK-NEXT: .reg .b64 %rd<61>; |
| ; CHECK-EMPTY: |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: ld.param.b64 %rd1, [to_f8e5m2_from_f64_param_0]; |
| ; CHECK-NEXT: mul.rn.f64 %rd2, %rd1, 0d4350000000000000; |
| ; CHECK-NEXT: and.b64 %rd3, %rd1, 9223372036854775807; |
| ; CHECK-NEXT: setp.lt.u64 %p1, %rd3, 4503599627370496; |
| ; CHECK-NEXT: selp.b64 %rd4, %rd2, %rd1, %p1; |
| ; CHECK-NEXT: and.b64 %rd5, %rd4, -9218868437227405313; |
| ; CHECK-NEXT: or.b64 %rd6, %rd5, 4602678819172646912; |
| ; CHECK-NEXT: add.s64 %rd7, %rd3, -9218868437227405312; |
| ; CHECK-NEXT: setp.lt.u64 %p2, %rd7, -9218868437227405311; |
| ; CHECK-NEXT: selp.f64 %rd8, %rd1, %rd6, %p2; |
| ; CHECK-NEXT: and.b64 %rd9, %rd8, 4503599627370495; |
| ; CHECK-NEXT: or.b64 %rd10, %rd9, 4503599627370496; |
| ; CHECK-NEXT: and.b64 %rd11, %rd2, 9218868437227405312; |
| ; CHECK-NEXT: selp.b64 %rd12, %rd11, %rd3, %p1; |
| ; CHECK-NEXT: shr.u64 %rd13, %rd12, 52; |
| ; CHECK-NEXT: cvt.u32.u64 %r1, %rd13; |
| ; CHECK-NEXT: selp.b32 %r2, -54, 0, %p1; |
| ; CHECK-NEXT: add.s32 %r3, %r1, %r2; |
| ; CHECK-NEXT: add.s32 %r4, %r3, -1022; |
| ; CHECK-NEXT: selp.b32 %r5, 0, %r4, %p2; |
| ; CHECK-NEXT: cvt.s64.s32 %rd14, %r5; |
| ; CHECK-NEXT: sub.s64 %rd15, 37, %rd14; |
| ; CHECK-NEXT: min.u64 %rd16, %rd15, 63; |
| ; CHECK-NEXT: cvt.u32.u64 %r6, %rd16; |
| ; CHECK-NEXT: shr.u64 %rd17, %rd10, %r6; |
| ; CHECK-NEXT: and.b64 %rd18, %rd17, 1; |
| ; CHECK-NEXT: max.u64 %rd19, %rd16, 1; |
| ; CHECK-NEXT: add.s64 %rd20, %rd19, -1; |
| ; CHECK-NEXT: cvt.u32.u64 %r7, %rd20; |
| ; CHECK-NEXT: mov.b64 %rd21, 1; |
| ; CHECK-NEXT: shl.b64 %rd22, %rd21, %r7; |
| ; CHECK-NEXT: add.s64 %rd23, %rd22, -1; |
| ; CHECK-NEXT: and.b64 %rd24, %rd10, %rd23; |
| ; CHECK-NEXT: setp.ne.b64 %p3, %rd24, 0; |
| ; CHECK-NEXT: selp.b64 %rd25, 1, 0, %p3; |
| ; CHECK-NEXT: or.b64 %rd26, %rd25, %rd18; |
| ; CHECK-NEXT: shr.u64 %rd27, %rd10, %r7; |
| ; CHECK-NEXT: and.b64 %rd28, %rd27, %rd26; |
| ; CHECK-NEXT: setp.ne.b64 %p4, %rd16, 0; |
| ; CHECK-NEXT: selp.b64 %rd29, %rd28, 0, %p4; |
| ; CHECK-NEXT: add.s64 %rd30, %rd17, %rd29; |
| ; CHECK-NEXT: setp.gt.s64 %p5, %rd30, 3; |
| ; CHECK-NEXT: selp.b64 %rd31, 0, %rd30, %p5; |
| ; CHECK-NEXT: selp.b64 %rd32, 4, 0, %p5; |
| ; CHECK-NEXT: shr.u64 %rd33, %rd1, 56; |
| ; CHECK-NEXT: and.b64 %rd34, %rd33, 128; |
| ; CHECK-NEXT: or.b64 %rd35, %rd34, %rd32; |
| ; CHECK-NEXT: or.b64 %rd36, %rd35, %rd31; |
| ; CHECK-NEXT: bfe.u64 %rd37, %rd8, 50, 2; |
| ; CHECK-NEXT: and.b64 %rd38, %rd37, 1; |
| ; CHECK-NEXT: and.b64 %rd39, %rd8, 562949953421311; |
| ; CHECK-NEXT: setp.ne.b64 %p6, %rd39, 0; |
| ; CHECK-NEXT: selp.b64 %rd40, 1, 0, %p6; |
| ; CHECK-NEXT: or.b64 %rd41, %rd40, %rd38; |
| ; CHECK-NEXT: shr.u64 %rd42, %rd8, 49; |
| ; CHECK-NEXT: and.b64 %rd43, %rd42, %rd41; |
| ; CHECK-NEXT: add.s64 %rd44, %rd37, %rd43; |
| ; CHECK-NEXT: setp.gt.s64 %p7, %rd44, 3; |
| ; CHECK-NEXT: selp.b64 %rd45, 0, %rd44, %p7; |
| ; CHECK-NEXT: selp.b64 %rd46, 1, 0, %p7; |
| ; CHECK-NEXT: add.s64 %rd47, %rd14, %rd46; |
| ; CHECK-NEXT: add.s64 %rd48, %rd47, 14; |
| ; CHECK-NEXT: shl.b64 %rd49, %rd48, 2; |
| ; CHECK-NEXT: or.b64 %rd50, %rd34, %rd49; |
| ; CHECK-NEXT: or.b64 %rd51, %rd50, %rd45; |
| ; CHECK-NEXT: setp.lt.s64 %p8, %rd48, 1; |
| ; CHECK-NEXT: selp.b64 %rd52, %rd36, %rd51, %p8; |
| ; CHECK-NEXT: setp.gt.s64 %p9, %rd45, 3; |
| ; CHECK-NEXT: or.b64 %rd53, %rd34, 124; |
| ; CHECK-NEXT: selp.b64 %rd54, %rd53, %rd52, %p9; |
| ; CHECK-NEXT: setp.eq.b64 %p10, %rd48, 30; |
| ; CHECK-NEXT: selp.b64 %rd55, %rd54, %rd52, %p10; |
| ; CHECK-NEXT: setp.gt.s64 %p11, %rd48, 30; |
| ; CHECK-NEXT: selp.b64 %rd56, %rd53, %rd55, %p11; |
| ; CHECK-NEXT: setp.eq.f64 %p12, %rd1, 0d0000000000000000; |
| ; CHECK-NEXT: selp.b64 %rd57, %rd34, %rd56, %p12; |
| ; CHECK-NEXT: abs.f64 %rd58, %rd1; |
| ; CHECK-NEXT: setp.eq.f64 %p13, %rd58, 0d7FF0000000000000; |
| ; CHECK-NEXT: selp.b64 %rd59, %rd53, %rd57, %p13; |
| ; CHECK-NEXT: setp.nan.f64 %p14, %rd1, %rd1; |
| ; CHECK-NEXT: selp.b64 %rd60, 126, %rd59, %p14; |
| ; CHECK-NEXT: st.param.b32 [func_retval0], %rd60; |
| ; CHECK-NEXT: ret; |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f64(double %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |