10
10
11
11
#![ allow( non_upper_case_globals) ]
12
12
13
- use llvm;
14
- use llvm:: { Integer , Pointer , Float , Double , Struct , Array } ;
13
+ use llvm:: { Integer , Pointer , Float , Double , Struct , Array , Vector } ;
15
14
use llvm:: { StructRetAttribute , ZExtAttribute } ;
16
15
use trans:: cabi:: { FnType , ArgType } ;
17
16
use trans:: context:: CrateContext ;
@@ -37,11 +36,7 @@ fn align(off: uint, ty: Type, align_fn: TyAlignFn) -> uint {
37
36
38
37
fn general_ty_align ( ty : Type ) -> uint {
39
38
match ty. kind ( ) {
40
- Integer => {
41
- unsafe {
42
- ( ( llvm:: LLVMGetIntTypeWidth ( ty. to_ref ( ) ) as uint ) + 7 ) / 8
43
- }
44
- }
39
+ Integer => ( ( ty. int_width ( ) as uint ) + 7 ) / 8 ,
45
40
Pointer => 4 ,
46
41
Float => 4 ,
47
42
Double => 8 ,
@@ -57,6 +52,11 @@ fn general_ty_align(ty: Type) -> uint {
57
52
let elt = ty. element_type ( ) ;
58
53
general_ty_align ( elt)
59
54
}
55
+ Vector => {
56
+ let len = ty. vector_length ( ) ;
57
+ let elt = ty. element_type ( ) ;
58
+ general_ty_align ( elt) * len
59
+ }
60
60
_ => panic ! ( "ty_align: unhandled type" )
61
61
}
62
62
}
@@ -70,11 +70,7 @@ fn general_ty_align(ty: Type) -> uint {
70
70
// /iPhoneOSABIReference/Articles/ARMv6FunctionCallingConventions.html
71
71
fn ios_ty_align ( ty : Type ) -> uint {
72
72
match ty. kind ( ) {
73
- Integer => {
74
- unsafe {
75
- cmp:: min ( 4 , ( ( llvm:: LLVMGetIntTypeWidth ( ty. to_ref ( ) ) as uint ) + 7 ) / 8 )
76
- }
77
- }
73
+ Integer => cmp:: min ( 4 , ( ( ty. int_width ( ) as uint ) + 7 ) / 8 ) ,
78
74
Pointer => 4 ,
79
75
Float => 4 ,
80
76
Double => 4 ,
@@ -90,17 +86,18 @@ fn ios_ty_align(ty: Type) -> uint {
90
86
let elt = ty. element_type ( ) ;
91
87
ios_ty_align ( elt)
92
88
}
89
+ Vector => {
90
+ let len = ty. vector_length ( ) ;
91
+ let elt = ty. element_type ( ) ;
92
+ ios_ty_align ( elt) * len
93
+ }
93
94
_ => panic ! ( "ty_align: unhandled type" )
94
95
}
95
96
}
96
97
97
98
fn ty_size ( ty : Type , align_fn : TyAlignFn ) -> uint {
98
99
match ty. kind ( ) {
99
- Integer => {
100
- unsafe {
101
- ( ( llvm:: LLVMGetIntTypeWidth ( ty. to_ref ( ) ) as uint ) + 7 ) / 8
102
- }
103
- }
100
+ Integer => ( ( ty. int_width ( ) as uint ) + 7 ) / 8 ,
104
101
Pointer => 4 ,
105
102
Float => 4 ,
106
103
Double => 8 ,
@@ -123,6 +120,12 @@ fn ty_size(ty: Type, align_fn: TyAlignFn) -> uint {
123
120
let eltsz = ty_size ( elt, align_fn) ;
124
121
len * eltsz
125
122
}
123
+ Vector => {
124
+ let len = ty. vector_length ( ) ;
125
+ let elt = ty. element_type ( ) ;
126
+ let eltsz = ty_size ( elt, align_fn) ;
127
+ len * eltsz
128
+ }
126
129
_ => panic ! ( "ty_size: unhandled type" )
127
130
}
128
131
}
@@ -166,7 +169,8 @@ fn is_reg_ty(ty: Type) -> bool {
166
169
Integer
167
170
| Pointer
168
171
| Float
169
- | Double => true ,
172
+ | Double
173
+ | Vector => true ,
170
174
_ => false
171
175
}
172
176
}
0 commit comments