@@ -46,8 +46,14 @@ define amdgpu_kernel void @frem_f16(ptr addrspace(1) %out, ptr addrspace(1) %in1
4646; VI-NEXT: v_cvt_f32_f16_e32 v0, s2
4747; VI-NEXT: v_cvt_f32_f16_e32 v2, s0
4848; VI-NEXT: v_mov_b32_e32 v1, s0
49- ; VI-NEXT: v_rcp_f32_e32 v2, v2
50- ; VI-NEXT: v_mul_f32_e32 v0, v0, v2
49+ ; VI-NEXT: v_rcp_f32_e32 v3, v2
50+ ; VI-NEXT: v_mul_f32_e32 v4, v0, v3
51+ ; VI-NEXT: v_mad_f32 v5, -v2, v4, v0
52+ ; VI-NEXT: v_mac_f32_e32 v4, v5, v3
53+ ; VI-NEXT: v_mad_f32 v0, -v2, v4, v0
54+ ; VI-NEXT: v_mul_f32_e32 v0, v0, v3
55+ ; VI-NEXT: v_and_b32_e32 v0, 0xff800000, v0
56+ ; VI-NEXT: v_add_f32_e32 v0, v0, v4
5157; VI-NEXT: v_cvt_f16_f32_e32 v0, v0
5258; VI-NEXT: v_div_fixup_f16 v0, v0, v1, s2
5359; VI-NEXT: v_trunc_f16_e32 v0, v0
@@ -554,19 +560,31 @@ define amdgpu_kernel void @frem_v2f16(ptr addrspace(1) %out, ptr addrspace(1) %i
554560; VI-NEXT: v_cvt_f32_f16_e32 v0, s2
555561; VI-NEXT: v_cvt_f32_f16_e32 v2, s0
556562; VI-NEXT: s_lshr_b32 s3, s0, 16
557- ; VI-NEXT: v_cvt_f32_f16_e32 v3, s3
558563; VI-NEXT: v_mov_b32_e32 v1, s0
559- ; VI-NEXT: v_rcp_f32_e32 v2, v2
560564; VI-NEXT: s_lshr_b32 s1, s2, 16
561- ; VI-NEXT: v_rcp_f32_e32 v3, v3
562- ; VI-NEXT: v_mul_f32_e32 v0, v0, v2
565+ ; VI-NEXT: v_rcp_f32_e32 v3, v2
566+ ; VI-NEXT: v_mul_f32_e32 v4, v0, v3
567+ ; VI-NEXT: v_mad_f32 v5, -v2, v4, v0
568+ ; VI-NEXT: v_mac_f32_e32 v4, v5, v3
569+ ; VI-NEXT: v_mad_f32 v0, -v2, v4, v0
570+ ; VI-NEXT: v_mul_f32_e32 v0, v0, v3
571+ ; VI-NEXT: v_and_b32_e32 v0, 0xff800000, v0
572+ ; VI-NEXT: v_add_f32_e32 v0, v0, v4
563573; VI-NEXT: v_cvt_f16_f32_e32 v0, v0
574+ ; VI-NEXT: v_cvt_f32_f16_e32 v3, s3
564575; VI-NEXT: v_mov_b32_e32 v2, s3
565576; VI-NEXT: v_div_fixup_f16 v0, v0, v1, s2
566577; VI-NEXT: v_trunc_f16_e32 v0, v0
567578; VI-NEXT: v_fma_f16 v0, -v0, v1, s2
568579; VI-NEXT: v_cvt_f32_f16_e32 v1, s1
569- ; VI-NEXT: v_mul_f32_e32 v1, v1, v3
580+ ; VI-NEXT: v_rcp_f32_e32 v4, v3
581+ ; VI-NEXT: v_mul_f32_e32 v5, v1, v4
582+ ; VI-NEXT: v_mad_f32 v6, -v3, v5, v1
583+ ; VI-NEXT: v_mac_f32_e32 v5, v6, v4
584+ ; VI-NEXT: v_mad_f32 v1, -v3, v5, v1
585+ ; VI-NEXT: v_mul_f32_e32 v1, v1, v4
586+ ; VI-NEXT: v_and_b32_e32 v1, 0xff800000, v1
587+ ; VI-NEXT: v_add_f32_e32 v1, v1, v5
570588; VI-NEXT: v_cvt_f16_f32_e32 v1, v1
571589; VI-NEXT: v_div_fixup_f16 v1, v1, v2, s1
572590; VI-NEXT: v_trunc_f16_e32 v1, v1
@@ -691,41 +709,65 @@ define amdgpu_kernel void @frem_v4f16(ptr addrspace(1) %out, ptr addrspace(1) %i
691709; VI-NEXT: v_cvt_f32_f16_e32 v0, s2
692710; VI-NEXT: v_cvt_f32_f16_e32 v2, s0
693711; VI-NEXT: s_lshr_b32 s8, s0, 16
694- ; VI-NEXT: v_cvt_f32_f16_e32 v3, s8
695712; VI-NEXT: v_mov_b32_e32 v1, s0
696- ; VI-NEXT: v_rcp_f32_e32 v2, v2
697713; VI-NEXT: s_lshr_b32 s6, s2, 16
698- ; VI-NEXT: v_rcp_f32_e32 v3, v3
699- ; VI-NEXT: v_cvt_f32_f16_e32 v4, s1
700- ; VI-NEXT: v_mul_f32_e32 v0, v0, v2
714+ ; VI-NEXT: v_rcp_f32_e32 v3, v2
715+ ; VI-NEXT: s_lshr_b32 s9, s1, 16
716+ ; VI-NEXT: s_lshr_b32 s7, s3, 16
717+ ; VI-NEXT: v_mul_f32_e32 v4, v0, v3
718+ ; VI-NEXT: v_mad_f32 v5, -v2, v4, v0
719+ ; VI-NEXT: v_mac_f32_e32 v4, v5, v3
720+ ; VI-NEXT: v_mad_f32 v0, -v2, v4, v0
721+ ; VI-NEXT: v_mul_f32_e32 v0, v0, v3
722+ ; VI-NEXT: v_and_b32_e32 v0, 0xff800000, v0
723+ ; VI-NEXT: v_add_f32_e32 v0, v0, v4
701724; VI-NEXT: v_cvt_f16_f32_e32 v0, v0
725+ ; VI-NEXT: v_cvt_f32_f16_e32 v3, s8
702726; VI-NEXT: v_mov_b32_e32 v2, s8
703- ; VI-NEXT: v_rcp_f32_e32 v4, v4
704- ; VI-NEXT: s_lshr_b32 s9, s1, 16
705727; VI-NEXT: v_div_fixup_f16 v0, v0, v1, s2
706728; VI-NEXT: v_trunc_f16_e32 v0, v0
707729; VI-NEXT: v_fma_f16 v0, -v0, v1, s2
708730; VI-NEXT: v_cvt_f32_f16_e32 v1, s6
709- ; VI-NEXT: v_cvt_f32_f16_e32 v5, s9
710- ; VI-NEXT: s_lshr_b32 s7, s3, 16
711- ; VI-NEXT: v_mul_f32_e32 v1, v1, v3
731+ ; VI-NEXT: v_rcp_f32_e32 v4, v3
732+ ; VI-NEXT: v_mul_f32_e32 v5, v1, v4
733+ ; VI-NEXT: v_mad_f32 v6, -v3, v5, v1
734+ ; VI-NEXT: v_mac_f32_e32 v5, v6, v4
735+ ; VI-NEXT: v_mad_f32 v1, -v3, v5, v1
736+ ; VI-NEXT: v_mul_f32_e32 v1, v1, v4
737+ ; VI-NEXT: v_and_b32_e32 v1, 0xff800000, v1
738+ ; VI-NEXT: v_add_f32_e32 v1, v1, v5
712739; VI-NEXT: v_cvt_f16_f32_e32 v1, v1
740+ ; VI-NEXT: v_cvt_f32_f16_e32 v4, s1
713741; VI-NEXT: v_mov_b32_e32 v3, s1
714- ; VI-NEXT: v_rcp_f32_e32 v5, v5
715742; VI-NEXT: v_div_fixup_f16 v1, v1, v2, s6
716743; VI-NEXT: v_trunc_f16_e32 v1, v1
717744; VI-NEXT: v_fma_f16 v1, -v1, v2, s6
718745; VI-NEXT: v_cvt_f32_f16_e32 v2, s3
746+ ; VI-NEXT: v_rcp_f32_e32 v5, v4
719747; VI-NEXT: v_lshlrev_b32_e32 v1, 16, v1
720748; VI-NEXT: v_or_b32_e32 v0, v0, v1
721- ; VI-NEXT: v_mul_f32_e32 v2, v2, v4
749+ ; VI-NEXT: v_mul_f32_e32 v6, v2, v5
750+ ; VI-NEXT: v_mad_f32 v7, -v4, v6, v2
751+ ; VI-NEXT: v_mac_f32_e32 v6, v7, v5
752+ ; VI-NEXT: v_mad_f32 v2, -v4, v6, v2
753+ ; VI-NEXT: v_mul_f32_e32 v2, v2, v5
754+ ; VI-NEXT: v_and_b32_e32 v2, 0xff800000, v2
755+ ; VI-NEXT: v_add_f32_e32 v2, v2, v6
722756; VI-NEXT: v_cvt_f16_f32_e32 v2, v2
757+ ; VI-NEXT: v_cvt_f32_f16_e32 v5, s9
723758; VI-NEXT: v_mov_b32_e32 v4, s9
724759; VI-NEXT: v_div_fixup_f16 v2, v2, v3, s3
725760; VI-NEXT: v_trunc_f16_e32 v2, v2
726761; VI-NEXT: v_fma_f16 v2, -v2, v3, s3
727762; VI-NEXT: v_cvt_f32_f16_e32 v3, s7
728- ; VI-NEXT: v_mul_f32_e32 v3, v3, v5
763+ ; VI-NEXT: v_rcp_f32_e32 v6, v5
764+ ; VI-NEXT: v_mul_f32_e32 v7, v3, v6
765+ ; VI-NEXT: v_mad_f32 v8, -v5, v7, v3
766+ ; VI-NEXT: v_mac_f32_e32 v7, v8, v6
767+ ; VI-NEXT: v_mad_f32 v3, -v5, v7, v3
768+ ; VI-NEXT: v_mul_f32_e32 v3, v3, v6
769+ ; VI-NEXT: v_and_b32_e32 v3, 0xff800000, v3
770+ ; VI-NEXT: v_add_f32_e32 v3, v3, v7
729771; VI-NEXT: v_cvt_f16_f32_e32 v3, v3
730772; VI-NEXT: v_div_fixup_f16 v3, v3, v4, s7
731773; VI-NEXT: v_trunc_f16_e32 v3, v3
0 commit comments