void lp_build_context_init(struct lp_build_context *bld, struct gallivm_state *gallivm, struct lp_type type) { bld->gallivm = gallivm; bld->type = type; bld->int_elem_type = lp_build_int_elem_type(gallivm, type); if (type.floating) bld->elem_type = lp_build_elem_type(gallivm, type); else bld->elem_type = bld->int_elem_type; if (type.length == 1) { bld->int_vec_type = bld->int_elem_type; bld->vec_type = bld->elem_type; } else { bld->int_vec_type = LLVMVectorType(bld->int_elem_type, type.length); bld->vec_type = LLVMVectorType(bld->elem_type, type.length); } bld->undef = LLVMGetUndef(bld->vec_type); bld->zero = LLVMConstNull(bld->vec_type); bld->one = lp_build_one(gallivm, type); }
LLVMTypeRef lp_build_int_vec_type(struct gallivm_state *gallivm, struct lp_type type) { LLVMTypeRef elem_type = lp_build_int_elem_type(gallivm, type); if (type.length == 1) return elem_type; else return LLVMVectorType(elem_type, type.length); }
/** * Build int32[4] vector type */ LLVMTypeRef lp_build_int32_vec4_type(struct gallivm_state *gallivm) { struct lp_type t; LLVMTypeRef type; memset(&t, 0, sizeof(t)); t.floating = FALSE; /* floating point values */ t.sign = TRUE; /* values are signed */ t.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */ t.width = 32; /* 32-bit int */ t.length = 4; /* 4 elements per vector */ type = lp_build_int_elem_type(gallivm, t); return LLVMVectorType(type, t.length); }
LLVMValueRef lp_build_const_int_vec(struct lp_type type, long long val) { LLVMTypeRef elem_type = lp_build_int_elem_type(type); LLVMValueRef elems[LP_MAX_VECTOR_LENGTH]; unsigned i; assert(type.length <= LP_MAX_VECTOR_LENGTH); for(i = 0; i < type.length; ++i) elems[i] = LLVMConstInt(elem_type, val, type.sign ? 1 : 0); if (type.length == 1) return elems[0]; return LLVMConstVector(elems, type.length); }