@@ -122,11 +122,14 @@ impl<'tcx> CValue<'tcx> {
122122 let layout = self . 1 ;
123123 match self . 0 {
124124 CValueInner :: ByRef ( ptr) => {
125- let scalar = match layout. abi {
126- layout:: Abi :: Scalar ( ref scalar) => scalar. clone ( ) ,
125+ let clif_ty = match layout. abi {
126+ layout:: Abi :: Scalar ( ref scalar) => scalar_to_clif_type ( fx. tcx , scalar. clone ( ) ) ,
127+ layout:: Abi :: Vector { ref element, count } => {
128+ scalar_to_clif_type ( fx. tcx , element. clone ( ) )
129+ . by ( u16:: try_from ( count) . unwrap ( ) ) . unwrap ( )
130+ }
127131 _ => unreachable ! ( ) ,
128132 } ;
129- let clif_ty = scalar_to_clif_type ( fx. tcx , scalar) ;
130133 ptr. load ( fx, clif_ty, MemFlags :: new ( ) )
131134 }
132135 CValueInner :: ByVal ( value) => value,
@@ -158,37 +161,32 @@ impl<'tcx> CValue<'tcx> {
158161 }
159162 }
160163
161- /// Load a value with layout.abi of vector
162- pub fn load_vector < ' a > ( self , fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > ) -> Value {
163- let layout = self . 1 ;
164- match self . 0 {
165- CValueInner :: ByRef ( ptr) => {
166- let clif_ty = match layout. abi {
167- layout:: Abi :: Vector { ref element, count } => {
168- scalar_to_clif_type ( fx. tcx , element. clone ( ) ) . by ( u16:: try_from ( count) . unwrap ( ) ) . unwrap ( )
169- }
170- _ => unreachable ! ( ) ,
171- } ;
172- ptr. load ( fx, clif_ty, MemFlags :: new ( ) )
173- }
174- CValueInner :: ByVal ( value) => value,
175- CValueInner :: ByValPair ( _, _) => bug ! ( "Please use load_scalar_pair for ByValPair" ) ,
176- }
177- }
178-
179164 pub fn value_field < ' a > (
180165 self ,
181166 fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > ,
182167 field : mir:: Field ,
183168 ) -> CValue < ' tcx > {
184169 let layout = self . 1 ;
185- let ptr = match self . 0 {
186- CValueInner :: ByRef ( ptr) => ptr,
170+ match self . 0 {
171+ CValueInner :: ByVal ( val) => {
172+ match layout. abi {
173+ layout:: Abi :: Vector { element : _, count } => {
174+ let count = u8:: try_from ( count) . expect ( "SIMD type with more than 255 lanes???" ) ;
175+ let field = u8:: try_from ( field. index ( ) ) . unwrap ( ) ;
176+ assert ! ( field < count) ;
177+ let lane = fx. bcx . ins ( ) . extractlane ( val, field) ;
178+ let field_layout = layout. field ( & * fx, usize:: from ( field) ) ;
179+ CValue :: by_val ( lane, field_layout)
180+ }
181+ _ => unreachable ! ( "value_field for ByVal with abi {:?}" , layout. abi) ,
182+ }
183+ }
184+ CValueInner :: ByRef ( ptr) => {
185+ let ( field_ptr, field_layout) = codegen_field ( fx, ptr, None , layout, field) ;
186+ CValue :: by_ref ( field_ptr, field_layout)
187+ }
187188 _ => bug ! ( "place_field for {:?}" , self ) ,
188- } ;
189-
190- let ( field_ptr, field_layout) = codegen_field ( fx, ptr, None , layout, field) ;
191- CValue :: by_ref ( field_ptr, field_layout)
189+ }
192190 }
193191
194192 pub fn unsize_value < ' a > ( self , fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > , dest : CPlace < ' tcx > ) {
0 commit comments