#![allow(non_upper_case_globals)]
use llvm;
-use llvm::{Integer, Pointer, Float, Double, Struct, Array};
+use llvm::{Integer, Pointer, Float, Double, Struct, Array, Vector};
use llvm::{StructRetAttribute, ZExtAttribute};
use trans::cabi::{FnType, ArgType};
use trans::context::CrateContext;
let elt = ty.element_type();
ty_align(elt)
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ ty_align(elt) * len
+ }
_ => panic!("ty_align: unhandled type")
}
}
let eltsz = ty_size(elt);
len * eltsz
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ let eltsz = ty_size(elt);
+ len * eltsz
+ }
_ => panic!("ty_size: unhandled type")
}
}
#![allow(non_upper_case_globals)]
use llvm;
-use llvm::{Integer, Pointer, Float, Double, Struct, Array};
+use llvm::{Integer, Pointer, Float, Double, Struct, Array, Vector};
use llvm::{StructRetAttribute, ZExtAttribute};
use trans::cabi::{FnType, ArgType};
use trans::context::CrateContext;
let elt = ty.element_type();
general_ty_align(elt)
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ general_ty_align(elt) * len
+ }
_ => panic!("ty_align: unhandled type")
}
}
let elt = ty.element_type();
ios_ty_align(elt)
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ ios_ty_align(elt) * len
+ }
_ => panic!("ty_align: unhandled type")
}
}
let eltsz = ty_size(elt, align_fn);
len * eltsz
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ let eltsz = ty_size(elt, align_fn);
+ len * eltsz
+ }
_ => panic!("ty_size: unhandled type")
}
}
use libc::c_uint;
use std::cmp;
use llvm;
-use llvm::{Integer, Pointer, Float, Double, Struct, Array};
+use llvm::{Integer, Pointer, Float, Double, Struct, Array, Vector};
use llvm::{StructRetAttribute, ZExtAttribute};
use trans::cabi::{ArgType, FnType};
use trans::context::CrateContext;
let elt = ty.element_type();
ty_align(elt)
}
- _ => panic!("ty_size: unhandled type")
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ ty_align(elt) * len
+ }
+ _ => panic!("ty_align: unhandled type")
}
}
let eltsz = ty_size(elt);
len * eltsz
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ let eltsz = ty_size(elt);
+ len * eltsz
+ }
_ => panic!("ty_size: unhandled type")
}
}
use llvm;
use llvm::{Integer, Pointer, Float, Double};
-use llvm::{Struct, Array, Attribute};
+use llvm::{Struct, Array, Attribute, Vector};
use llvm::{StructRetAttribute, ByValAttribute, ZExtAttribute};
use trans::cabi::{ArgType, FnType};
use trans::context::CrateContext;
let elt = ty.element_type();
ty_align(elt)
}
- _ => panic!("ty_size: unhandled type")
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ ty_align(elt) * len
+ }
+ _ => panic!("ty_align: unhandled type")
}
}
let eltsz = ty_size(elt);
len * eltsz
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ let eltsz = ty_size(elt);
+ len * eltsz
+ }
+
_ => panic!("ty_size: unhandled type")
}
}
(_, X87Up) |
(_, ComplexX87) => Memory,
+ (SSEFv, SSEUp) |
+ (SSEFs, SSEUp) |
+ (SSEDv, SSEUp) |
+ (SSEDs, SSEUp) |
+ (SSEInt(_), SSEUp) => return,
+
(_, _) => newv
};
cls[i] = to_write;
i += 1u;
}
}
+ Vector => {
+ let len = ty.vector_length();
+ let elt = ty.element_type();
+ let eltsz = ty_size(elt);
+ let mut reg = match elt.kind() {
+ Integer => SSEInt,
+ Float => SSEFv,
+ Double => SSEDv,
+ _ => panic!("classify: unhandled vector element type")
+ };
+
+ let mut i = 0u;
+ while i < len {
+ unify(cls, ix + (off + i * eltsz) / 8, reg);
+
+ // everything after the first one is the upper
+ // half of a register.
+ reg = SSEUp;
+ i += 1u;
+ }
+ }
_ => panic!("classify: unhandled type")
}
}
let mut i = 0u;
let ty_kind = ty.kind();
let e = cls.len();
- if cls.len() > 2u && (ty_kind == Struct || ty_kind == Array) {
+ if cls.len() > 2u && (ty_kind == Struct || ty_kind == Array || ty_kind == Vector) {
if cls[i].is_sse() {
i += 1u;
while i < e {
Int => {
tys.push(Type::i64(ccx));
}
- SSEFv => {
+ SSEFv | SSEDv | SSEInt => {
+ let (elts_per_word, elt_ty) = match cls[i] {
+ SSEFv => (2, Type::f32(ccx)),
+ SSEDv => (1, Type::f64(ccx)),
+ // FIXME: need to handle the element types, since
+ // C doesn't distinguish between the contained
+ // types of the vector at all; normalise to u8,
+ // maybe?
+ SSEInt => panic!("llregtype: SSEInt not yet supported"),
+ _ => unreachable!(),
+ };
let vec_len = llvec_len(&cls[(i + 1u)..]);
- let vec_ty = Type::vector(&Type::f32(ccx), (vec_len * 2u) as u64);
+ let vec_ty = Type::vector(&elt_ty, (vec_len * elts_per_word) as u64);
tys.push(vec_ty);
i += vec_len;
continue;
}
i += 1u;
}
- return Type::struct_(ccx, tys.as_slice(), false);
+ if tys.len() == 1 && tys[0].kind() == Vector {
+ // if the type contains only a vector, pass it as that vector.
+ tys[0]
+ } else {
+ Type::struct_(ccx, tys.as_slice(), false)
+ }
}
pub fn compute_abi_info(ccx: &CrateContext,