void orc_c_init (void);
void
+orc_program_c_init (OrcProgram *program)
+{
+
+}
+
+void
orc_program_assemble_c (OrcProgram *program)
{
int i;
OrcOpcode *opcode;
OrcRule *rule;
- printf("\n");
- printf("void\n");
- printf("test (OrcExecutor *ex)\n");
- printf("{\n");
- printf(" int i;\n");
+ orc_program_append_code(program,"\n");
+ orc_program_append_code(program,"void\n");
+ orc_program_append_code(program,"test (OrcExecutor *ex)\n");
+ orc_program_append_code(program,"{\n");
+ orc_program_append_code(program," int i;\n");
for(i=0;i<program->n_vars;i++){
OrcVariable *var = program->vars + i;
switch (var->vartype) {
case ORC_VAR_TYPE_CONST:
- printf(" int16_t var%d = %d;\n", i, var->s16);
+ orc_program_append_code(program," int16_t var%d = %d;\n", i, var->s16);
break;
case ORC_VAR_TYPE_TEMP:
- printf(" int16_t var%d;\n", i);
+ orc_program_append_code(program," int16_t var%d;\n", i);
break;
case ORC_VAR_TYPE_SRC:
case ORC_VAR_TYPE_DEST:
- printf(" int16_t *var%d = ex->var%d;\n", i, i);
+ orc_program_append_code(program," int16_t *var%d = ex->var%d;\n", i, i);
break;
case ORC_VAR_TYPE_PARAM:
- printf(" int16_t var%d = ex->var%d;\n", i, i);
+ orc_program_append_code(program," int16_t var%d = ex->var%d;\n", i, i);
break;
default:
break;
}
- printf("\n");
- printf(" for (i = 0; i < n; i++) {\n");
+ orc_program_append_code(program,"\n");
+ orc_program_append_code(program," for (i = 0; i < n; i++) {\n");
for(j=0;j<program->n_insns;j++){
insn = program->insns + j;
opcode = insn->opcode;
- printf(" // %d: %s\n", j, insn->opcode->name);
-
-#if 0
- for(k=opcode->n_dest;k<opcode->n_src + opcode->n_dest;k++){
- switch (args[k]->vartype) {
- case ORC_VAR_TYPE_SRC:
- x86_emit_load_src (program, args[k]);
- break;
- case ORC_VAR_TYPE_CONST:
- break;
- case ORC_VAR_TYPE_TEMP:
- break;
- default:
- break;
- }
- }
-#endif
+ orc_program_append_code(program," /* %d: %s */\n", j, insn->opcode->name);
rule = insn->rule;
if (rule) {
rule->emit (program, rule->emit_user, insn);
} else {
- printf("No rule for: %s\n", opcode->name);
- }
-
-#if 0
- for(k=0;k<opcode->n_dest;k++){
- switch (args[k]->vartype) {
- case ORC_VAR_TYPE_DEST:
- x86_emit_store_dest (program, args[k]);
- break;
- case ORC_VAR_TYPE_TEMP:
- break;
- default:
- break;
- }
+ orc_program_append_code(program,"#error No rule for: %s\n", opcode->name);
}
-#endif
}
- printf(" }\n");
- printf("}\n");
- printf("\n");
+ orc_program_append_code(program," }\n");
+ orc_program_append_code(program,"}\n");
+ orc_program_append_code(program,"\n");
}
c_get_name (src1, p, insn->args[1]);
c_get_name (src2, p, insn->args[2]);
- printf (" %s = %s + %s;\n", dest, src1, src2);
+ orc_program_append_code(p," %s = %s + %s;\n", dest, src1, src2);
}
static void
c_get_name (src1, p, insn->args[1]);
c_get_name (src2, p, insn->args[2]);
- printf (" %s = %s - %s;\n", dest, src1, src2);
+ orc_program_append_code(p," %s = %s - %s;\n", dest, src1, src2);
}
static void
c_get_name (src1, p, insn->args[1]);
c_get_name (src2, p, insn->args[2]);
- printf (" %s = %s * %s;\n", dest, src1, src2);
+ orc_program_append_code(p," %s = %s * %s;\n", dest, src1, src2);
}
static void
c_get_name (src1, p, insn->args[1]);
c_get_name (src2, p, insn->args[2]);
- printf (" %s = %s << %s;\n", dest, src1, src2);
+ orc_program_append_code(p," %s = %s << %s;\n", dest, src1, src2);
}
static void
c_get_name (src1, p, insn->args[1]);
c_get_name (src2, p, insn->args[2]);
- printf (" %s = %s >> %s;\n", dest, src1, src2);
+ orc_program_append_code(p," %s = %s >> %s;\n", dest, src1, src2);
}
void
orc_c_init (void)
{
- orc_rule_register ("add_s16", ORC_RULE_C, c_rule_add_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("sub_s16", ORC_RULE_C, c_rule_sub_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("mul_s16", ORC_RULE_C, c_rule_mul_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("lshift_s16", ORC_RULE_C, c_rule_lshift_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("rshift_s16", ORC_RULE_C, c_rule_rshift_s16, NULL,
- ORC_RULE_REG_REG);
+ orc_rule_register ("add_s16", ORC_RULE_C, c_rule_add_s16, NULL);
+ orc_rule_register ("sub_s16", ORC_RULE_C, c_rule_sub_s16, NULL);
+ orc_rule_register ("mul_s16", ORC_RULE_C, c_rule_mul_s16, NULL);
+ orc_rule_register ("lshift_s16", ORC_RULE_C, c_rule_lshift_s16, NULL);
+ orc_rule_register ("rshift_s16", ORC_RULE_C, c_rule_rshift_s16, NULL);
}
void
orc_program_powerpc_register_rules (void)
{
- orc_rule_register ("add_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_add_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("sub_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_sub_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("mul_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_mul_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("lshift_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_lshift_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("rshift_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_rshift_s16, NULL,
- ORC_RULE_REG_REG);
+ orc_rule_register ("add_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_add_s16, NULL);
+ orc_rule_register ("sub_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_sub_s16, NULL);
+ orc_rule_register ("mul_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_mul_s16, NULL);
+ orc_rule_register ("lshift_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_lshift_s16, NULL);
+ orc_rule_register ("rshift_s16", ORC_RULE_ALTIVEC_1, powerpc_rule_rshift_s16, NULL);
}
/* code generation */
void
x86_emit_prologue (OrcProgram *program)
{
- printf(".global test\n");
- printf("test:\n");
+ orc_program_append_code(program,".global test\n");
+ orc_program_append_code(program,"test:\n");
if (x86_64) {
} else {
void
orc_x86_init (void)
{
- orc_program_x86_register_rules ();
orc_program_mmx_register_rules ();
orc_program_sse_register_rules ();
}
program->used_regs[i] = 0;
}
- program->data_register_class = 2;
+ if (program->target == ORC_TARGET_MMX) {
+ program->data_register_class = 2;
+ program->rule_set = ORC_RULE_MMX_1;
+ } else {
+ program->data_register_class = 3;
+ program->rule_set = ORC_RULE_SSE_1;
+ }
}
void
{
x86_emit_prologue (program);
+ if (program->target == ORC_TARGET_SSE) {
+ program->loop_shift = 3;
+ } else {
+ program->loop_shift = 2;
+ }
+
x86_emit_mov_memoffset_reg (program, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,n),
x86_exec_ptr, X86_ECX);
x86_emit_sar_imm_reg (program, 4, program->loop_shift, X86_ECX);
(int)ORC_STRUCT_OFFSET(OrcExecutor,counter1), x86_exec_ptr);
x86_emit_je (program, 1);
- program->rule_set = ORC_RULE_MMX_1;
- program->n_per_loop = 1;
- program->loop_shift = 0;
+ if (program->target == ORC_TARGET_SSE) {
+ program->rule_set = ORC_RULE_SSE_1;
+ program->n_per_loop = 1;
+ program->loop_shift = 0;
+ } else {
+ program->rule_set = ORC_RULE_MMX_1;
+ program->n_per_loop = 1;
+ program->loop_shift = 0;
+ }
+
x86_emit_label (program, 0);
x86_emit_loop (program);
x86_emit_dec_memoffset (program, 4,
(int)ORC_STRUCT_OFFSET(OrcExecutor,counter1),
x86_exec_ptr);
- x86_emit_cmp_imm_memoffset (program, 4, 0,
- (int)ORC_STRUCT_OFFSET(OrcExecutor,counter1),
- x86_exec_ptr);
x86_emit_jne (program, 0);
x86_emit_label (program, 1);
(int)ORC_STRUCT_OFFSET(OrcExecutor,counter2), x86_exec_ptr);
x86_emit_je (program, 3);
- program->rule_set = ORC_RULE_MMX_4;
- program->n_per_loop = 4;
- program->loop_shift = 2;
+ if (program->target == ORC_TARGET_SSE) {
+ program->rule_set = ORC_RULE_SSE_8;
+ program->n_per_loop = 8;
+ program->loop_shift = 3;
+ } else {
+ program->rule_set = ORC_RULE_MMX_4;
+ program->n_per_loop = 4;
+ program->loop_shift = 2;
+ }
+
x86_emit_label (program, 2);
x86_emit_loop (program);
x86_emit_dec_memoffset (program, 4,
insn = program->insns + j;
opcode = insn->opcode;
- printf("# %d: %s", j, insn->opcode->name);
+ orc_program_append_code(program,"# %d: %s", j, insn->opcode->name);
/* set up args */
for(k=0;k<opcode->n_src + opcode->n_dest;k++){
args[k] = program->vars + insn->args[k];
- printf(" %d", args[k]->alloc);
+ orc_program_append_code(program," %d", args[k]->alloc);
if (args[k]->is_chained) {
- printf(" (chained)");
+ orc_program_append_code(program," (chained)");
}
}
- printf(" rule_flag=%d", insn->rule_flag);
- printf("\n");
+ orc_program_append_code(program," rule_flag=%d", insn->rule_flag);
+ orc_program_append_code(program,"\n");
for(k=opcode->n_dest;k<opcode->n_src + opcode->n_dest;k++){
switch (args[k]->vartype) {
rule = insn->rule;
if (rule) {
- if (!(rule->flags & ORC_RULE_3REG) && args[0]->alloc != args[1]->alloc) {
+ if (args[0]->alloc != args[1]->alloc) {
x86_emit_mov_reg_reg (program, 2, args[1]->alloc, args[0]->alloc);
}
rule->emit (program, rule->emit_user, insn);
} else {
- printf("No rule for: %s\n", opcode->name);
+ orc_program_append_code(program,"No rule for: %s\n", opcode->name);
}
for(k=0;k<opcode->n_dest;k++){
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <orc/orcprogram.h>
p = malloc(sizeof(OrcProgram));
memset (p, 0, sizeof(OrcProgram));
+ p->target = ORC_TARGET_C;
+
return p;
}
void
orc_program_compile (OrcProgram *program)
{
-#if defined(HAVE_POWERPC)
- orc_program_powerpc_init (program);
-#elif defined(HAVE_I386)
- orc_program_x86_init (program);
-#elif defined(HAVE_AMD64)
- orc_program_x86_init (program);
-#else
-#error FIXME
-#endif
+ int i;
+
+ for(i=0;i<32;i++) {
+ program->valid_regs[i] = 1;
+ }
+
+ switch (program->target) {
+ case ORC_TARGET_C:
+ orc_program_c_init (program);
+ break;
+ case ORC_TARGET_ALTIVEC:
+ orc_program_powerpc_init (program);
+ break;
+ case ORC_TARGET_SSE:
+ orc_program_x86_init (program);
+ break;
+ case ORC_TARGET_MMX:
+ orc_program_x86_init (program);
+ break;
+ default:
+ break;
+ }
orc_program_assign_rules (program);
orc_program_rewrite_vars (program);
- orc_program_global_reg_alloc (program);
+ if (program->target != ORC_TARGET_C) {
+ orc_program_global_reg_alloc (program);
- orc_program_do_regs (program);
+ orc_program_do_regs (program);
+ }
orc_program_rewrite_vars2 (program);
- orc_program_allocate_codemem (program);
-#if defined(HAVE_POWERPC)
- orc_program_assemble_powerpc (program);
-#elif defined(HAVE_I386)
- orc_program_assemble_x86 (program);
-#elif defined(HAVE_AMD64)
- orc_program_assemble_x86 (program);
-#else
-#error FIXME
-#endif
- //orc_program_assemble_c (program);
+ if (program->target != ORC_TARGET_C) {
+ orc_program_allocate_codemem (program);
+ }
+
+ switch (program->target) {
+ case ORC_TARGET_C:
+ orc_program_assemble_c (program);
+ break;
+ case ORC_TARGET_ALTIVEC:
+ orc_program_assemble_powerpc (program);
+ break;
+ case ORC_TARGET_MMX:
+ orc_program_assemble_x86 (program);
+ break;
+ case ORC_TARGET_SSE:
+ orc_program_assemble_x86 (program);
+ break;
+ default:
+ break;
+ }
orc_program_dump_code (program);
}
for(i=0;i<program->n_insns;i++) {
OrcInstruction *insn = program->insns + i;
- unsigned int flags;
insn->rule = insn->opcode->rules + program->rule_set;
-
- flags = insn->rule->flags;
- if (flags & ORC_RULE_REG_IMM &&
- program->vars[insn->args[2]].vartype == ORC_VAR_TYPE_CONST) {
- program->insns[i].rule_flag = ORC_RULE_REG_IMM;
- } else {
- program->insns[i].rule_flag = ORC_RULE_REG_REG;
- }
}
}
* - rule must handle it
* - src1 must be last_use
*/
- if (1 || program->insns[j].rule->flags & ORC_RULE_REG_REG) {
+ if (1) {
int src1 = program->insns[j].args[1];
int dest = program->insns[j].args[0];
if (program->vars[src1].last_use == j) {
}
#endif
- if (program->insns[j].rule_flag == ORC_RULE_REG_IMM) {
+ if (0) {
/* immediate operand, don't load */
int src2 = program->insns[j].args[2];
program->vars[src2].alloc = 1;
return 2;
}
+void
+orc_program_append_code (OrcProgram *p, const char *fmt, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, fmt);
+ vprintf(fmt, varargs);
+ va_end (varargs);
+}
+
ORC_RULE_ALTIVEC_1
};
+enum {
+ ORC_TARGET_C = 0,
+ ORC_TARGET_ALTIVEC = 1,
+ ORC_TARGET_MMX = 2,
+ ORC_TARGET_SSE = 3
+};
+
struct _OrcType {
char *name;
int size;
};
struct _OrcRule {
- unsigned int flags;
OrcRuleEmitFunc emit;
void *emit_user;
};
int used_regs[ORC_N_REGS];
int alloc_regs[ORC_N_REGS];
+ int target;
int loop_shift;
int n_per_loop;
};
};
-enum {
- ORC_RULE_3REG = (1<<0),
- ORC_RULE_REG_REG = (1<<1),
- ORC_RULE_MEM_REG = (1<<2),
- ORC_RULE_REG_MEM = (1<<3),
- ORC_RULE_REG_IMM = (1<<4),
- ORC_RULE_MEM_IMM = (1<<5),
- ORC_RULE_REG_CL = (1<<6)
-};
-
void orc_init (void);
void orc_powerpc_init (void);
void orc_c_init (void);
+void orc_program_set_target (OrcProgram *p, const char *target);
+
void orc_program_compile (OrcProgram *p);
+void orc_program_c_init (OrcProgram *p);
void orc_program_x86_init (OrcProgram *p);
void orc_program_powerpc_init (OrcProgram *p);
void orc_program_assemble_x86 (OrcProgram *p);
void orc_executor_run (OrcExecutor *ex);
void orc_rule_register (const char *opcode_name, unsigned int mode,
- OrcRuleEmitFunc emit, void *emit_user, unsigned int flags);
+ OrcRuleEmitFunc emit, void *emit_user);
int orc_program_allocate_register (OrcProgram *program, int is_data);
int orc_program_x86_allocate_register (OrcProgram *program, int is_data);
void orc_program_dump_code (OrcProgram *program);
int orc_variable_get_size (OrcVariable *var);
+
+void orc_program_append_code (OrcProgram *p, const char *fmt, ...);
#endif
void
orc_rule_register (const char *opcode_name, unsigned int mode,
- OrcRuleEmitFunc emit, void *emit_user, unsigned int flags)
+ OrcRuleEmitFunc emit, void *emit_user)
{
OrcOpcode *opcode;
opcode->rules[mode].emit = emit;
opcode->rules[mode].emit_user = emit_user;
- opcode->rules[mode].flags = flags;
}
{
int i;
- orc_rule_register ("_loadi_s16", ORC_RULE_MMX_4, mmx_rule_loadi_s16, NULL,
- ORC_RULE_REG_IMM);
+ orc_rule_register ("_loadi_s16", ORC_RULE_MMX_4, mmx_rule_loadi_s16, NULL);
for(i=ORC_RULE_MMX_1; i <= ORC_RULE_MMX_4; i++) {
- orc_rule_register ("add_s16", i, mmx_rule_add_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("sub_s16", i, mmx_rule_sub_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("mul_s16", i, mmx_rule_mul_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("lshift_s16", i, mmx_rule_lshift_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("rshift_s16", i, mmx_rule_rshift_s16, NULL,
- ORC_RULE_REG_REG);
+ orc_rule_register ("add_s16", i, mmx_rule_add_s16, NULL);
+ orc_rule_register ("sub_s16", i, mmx_rule_sub_s16, NULL);
+ orc_rule_register ("mul_s16", i, mmx_rule_mul_s16, NULL);
+ orc_rule_register ("lshift_s16", i, mmx_rule_lshift_s16, NULL);
+ orc_rule_register ("rshift_s16", i, mmx_rule_rshift_s16, NULL);
}
}
{
int i;
- orc_rule_register ("_loadi_s16", ORC_RULE_SSE_4, sse_rule_loadi_s16, NULL,
- ORC_RULE_REG_IMM);
+ orc_rule_register ("_loadi_s16", ORC_RULE_SSE_4, sse_rule_loadi_s16, NULL);
for(i=ORC_RULE_SSE_1; i <= ORC_RULE_SSE_8; i++) {
- orc_rule_register ("add_s16", i, sse_rule_add_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("sub_s16", i, sse_rule_sub_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("mul_s16", i, sse_rule_mul_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("lshift_s16", i, sse_rule_lshift_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("rshift_s16", i, sse_rule_rshift_s16, NULL,
- ORC_RULE_REG_REG);
+ orc_rule_register ("add_s16", i, sse_rule_add_s16, NULL);
+ orc_rule_register ("sub_s16", i, sse_rule_sub_s16, NULL);
+ orc_rule_register ("mul_s16", i, sse_rule_mul_s16, NULL);
+ orc_rule_register ("lshift_s16", i, sse_rule_lshift_s16, NULL);
+ orc_rule_register ("rshift_s16", i, sse_rule_rshift_s16, NULL);
}
}
-
-#include "config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-
-#include <orc/orcprogram.h>
-#include <orc/x86.h>
-
-#define SIZE 65536
-
-/* rules */
-
-static void
-x86_rule_loadi_s16 (OrcProgram *p, void *user, OrcInstruction *insn)
-{
- x86_emit_mov_imm_reg (p, 2, p->vars[insn->args[2]].s16,
- p->vars[insn->args[0]].alloc);
-}
-
-static void
-x86_rule_add_s16 (OrcProgram *p, void *user, OrcInstruction *insn)
-{
- if (insn->rule_flag == ORC_RULE_REG_IMM) {
- int value = p->vars[insn->args[2]].s16;
- printf(" addw $%d, %%%s\n", value,
- x86_get_regname_16(p->vars[insn->args[0]].alloc));
-
- if (value >= -128 && value < 128) {
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0x83;
- x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 0);
- *p->codeptr++ = value;
- } else {
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0x81;
- x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 0);
- *p->codeptr++ = value & 0xff;
- *p->codeptr++ = value >> 8;
- }
- } else {
- printf(" addw %%%s, %%%s\n",
- x86_get_regname_16(p->vars[insn->args[2]].alloc),
- x86_get_regname_16(p->vars[insn->args[0]].alloc));
-
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0x03;
- x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc,
- p->vars[insn->args[0]].alloc);
- }
-}
-
-static void
-x86_rule_sub_s16 (OrcProgram *p, void *user, OrcInstruction *insn)
-{
- printf(" subw %%%s, %%%s\n",
- x86_get_regname_16(p->vars[insn->args[2]].alloc),
- x86_get_regname_16(p->vars[insn->args[0]].alloc));
-
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0x2b;
- x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc,
- p->vars[insn->args[0]].alloc);
-}
-
-static void
-x86_rule_mul_s16 (OrcProgram *p, void *user, OrcInstruction *insn)
-{
- printf(" imulw %%%s, %%%s\n",
- x86_get_regname_16(p->vars[insn->args[2]].alloc),
- x86_get_regname_16(p->vars[insn->args[0]].alloc));
-
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0x0f;
- *p->codeptr++ = 0xaf;
- x86_emit_modrm_reg (p, p->vars[insn->args[2]].alloc,
- p->vars[insn->args[0]].alloc);
-}
-
-static void
-x86_rule_lshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn)
-{
- x86_emit_mov_reg_reg(p, 4, p->vars[insn->args[2]].alloc, X86_ECX);
-
- printf(" shlw %%cl, %%%s\n",
- x86_get_regname_16(p->vars[insn->args[0]].alloc));
-
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0xd3;
- x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 4);
-}
-
-static void
-x86_rule_rshift_s16 (OrcProgram *p, void *user, OrcInstruction *insn)
-{
- if (insn->rule_flag == ORC_RULE_REG_IMM) {
- printf(" sarw $%d, %%%s\n",
- p->vars[insn->args[2]].s16,
- x86_get_regname_16(p->vars[insn->args[0]].alloc));
-
- if (p->vars[insn->args[2]].s16 == 1) {
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0xd1;
- x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 7);
- } else {
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0xc1;
- x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 7);
- *p->codeptr++ = p->vars[insn->args[2]].s16;
- }
- } else {
- x86_emit_mov_reg_reg(p, 4, p->vars[insn->args[2]].alloc, X86_ECX);
-
- printf(" sarw %%cl, %%%s\n",
- x86_get_regname_16(p->vars[insn->args[0]].alloc));
-
- *p->codeptr++ = 0x66;
- *p->codeptr++ = 0xd3;
- x86_emit_modrm_reg (p, p->vars[insn->args[0]].alloc, 7);
- }
-}
-
-
-void
-orc_program_x86_register_rules (void)
-{
- orc_rule_register ("_loadi_s16", ORC_RULE_SCALAR_1, x86_rule_loadi_s16, NULL,
- ORC_RULE_REG_IMM);
-
- orc_rule_register ("add_s16", ORC_RULE_SCALAR_1, x86_rule_add_s16, NULL,
- ORC_RULE_REG_REG | ORC_RULE_REG_IMM);
- orc_rule_register ("sub_s16", ORC_RULE_SCALAR_1, x86_rule_sub_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("mul_s16", ORC_RULE_SCALAR_1, x86_rule_mul_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("lshift_s16", ORC_RULE_SCALAR_1, x86_rule_lshift_s16, NULL,
- ORC_RULE_REG_REG);
- orc_rule_register ("rshift_s16", ORC_RULE_SCALAR_1, x86_rule_rshift_s16, NULL,
- ORC_RULE_REG_REG | ORC_RULE_REG_IMM);
-}
-