@@ -2089,65 +2089,72 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
2089
2089
return Ok ( args[ 0 ] . immediate ( ) ) ;
2090
2090
}
2091
2091
2092
+ #[ derive( Copy , Clone ) ]
2093
+ enum Sign {
2094
+ Unsigned ,
2095
+ Signed ,
2096
+ }
2097
+ use Sign :: * ;
2098
+
2092
2099
enum Style {
2093
2100
Float ,
2094
- Int ( /* is signed? */ bool ) ,
2101
+ Int ( Sign ) ,
2095
2102
Unsupported ,
2096
2103
}
2097
2104
2098
2105
let ( in_style, in_width) = match in_elem. kind ( ) {
2099
2106
// vectors of pointer-sized integers should've been
2100
2107
// disallowed before here, so this unwrap is safe.
2101
2108
ty:: Int ( i) => (
2102
- Style :: Int ( true ) ,
2109
+ Style :: Int ( Signed ) ,
2103
2110
i. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
2104
2111
) ,
2105
2112
ty:: Uint ( u) => (
2106
- Style :: Int ( false ) ,
2113
+ Style :: Int ( Unsigned ) ,
2107
2114
u. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
2108
2115
) ,
2109
2116
ty:: Float ( f) => ( Style :: Float , f. bit_width ( ) ) ,
2110
2117
_ => ( Style :: Unsupported , 0 ) ,
2111
2118
} ;
2112
2119
let ( out_style, out_width) = match out_elem. kind ( ) {
2113
2120
ty:: Int ( i) => (
2114
- Style :: Int ( true ) ,
2121
+ Style :: Int ( Signed ) ,
2115
2122
i. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
2116
2123
) ,
2117
2124
ty:: Uint ( u) => (
2118
- Style :: Int ( false ) ,
2125
+ Style :: Int ( Unsigned ) ,
2119
2126
u. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
2120
2127
) ,
2121
2128
ty:: Float ( f) => ( Style :: Float , f. bit_width ( ) ) ,
2122
2129
_ => ( Style :: Unsupported , 0 ) ,
2123
2130
} ;
2124
2131
2125
2132
match ( in_style, out_style) {
2126
- ( Style :: Int ( in_is_signed ) , Style :: Int ( _) ) => {
2133
+ ( Style :: Int ( sign ) , Style :: Int ( _) ) => {
2127
2134
return Ok ( match in_width. cmp ( & out_width) {
2128
2135
Ordering :: Greater => bx. trunc ( args[ 0 ] . immediate ( ) , llret_ty) ,
2129
2136
Ordering :: Equal => args[ 0 ] . immediate ( ) ,
2130
- Ordering :: Less => {
2131
- if in_is_signed {
2132
- bx. sext ( args[ 0 ] . immediate ( ) , llret_ty)
2133
- } else {
2134
- bx. zext ( args[ 0 ] . immediate ( ) , llret_ty)
2135
- }
2136
- }
2137
+ Ordering :: Less => match sign {
2138
+ Sign :: Signed => bx. sext ( args[ 0 ] . immediate ( ) , llret_ty) ,
2139
+ Sign :: Unsigned => bx. zext ( args[ 0 ] . immediate ( ) , llret_ty) ,
2140
+ } ,
2137
2141
} ) ;
2138
2142
}
2139
- ( Style :: Int ( in_is_signed) , Style :: Float ) => {
2140
- return Ok ( if in_is_signed {
2141
- bx. sitofp ( args[ 0 ] . immediate ( ) , llret_ty)
2142
- } else {
2143
- bx. uitofp ( args[ 0 ] . immediate ( ) , llret_ty)
2143
+ ( Style :: Int ( sign) , Style :: Float ) => {
2144
+ return Ok ( match sign {
2145
+ Sign :: Signed => bx. sitofp ( args[ 0 ] . immediate ( ) , llret_ty) ,
2146
+ Sign :: Unsigned => bx. uitofp ( args[ 0 ] . immediate ( ) , llret_ty) ,
2144
2147
} ) ;
2145
2148
}
2146
- ( Style :: Float , Style :: Int ( out_is_signed) ) => {
2147
- return Ok ( match ( out_is_signed, name == sym:: simd_as) {
2148
- ( false , false ) => bx. fptoui ( args[ 0 ] . immediate ( ) , llret_ty) ,
2149
- ( true , false ) => bx. fptosi ( args[ 0 ] . immediate ( ) , llret_ty) ,
2150
- ( _, true ) => bx. cast_float_to_int ( out_is_signed, args[ 0 ] . immediate ( ) , llret_ty) ,
2149
+ ( Style :: Float , Style :: Int ( sign) ) => {
2150
+ return Ok ( match ( sign, name == sym:: simd_as) {
2151
+ ( Sign :: Unsigned , false ) => bx. fptoui ( args[ 0 ] . immediate ( ) , llret_ty) ,
2152
+ ( Sign :: Signed , false ) => bx. fptosi ( args[ 0 ] . immediate ( ) , llret_ty) ,
2153
+ ( _, true ) => bx. cast_float_to_int (
2154
+ matches ! ( sign, Sign :: Signed ) ,
2155
+ args[ 0 ] . immediate ( ) ,
2156
+ llret_ty,
2157
+ ) ,
2151
2158
} ) ;
2152
2159
}
2153
2160
( Style :: Float , Style :: Float ) => {
0 commit comments