@@ -28,7 +28,6 @@ use crate::context::CodegenCx;
28
28
pub fn generic_simd_intrinsic < ' a , ' gcc , ' tcx > (
29
29
bx : & mut Builder < ' a , ' gcc , ' tcx > ,
30
30
name : Symbol ,
31
- callee_ty : Ty < ' tcx > ,
32
31
args : & [ OperandRef < ' tcx , RValue < ' gcc > > ] ,
33
32
ret_ty : Ty < ' tcx > ,
34
33
llret_ty : Type < ' gcc > ,
@@ -54,24 +53,17 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
54
53
} ;
55
54
}
56
55
57
- let tcx = bx. tcx ( ) ;
58
- let sig = tcx. normalize_erasing_late_bound_regions (
59
- ty:: TypingEnv :: fully_monomorphized ( ) ,
60
- callee_ty. fn_sig ( tcx) ,
61
- ) ;
62
- let arg_tys = sig. inputs ( ) ;
63
-
64
56
if name == sym:: simd_select_bitmask {
65
57
require_simd ! (
66
- arg_tys [ 1 ] ,
67
- InvalidMonomorphization :: SimdArgument { span, name, ty: arg_tys [ 1 ] }
58
+ args [ 1 ] . layout . ty ,
59
+ InvalidMonomorphization :: SimdArgument { span, name, ty: args [ 1 ] . layout . ty }
68
60
) ;
69
- let ( len, _) = arg_tys [ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ;
61
+ let ( len, _) = args [ 1 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
70
62
71
63
let expected_int_bits = ( len. max ( 8 ) - 1 ) . next_power_of_two ( ) ;
72
64
let expected_bytes = len / 8 + ( ( len % 8 > 0 ) as u64 ) ;
73
65
74
- let mask_ty = arg_tys [ 0 ] ;
66
+ let mask_ty = args [ 0 ] . layout . ty ;
75
67
let mut mask = match * mask_ty. kind ( ) {
76
68
ty:: Int ( i) if i. bit_width ( ) == Some ( expected_int_bits) => args[ 0 ] . immediate ( ) ,
77
69
ty:: Uint ( i) if i. bit_width ( ) == Some ( expected_int_bits) => args[ 0 ] . immediate ( ) ,
@@ -121,8 +113,11 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
121
113
}
122
114
123
115
// every intrinsic below takes a SIMD vector as its first argument
124
- require_simd ! ( arg_tys[ 0 ] , InvalidMonomorphization :: SimdInput { span, name, ty: arg_tys[ 0 ] } ) ;
125
- let in_ty = arg_tys[ 0 ] ;
116
+ require_simd ! (
117
+ args[ 0 ] . layout. ty,
118
+ InvalidMonomorphization :: SimdInput { span, name, ty: args[ 0 ] . layout. ty }
119
+ ) ;
120
+ let in_ty = args[ 0 ] . layout . ty ;
126
121
127
122
let comparison = match name {
128
123
sym:: simd_eq => Some ( BinOp :: Eq ) ,
@@ -134,7 +129,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
134
129
_ => None ,
135
130
} ;
136
131
137
- let ( in_len, in_elem) = arg_tys [ 0 ] . simd_size_and_type ( bx. tcx ( ) ) ;
132
+ let ( in_len, in_elem) = args [ 0 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
138
133
if let Some ( cmp_op) = comparison {
139
134
require_simd ! ( ret_ty, InvalidMonomorphization :: SimdReturn { span, name, ty: ret_ty } ) ;
140
135
@@ -401,13 +396,13 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
401
396
#[ cfg( feature = "master" ) ]
402
397
if name == sym:: simd_insert || name == sym:: simd_insert_dyn {
403
398
require ! (
404
- in_elem == arg_tys [ 2 ] ,
399
+ in_elem == args [ 2 ] . layout . ty ,
405
400
InvalidMonomorphization :: InsertedType {
406
401
span,
407
402
name,
408
403
in_elem,
409
404
in_ty,
410
- out_ty: arg_tys [ 2 ]
405
+ out_ty: args [ 2 ] . layout . ty
411
406
}
412
407
) ;
413
408
@@ -439,10 +434,10 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
439
434
let m_elem_ty = in_elem;
440
435
let m_len = in_len;
441
436
require_simd ! (
442
- arg_tys [ 1 ] ,
443
- InvalidMonomorphization :: SimdArgument { span, name, ty: arg_tys [ 1 ] }
437
+ args [ 1 ] . layout . ty ,
438
+ InvalidMonomorphization :: SimdArgument { span, name, ty: args [ 1 ] . layout . ty }
444
439
) ;
445
- let ( v_len, _) = arg_tys [ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ;
440
+ let ( v_len, _) = args [ 1 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
446
441
require ! (
447
442
m_len == v_len,
448
443
InvalidMonomorphization :: MismatchedLengths { span, name, m_len, v_len }
@@ -911,26 +906,26 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
911
906
// All types must be simd vector types
912
907
require_simd ! ( in_ty, InvalidMonomorphization :: SimdFirst { span, name, ty: in_ty } ) ;
913
908
require_simd ! (
914
- arg_tys [ 1 ] ,
915
- InvalidMonomorphization :: SimdSecond { span, name, ty: arg_tys [ 1 ] }
909
+ args [ 1 ] . layout . ty ,
910
+ InvalidMonomorphization :: SimdSecond { span, name, ty: args [ 1 ] . layout . ty }
916
911
) ;
917
912
require_simd ! (
918
- arg_tys [ 2 ] ,
919
- InvalidMonomorphization :: SimdThird { span, name, ty: arg_tys [ 2 ] }
913
+ args [ 2 ] . layout . ty ,
914
+ InvalidMonomorphization :: SimdThird { span, name, ty: args [ 2 ] . layout . ty }
920
915
) ;
921
916
require_simd ! ( ret_ty, InvalidMonomorphization :: SimdReturn { span, name, ty: ret_ty } ) ;
922
917
923
918
// Of the same length:
924
- let ( out_len, _) = arg_tys [ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ;
925
- let ( out_len2, _) = arg_tys [ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ;
919
+ let ( out_len, _) = args [ 1 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
920
+ let ( out_len2, _) = args [ 2 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
926
921
require ! (
927
922
in_len == out_len,
928
923
InvalidMonomorphization :: SecondArgumentLength {
929
924
span,
930
925
name,
931
926
in_len,
932
927
in_ty,
933
- arg_ty: arg_tys [ 1 ] ,
928
+ arg_ty: args [ 1 ] . layout . ty ,
934
929
out_len
935
930
}
936
931
) ;
@@ -941,7 +936,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
941
936
name,
942
937
in_len,
943
938
in_ty,
944
- arg_ty: arg_tys [ 2 ] ,
939
+ arg_ty: args [ 2 ] . layout . ty ,
945
940
out_len: out_len2
946
941
}
947
942
) ;
@@ -970,8 +965,8 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
970
965
971
966
// The second argument must be a simd vector with an element type that's a pointer
972
967
// to the element type of the first argument
973
- let ( _, element_ty0) = arg_tys [ 0 ] . simd_size_and_type ( bx. tcx ( ) ) ;
974
- let ( _, element_ty1) = arg_tys [ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ;
968
+ let ( _, element_ty0) = args [ 0 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
969
+ let ( _, element_ty1) = args [ 1 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
975
970
let ( pointer_count, underlying_ty) = match * element_ty1. kind ( ) {
976
971
ty:: RawPtr ( p_ty, _) if p_ty == in_elem => {
977
972
( ptr_count ( element_ty1) , non_ptr ( element_ty1) )
@@ -983,7 +978,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
983
978
span,
984
979
name,
985
980
expected_element: element_ty1,
986
- second_arg: arg_tys [ 1 ] ,
981
+ second_arg: args [ 1 ] . layout . ty ,
987
982
in_elem,
988
983
in_ty,
989
984
mutability: ExpectedPointerMutability :: Not ,
@@ -998,7 +993,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
998
993
999
994
// The element type of the third argument must be an integer type of any width:
1000
995
// TODO: also support unsigned integers.
1001
- let ( _, element_ty2) = arg_tys [ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ;
996
+ let ( _, element_ty2) = args [ 2 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
1002
997
match * element_ty2. kind ( ) {
1003
998
ty:: Int ( _) => ( ) ,
1004
999
_ => {
@@ -1030,25 +1025,25 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
1030
1025
// All types must be simd vector types
1031
1026
require_simd ! ( in_ty, InvalidMonomorphization :: SimdFirst { span, name, ty: in_ty } ) ;
1032
1027
require_simd ! (
1033
- arg_tys [ 1 ] ,
1034
- InvalidMonomorphization :: SimdSecond { span, name, ty: arg_tys [ 1 ] }
1028
+ args [ 1 ] . layout . ty ,
1029
+ InvalidMonomorphization :: SimdSecond { span, name, ty: args [ 1 ] . layout . ty }
1035
1030
) ;
1036
1031
require_simd ! (
1037
- arg_tys [ 2 ] ,
1038
- InvalidMonomorphization :: SimdThird { span, name, ty: arg_tys [ 2 ] }
1032
+ args [ 2 ] . layout . ty ,
1033
+ InvalidMonomorphization :: SimdThird { span, name, ty: args [ 2 ] . layout . ty }
1039
1034
) ;
1040
1035
1041
1036
// Of the same length:
1042
- let ( element_len1, _) = arg_tys [ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ;
1043
- let ( element_len2, _) = arg_tys [ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ;
1037
+ let ( element_len1, _) = args [ 1 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
1038
+ let ( element_len2, _) = args [ 2 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
1044
1039
require ! (
1045
1040
in_len == element_len1,
1046
1041
InvalidMonomorphization :: SecondArgumentLength {
1047
1042
span,
1048
1043
name,
1049
1044
in_len,
1050
1045
in_ty,
1051
- arg_ty: arg_tys [ 1 ] ,
1046
+ arg_ty: args [ 1 ] . layout . ty ,
1052
1047
out_len: element_len1
1053
1048
}
1054
1049
) ;
@@ -1059,7 +1054,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
1059
1054
name,
1060
1055
in_len,
1061
1056
in_ty,
1062
- arg_ty: arg_tys [ 2 ] ,
1057
+ arg_ty: args [ 2 ] . layout . ty ,
1063
1058
out_len: element_len2
1064
1059
}
1065
1060
) ;
@@ -1082,9 +1077,9 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
1082
1077
1083
1078
// The second argument must be a simd vector with an element type that's a pointer
1084
1079
// to the element type of the first argument
1085
- let ( _, element_ty0) = arg_tys [ 0 ] . simd_size_and_type ( bx. tcx ( ) ) ;
1086
- let ( _, element_ty1) = arg_tys [ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ;
1087
- let ( _, element_ty2) = arg_tys [ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ;
1080
+ let ( _, element_ty0) = args [ 0 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
1081
+ let ( _, element_ty1) = args [ 1 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
1082
+ let ( _, element_ty2) = args [ 2 ] . layout . ty . simd_size_and_type ( bx. tcx ( ) ) ;
1088
1083
let ( pointer_count, underlying_ty) = match * element_ty1. kind ( ) {
1089
1084
ty:: RawPtr ( p_ty, mutbl) if p_ty == in_elem && mutbl == hir:: Mutability :: Mut => {
1090
1085
( ptr_count ( element_ty1) , non_ptr ( element_ty1) )
@@ -1096,7 +1091,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
1096
1091
span,
1097
1092
name,
1098
1093
expected_element: element_ty1,
1099
- second_arg: arg_tys [ 1 ] ,
1094
+ second_arg: args [ 1 ] . layout . ty ,
1100
1095
in_elem,
1101
1096
in_ty,
1102
1097
mutability: ExpectedPointerMutability :: Mut ,
@@ -1194,8 +1189,8 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
1194
1189
return_error ! ( InvalidMonomorphization :: ExpectedVectorElementType {
1195
1190
span,
1196
1191
name,
1197
- expected_element: arg_tys [ 0 ] . simd_size_and_type( bx. tcx( ) ) . 1 ,
1198
- vector_type: arg_tys [ 0 ] ,
1192
+ expected_element: args [ 0 ] . layout . ty . simd_size_and_type( bx. tcx( ) ) . 1 ,
1193
+ vector_type: args [ 0 ] . layout . ty ,
1199
1194
} ) ;
1200
1195
}
1201
1196
} ;
0 commit comments