@@ -213,7 +213,7 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
213
213
214
214
let actual_ty = actual_val. get_type ( ) ;
215
215
if expected_ty != actual_ty {
216
- if !actual_ty. is_vector ( ) && !expected_ty. is_vector ( ) && actual_ty. is_integral ( ) && expected_ty. is_integral ( ) && actual_ty . get_size ( ) != expected_ty . get_size ( ) {
216
+ if !actual_ty. is_vector ( ) && !expected_ty. is_vector ( ) && actual_ty. is_integral ( ) && expected_ty. is_integral ( ) {
217
217
self . context . new_cast ( None , actual_val, expected_ty)
218
218
}
219
219
else if on_stack_param_indices. contains ( & index) {
@@ -275,21 +275,25 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
275
275
}
276
276
277
277
fn function_ptr_call ( & mut self , func_ptr : RValue < ' gcc > , args : & [ RValue < ' gcc > ] , _funclet : Option < & Funclet > ) -> RValue < ' gcc > {
278
- let args = self . check_ptr_call ( "call" , func_ptr, args) ;
278
+ let gcc_func = func_ptr. get_type ( ) . dyncast_function_ptr_type ( ) . expect ( "function ptr" ) ;
279
+ let func_name = format ! ( "{:?}" , func_ptr) ;
280
+ let previous_arg_count = args. len ( ) ;
281
+ let args = llvm:: adjust_intrinsic_arguments ( & self , gcc_func, args. into ( ) , & func_name) ;
282
+ let args_adjusted = args. len ( ) != previous_arg_count;
283
+ let args = self . check_ptr_call ( "call" , func_ptr, & * args) ;
279
284
280
285
// gccjit requires to use the result of functions, even when it's not used.
281
286
// That's why we assign the result to a local or call add_eval().
282
- let gcc_func = func_ptr. get_type ( ) . dyncast_function_ptr_type ( ) . expect ( "function ptr" ) ;
283
287
let return_type = gcc_func. get_return_type ( ) ;
284
288
let void_type = self . context . new_type :: < ( ) > ( ) ;
285
289
let current_func = self . block . get_function ( ) ;
286
290
287
291
if return_type != void_type {
288
292
unsafe { RETURN_VALUE_COUNT += 1 } ;
289
- let result = current_func . new_local ( None , return_type , & format ! ( "ptrReturnValue{}" , unsafe { RETURN_VALUE_COUNT } ) ) ;
290
- let func_name = format ! ( "{:?}" , func_ptr ) ;
291
- let args = llvm :: adjust_intrinsic_arguments ( & self , gcc_func , args , & func_name ) ;
292
- self . block . add_assignment ( None , result, self . cx . context . new_call_through_ptr ( None , func_ptr , & args ) ) ;
293
+ let return_value = self . cx . context . new_call_through_ptr ( None , func_ptr , & args ) ;
294
+ let return_value = llvm :: adjust_intrinsic_return_value ( & self , return_value , & func_name , & args , args_adjusted ) ;
295
+ let result = current_func . new_local ( None , return_value . get_type ( ) , & format ! ( "ptrReturnValue{}" , unsafe { RETURN_VALUE_COUNT } ) ) ;
296
+ self . block . add_assignment ( None , result, return_value ) ;
293
297
result. to_rvalue ( )
294
298
}
295
299
else {
@@ -1386,18 +1390,20 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
1386
1390
where F : Fn ( RValue < ' gcc > , RValue < ' gcc > , & ' gcc Context < ' gcc > ) -> RValue < ' gcc >
1387
1391
{
1388
1392
let vector_type = src. get_type ( ) . unqualified ( ) . dyncast_vector ( ) . expect ( "vector type" ) ;
1393
+ let element_type = vector_type. get_element_type ( ) ;
1394
+ let mask_element_type = self . type_ix ( element_type. get_size ( ) as u64 * 8 ) ;
1389
1395
let element_count = vector_type. get_num_units ( ) ;
1390
1396
let mut vector_elements = vec ! [ ] ;
1391
1397
for i in 0 ..element_count {
1392
1398
vector_elements. push ( i) ;
1393
1399
}
1394
- let mask_type = self . context . new_vector_type ( self . int_type , element_count as u64 ) ;
1400
+ let mask_type = self . context . new_vector_type ( mask_element_type , element_count as u64 ) ;
1395
1401
let mut shift = 1 ;
1396
1402
let mut res = src;
1397
1403
while shift < element_count {
1398
1404
let vector_elements: Vec < _ > =
1399
1405
vector_elements. iter ( )
1400
- . map ( |i| self . context . new_rvalue_from_int ( self . int_type , ( ( i + shift) % element_count) as i32 ) )
1406
+ . map ( |i| self . context . new_rvalue_from_int ( mask_element_type , ( ( i + shift) % element_count) as i32 ) )
1401
1407
. collect ( ) ;
1402
1408
let mask = self . context . new_rvalue_from_vector ( None , mask_type, & vector_elements) ;
1403
1409
let shifted = self . context . new_rvalue_vector_perm ( None , res, res, mask) ;
@@ -1409,7 +1415,7 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
1409
1415
}
1410
1416
1411
1417
#[ cfg( not( feature="master" ) ) ]
1412
- pub fn vector_reduce < F > ( & mut self , src : RValue < ' gcc > , op : F ) -> RValue < ' gcc >
1418
+ pub fn vector_reduce < F > ( & mut self , _src : RValue < ' gcc > , _op : F ) -> RValue < ' gcc >
1413
1419
where F : Fn ( RValue < ' gcc > , RValue < ' gcc > , & ' gcc Context < ' gcc > ) -> RValue < ' gcc >
1414
1420
{
1415
1421
unimplemented ! ( ) ;
0 commit comments