aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-03-03 09:25:05 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-11-17 10:04:37 +0100
commit21b2801285102bbaed6247c04169fa8366a873ad (patch)
tree5d95a5abec0f87bafd553b9eab69049852685417
parent17f4ee591da59e5399319f0c0a5444200f9ae99d (diff)
downloadsparse-dev-21b2801285102bbaed6247c04169fa8366a873ad.tar.gz
llvm: add support for OP_NEG
sparse-llvm has not yet support for OP_NEG and stop on an assert if one is encountered. Fix this by invoking the appropriate LLVMBuild[F]Neg(). Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--sparse-llvm.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c
index 99b18ae8..3dbb9874 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -942,9 +942,22 @@ static void output_insn(struct function *fn, struct instruction *insn)
insn->target->priv = target;
break;
}
- case OP_NEG:
- assert(0);
+ case OP_NEG: {
+ LLVMValueRef src, target;
+ char target_name[64];
+
+ src = pseudo_to_value(fn, insn, insn->src);
+
+ pseudo_name(insn->target, target_name);
+
+ if (is_float_type(insn->type))
+ target = LLVMBuildFNeg(fn->builder, src, target_name);
+ else
+ target = LLVMBuildNeg(fn->builder, src, target_name);
+
+ insn->target->priv = target;
break;
+ }
case OP_CONTEXT:
assert(0);
break;