aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--functional/binops.c121
-rw-r--r--sparse-llvm.c28
2 files changed, 136 insertions, 13 deletions
diff --git a/functional/binops.c b/functional/binops.c
new file mode 100644
index 00000000..16af33e7
--- /dev/null
+++ b/functional/binops.c
@@ -0,0 +1,121 @@
+int add(int x, int y)
+{
+ return x + y;
+}
+
+unsigned int uadd(unsigned int x, unsigned int y)
+{
+ return x + y;
+}
+
+int sub(int x, int y)
+{
+ return x - y;
+}
+
+unsigned int usub(unsigned int x, unsigned int y)
+{
+ return x - y;
+}
+
+int mul(int x, int y)
+{
+ return x * y;
+}
+
+unsigned int umul(unsigned int x, unsigned int y)
+{
+ return x * y;
+}
+
+int div(int x, int y)
+{
+ return x / y;
+}
+
+unsigned int udiv(unsigned int x, unsigned int y)
+{
+ return x / y;
+}
+
+int mod(int x, int y)
+{
+ return x % y;
+}
+
+unsigned int umod(unsigned int x, unsigned int y)
+{
+ return x % y;
+}
+
+int shl(int x, int y)
+{
+ return x << y;
+}
+
+unsigned int ushl(unsigned int x, unsigned int y)
+{
+ return x << y;
+}
+
+int shr(int x, int y)
+{
+ return x >> y;
+}
+
+unsigned int ushr(unsigned int x, unsigned int y)
+{
+ return x >> y;
+}
+
+int and(int x, int y)
+{
+ return x & y;
+}
+
+unsigned int uand(unsigned int x, unsigned int y)
+{
+ return x & y;
+}
+
+int or(int x, int y)
+{
+ return x | y;
+}
+
+unsigned int uor(unsigned int x, unsigned int y)
+{
+ return x | y;
+}
+
+int xor(int x, int y)
+{
+ return x ^ y;
+}
+
+unsigned int uxor(unsigned int x, unsigned int y)
+{
+ return x ^ y;
+}
+
+#if 0
+int and_bool(int x, int y)
+{
+ return x && y;
+}
+
+unsigned int uand_bool(unsigned int x, unsigned int y)
+{
+ return x && y;
+}
+
+int or_bool(int x, int y)
+{
+ return x || y;
+}
+
+unsigned int uor_bool(unsigned int x, unsigned int y)
+{
+ return x || y;
+}
+#endif
diff --git a/sparse-llvm.c b/sparse-llvm.c
index 6ff20901..d59c78bc 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -136,50 +136,52 @@ static void output_op_binary(struct function *fn, struct instruction *insn)
target = LLVMBuildAdd(fn->builder, lhs, rhs, target_name);
break;
case OP_SUB:
- assert(0);
+ target = LLVMBuildSub(fn->builder, lhs, rhs, target_name);
break;
case OP_MULU:
- assert(0);
+ target = LLVMBuildMul(fn->builder, lhs, rhs, target_name);
break;
case OP_MULS:
- assert(0);
+ target = LLVMBuildMul(fn->builder, lhs, rhs, target_name);
break;
case OP_DIVU:
- assert(0);
+ target = LLVMBuildUDiv(fn->builder, lhs, rhs, target_name);
break;
case OP_DIVS:
- assert(0);
+ target = LLVMBuildSDiv(fn->builder, lhs, rhs, target_name);
break;
case OP_MODU:
- assert(0);
+ target = LLVMBuildURem(fn->builder, lhs, rhs, target_name);
break;
case OP_MODS:
- assert(0);
+ target = LLVMBuildSRem(fn->builder, lhs, rhs, target_name);
break;
case OP_SHL:
- assert(0);
+ target = LLVMBuildShl(fn->builder, lhs, rhs, target_name);
break;
case OP_LSR:
- assert(0);
+ target = LLVMBuildLShr(fn->builder, lhs, rhs, target_name);
break;
case OP_ASR:
- assert(0);
+ target = LLVMBuildAShr(fn->builder, lhs, rhs, target_name);
break;
/* Logical */
case OP_AND:
- assert(0);
+ target = LLVMBuildAnd(fn->builder, lhs, rhs, target_name);
break;
case OP_OR:
- assert(0);
+ target = LLVMBuildOr(fn->builder, lhs, rhs, target_name);
break;
case OP_XOR:
- assert(0);
+ target = LLVMBuildXor(fn->builder, lhs, rhs, target_name);
break;
case OP_AND_BOOL:
assert(0);
break;
case OP_OR_BOOL:
+ assert(0);
+ break;
/* Binary comparison */
case OP_SET_EQ: