@@ -73,7 +73,7 @@ fn classify_ret_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, ret: &mut ArgType<'tcx>)
73
73
} else if ret. layout . fields . count ( ) == 2 {
74
74
if let Some ( reg0) = float_reg ( cx, ret, 0 ) {
75
75
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) ) ;
77
77
return ;
78
78
}
79
79
}
@@ -98,7 +98,7 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
98
98
99
99
let dl = & cx. tcx . data_layout ;
100
100
let size = arg. layout . size ;
101
- let mut prefix = [ RegKind :: Integer ; 8 ] ;
101
+ let mut prefix = [ None ; 8 ] ;
102
102
let mut prefix_index = 0 ;
103
103
104
104
match arg. layout . fields {
@@ -123,15 +123,20 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
123
123
if let layout:: Abi :: Scalar ( ref scalar) = field. abi {
124
124
if let layout:: F64 = scalar. value {
125
125
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)
127
127
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 ) {
129
130
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 ( ) {
131
136
break ;
132
137
}
133
138
134
- prefix[ prefix_index] = RegKind :: Float ;
139
+ prefix[ prefix_index] = Some ( RegKind :: Float ) ;
135
140
prefix_index += 1 ;
136
141
last_offset = offset + Reg :: f64 ( ) . size ;
137
142
}
@@ -142,10 +147,11 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
142
147
} ;
143
148
144
149
// 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 {
146
152
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 }
149
155
} ) ;
150
156
}
151
157
0 commit comments