diff options
author | Wim Taymans <wtaymans@redhat.com> | 2014-12-16 15:20:08 +0100 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2014-12-16 15:20:08 +0100 |
commit | ea3c4577fa45e846f3797ed2f60cc4fa51738114 (patch) | |
tree | 92f7f0bb7fe878de6ef32b815a2001eca9fbd87d | |
parent | 093a04aa9bc097b6594f96d90ab315cdac582aa9 (diff) |
llvm: updates
-rw-r--r-- | orc/orcprogram-llvm.c | 140 |
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]); } |