@@ -1460,26 +1460,99 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
1460
1460
unimplemented ! ( ) ;
1461
1461
}
1462
1462
1463
+ #[ cfg( feature="master" ) ]
1464
+ pub fn vector_reduce_fadd ( & mut self , acc : RValue < ' gcc > , src : RValue < ' gcc > ) -> RValue < ' gcc > {
1465
+ let vector_type = src. get_type ( ) . unqualified ( ) . dyncast_vector ( ) . expect ( "vector type" ) ;
1466
+ let element_count = vector_type. get_num_units ( ) ;
1467
+ ( 0 ..element_count) . into_iter ( )
1468
+ . map ( |i| self . context
1469
+ . new_vector_access ( None , src, self . context . new_rvalue_from_int ( self . int_type , i as _ ) )
1470
+ . to_rvalue ( ) )
1471
+ . fold ( acc, |x, i| x + i)
1472
+ }
1473
+
1474
+ #[ cfg( not( feature="master" ) ) ]
1475
+ pub fn vector_reduce_fadd ( & mut self , _acc : RValue < ' gcc > , _src : RValue < ' gcc > ) -> RValue < ' gcc > {
1476
+ unimplemented ! ( ) ;
1477
+ }
1478
+
1463
1479
pub fn vector_reduce_fmul_fast ( & mut self , _acc : RValue < ' gcc > , _src : RValue < ' gcc > ) -> RValue < ' gcc > {
1464
1480
unimplemented ! ( ) ;
1465
1481
}
1466
1482
1483
+ #[ cfg( feature="master" ) ]
1484
+ pub fn vector_reduce_fmul ( & mut self , acc : RValue < ' gcc > , src : RValue < ' gcc > ) -> RValue < ' gcc > {
1485
+ let vector_type = src. get_type ( ) . unqualified ( ) . dyncast_vector ( ) . expect ( "vector type" ) ;
1486
+ let element_count = vector_type. get_num_units ( ) ;
1487
+ ( 0 ..element_count) . into_iter ( )
1488
+ . map ( |i| self . context
1489
+ . new_vector_access ( None , src, self . context . new_rvalue_from_int ( self . int_type , i as _ ) )
1490
+ . to_rvalue ( ) )
1491
+ . fold ( acc, |x, i| x * i)
1492
+ }
1493
+
1494
+ #[ cfg( not( feature="master" ) ) ]
1495
+ pub fn vector_reduce_fmul ( & mut self , _acc : RValue < ' gcc > , _src : RValue < ' gcc > ) -> RValue < ' gcc > {
1496
+ unimplemented ! ( )
1497
+ }
1498
+
1467
1499
// Inspired by Hacker's Delight min implementation.
1468
1500
pub fn vector_reduce_min ( & mut self , src : RValue < ' gcc > ) -> RValue < ' gcc > {
1469
1501
self . vector_reduce ( src, |a, b, context| {
1470
1502
let differences_or_zeros = difference_or_zero ( a, b, context) ;
1471
- context. new_binary_op ( None , BinaryOp :: Minus , a . get_type ( ) , a , differences_or_zeros)
1503
+ context. new_binary_op ( None , BinaryOp :: Plus , b . get_type ( ) , b , differences_or_zeros)
1472
1504
} )
1473
1505
}
1474
1506
1475
1507
// Inspired by Hacker's Delight max implementation.
1476
1508
pub fn vector_reduce_max ( & mut self , src : RValue < ' gcc > ) -> RValue < ' gcc > {
1477
1509
self . vector_reduce ( src, |a, b, context| {
1478
1510
let differences_or_zeros = difference_or_zero ( a, b, context) ;
1479
- context. new_binary_op ( None , BinaryOp :: Plus , b . get_type ( ) , b , differences_or_zeros)
1511
+ context. new_binary_op ( None , BinaryOp :: Minus , a . get_type ( ) , a , differences_or_zeros)
1480
1512
} )
1481
1513
}
1482
1514
1515
+ #[ cfg( feature="master" ) ]
1516
+ pub fn vector_reduce_fmin ( & mut self , src : RValue < ' gcc > ) -> RValue < ' gcc > {
1517
+ let vector_type = src. get_type ( ) . unqualified ( ) . dyncast_vector ( ) . expect ( "vector type" ) ;
1518
+ let element_count = vector_type. get_num_units ( ) ;
1519
+ let mut acc = self . context . new_vector_access ( None , src, self . context . new_rvalue_zero ( self . int_type ) ) . to_rvalue ( ) ;
1520
+ for i in 1 ..element_count {
1521
+ let elem = self . context
1522
+ . new_vector_access ( None , src, self . context . new_rvalue_from_int ( self . int_type , i as _ ) )
1523
+ . to_rvalue ( ) ;
1524
+ let cmp = self . context . new_comparison ( None , ComparisonOp :: LessThan , acc, elem) ;
1525
+ acc = self . select ( cmp, acc, elem) ;
1526
+ }
1527
+ acc
1528
+ }
1529
+
1530
+ #[ cfg( not( feature="master" ) ) ]
1531
+ pub fn vector_reduce_fmin ( & mut self , _src : RValue < ' gcc > ) -> RValue < ' gcc > {
1532
+ unimplemented ! ( ) ;
1533
+ }
1534
+
1535
+ #[ cfg( feature="master" ) ]
1536
+ pub fn vector_reduce_fmax ( & mut self , src : RValue < ' gcc > ) -> RValue < ' gcc > {
1537
+ let vector_type = src. get_type ( ) . unqualified ( ) . dyncast_vector ( ) . expect ( "vector type" ) ;
1538
+ let element_count = vector_type. get_num_units ( ) ;
1539
+ let mut acc = self . context . new_vector_access ( None , src, self . context . new_rvalue_zero ( self . int_type ) ) . to_rvalue ( ) ;
1540
+ for i in 1 ..element_count {
1541
+ let elem = self . context
1542
+ . new_vector_access ( None , src, self . context . new_rvalue_from_int ( self . int_type , i as _ ) )
1543
+ . to_rvalue ( ) ;
1544
+ let cmp = self . context . new_comparison ( None , ComparisonOp :: GreaterThan , acc, elem) ;
1545
+ acc = self . select ( cmp, acc, elem) ;
1546
+ }
1547
+ acc
1548
+ }
1549
+
1550
+ #[ cfg( not( feature="master" ) ) ]
1551
+ pub fn vector_reduce_fmax ( & mut self , _src : RValue < ' gcc > ) -> RValue < ' gcc > {
1552
+ unimplemented ! ( ) ;
1553
+ }
1554
+
1555
+
1483
1556
pub fn vector_select ( & mut self , cond : RValue < ' gcc > , then_val : RValue < ' gcc > , else_val : RValue < ' gcc > ) -> RValue < ' gcc > {
1484
1557
// cond is a vector of integers, not of bools.
1485
1558
let cond_type = cond. get_type ( ) ;
0 commit comments