aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 2f2da1826..b06c041e4 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -422,6 +422,7 @@ enum irParamPasskind {
irParamPass_Pointer, // Pass as a pointer rather than by value
irParamPass_Integer, // Pass as an integer of the same size
irParamPass_ConstRef, // Pass as a pointer but the value is immutable
+ irParamPass_BitCast, // Pass by value and bit cast to the correct type
};
struct irValueParam {
@@ -871,7 +872,7 @@ void ir_emit_increment(irProcedure *proc, irValue *addr);
irValue *ir_emit_array_ep(irProcedure *proc, irValue *s, irValue *index);
irValue *ir_emit_array_epi(irProcedure *proc, irValue *s, i32 index);
irValue *ir_emit_struct_ev(irProcedure *proc, irValue *s, i32 index);
-
+irValue *ir_emit_bitcast(irProcedure *proc, irValue *data, Type *type);
irValue *ir_emit_byte_swap(irProcedure *proc, irValue *value, Type *t);
irValue *ir_alloc_value(irValueKind kind) {
@@ -930,6 +931,8 @@ irValue *ir_value_param(irProcedure *parent, Entity *e, Type *abi_type) {
v->Param.kind = irParamPass_Integer;
} else if (abi_type == t_llvm_bool) {
v->Param.kind = irParamPass_Value;
+ } else if (is_type_simd_vector(abi_type)) {
+ v->Param.kind = irParamPass_BitCast;
} else {
GB_PANIC("Invalid abi type pass kind");
}
@@ -1738,6 +1741,14 @@ irValue *ir_add_param(irProcedure *proc, Entity *e, Ast *expr, Type *abi_type, i
case irParamPass_ConstRef:
ir_module_add_value(proc->module, e, v);
return ir_emit_load(proc, v);
+
+ case irParamPass_BitCast: {
+ irValue *l = ir_add_local(proc, e, expr, false, index);
+ irValue *x = ir_emit_bitcast(proc, v, e->type);
+ ir_emit_store(proc, l, x);
+ return x;
+ }
+
}
GB_PANIC("Unreachable");
@@ -1814,15 +1825,19 @@ irDebugEncoding ir_debug_encoding_for_basic(BasicKind kind) {
case Basic_u8:
return irDebugBasicEncoding_unsigned_char;
+
case Basic_i16:
case Basic_i32:
case Basic_i64:
+ case Basic_i128:
case Basic_i16le:
case Basic_i32le:
case Basic_i64le:
+ case Basic_i128le:
case Basic_i16be:
case Basic_i32be:
case Basic_i64be:
+ case Basic_i128be:
case Basic_int:
case Basic_rune:
case Basic_typeid:
@@ -1831,12 +1846,15 @@ irDebugEncoding ir_debug_encoding_for_basic(BasicKind kind) {
case Basic_u16:
case Basic_u32:
case Basic_u64:
+ case Basic_u128:
case Basic_u16le:
case Basic_u32le:
case Basic_u64le:
+ case Basic_u128le:
case Basic_u16be:
case Basic_u32be:
case Basic_u64be:
+ case Basic_u128be:
case Basic_uint:
case Basic_uintptr:
return irDebugBasicEncoding_unsigned;
@@ -2996,6 +3014,8 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array<irValue *> args, Pro
args[i] = ir_emit_transmute(p, args[i], new_type);
} else if (new_type == t_llvm_bool) {
args[i] = ir_emit_conv(p, args[i], new_type);
+ } else if (is_type_simd_vector(new_type)) {
+ args[i] = ir_emit_bitcast(p, args[i], new_type);
}
}
}
@@ -9740,6 +9760,8 @@ void ir_setup_type_info_data(irProcedure *proc) { // NOTE(bill): Setup type_info
case Basic_u32:
case Basic_i64:
case Basic_u64:
+ case Basic_i128:
+ case Basic_u128:
case Basic_i16le:
case Basic_u16le:
@@ -9747,13 +9769,16 @@ void ir_setup_type_info_data(irProcedure *proc) { // NOTE(bill): Setup type_info
case Basic_u32le:
case Basic_i64le:
case Basic_u64le:
+ case Basic_i128le:
+ case Basic_u128le:
case Basic_i16be:
case Basic_u16be:
case Basic_i32be:
case Basic_u32be:
case Basic_i64be:
case Basic_u64be:
-
+ case Basic_i128be:
+ case Basic_u128be:
case Basic_int:
case Basic_uint: