@@ -856,3 +856,68 @@ define <2 x float> @fma_unary_shuffle_ops_uses(<2 x float> %x, <2 x float> %y, <
856856 %r = call <2 x float > @llvm.fma.v2f32 (<2 x float > %a , <2 x float > %b , <2 x float > %c )
857857 ret <2 x float > %r
858858}
859+
860+ define half @fma_negone (half %x , half %y ) {
861+ ; CHECK-LABEL: @fma_negone(
862+ ; CHECK-NEXT: [[SUB:%.*]] = fsub half [[Y:%.*]], [[X:%.*]]
863+ ; CHECK-NEXT: ret half [[SUB]]
864+ ;
865+ %sub = call half @llvm.fma.f16 (half %x , half -1 .0 , half %y )
866+ ret half %sub
867+ }
868+
869+ define half @fmuladd_negone (half %x , half %y ) {
870+ ; CHECK-LABEL: @fmuladd_negone(
871+ ; CHECK-NEXT: [[SUB:%.*]] = fsub half [[Y:%.*]], [[X:%.*]]
872+ ; CHECK-NEXT: ret half [[SUB]]
873+ ;
874+ %sub = call half @llvm.fmuladd.f16 (half %x , half -1 .0 , half %y )
875+ ret half %sub
876+ }
877+
878+ define half @fma_negone_fmf (half %x , half %y ) {
879+ ; CHECK-LABEL: @fma_negone_fmf(
880+ ; CHECK-NEXT: [[SUB:%.*]] = fsub nnan ninf nsz half [[Y:%.*]], [[X:%.*]]
881+ ; CHECK-NEXT: ret half [[SUB]]
882+ ;
883+ %sub = call nnan ninf nsz half @llvm.fma.f16 (half %x , half -1 .0 , half %y )
884+ ret half %sub
885+ }
886+
887+ define half @fmuladd_negone_fmf (half %x , half %y ) {
888+ ; CHECK-LABEL: @fmuladd_negone_fmf(
889+ ; CHECK-NEXT: [[SUB:%.*]] = fsub nnan ninf nsz half [[Y:%.*]], [[X:%.*]]
890+ ; CHECK-NEXT: ret half [[SUB]]
891+ ;
892+ %sub = call nnan ninf nsz half @llvm.fmuladd.f16 (half %x , half -1 .0 , half %y )
893+ ret half %sub
894+ }
895+
896+ define <2 x half > @fma_negone_vec (<2 x half > %x , <2 x half > %y ) {
897+ ; CHECK-LABEL: @fma_negone_vec(
898+ ; CHECK-NEXT: [[SUB:%.*]] = fsub <2 x half> [[Y:%.*]], [[X:%.*]]
899+ ; CHECK-NEXT: ret <2 x half> [[SUB]]
900+ ;
901+ %sub = call <2 x half > @llvm.fma.v2f16 (<2 x half > %x , <2 x half > splat(half -1 .0 ), <2 x half > %y )
902+ ret <2 x half > %sub
903+ }
904+
905+ define <2 x half > @fma_negone_vec_partial_undef (<2 x half > %x , <2 x half > %y ) {
906+ ; CHECK-LABEL: @fma_negone_vec_partial_undef(
907+ ; CHECK-NEXT: [[SUB:%.*]] = call <2 x half> @llvm.fma.v2f16(<2 x half> [[X:%.*]], <2 x half> <half undef, half 0xHBC00>, <2 x half> [[Y:%.*]])
908+ ; CHECK-NEXT: ret <2 x half> [[SUB]]
909+ ;
910+ %sub = call <2 x half > @llvm.fma.v2f16 (<2 x half > %x , <2 x half > <half undef , half -1 .0 >, <2 x half > %y )
911+ ret <2 x half > %sub
912+ }
913+
914+ ; negative tests
915+
916+ define half @fma_non_negone (half %x , half %y ) {
917+ ; CHECK-LABEL: @fma_non_negone(
918+ ; CHECK-NEXT: [[SUB:%.*]] = call half @llvm.fma.f16(half [[X:%.*]], half 0xHBE00, half [[Y:%.*]])
919+ ; CHECK-NEXT: ret half [[SUB]]
920+ ;
921+ %sub = call half @llvm.fma.f16 (half %x , half -1 .5 , half %y )
922+ ret half %sub
923+ }
0 commit comments