summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2016-03-23 13:18:35 +0100
committerWim Taymans <wtaymans@redhat.com>2016-03-23 13:18:35 +0100
commit7881a87f7487c8af248b4ef76bcd42844c0273c8 (patch)
tree5a4e04b2223f11e16864acf5f0e792ab0e2abc27
parent4dc0f609da4e68ac2f41c573053f002154195691 (diff)
llvm: small updatesllvm-backend
-rw-r--r--orc/orcprogram-llvm.c198
1 files 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;i<ORC_GP_REG_BASE+32;i++){
compiler->valid_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 = "<i32 32767>";
+ mask2 = "<i32 -32768>";
+ } else if (sh == 2) {
+ mask1 = "<i32 32767, i16 32767>";
+ mask2 = "<i32 -32768, i16 -32768>";
+ } else if (sh == 4) {
+ mask1 = "<i32 32767, i16 32767, i16 32767, i16 32767>";
+ mask2 = "<i32 -32768, i16 -32768, i16 -32768, i16 -32768>";
+ } 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)