authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-31 21:32:05-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-31 21:32:05-07:00
log675de74412e6006ee270fdd2a3b3e20727328af0
treea906213304c373619b413b040eb09513efd741e9
parenta4e19f94f10445273b977e21e721d236a37c5cf4

codegen: fix negation for floats


1 files changed, 11 insertions(+), 4 deletions(-)

src/codegen.cpp+11-4
......@@ -928,6 +928,7 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
928928 assert(node->data.prefix_op_expr.primary_expr);
929929
930930 AstNode *expr_node = node->data.prefix_op_expr.primary_expr;
931 TypeTableEntry *expr_type = get_expr_type(expr_node);
931932
932933 switch (node->data.prefix_op_expr.prefix_op) {
933934 case PrefixOpInvalid:
......@@ -935,8 +936,15 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
935936 case PrefixOpNegation:
936937 {
937938 LLVMValueRef expr = gen_expr(g, expr_node);
938 add_debug_source_node(g, node);
939 return LLVMBuildNeg(g->builder, expr, "");
939 if (expr_type->id == TypeTableEntryIdInt) {
940 add_debug_source_node(g, node);
941 return LLVMBuildNeg(g->builder, expr, "");
942 } else if (expr_type->id == TypeTableEntryIdFloat) {
943 add_debug_source_node(g, node);
944 return LLVMBuildFNeg(g->builder, expr, "");
945 } else {
946 zig_unreachable();
947 }
940948 }
941949 case PrefixOpBoolNot:
942950 {
......@@ -961,8 +969,7 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
961969 case PrefixOpDereference:
962970 {
963971 LLVMValueRef expr = gen_expr(g, expr_node);
964 TypeTableEntry *type_entry = get_expr_type(expr_node);
965 if (type_entry->size_in_bits == 0) {
972 if (expr_type->size_in_bits == 0) {
966973 return nullptr;
967974 } else {
968975 add_debug_source_node(g, node);