@@ -182,44 +182,48 @@ pub fn compute_abi_info<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, fty: &mut FnType<'tc
182
182
let mut sse_regs = 8 ; // XMM0-7
183
183
184
184
let mut x86_64_ty = |arg : & mut ArgType < ' tcx > , is_arg : bool | {
185
- let cls = classify_arg ( cx, arg) ;
185
+ let mut cls_or_mem = classify_arg ( cx, arg) ;
186
186
187
187
let mut needed_int = 0 ;
188
188
let mut needed_sse = 0 ;
189
- let in_mem = match cls {
190
- Err ( Memory ) => true ,
191
- Ok ( ref cls) if is_arg => {
192
- for & c in cls {
189
+ if is_arg {
190
+ if let Ok ( cls) = cls_or_mem {
191
+ for & c in & cls {
193
192
match c {
194
193
Some ( Class :: Int ) => needed_int += 1 ,
195
194
Some ( Class :: Sse ) => needed_sse += 1 ,
196
195
_ => { }
197
196
}
198
197
}
199
- arg. layout . is_aggregate ( ) &&
200
- ( int_regs < needed_int || sse_regs < needed_sse)
198
+ if arg. layout . is_aggregate ( ) {
199
+ if int_regs < needed_int || sse_regs < needed_sse {
200
+ cls_or_mem = Err ( Memory ) ;
201
+ }
202
+ }
201
203
}
202
- Ok ( _) => false
203
- } ;
204
+ }
204
205
205
- if in_mem {
206
- if is_arg {
207
- arg. make_indirect_byval ( ) ;
208
- } else {
209
- // `sret` parameter thus one less integer register available
210
- arg. make_indirect ( ) ;
211
- int_regs -= 1 ;
206
+ match cls_or_mem {
207
+ Err ( Memory ) => {
208
+ if is_arg {
209
+ arg. make_indirect_byval ( ) ;
210
+ } else {
211
+ // `sret` parameter thus one less integer register available
212
+ arg. make_indirect ( ) ;
213
+ int_regs -= 1 ;
214
+ }
212
215
}
213
- } else {
214
- // split into sized chunks passed individually
215
- int_regs -= needed_int;
216
- sse_regs -= needed_sse;
217
-
218
- if arg. layout . is_aggregate ( ) {
219
- let size = arg. layout . size ;
220
- arg. cast_to ( cast_target ( cls. as_ref ( ) . unwrap ( ) , size) )
221
- } else {
222
- arg. extend_integer_width_to ( 32 ) ;
216
+ Ok ( ref cls) => {
217
+ // split into sized chunks passed individually
218
+ int_regs -= needed_int;
219
+ sse_regs -= needed_sse;
220
+
221
+ if arg. layout . is_aggregate ( ) {
222
+ let size = arg. layout . size ;
223
+ arg. cast_to ( cast_target ( cls, size) )
224
+ } else {
225
+ arg. extend_integer_width_to ( 32 ) ;
226
+ }
223
227
}
224
228
}
225
229
} ;
0 commit comments