@@ -163,7 +163,7 @@ fn classify_ty(ty: TypeRef) -> [x86_64_reg_class] {
163
163
}
164
164
165
165
fn classify ( ty : TypeRef ,
166
- cls : [ mut x86_64_reg_class ] , i : uint ,
166
+ cls : [ mut x86_64_reg_class ] , ix : uint ,
167
167
off : uint ) {
168
168
let t_align = ty_align ( ty) ;
169
169
let t_size = ty_size ( ty) ;
@@ -173,7 +173,7 @@ fn classify_ty(ty: TypeRef) -> [x86_64_reg_class] {
173
173
let mut i = off / 8 u;
174
174
let e = ( off + t_size + 7 u) / 8 u;
175
175
while i < e {
176
- unify ( cls, i, memory_class) ;
176
+ unify ( cls, ix + i, memory_class) ;
177
177
i += 1 u;
178
178
}
179
179
ret;
@@ -182,30 +182,30 @@ fn classify_ty(ty: TypeRef) -> [x86_64_reg_class] {
182
182
alt llvm:: LLVMGetTypeKind ( ty) as int {
183
183
8 /* integer */ |
184
184
12 /* pointer */ {
185
- unify ( cls, off / 8 u, integer_class) ;
185
+ unify ( cls, ix + off / 8 u, integer_class) ;
186
186
}
187
187
2 /* float */ {
188
188
if off % 8 u == 4 u {
189
- unify ( cls, off / 8 u, sse_fv_class) ;
189
+ unify ( cls, ix + off / 8 u, sse_fv_class) ;
190
190
} else {
191
- unify ( cls, off / 8 u, sse_fs_class) ;
191
+ unify ( cls, ix + off / 8 u, sse_fs_class) ;
192
192
}
193
193
}
194
194
3 /* double */ {
195
- unify ( cls, off / 8 u, sse_ds_class) ;
195
+ unify ( cls, ix + off / 8 u, sse_ds_class) ;
196
196
}
197
197
10 /* struct */ {
198
- classify_struct ( struct_tys ( ty) , cls, i , off) ;
198
+ classify_struct ( struct_tys ( ty) , cls, ix , off) ;
199
199
}
200
200
11 /* array */ {
201
- // FIXME: I HAVE NO IDEA WHAT I AM DOING THIS MUST BE WRONG
202
- let len = llvm :: LLVMGetArrayLength ( ty ) as uint ;
203
- if len == 0 u {
204
- } else {
205
- let elt = llvm :: LLVMGetElementType ( ty ) ;
206
- let tys = vec :: from_elem ( len , elt ) ;
207
- classify_struct ( tys , cls , i , off ) ;
208
- }
201
+ let elt = llvm :: LLVMGetElementType ( ty ) ;
202
+ let eltsz = ty_size ( elt ) ;
203
+ let len = llvm :: LLVMGetArrayLength ( ty ) as uint ;
204
+ let mut i = 0 u ;
205
+ while i < len {
206
+ classify ( elt , cls , ix , off + i * eltsz ) ;
207
+ i += 1 u ;
208
+ }
209
209
}
210
210
_ {
211
211
fail "classify: unhandled type" ;
@@ -215,9 +215,11 @@ fn classify_ty(ty: TypeRef) -> [x86_64_reg_class] {
215
215
216
216
fn fixup ( ty : TypeRef , cls : [ mut x86_64_reg_class ] ) {
217
217
let mut i = 0 u;
218
+ let llty = llvm:: LLVMGetTypeKind ( ty) as int ;
218
219
let e = vec:: len ( cls) ;
219
220
if vec:: len ( cls) > 2 u &&
220
- llvm:: LLVMGetTypeKind ( ty) as int == 10 /* struct */ {
221
+ ( llty == 10 /* struct */ ||
222
+ llty == 11 /* array */ ) {
221
223
if is_sse ( cls[ i] ) {
222
224
i += 1 u;
223
225
while i < e {
0 commit comments