@@ -122,11 +122,14 @@ impl<'tcx> CValue<'tcx> {
122
122
let layout = self . 1 ;
123
123
match self . 0 {
124
124
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
+ }
127
131
_ => unreachable ! ( ) ,
128
132
} ;
129
- let clif_ty = scalar_to_clif_type ( fx. tcx , scalar) ;
130
133
ptr. load ( fx, clif_ty, MemFlags :: new ( ) )
131
134
}
132
135
CValueInner :: ByVal ( value) => value,
@@ -158,37 +161,32 @@ impl<'tcx> CValue<'tcx> {
158
161
}
159
162
}
160
163
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
-
179
164
pub fn value_field < ' a > (
180
165
self ,
181
166
fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > ,
182
167
field : mir:: Field ,
183
168
) -> CValue < ' tcx > {
184
169
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
+ }
187
188
_ => 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
+ }
192
190
}
193
191
194
192
pub fn unsize_value < ' a > ( self , fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > , dest : CPlace < ' tcx > ) {
0 commit comments