implement vector negation
also fix vector behavior tests, they weren't actually testing runtime vectors, but now they are. See #903
This commit is contained in:
@@ -3229,7 +3229,8 @@ static LLVMValueRef ir_render_br(CodeGen *g, IrExecutable *executable, IrInstruc
|
||||
static LLVMValueRef ir_render_un_op(CodeGen *g, IrExecutable *executable, IrInstructionUnOp *un_op_instruction) {
|
||||
IrUnOp op_id = un_op_instruction->op_id;
|
||||
LLVMValueRef expr = ir_llvm_value(g, un_op_instruction->value);
|
||||
ZigType *expr_type = un_op_instruction->value->value.type;
|
||||
ZigType *operand_type = un_op_instruction->value->value.type;
|
||||
ZigType *scalar_type = (operand_type->id == ZigTypeIdVector) ? operand_type->data.vector.elem_type : operand_type;
|
||||
|
||||
switch (op_id) {
|
||||
case IrUnOpInvalid:
|
||||
@@ -3239,16 +3240,16 @@ static LLVMValueRef ir_render_un_op(CodeGen *g, IrExecutable *executable, IrInst
|
||||
case IrUnOpNegation:
|
||||
case IrUnOpNegationWrap:
|
||||
{
|
||||
if (expr_type->id == ZigTypeIdFloat) {
|
||||
if (scalar_type->id == ZigTypeIdFloat) {
|
||||
ZigLLVMSetFastMath(g->builder, ir_want_fast_math(g, &un_op_instruction->base));
|
||||
return LLVMBuildFNeg(g->builder, expr, "");
|
||||
} else if (expr_type->id == ZigTypeIdInt) {
|
||||
} else if (scalar_type->id == ZigTypeIdInt) {
|
||||
if (op_id == IrUnOpNegationWrap) {
|
||||
return LLVMBuildNeg(g->builder, expr, "");
|
||||
} else if (ir_want_runtime_safety(g, &un_op_instruction->base)) {
|
||||
LLVMValueRef zero = LLVMConstNull(LLVMTypeOf(expr));
|
||||
return gen_overflow_op(g, expr_type, AddSubMulSub, zero, expr);
|
||||
} else if (expr_type->data.integral.is_signed) {
|
||||
return gen_overflow_op(g, operand_type, AddSubMulSub, zero, expr);
|
||||
} else if (scalar_type->data.integral.is_signed) {
|
||||
return LLVMBuildNSWNeg(g->builder, expr, "");
|
||||
} else {
|
||||
return LLVMBuildNUWNeg(g->builder, expr, "");
|
||||
|
||||
Reference in New Issue
Block a user