aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-03-20 21:41:25 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-11-17 10:04:37 +0100
commitf80fd84cabc086662bc66d21f4eb64e603cabf98 (patch)
tree3a7a829ffa8293373a8a855514cd3bd31120f476
parentc253791f87fbeb034e5b49fa221b1bcea3cd6bfb (diff)
downloadsparse-dev-f80fd84cabc086662bc66d21f4eb64e603cabf98.tar.gz
llvm: add support for OP_FPCAST
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--sparse-llvm.c22
-rw-r--r--validation/backend/cast.c5
2 files changed, 24 insertions, 3 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c
index 9ea8ab07..8bc1c0ac 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -937,6 +937,26 @@ static void output_op_cast(struct function *fn, struct instruction *insn, LLVMOp
insn->target->priv = target;
}
+static void output_op_fpcast(struct function *fn, struct instruction *insn)
+{
+ LLVMTypeRef dtype = symbol_type(insn->type);
+ LLVMValueRef src, target;
+ struct symbol *otype = insn->orig_type;
+ char name[64];
+
+ assert(is_float_type(insn->type));
+
+ pseudo_name(insn->target, name);
+ src = get_operand(fn, otype, insn->src);
+ if (is_float_type(otype))
+ target = LLVMBuildFPCast(fn->builder, src, dtype, name);
+ else if (is_signed_type(otype))
+ target = LLVMBuildSIToFP(fn->builder, src, dtype, name);
+ else
+ target = LLVMBuildUIToFP(fn->builder, src, dtype, name);
+ insn->target->priv = target;
+}
+
static void output_op_setval(struct function *fn, struct instruction *insn)
{
struct expression *val = insn->val;
@@ -1011,7 +1031,7 @@ static void output_insn(struct function *fn, struct instruction *insn)
output_op_cast(fn, insn, LLVMSExt);
break;
case OP_FPCAST:
- assert(0);
+ output_op_fpcast(fn, insn);
break;
case OP_PTRCAST:
output_op_ptrcast(fn, insn);
diff --git a/validation/backend/cast.c b/validation/backend/cast.c
index 4ca531b5..e18bd023 100644
--- a/validation/backend/cast.c
+++ b/validation/backend/cast.c
@@ -1,4 +1,5 @@
typedef _Bool bool;
+typedef signed char schar;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
@@ -14,6 +15,7 @@ typedef unsigned long long ulonglong;
#define DEFINE_CASTS(from) \
DEFINE_CAST(from, bool) \
DEFINE_CAST(from, char) \
+ DEFINE_CAST(from, schar) \
DEFINE_CAST(from, uchar) \
DEFINE_CAST(from, short) \
DEFINE_CAST(from, ushort) \
@@ -23,13 +25,12 @@ typedef unsigned long long ulonglong;
DEFINE_CAST(from, ulong) \
DEFINE_CAST(from, longlong) \
DEFINE_CAST(from, ulonglong) \
-/*
DEFINE_CAST(from, float) \
DEFINE_CAST(from, double)
-*/
DEFINE_CASTS(bool)
DEFINE_CASTS(char)
+DEFINE_CASTS(schar)
DEFINE_CASTS(uchar)
DEFINE_CASTS(short)
DEFINE_CASTS(ushort)