@@ -955,6 +955,147 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
955
955
}
956
956
}
957
957
958
+ pub fn vector_reduce_fadd_fast ( & self , acc : ValueRef , src : ValueRef ) -> ValueRef {
959
+ self . count_insn ( "vector.reduce.fadd_fast" ) ;
960
+ unsafe {
961
+ // FIXME: add a non-fast math version once
962
+ // https://bugs.llvm.org/show_bug.cgi?id=36732
963
+ // is fixed.
964
+ let instr = llvm:: LLVMRustBuildVectorReduceFAdd ( self . llbuilder , acc, src) ;
965
+ if instr. is_null ( ) {
966
+ bug ! ( "LLVMRustBuildVectorReduceFAdd is not available in LLVM version < 5.0" ) ;
967
+ }
968
+ llvm:: LLVMRustSetHasUnsafeAlgebra ( instr) ;
969
+ instr
970
+ }
971
+ }
972
+ pub fn vector_reduce_fmul_fast ( & self , acc : ValueRef , src : ValueRef ) -> ValueRef {
973
+ self . count_insn ( "vector.reduce.fmul_fast" ) ;
974
+ unsafe {
975
+ // FIXME: add a non-fast math version once
976
+ // https://bugs.llvm.org/show_bug.cgi?id=36732
977
+ // is fixed.
978
+ let instr = llvm:: LLVMRustBuildVectorReduceFMul ( self . llbuilder , acc, src) ;
979
+ if instr. is_null ( ) {
980
+ bug ! ( "LLVMRustBuildVectorReduceFMul is not available in LLVM version < 5.0" ) ;
981
+ }
982
+ llvm:: LLVMRustSetHasUnsafeAlgebra ( instr) ;
983
+ instr
984
+ }
985
+ }
986
+ pub fn vector_reduce_add ( & self , src : ValueRef ) -> ValueRef {
987
+ self . count_insn ( "vector.reduce.add" ) ;
988
+ unsafe {
989
+ let instr = llvm:: LLVMRustBuildVectorReduceAdd ( self . llbuilder , src) ;
990
+ if instr. is_null ( ) {
991
+ bug ! ( "LLVMRustBuildVectorReduceAdd is not available in LLVM version < 5.0" ) ;
992
+ }
993
+ instr
994
+ }
995
+ }
996
+ pub fn vector_reduce_mul ( & self , src : ValueRef ) -> ValueRef {
997
+ self . count_insn ( "vector.reduce.mul" ) ;
998
+ unsafe {
999
+ let instr = llvm:: LLVMRustBuildVectorReduceMul ( self . llbuilder , src) ;
1000
+ if instr. is_null ( ) {
1001
+ bug ! ( "LLVMRustBuildVectorReduceMul is not available in LLVM version < 5.0" ) ;
1002
+ }
1003
+ instr
1004
+ }
1005
+ }
1006
+ pub fn vector_reduce_and ( & self , src : ValueRef ) -> ValueRef {
1007
+ self . count_insn ( "vector.reduce.and" ) ;
1008
+ unsafe {
1009
+ let instr = llvm:: LLVMRustBuildVectorReduceAnd ( self . llbuilder , src) ;
1010
+ if instr. is_null ( ) {
1011
+ bug ! ( "LLVMRustBuildVectorReduceAnd is not available in LLVM version < 5.0" ) ;
1012
+ }
1013
+ instr
1014
+ }
1015
+ }
1016
+ pub fn vector_reduce_or ( & self , src : ValueRef ) -> ValueRef {
1017
+ self . count_insn ( "vector.reduce.or" ) ;
1018
+ unsafe {
1019
+ let instr = llvm:: LLVMRustBuildVectorReduceOr ( self . llbuilder , src) ;
1020
+ if instr. is_null ( ) {
1021
+ bug ! ( "LLVMRustBuildVectorReduceOr is not available in LLVM version < 5.0" ) ;
1022
+ }
1023
+ instr
1024
+ }
1025
+ }
1026
+ pub fn vector_reduce_xor ( & self , src : ValueRef ) -> ValueRef {
1027
+ self . count_insn ( "vector.reduce.xor" ) ;
1028
+ unsafe {
1029
+ let instr = llvm:: LLVMRustBuildVectorReduceXor ( self . llbuilder , src) ;
1030
+ if instr. is_null ( ) {
1031
+ bug ! ( "LLVMRustBuildVectorReduceXor is not available in LLVM version < 5.0" ) ;
1032
+ }
1033
+ instr
1034
+ }
1035
+ }
1036
+ pub fn vector_reduce_fmin ( & self , src : ValueRef ) -> ValueRef {
1037
+ self . count_insn ( "vector.reduce.fmin" ) ;
1038
+ unsafe {
1039
+ let instr = llvm:: LLVMRustBuildVectorReduceFMin ( self . llbuilder , src, true ) ;
1040
+ if instr. is_null ( ) {
1041
+ bug ! ( "LLVMRustBuildVectorReduceFMin is not available in LLVM version < 5.0" ) ;
1042
+ }
1043
+ instr
1044
+ }
1045
+ }
1046
+ pub fn vector_reduce_fmax ( & self , src : ValueRef ) -> ValueRef {
1047
+ self . count_insn ( "vector.reduce.fmax" ) ;
1048
+ unsafe {
1049
+ let instr = llvm:: LLVMRustBuildVectorReduceFMax ( self . llbuilder , src, true ) ;
1050
+ if instr. is_null ( ) {
1051
+ bug ! ( "LLVMRustBuildVectorReduceFMax is not available in LLVM version < 5.0" ) ;
1052
+ }
1053
+ instr
1054
+ }
1055
+ }
1056
+ pub fn vector_reduce_fmin_fast ( & self , src : ValueRef ) -> ValueRef {
1057
+ self . count_insn ( "vector.reduce.fmin_fast" ) ;
1058
+ unsafe {
1059
+ let instr = llvm:: LLVMRustBuildVectorReduceFMin ( self . llbuilder , src, false ) ;
1060
+ if instr. is_null ( ) {
1061
+ bug ! ( "LLVMRustBuildVectorReduceFMin is not available in LLVM version < 5.0" ) ;
1062
+ }
1063
+ llvm:: LLVMRustSetHasUnsafeAlgebra ( instr) ;
1064
+ instr
1065
+ }
1066
+ }
1067
+ pub fn vector_reduce_fmax_fast ( & self , src : ValueRef ) -> ValueRef {
1068
+ self . count_insn ( "vector.reduce.fmax_fast" ) ;
1069
+ unsafe {
1070
+ let instr = llvm:: LLVMRustBuildVectorReduceFMax ( self . llbuilder , src, false ) ;
1071
+ if instr. is_null ( ) {
1072
+ bug ! ( "LLVMRustBuildVectorReduceFMax is not available in LLVM version < 5.0" ) ;
1073
+ }
1074
+ llvm:: LLVMRustSetHasUnsafeAlgebra ( instr) ;
1075
+ instr
1076
+ }
1077
+ }
1078
+ pub fn vector_reduce_min ( & self , src : ValueRef , is_signed : bool ) -> ValueRef {
1079
+ self . count_insn ( "vector.reduce.min" ) ;
1080
+ unsafe {
1081
+ let instr = llvm:: LLVMRustBuildVectorReduceMin ( self . llbuilder , src, is_signed) ;
1082
+ if instr. is_null ( ) {
1083
+ bug ! ( "LLVMRustBuildVectorReduceMin is not available in LLVM version < 5.0" ) ;
1084
+ }
1085
+ instr
1086
+ }
1087
+ }
1088
+ pub fn vector_reduce_max ( & self , src : ValueRef , is_signed : bool ) -> ValueRef {
1089
+ self . count_insn ( "vector.reduce.max" ) ;
1090
+ unsafe {
1091
+ let instr = llvm:: LLVMRustBuildVectorReduceMax ( self . llbuilder , src, is_signed) ;
1092
+ if instr. is_null ( ) {
1093
+ bug ! ( "LLVMRustBuildVectorReduceMax is not available in LLVM version < 5.0" ) ;
1094
+ }
1095
+ instr
1096
+ }
1097
+ }
1098
+
958
1099
pub fn extract_value ( & self , agg_val : ValueRef , idx : u64 ) -> ValueRef {
959
1100
self . count_insn ( "extractvalue" ) ;
960
1101
assert_eq ! ( idx as c_uint as u64 , idx) ;
0 commit comments