@@ -1518,14 +1518,13 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
1518
1518
pub ( crate ) fn set_unpredictable ( & mut self , inst : & ' ll Value ) {
1519
1519
self . set_metadata_node ( inst, llvm:: MD_unpredictable , & [ ] ) ;
1520
1520
}
1521
- }
1522
- impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
1521
+
1523
1522
pub ( crate ) fn minnum ( & mut self , lhs : & ' ll Value , rhs : & ' ll Value ) -> & ' ll Value {
1524
- unsafe { llvm :: LLVMRustBuildMinNum ( self . llbuilder , lhs, rhs) }
1523
+ self . call_intrinsic ( "llvm.minnum" , & [ self . val_ty ( lhs ) ] , & [ lhs, rhs] )
1525
1524
}
1526
1525
1527
1526
pub ( crate ) fn maxnum ( & mut self , lhs : & ' ll Value , rhs : & ' ll Value ) -> & ' ll Value {
1528
- unsafe { llvm :: LLVMRustBuildMaxNum ( self . llbuilder , lhs, rhs) }
1527
+ self . call_intrinsic ( "llvm.maxnum" , & [ self . val_ty ( lhs ) ] , & [ lhs, rhs] )
1529
1528
}
1530
1529
1531
1530
pub ( crate ) fn insert_element (
@@ -1547,65 +1546,84 @@ impl<'a, 'll, CX: Borrow<SCx<'ll>>> GenericBuilder<'a, 'll, CX> {
1547
1546
}
1548
1547
1549
1548
pub ( crate ) fn vector_reduce_fadd ( & mut self , acc : & ' ll Value , src : & ' ll Value ) -> & ' ll Value {
1550
- unsafe { llvm :: LLVMRustBuildVectorReduceFAdd ( self . llbuilder , acc, src) }
1549
+ self . call_intrinsic ( "llvm.vector.reduce.fadd" , & [ self . val_ty ( src ) ] , & [ acc, src] )
1551
1550
}
1551
+
1552
1552
pub ( crate ) fn vector_reduce_fmul ( & mut self , acc : & ' ll Value , src : & ' ll Value ) -> & ' ll Value {
1553
- unsafe { llvm :: LLVMRustBuildVectorReduceFMul ( self . llbuilder , acc, src) }
1553
+ self . call_intrinsic ( "llvm.vector.reduce.fmul" , & [ self . val_ty ( src ) ] , & [ acc, src] )
1554
1554
}
1555
+
1555
1556
pub ( crate ) fn vector_reduce_fadd_reassoc (
1556
1557
& mut self ,
1557
1558
acc : & ' ll Value ,
1558
1559
src : & ' ll Value ,
1559
1560
) -> & ' ll Value {
1560
1561
unsafe {
1561
- let instr = llvm:: LLVMRustBuildVectorReduceFAdd ( self . llbuilder , acc, src) ;
1562
+ let instr =
1563
+ self . call_intrinsic ( "llvm.vector.reduce.fadd" , & [ self . val_ty ( src) ] , & [ acc, src] ) ;
1562
1564
llvm:: LLVMRustSetAllowReassoc ( instr) ;
1563
1565
instr
1564
1566
}
1565
1567
}
1568
+
1566
1569
pub ( crate ) fn vector_reduce_fmul_reassoc (
1567
1570
& mut self ,
1568
1571
acc : & ' ll Value ,
1569
1572
src : & ' ll Value ,
1570
1573
) -> & ' ll Value {
1571
1574
unsafe {
1572
- let instr = llvm:: LLVMRustBuildVectorReduceFMul ( self . llbuilder , acc, src) ;
1575
+ let instr =
1576
+ self . call_intrinsic ( "llvm.vector.reduce.fmul" , & [ self . val_ty ( src) ] , & [ acc, src] ) ;
1573
1577
llvm:: LLVMRustSetAllowReassoc ( instr) ;
1574
1578
instr
1575
1579
}
1576
1580
}
1581
+
1577
1582
pub ( crate ) fn vector_reduce_add ( & mut self , src : & ' ll Value ) -> & ' ll Value {
1578
- unsafe { llvm :: LLVMRustBuildVectorReduceAdd ( self . llbuilder , src) }
1583
+ self . call_intrinsic ( "llvm.vector.reduce.add" , & [ self . val_ty ( src) ] , & [ src ] )
1579
1584
}
1585
+
1580
1586
pub ( crate ) fn vector_reduce_mul ( & mut self , src : & ' ll Value ) -> & ' ll Value {
1581
- unsafe { llvm :: LLVMRustBuildVectorReduceMul ( self . llbuilder , src) }
1587
+ self . call_intrinsic ( "llvm.vector.reduce.mul" , & [ self . val_ty ( src) ] , & [ src ] )
1582
1588
}
1589
+
1583
1590
pub ( crate ) fn vector_reduce_and ( & mut self , src : & ' ll Value ) -> & ' ll Value {
1584
- unsafe { llvm :: LLVMRustBuildVectorReduceAnd ( self . llbuilder , src) }
1591
+ self . call_intrinsic ( "llvm.vector.reduce.and" , & [ self . val_ty ( src) ] , & [ src ] )
1585
1592
}
1593
+
1586
1594
pub ( crate ) fn vector_reduce_or ( & mut self , src : & ' ll Value ) -> & ' ll Value {
1587
- unsafe { llvm :: LLVMRustBuildVectorReduceOr ( self . llbuilder , src) }
1595
+ self . call_intrinsic ( "llvm.vector.reduce.or" , & [ self . val_ty ( src) ] , & [ src ] )
1588
1596
}
1597
+
1589
1598
pub ( crate ) fn vector_reduce_xor ( & mut self , src : & ' ll Value ) -> & ' ll Value {
1590
- unsafe { llvm :: LLVMRustBuildVectorReduceXor ( self . llbuilder , src) }
1599
+ self . call_intrinsic ( "llvm.vector.reduce.xor" , & [ self . val_ty ( src) ] , & [ src ] )
1591
1600
}
1601
+
1592
1602
pub ( crate ) fn vector_reduce_fmin ( & mut self , src : & ' ll Value ) -> & ' ll Value {
1593
- unsafe {
1594
- llvm:: LLVMRustBuildVectorReduceFMin ( self . llbuilder , src, /*NoNaNs:*/ false )
1595
- }
1603
+ self . call_intrinsic ( "llvm.vector.reduce.fmin" , & [ self . val_ty ( src) ] , & [ src] )
1596
1604
}
1605
+
1597
1606
pub ( crate ) fn vector_reduce_fmax ( & mut self , src : & ' ll Value ) -> & ' ll Value {
1598
- unsafe {
1599
- llvm:: LLVMRustBuildVectorReduceFMax ( self . llbuilder , src, /*NoNaNs:*/ false )
1600
- }
1607
+ self . call_intrinsic ( "llvm.vector.reduce.fmax" , & [ self . val_ty ( src) ] , & [ src] )
1601
1608
}
1609
+
1602
1610
pub ( crate ) fn vector_reduce_min ( & mut self , src : & ' ll Value , is_signed : bool ) -> & ' ll Value {
1603
- unsafe { llvm:: LLVMRustBuildVectorReduceMin ( self . llbuilder , src, is_signed) }
1611
+ self . call_intrinsic (
1612
+ if is_signed { "llvm.vector.reduce.smin" } else { "llvm.vector.reduce.umin" } ,
1613
+ & [ self . val_ty ( src) ] ,
1614
+ & [ src] ,
1615
+ )
1604
1616
}
1617
+
1605
1618
pub ( crate ) fn vector_reduce_max ( & mut self , src : & ' ll Value , is_signed : bool ) -> & ' ll Value {
1606
- unsafe { llvm:: LLVMRustBuildVectorReduceMax ( self . llbuilder , src, is_signed) }
1619
+ self . call_intrinsic (
1620
+ if is_signed { "llvm.vector.reduce.smax" } else { "llvm.vector.reduce.umax" } ,
1621
+ & [ self . val_ty ( src) ] ,
1622
+ & [ src] ,
1623
+ )
1607
1624
}
1608
-
1625
+ }
1626
+ impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
1609
1627
pub ( crate ) fn add_clause ( & mut self , landing_pad : & ' ll Value , clause : & ' ll Value ) {
1610
1628
unsafe {
1611
1629
llvm:: LLVMAddClause ( landing_pad, clause) ;
0 commit comments