From 7881a87f7487c8af248b4ef76bcd42844c0273c8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 23 Mar 2016 13:18:35 +0100 Subject: llvm: small updates --- orc/orcprogram-llvm.c | 198 ++++++++++++++++++++++++++------------------------ 1 file changed, 104 insertions(+), 94 deletions(-) diff --git a/orc/orcprogram-llvm.c b/orc/orcprogram-llvm.c index 3768068..a615523 100644 --- a/orc/orcprogram-llvm.c +++ b/orc/orcprogram-llvm.c @@ -29,7 +29,7 @@ orc_compiler_llvm_init (OrcCompiler *compiler) for(i=ORC_GP_REG_BASE;ivalid_regs[i] = 1; } - compiler->loop_shift = 0; + compiler->loop_shift = 1; } const char * @@ -102,6 +102,7 @@ output_prototype (OrcCompiler *compiler) OrcProgram *p = compiler->program; int i; int need_comma; + int mult = 1 << compiler->loop_shift; ORC_ASM_CODE(compiler,"define void @%s (", compiler->program->name); need_comma = FALSE; @@ -110,7 +111,7 @@ output_prototype (OrcCompiler *compiler) var = &p->vars[ORC_VAR_D1 + i]; if (var->size) { if (need_comma) ORC_ASM_CODE (compiler, ", "); - ORC_ASM_CODE (compiler, "<1 x i%d> * noalias %s", var->size*8, + ORC_ASM_CODE (compiler, "<%d x i%d> * noalias %s", mult, var->size*8, varnames[ORC_VAR_D1 + i]); if (p->is_2d) { ORC_ASM_CODE (compiler, ", i32 %s_stride", varnames[ORC_VAR_D1 + i]); @@ -122,7 +123,7 @@ output_prototype (OrcCompiler *compiler) var = &p->vars[ORC_VAR_A1 + i]; if (var->size) { if (need_comma) ORC_ASM_CODE (compiler, ", "); - ORC_ASM_CODE (compiler, "<1 x i%d> * noalias %s", var->size*8, + ORC_ASM_CODE (compiler, "<%d x i%d> * noalias %s", mult, var->size*8, varnames[ORC_VAR_A1 + i]); need_comma = TRUE; } @@ -131,7 +132,7 @@ output_prototype (OrcCompiler *compiler) var = &p->vars[ORC_VAR_S1 + i]; if (var->size) { if (need_comma) ORC_ASM_CODE (compiler, ", "); - ORC_ASM_CODE (compiler, "<1 x i%d> * noalias %s", var->size*8, + ORC_ASM_CODE (compiler, "<%d x i%d> * noalias %s", mult, var->size*8, varnames[ORC_VAR_S1 + i]); if (p->is_2d) { ORC_ASM_CODE (compiler, ", i32 %s_stride", varnames[ORC_VAR_S1 + i]); @@ -194,6 +195,7 @@ orc_compiler_llvm_assemble (OrcCompiler *compiler) OrcStaticOpcode *opcode; OrcRule *rule; int prefix = 0; + int mult = 1 << compiler->loop_shift; if (!(compiler->target_flags & ORC_TARGET_C_BARE)) { output_prototype (compiler); @@ -206,7 +208,7 @@ orc_compiler_llvm_assemble (OrcCompiler *compiler) ORC_ASM_CODE (compiler, " store i32 0, i32* %%j\n\n"); - ORC_ASM_CODE (compiler, " %%index_m = load i32* %%j\n"); + ORC_ASM_CODE (compiler, " %%index_m = load i32, i32* %%j\n"); ORC_ASM_CODE (compiler, " %%cmp_m = icmp slt i32 %%index_m, %%m\n"); ORC_ASM_CODE (compiler, " br i1 %%cmp_m, label %%loop_m, label %%exit_m\n\n"); @@ -219,21 +221,13 @@ orc_compiler_llvm_assemble (OrcCompiler *compiler) if (var->name == NULL) continue; switch (var->vartype) { case ORC_VAR_TYPE_SRC: + case ORC_VAR_TYPE_DEST: { char s1[40], s2[40]; get_varname(s1, compiler, i); get_varname_stride(s2, compiler, i); - ORC_ASM_CODE(compiler," %%ptr%d = getelementptr <1 x i%d>* %s\n", - i, var->size*8, varnames[i]); - } - break; - case ORC_VAR_TYPE_DEST: - { - char s1[40], s2[40]; - get_varname(s1, compiler, i), - get_varname_stride(s2, compiler, i), - ORC_ASM_CODE(compiler," %%ptr%d = getelementptr <1 x i%d>* %s\n", - i, var->size*8, varnames[i]); + ORC_ASM_CODE(compiler," %%ptr%d = getelementptr <%d x i%d>, <%d x i%d>* %s\n", + i, mult, var->size*8, mult, var->size*8, varnames[i]); } break; default: @@ -246,12 +240,9 @@ orc_compiler_llvm_assemble (OrcCompiler *compiler) if (var->name == NULL) continue; switch (var->vartype) { case ORC_VAR_TYPE_SRC: - ORC_ASM_CODE(compiler," %%ptr%d = getelementptr <1 x i%d>* %s\n", - i, var->size*8, varnames[i]); - break; case ORC_VAR_TYPE_DEST: - ORC_ASM_CODE(compiler," %%ptr%d = getelementptr <1 x i%d>* %s\n", - i, var->size*8, varnames[i]); + ORC_ASM_CODE(compiler," %%ptr%d = getelementptr <%d x i%d>, <%d x i%d>* %s\n", + i, mult, var->size*8, mult, var->size*8, varnames[i]); break; default: break; @@ -282,7 +273,7 @@ orc_compiler_llvm_assemble (OrcCompiler *compiler) ORC_ASM_CODE (compiler, "%*s br label %%head_n\n\n", prefix, ""); ORC_ASM_CODE (compiler, "%*shead_n:\n", prefix, ""); - ORC_ASM_CODE (compiler, "%*s %%index_n = load i32* %%i\n", prefix, ""); + ORC_ASM_CODE (compiler, "%*s %%index_n = load i32, i32* %%i\n", prefix, ""); ORC_ASM_CODE (compiler, "%*s %%cmp_n = icmp slt i32 %%index_n, %%n\n", prefix, ""); ORC_ASM_CODE (compiler, "%*s br i1 %%cmp_n, label %%loop_n, label %%exit_n\n\n", prefix, ""); @@ -390,6 +381,20 @@ get_vector_constant (char *name, int len, int bits, orc_int64 val) } /* rules */ +static int +get_shift (OrcCompiler *p, OrcInstruction *insn) +{ + int res; + if (insn && (insn->flags & ORC_INSTRUCTION_FLAG_X2)) { + res = 2; + } else if (insn && (insn->flags & ORC_INSTRUCTION_FLAG_X4)) { + res = 4; + } else { + res = 1; + } + return res << p->loop_shift; +} + static void llvm_get_name_int (char *name, OrcCompiler *p, OrcInstruction *insn, int var, int src) @@ -422,26 +427,15 @@ llvm_get_name_int (char *name, OrcCompiler *p, OrcInstruction *insn, int var, in } } else if (p->vars[var].vartype == ORC_VAR_TYPE_CONST) { int bits = p->vars[var].size * 8; - - if (insn && (insn->flags & (ORC_INSTRUCTION_FLAG_X2|ORC_INSTRUCTION_FLAG_X4))) { - if (insn->flags & ORC_INSTRUCTION_FLAG_X4) - get_vector_constant (name, 4, bits, p->vars[var].value.i); - else - get_vector_constant (name, 2, bits, p->vars[var].value.i); - } else - get_vector_constant (name, 1, bits, p->vars[var].value.i); + int sh = get_shift (p, insn); + get_vector_constant (name, sh, bits, p->vars[var].value.i); } else { if (insn && (insn->flags & (ORC_INSTRUCTION_FLAG_X2|ORC_INSTRUCTION_FLAG_X4))) { int bits = p->vars[var].size * 8; - int multiplier; + int multiplier = get_shift (p, insn); get_temp (name, p); - if (insn->flags & ORC_INSTRUCTION_FLAG_X4) - multiplier = 4; - else - multiplier = 2; - if (src) ORC_ASM_CODE (p, " %s = bitcast <1 x i%d> %%var%d to <%d x i%d>\n", name, bits, var, multiplier, bits / multiplier); @@ -487,20 +481,6 @@ llvm_store_dst_int (char *name, OrcCompiler *p, OrcInstruction *insn, int var) var, multiplier, bits / multiplier, name, bits); } -static int -get_shift (OrcCompiler *p, OrcInstruction *insn) -{ - int res;; - if (insn && (insn->flags & ORC_INSTRUCTION_FLAG_X2)) { - res = 2; - } else if (insn && (insn->flags & ORC_INSTRUCTION_FLAG_X4)) { - res = 4; - } else { - res = 1; - } - return res; -} - static void llvm_rule_absb (OrcCompiler *p, void *user, OrcInstruction *insn) { @@ -692,9 +672,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, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i8>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>, <%d x i8>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i8>, <%d x i8>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -709,9 +689,9 @@ llvm_rule_loadoffb (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i8>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>, <%d x i8>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i8>, <%d x i8>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -726,9 +706,9 @@ llvm_rule_loadupdb (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i8>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>, <%d x i8>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i8>, <%d x i8>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -743,9 +723,9 @@ llvm_rule_loadupib (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i8>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>, <%d x i8>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i8>, <%d x i8>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -780,9 +760,9 @@ llvm_rule_ldresnearb (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i8>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>, <%d x i8>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i8>, <%d x i8>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -797,9 +777,9 @@ llvm_rule_ldresnearl (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i32>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>, <%d x i32>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i32>, <%d x i32>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -814,9 +794,9 @@ llvm_rule_ldreslinb (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i8>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>, <%d x i8>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i8>, <%d x i8>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -831,9 +811,9 @@ llvm_rule_ldreslinl (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i32>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>, <%d x i32>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i32>, <%d x i32>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -1012,8 +992,8 @@ 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, i32 %%index_n\n", - t1, sh, insn->dest_args[0]); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i8>, <%d x i8>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->dest_args[0]); ORC_ASM_CODE (p, " store <%d x i8> %s, <%d x i8>* %s\n", sh, src, sh, t1); } @@ -1290,9 +1270,9 @@ llvm_rule_loadw (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 i16>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i16>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i16>, <%d x i16>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i16>, <%d x i16>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -1307,9 +1287,9 @@ llvm_rule_loadoffw (OrcCompiler *p, void *user, OrcInstruction *insn) llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); /* FIXME */ - ORC_ASM_CODE (p, " %s = getelementptr <%d x i16>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i16>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i16>, <%d x i16>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i16>, <%d x i16>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -1522,8 +1502,8 @@ llvm_rule_storew (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 i16>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->dest_args[0]); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i16>, <%d x i16>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->dest_args[0]); ORC_ASM_CODE (p, " store <%d x i16> %s, <%d x i16>* %s\n", sh, src, sh, t1); } static void @@ -1737,9 +1717,9 @@ llvm_rule_loadl (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 i32>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i32>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>, <%d x i32>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i32>, <%d x i32>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -1955,8 +1935,8 @@ llvm_rule_storel (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 i32>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->dest_args[0]); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i32>, <%d x i32>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->dest_args[0]); ORC_ASM_CODE (p, " store <%d x i32> %s, <%d x i32>* %s\n", sh, src, sh, t1); } static void @@ -2026,9 +2006,9 @@ llvm_rule_loadq (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 i64>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->src_args[0]); - ORC_ASM_CODE (p, " %s = load <%d x i64>* %s\n", dest, sh, t1); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i64>, <%d x i64>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->src_args[0]); + ORC_ASM_CODE (p, " %s = load <%d x i64>, <%d x i64>* %s\n", dest, sh, sh, t1); llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } @@ -2072,8 +2052,8 @@ llvm_rule_storeq (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 i64>* %%ptr%d, i32 %%index_n\n", - t1, sh, insn->dest_args[0]); + ORC_ASM_CODE (p, " %s = getelementptr <%d x i64>, <%d x i64>* %%ptr%d, i32 %%index_n\n", + t1, sh, sh, insn->dest_args[0]); ORC_ASM_CODE (p, " store <%d x i64> %s, <%d x i64>* %s\n", sh, src, sh, t1); } static void @@ -2545,9 +2525,39 @@ static void llvm_rule_convssslw (OrcCompiler *p, void *user, OrcInstruction *insn) { char dest[40], src[40]; + int sh = get_shift (p, insn); + char t1[40], t2[40], t3[40], t4[40]; + const char *mask1, *mask2; + + get_temp (t1, p); + get_temp (t2, p); + get_temp (t3, p); + get_temp (t4, p); llvm_get_dst_int (dest, p, insn, insn->dest_args[0]); llvm_get_src_int (src, p, insn, insn->src_args[0]); + + if (sh == 1) { + mask1 = ""; + mask2 = ""; + } else if (sh == 2) { + mask1 = ""; + mask2 = ""; + } else if (sh == 4) { + mask1 = ""; + mask2 = ""; + } else { + mask1 = "ERROR"; + mask2 = "ERROR"; + } + + ORC_ASM_CODE (p, " %s = icmp sgt <%d x i32> %s, %s\n", t1, sh, src, mask1); + ORC_ASM_CODE (p, " %s = select <%d x i1> %s, <%d x i32> %s, <%d x i32> %s\n", t2, sh, t1, sh, mask1, sh, src); + ORC_ASM_CODE (p, " %s = icmp sle <%d x i32> %s, %s\n", t3, sh, src, mask2); + ORC_ASM_CODE (p, " %s = select <%d x i1> %s, <%d x i32> %s, <%d x i32> %s\n", t4, sh, t3, sh, mask2, sh, t2); + ORC_ASM_CODE (p, " %s = trunc <%d x i32> %s to <%d x i16>\n", dest, sh, t4, sh); + + llvm_store_dst_int (dest, p, insn, insn->dest_args[0]); } static void llvm_rule_convsuslw (OrcCompiler *p, void *user, OrcInstruction *insn) -- cgit v1.2.3