#define SIZE 65536
-int ssse3 = TRUE;
-int sse41 = FALSE;
-
-void
-orc_sse_emit_f20f (OrcCompiler *p, const char *insn_name, int code,
- int src, int dest)
-{
- ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
- orc_x86_get_regname_sse(src),
- orc_x86_get_regname_sse(dest));
- *p->codeptr++ = 0xf2;
- orc_x86_emit_rex (p, 0, dest, 0, src);
- *p->codeptr++ = 0x0f;
- *p->codeptr++ = code;
- orc_x86_emit_modrm_reg (p, src, dest);
-}
-
-void
-orc_sse_emit_f30f (OrcCompiler *p, const char *insn_name, int code,
- int src, int dest)
-{
- ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
- orc_x86_get_regname_sse(src),
- orc_x86_get_regname_sse(dest));
- *p->codeptr++ = 0xf3;
- orc_x86_emit_rex (p, 0, dest, 0, src);
- *p->codeptr++ = 0x0f;
- *p->codeptr++ = code;
- orc_x86_emit_modrm_reg (p, src, dest);
-}
-
-void
-orc_sse_emit_0f (OrcCompiler *p, const char *insn_name, int code,
- int src, int dest)
-{
- ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
- orc_x86_get_regname_sse(src),
- orc_x86_get_regname_sse(dest));
- orc_x86_emit_rex (p, 0, dest, 0, src);
- *p->codeptr++ = 0x0f;
- *p->codeptr++ = code;
- orc_x86_emit_modrm_reg (p, src, dest);
-}
-
-void
-orc_sse_emit_660f (OrcCompiler *p, const char *insn_name, int code,
- int src, int dest)
-{
- ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
- orc_x86_get_regname_sse(src),
- orc_x86_get_regname_sse(dest));
- *p->codeptr++ = 0x66;
- orc_x86_emit_rex (p, 0, dest, 0, src);
- *p->codeptr++ = 0x0f;
- *p->codeptr++ = code;
- orc_x86_emit_modrm_reg (p, src, dest);
-}
-
-void
-orc_sse_emit_660f38 (OrcCompiler *p, const char *insn_name, int code,
- int src, int dest)
-{
- ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
- orc_x86_get_regname_sse(src),
- orc_x86_get_regname_sse(dest));
- *p->codeptr++ = 0x66;
- orc_x86_emit_rex (p, 0, dest, 0, src);
- *p->codeptr++ = 0x0f;
- *p->codeptr++ = 0x38;
- *p->codeptr++ = code;
- orc_x86_emit_modrm_reg (p, src, dest);
-}
-
/* sse rules */
void
p->vars[insn->dest_args[0]].alloc);
}
-static void
-orc_sse_emit_66_rex_0f (OrcCompiler *p, OrcInstruction *insn, int code,
- const char *insn_name, int src, int dest)
-{
- ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
- orc_x86_get_regname_sse(src), orc_x86_get_regname_sse(dest));
-
- *p->codeptr++ = 0x66;
- orc_x86_emit_rex (p, 0, dest, 0, src);
- *p->codeptr++ = 0x0f;
- if (code & 0xff00) {
- *p->codeptr++ = code >> 8;
- *p->codeptr++ = code & 0xff;
- } else {
- *p->codeptr++ = code;
- }
- orc_x86_emit_modrm_reg (p, src, dest);
-}
-
#define UNARY(opcode,insn_name,code) \
static void \
sse_rule_ ## opcode (OrcCompiler *p, void *user, OrcInstruction *insn) \
{ \
- orc_sse_emit_66_rex_0f (p, insn, code, insn_name, \
+ orc_sse_emit_660f (p, insn_name, code, \
p->vars[insn->src_args[0]].alloc, \
p->vars[insn->dest_args[0]].alloc); \
}
static void \
sse_rule_ ## opcode (OrcCompiler *p, void *user, OrcInstruction *insn) \
{ \
- orc_sse_emit_66_rex_0f (p, insn, code, insn_name, \
+ orc_sse_emit_660f (p, insn_name, code, \
p->vars[insn->src_args[1]].alloc, \
p->vars[insn->dest_args[0]].alloc); \
}
int dest = p->vars[insn->dest_args[0]].alloc;
int imm_vals[] = { 0x01010101, 0x00010001, 0x00000001 };
const char * names[] = { "psignb", "psignw", "psignd" };
- int codes[] = { 0x08, 0x09, 0x0a };
+ int codes[] = { 0x3808, 0x3809, 0x380a };
if (src == dest) {
orc_sse_emit_660f (p, "movdqa", 0x6f, src, p->tmpreg);
orc_x86_emit_modrm_reg (p, dest, dest);
*p->codeptr++ = 0x00;
- orc_sse_emit_660f38 (p, names[ORC_PTR_TO_INT(user)], codes[ORC_PTR_TO_INT(user)], src, dest);
+ orc_sse_emit_660f (p, names[ORC_PTR_TO_INT(user)], codes[ORC_PTR_TO_INT(user)], src, dest);
}
static void
static void
sse_rule_convsuslw (OrcCompiler *p, void *user, OrcInstruction *insn)
{
- orc_sse_emit_660f38 (p, "packusdw", 0x2b,
+ orc_sse_emit_660f (p, "packusdw", 0x382b,
p->vars[insn->src_args[0]].alloc,
p->vars[insn->dest_args[0]].alloc);
}
orc_sse_emit_660f (p, "movdqa", 0x6f, src, dest);
}
- orc_sse_emit_660f38 (p, "pshufb", 0x00, tmp, dest);
+ orc_sse_emit_660f (p, "pshufb", 0x3800, tmp, dest);
}
static void
orc_sse_emit_660f (p, "movdqa", 0x6f, src, dest);
}
- orc_sse_emit_660f38 (p, "pshufb", 0x00, tmp, dest);
+ orc_sse_emit_660f (p, "pshufb", 0x3800, tmp, dest);
}
static void
orc_sse_emit_660f (p, "movdqa", 0x6f, src, dest);
}
- orc_sse_emit_660f38 (p, "pshufb", 0x00, tmp, dest);
+ orc_sse_emit_660f (p, "pshufb", 0x3800, tmp, dest);
}
static void
orc_sse_emit_660f (p, "movdqa", 0x6f, src, dest);
}
- orc_sse_emit_660f38 (p, "pshufb", 0x00, tmp, dest);
+ orc_sse_emit_660f (p, "pshufb", 0x3800, tmp, dest);
}
/* slow rules */
if (src != dest) {
orc_sse_emit_660f (p, "movdqa", 0x6f, src, dest);
}
- orc_sse_emit_660f38 (p, "pshufb", 0x00, tmp, dest);
+ orc_sse_emit_660f (p, "pshufb", 0x3800, tmp, dest);
}
static void
if (src != dest) {
orc_sse_emit_660f (p, "movdqa", 0x6f, src, dest);
}
- orc_sse_emit_660f38 (p, "pshufb", 0x00, tmp, dest);
+ orc_sse_emit_660f (p, "pshufb", 0x3800, tmp, dest);
}
static void
--- /dev/null
+
+#include "config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <orc/orcprogram.h>
+#include <orc/orcdebug.h>
+#include <orc/x86.h>
+
+
+void
+orc_sse_emit_f20f (OrcCompiler *p, const char *insn_name, int code,
+ int src, int dest)
+{
+ ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
+ orc_x86_get_regname_sse(src),
+ orc_x86_get_regname_sse(dest));
+ *p->codeptr++ = 0xf2;
+ orc_x86_emit_rex (p, 0, dest, 0, src);
+ *p->codeptr++ = 0x0f;
+ *p->codeptr++ = code;
+ orc_x86_emit_modrm_reg (p, src, dest);
+}
+
+void
+orc_sse_emit_f30f (OrcCompiler *p, const char *insn_name, int code,
+ int src, int dest)
+{
+ ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
+ orc_x86_get_regname_sse(src),
+ orc_x86_get_regname_sse(dest));
+ *p->codeptr++ = 0xf3;
+ orc_x86_emit_rex (p, 0, dest, 0, src);
+ *p->codeptr++ = 0x0f;
+ *p->codeptr++ = code;
+ orc_x86_emit_modrm_reg (p, src, dest);
+}
+
+void
+orc_sse_emit_0f (OrcCompiler *p, const char *insn_name, int code,
+ int src, int dest)
+{
+ ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
+ orc_x86_get_regname_sse(src),
+ orc_x86_get_regname_sse(dest));
+ orc_x86_emit_rex (p, 0, dest, 0, src);
+ *p->codeptr++ = 0x0f;
+ *p->codeptr++ = code;
+ orc_x86_emit_modrm_reg (p, src, dest);
+}
+
+void
+orc_sse_emit_660f (OrcCompiler *p, const char *insn_name, int code,
+ int src, int dest)
+{
+ ORC_ASM_CODE(p," %s %%%s, %%%s\n", insn_name,
+ orc_x86_get_regname_sse(src),
+ orc_x86_get_regname_sse(dest));
+ *p->codeptr++ = 0x66;
+ orc_x86_emit_rex (p, 0, dest, 0, src);
+ *p->codeptr++ = 0x0f;
+ if (code & 0xff00) {
+ *p->codeptr++ = code >> 8;
+ }
+ *p->codeptr++ = code & 0xff;
+ orc_x86_emit_modrm_reg (p, src, dest);
+}
+
+