@@ -856,3 +856,68 @@ define <2 x float> @fma_unary_shuffle_ops_uses(<2 x float> %x, <2 x float> %y, <
856
856
%r = call <2 x float > @llvm.fma.v2f32 (<2 x float > %a , <2 x float > %b , <2 x float > %c )
857
857
ret <2 x float > %r
858
858
}
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