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