[PATCH] sparse, llvm: More comparison ops code generation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch implements LLVM code generation for OP_SET_LE, OP_SET_GE, OP_SET_BE,
and OP_SET_AE.

Cc: Christopher Li <sparse@xxxxxxxxxxx>
Cc: Jeff Garzik <jgarzik@xxxxxxxxxx>
Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Pekka Enberg <penberg@xxxxxxxxxx>
---
 sparse-llvm.c                |    8 ++++----
 validation/backend/cmp-ops.c |   20 ++++++++++++++++++++
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/sparse-llvm.c b/sparse-llvm.c
index 6402666..700a7a4 100644
--- a/sparse-llvm.c
+++ b/sparse-llvm.c
@@ -502,10 +502,10 @@ static void output_op_binary(struct function *fn, struct instruction *insn)
 		target = LLVMBuildICmp(fn->builder, LLVMIntNE, lhs, rhs, target_name);
 		break;
 	case OP_SET_LE:
-		assert(0);
+		target = LLVMBuildICmp(fn->builder, LLVMIntSLE, lhs, rhs, target_name);
 		break;
 	case OP_SET_GE:
-		assert(0);
+		target = LLVMBuildICmp(fn->builder, LLVMIntSGE, lhs, rhs, target_name);
 		break;
 	case OP_SET_LT:
 		assert(!symbol_is_fp_type(insn->type));
@@ -522,10 +522,10 @@ static void output_op_binary(struct function *fn, struct instruction *insn)
 		target = LLVMBuildICmp(fn->builder, LLVMIntUGT, lhs, rhs, target_name);
 		break;
 	case OP_SET_BE:
-		assert(0);
+		target = LLVMBuildICmp(fn->builder, LLVMIntULE, lhs, rhs, target_name);
 		break;
 	case OP_SET_AE:
-		assert(0);
+		target = LLVMBuildICmp(fn->builder, LLVMIntUGE, lhs, rhs, target_name);
 		break;
 	default:
 		assert(0);
diff --git a/validation/backend/cmp-ops.c b/validation/backend/cmp-ops.c
index b1ad227..7bbc81c 100644
--- a/validation/backend/cmp-ops.c
+++ b/validation/backend/cmp-ops.c
@@ -18,6 +18,16 @@ static int setg(int x, int y)
 	return x > y;
 }
 
+static int setle(int x, int y)
+{
+	return x <= y;
+}
+
+static int setge(int x, int y)
+{
+	return x >= y;
+}
+
 static int setb(unsigned int x, unsigned int y)
 {
 	return x < y;
@@ -28,6 +38,16 @@ static int seta(unsigned int x, unsigned int y)
 	return x > y;
 }
 
+static int setbe(unsigned int x, unsigned int y)
+{
+	return x <= y;
+}
+
+static int setae(unsigned int x, unsigned int y)
+{
+	return x >= y;
+}
+
 /*
  * check-name: Comparison operator code generation
  * check-command: ./sparsec -c $file -o tmp.o
-- 
1.7.6.4

--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux