@@ -955,6 +955,147 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
955955 }
956956 }
957957
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+
9581099 pub fn extract_value ( & self , agg_val : ValueRef , idx : u64 ) -> ValueRef {
9591100 self . count_insn ( "extractvalue" ) ;
9601101 assert_eq ! ( idx as c_uint as u64 , idx) ;
0 commit comments