@@ -73,7 +73,7 @@ fn classify_ret_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, ret: &mut ArgType<'tcx>)
7373 } else if ret. layout . fields . count ( ) == 2 {
7474 if let Some ( reg0) = float_reg ( cx, ret, 0 ) {
7575 if let Some ( reg1) = float_reg ( cx, ret, 1 ) {
76- ret. cast_to ( CastTarget :: Pair ( reg0, reg1) ) ;
76+ ret. cast_to ( CastTarget :: pair ( reg0, reg1) ) ;
7777 return ;
7878 }
7979 }
@@ -98,7 +98,7 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
9898
9999 let dl = & cx. tcx . data_layout ;
100100 let size = arg. layout . size ;
101- let mut prefix = [ RegKind :: Integer ; 8 ] ;
101+ let mut prefix = [ None ; 8 ] ;
102102 let mut prefix_index = 0 ;
103103
104104 match arg. layout . fields {
@@ -123,15 +123,20 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
123123 if let layout:: Abi :: Scalar ( ref scalar) = field. abi {
124124 if let layout:: F64 = scalar. value {
125125 if offset. is_abi_aligned ( dl. f64_align ) {
126- // Skip over enough integers to cover [last_offset, offset)
126+ // Insert enough integers to cover [last_offset, offset)
127127 assert ! ( last_offset. is_abi_aligned( dl. f64_align) ) ;
128- prefix_index += ( ( offset - last_offset) . bits ( ) / 64 ) as usize ;
128+ for _ in 0 ..( ( offset - last_offset) . bits ( ) / 64 )
129+ . min ( ( prefix. len ( ) - prefix_index) as u64 ) {
129130
130- if prefix_index >= prefix. len ( ) {
131+ prefix[ prefix_index] = Some ( RegKind :: Integer ) ;
132+ prefix_index += 1 ;
133+ }
134+
135+ if prefix_index == prefix. len ( ) {
131136 break ;
132137 }
133138
134- prefix[ prefix_index] = RegKind :: Float ;
139+ prefix[ prefix_index] = Some ( RegKind :: Float ) ;
135140 prefix_index += 1 ;
136141 last_offset = offset + Reg :: f64 ( ) . size ;
137142 }
@@ -142,10 +147,11 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
142147 } ;
143148
144149 // Extract first 8 chunks as the prefix
145- arg. cast_to ( CastTarget :: ChunkedPrefix {
150+ let rest_size = size - Size :: from_bytes ( 8 ) * prefix_index as u64 ;
151+ arg. cast_to ( CastTarget {
146152 prefix : prefix,
147- chunk : Size :: from_bytes ( 8 ) ,
148- total : size
153+ prefix_chunk : Size :: from_bytes ( 8 ) ,
154+ rest : Uniform { unit : Reg :: i64 ( ) , total : rest_size }
149155 } ) ;
150156}
151157
0 commit comments