summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2014-12-16 15:20:08 +0100
committerWim Taymans <wtaymans@redhat.com>2014-12-16 15:20:08 +0100
commitea3c4577fa45e846f3797ed2f60cc4fa51738114 (patch)
tree92f7f0bb7fe878de6ef32b815a2001eca9fbd87d
parent093a04aa9bc097b6594f96d90ab315cdac582aa9 (diff)
llvm: updates
-rw-r--r--orc/orcprogram-llvm.c140
1 files changed, 136 insertions, 4 deletions
diff --git a/orc/orcprogram-llvm.c b/orc/orcprogram-llvm.c
index e30b493..ea8726a 100644
--- a/orc/orcprogram-llvm.c
+++ b/orc/orcprogram-llvm.c
@@ -541,9 +541,9 @@ llvm_rule_loadb (OrcCompiler *p, void *user, OrcInstruction *insn)
llvm_get_dst_int (dest, p, insn, insn->dest_args[0]);
- ORC_ASM_CODE (p, " %s = getelementptr <%d x i8*> %%ptr%d, <%d x i64> %%i\n",
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>* %%ptr%d, <%d x i64> %%i\n",
t1, sh, insn->src_args[0], sh);
- ORC_ASM_CODE (p, " %s = load <%d x i8*> %s\n", dest, sh, t1);
+ ORC_ASM_CODE (p, " %s = load <%d x i8>* %s\n", dest, sh, t1);
llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}
@@ -745,9 +745,9 @@ llvm_rule_storeb (OrcCompiler *p, void *user, OrcInstruction *insn)
llvm_get_dst_int (src, p, insn, insn->src_args[0]);
- ORC_ASM_CODE (p, " %s = getelementptr <%d x i8*> %%ptr%d, <%d x i64> %%i\n",
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>* %%ptr%d, <%d x i64> %%i\n",
t1, sh, insn->dest_args[0], sh);
- ORC_ASM_CODE (p, " store <%d x i8*> %s, %s\n", sh, src, t1);
+ ORC_ASM_CODE (p, " store <%d x i8> %s, %s\n", sh, src, t1);
}
static void
@@ -968,6 +968,18 @@ llvm_rule_divluw (OrcCompiler *p, void *user, OrcInstruction *insn)
static void
llvm_rule_loadw (OrcCompiler *p, void *user, OrcInstruction *insn)
{
+ char dest[40], t1[40];
+ int sh = get_shift (p, insn);
+
+ get_temp (t1, p);
+
+ llvm_get_dst_int (dest, p, insn, insn->dest_args[0]);
+
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i16>* %%ptr%d, <%d x i64> %%i\n",
+ t1, sh, insn->src_args[0], sh);
+ ORC_ASM_CODE (p, " %s = load <%d x i16>* %s\n", dest, sh, t1);
+
+ llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}
static void
llvm_rule_loadoffw (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -1142,6 +1154,16 @@ llvm_rule_signw (OrcCompiler *p, void *user, OrcInstruction *insn)
static void
llvm_rule_storew (OrcCompiler *p, void *user, OrcInstruction *insn)
{
+ char src[40], t1[40];
+ int sh = get_shift (p, insn);
+
+ get_temp (t1, p);
+
+ llvm_get_dst_int (src, p, insn, insn->src_args[0]);
+
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i16>* %%ptr%d, <%d x i64> %%i\n",
+ t1, sh, insn->dest_args[0], sh);
+ ORC_ASM_CODE (p, " store <%d x i16> %s, %s\n", sh, src, t1);
}
static void
llvm_rule_subw (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -1344,6 +1366,18 @@ llvm_rule_copyl (OrcCompiler *p, void *user, OrcInstruction *insn)
static void
llvm_rule_loadl (OrcCompiler *p, void *user, OrcInstruction *insn)
{
+ char dest[40], t1[40];
+ int sh = get_shift (p, insn);
+
+ get_temp (t1, p);
+
+ llvm_get_dst_int (dest, p, insn, insn->dest_args[0]);
+
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>* %%ptr%d, <%d x i64> %%i\n",
+ t1, sh, insn->src_args[0], sh);
+ ORC_ASM_CODE (p, " %s = load <%d x i32>* %s\n", dest, sh, t1);
+
+ llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}
static void
llvm_rule_loadoffl (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -1518,6 +1552,16 @@ llvm_rule_signl (OrcCompiler *p, void *user, OrcInstruction *insn)
static void
llvm_rule_storel (OrcCompiler *p, void *user, OrcInstruction *insn)
{
+ char src[40], t1[40];
+ int sh = get_shift (p, insn);
+
+ get_temp (t1, p);
+
+ llvm_get_dst_int (src, p, insn, insn->src_args[0]);
+
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>* %%ptr%d, <%d x i64> %%i\n",
+ t1, sh, insn->dest_args[0], sh);
+ ORC_ASM_CODE (p, " store <%d x i32> %s, %s\n", sh, src, t1);
}
static void
llvm_rule_subl (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -1579,6 +1623,18 @@ llvm_rule_xorl (OrcCompiler *p, void *user, OrcInstruction *insn)
static void
llvm_rule_loadq (OrcCompiler *p, void *user, OrcInstruction *insn)
{
+ char dest[40], t1[40];
+ int sh = get_shift (p, insn);
+
+ get_temp (t1, p);
+
+ llvm_get_dst_int (dest, p, insn, insn->dest_args[0]);
+
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i64>* %%ptr%d, <%d x i64> %%i\n",
+ t1, sh, insn->src_args[0], sh);
+ ORC_ASM_CODE (p, " %s = load <%d x i64>* %s\n", dest, sh, t1);
+
+ llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}
static void
llvm_rule_loadpq (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -1587,6 +1643,16 @@ llvm_rule_loadpq (OrcCompiler *p, void *user, OrcInstruction *insn)
static void
llvm_rule_storeq (OrcCompiler *p, void *user, OrcInstruction *insn)
{
+ char src[40], t1[40];
+ int sh = get_shift (p, insn);
+
+ get_temp (t1, p);
+
+ llvm_get_dst_int (src, p, insn, insn->src_args[0]);
+
+ ORC_ASM_CODE (p, " %s = getelementptr <%d x i64>* %%ptr%d, <%d x i64> %%i\n",
+ t1, sh, insn->dest_args[0], sh);
+ ORC_ASM_CODE (p, " store <%d x i64> %s, %s\n", sh, src, t1);
}
static void
llvm_rule_splatw3q (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -2280,14 +2346,48 @@ llvm_rule_accsadubl (OrcCompiler *p, void *user, OrcInstruction *insn)
llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}
+static const char *
+get_swap_mask1 (OrcCompiler *p, int sh)
+{
+ const char *mask;
+
+ if (sh == 1)
+ mask = "<2 x i32> <i32 1, i32 0>";
+ else if (sh == 2)
+ mask = "<4 x i32> <i32 1, i32 0, i32 1, i32 0>";
+ else if (sh == 4)
+ mask = "<8 x i32> <i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0>";
+ else
+ mask = "ERROR";
+
+ return mask;
+}
+
static void
llvm_rule_swapw (OrcCompiler *p, void *user, OrcInstruction *insn)
{
char dest[40], src[40];
+ int sh = get_shift (p, insn);
+ char t1[40], t2[40];
+ const char *mask;
llvm_get_dst_int (dest, p, insn, insn->dest_args[0]);
llvm_get_src_int (src, p, insn, insn->src_args[0]);
+ get_temp (t1, p);
+ get_temp (t2, p);
+
+ mask = get_swap_mask1 (p, sh);
+
+ ORC_ASM_CODE (p, " %s = bitcast <%d x i16> %s to <%d x i8>\n",
+ t1, sh, src, sh * 2);
+ ORC_ASM_CODE (p, " %s = shufflevector <%d x i8> %s, <%d x i8> %s, %s\n",
+ t2, sh * 2, t1, sh * 2, t1, mask);
+ ORC_ASM_CODE (p, " %s = bitcast <%d x i8> %s to <%d x i16>\n",
+ dest, sh * 2, t2, sh);
+
+ llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}
+
static void
llvm_rule_swapl (OrcCompiler *p, void *user, OrcInstruction *insn)
{
@@ -2300,9 +2400,25 @@ static void
llvm_rule_swapwl (OrcCompiler *p, void *user, OrcInstruction *insn)
{
char dest[40], src[40];
+ int sh = get_shift (p, insn);
+ char t1[40], t2[40];
+ const char *mask;
llvm_get_dst_int (dest, p, insn, insn->dest_args[0]);
llvm_get_src_int (src, p, insn, insn->src_args[0]);
+ get_temp (t1, p);
+ get_temp (t2, p);
+
+ mask = get_swap_mask1 (p, sh);
+
+ ORC_ASM_CODE (p, " %s = bitcast <%d x i32> %s to <%d x i16>\n",
+ t1, sh, src, sh * 2);
+ ORC_ASM_CODE (p, " %s = shufflevector <%d x i16> %s, <%d x i16> %s, %s\n",
+ dest, sh, t1, sh, t1, mask);
+ ORC_ASM_CODE (p, " %s = bitcast <%d x i16> %s to <%d x i32>\n",
+ dest, sh * 2, t2, sh);
+
+ llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}
static void
llvm_rule_swapq (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -2316,9 +2432,25 @@ static void
llvm_rule_swaplq (OrcCompiler *p, void *user, OrcInstruction *insn)
{
char dest[40], src[40];
+ int sh = get_shift (p, insn);
+ const char *mask;
+ char t1[40], t2[40];
llvm_get_dst_int (dest, p, insn, insn->dest_args[0]);
llvm_get_src_int (src, p, insn, insn->src_args[0]);
+ get_temp (t1, p);
+ get_temp (t2, p);
+
+ mask = get_swap_mask1 (p, sh);
+
+ ORC_ASM_CODE (p, " %s = bitcast <%d x i64> %s to <%d x i32>\n",
+ t1, sh, src, sh * 2);
+ ORC_ASM_CODE (p, " %s = shufflevector <%d x i32> %s, <%d x i32> %s, %s\n",
+ t2, sh, t1, sh, t1, mask);
+ ORC_ASM_CODE (p, " %s = bitcast <%d x i32> %s to <%d x i64>\n",
+ dest, sh * 2, t2, sh);
+
+ llvm_store_dst_int (dest, p, insn, insn->dest_args[0]);
}