@@ -2089,65 +2089,72 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
20892089 return Ok ( args[ 0 ] . immediate ( ) ) ;
20902090 }
20912091
2092+ #[ derive( Copy , Clone ) ]
2093+ enum Sign {
2094+ Unsigned ,
2095+ Signed ,
2096+ }
2097+ use Sign :: * ;
2098+
20922099 enum Style {
20932100 Float ,
2094- Int ( /* is signed? */ bool ) ,
2101+ Int ( Sign ) ,
20952102 Unsupported ,
20962103 }
20972104
20982105 let ( in_style, in_width) = match in_elem. kind ( ) {
20992106 // vectors of pointer-sized integers should've been
21002107 // disallowed before here, so this unwrap is safe.
21012108 ty:: Int ( i) => (
2102- Style :: Int ( true ) ,
2109+ Style :: Int ( Signed ) ,
21032110 i. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
21042111 ) ,
21052112 ty:: Uint ( u) => (
2106- Style :: Int ( false ) ,
2113+ Style :: Int ( Unsigned ) ,
21072114 u. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
21082115 ) ,
21092116 ty:: Float ( f) => ( Style :: Float , f. bit_width ( ) ) ,
21102117 _ => ( Style :: Unsupported , 0 ) ,
21112118 } ;
21122119 let ( out_style, out_width) = match out_elem. kind ( ) {
21132120 ty:: Int ( i) => (
2114- Style :: Int ( true ) ,
2121+ Style :: Int ( Signed ) ,
21152122 i. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
21162123 ) ,
21172124 ty:: Uint ( u) => (
2118- Style :: Int ( false ) ,
2125+ Style :: Int ( Unsigned ) ,
21192126 u. normalize ( bx. tcx ( ) . sess . target . pointer_width ) . bit_width ( ) . unwrap ( ) ,
21202127 ) ,
21212128 ty:: Float ( f) => ( Style :: Float , f. bit_width ( ) ) ,
21222129 _ => ( Style :: Unsupported , 0 ) ,
21232130 } ;
21242131
21252132 match ( in_style, out_style) {
2126- ( Style :: Int ( in_is_signed ) , Style :: Int ( _) ) => {
2133+ ( Style :: Int ( sign ) , Style :: Int ( _) ) => {
21272134 return Ok ( match in_width. cmp ( & out_width) {
21282135 Ordering :: Greater => bx. trunc ( args[ 0 ] . immediate ( ) , llret_ty) ,
21292136 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+ } ,
21372141 } ) ;
21382142 }
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) ,
21442147 } ) ;
21452148 }
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+ ) ,
21512158 } ) ;
21522159 }
21532160 ( Style :: Float , Style :: Float ) => {
0 commit comments