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) {...@@ -928,6 +928,7 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
928 assert(node->data.prefix_op_expr.primary_expr);928 assert(node->data.prefix_op_expr.primary_expr);
929929
930 AstNode *expr_node = node->data.prefix_op_expr.primary_expr;930 AstNode *expr_node = node->data.prefix_op_expr.primary_expr;
931 TypeTableEntry *expr_type = get_expr_type(expr_node);
931932
932 switch (node->data.prefix_op_expr.prefix_op) {933 switch (node->data.prefix_op_expr.prefix_op) {
933 case PrefixOpInvalid:934 case PrefixOpInvalid:
...@@ -935,8 +936,15 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {...@@ -935,8 +936,15 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
935 case PrefixOpNegation:936 case PrefixOpNegation:
936 {937 {
937 LLVMValueRef expr = gen_expr(g, expr_node);938 LLVMValueRef expr = gen_expr(g, expr_node);
938 add_debug_source_node(g, node);939 if (expr_type->id == TypeTableEntryIdInt) {
939 return LLVMBuildNeg(g->builder, expr, "");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 }
940 }948 }
941 case PrefixOpBoolNot:949 case PrefixOpBoolNot:
942 {950 {
...@@ -961,8 +969,7 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {...@@ -961,8 +969,7 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
961 case PrefixOpDereference:969 case PrefixOpDereference:
962 {970 {
963 LLVMValueRef expr = gen_expr(g, expr_node);971 LLVMValueRef expr = gen_expr(g, expr_node);
964 TypeTableEntry *type_entry = get_expr_type(expr_node);972 if (expr_type->size_in_bits == 0) {
965 if (type_entry->size_in_bits == 0) {
966 return nullptr;973 return nullptr;
967 } else {974 } else {
968 add_debug_source_node(g, node);975 add_debug_source_node(g, node);