diff options
| -rw-r--r-- | functional/binops.c | 121 | ||||
| -rw-r--r-- | sparse-llvm.c | 28 |
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: |
