diff --git a/include/jit.h b/include/jit.h index 9b29990..322efe0 100644 --- a/include/jit.h +++ b/include/jit.h @@ -13,10 +13,18 @@ enum op { ADD, // ra += rb MOV, // ra = rb MOVI, // ra = imm - SHLI, + SLL, + SLLI, + SRL, + SRLI, + SRA, + SRAI, AND, ANDI, OR, + ORI, + XOR, + XORI, RET, // return LD, // ra = mem[rb + imm] SD, // mem[rb + imm] = ra @@ -45,7 +53,8 @@ enum reg { #define GEN_AND(my_ra, my_rb) ((struct insn) { .op = AND, .ra = my_ra, .rb = my_rb }) #define GEN_MOV(my_ra, my_rb) ((struct insn) { .op = MOV, .ra = my_ra, .rb = my_rb }) #define GEN_MOVI(my_ra, i) ((struct insn) { .op = MOVI, .ra = my_ra, .rb = 0, .imm = i }) -#define GEN_SHLI(my_ra, i) ((struct insn) { .op = SHLI, .ra = my_ra, .rb = 0, .imm = i }) +#define GEN_SLLI(my_ra, i) ((struct insn) { .op = SLLI, .ra = my_ra, .rb = 0, .imm = i }) +#define GEN_SRLI(my_ra, i) ((struct insn) { .op = SRLI, .ra = my_ra, .rb = 0, .imm = i }) #define GEN_OR(my_ra, my_rb) ((struct insn) { .op = OR, .ra = my_ra, .rb = my_rb }) #define GEN_RET() ((struct insn) { .op = RET, .ra = 0, .rb = 0 }) #define GEN_LD(reg, addr, i) ((struct insn) { .op = LD, .ra = reg, .rb = addr, .imm = i }) diff --git a/src/app_jitpaint.c b/src/app_jitpaint.c index bd08adf..b8c0858 100644 --- a/src/app_jitpaint.c +++ b/src/app_jitpaint.c @@ -24,13 +24,34 @@ static void app_jitpaint_init(void *self) { struct app_jitpaint *app = self; // color format: pack(r, g, b) = (r<<16) | (g<<8) | b struct insn insns[] = { - GEN_SHLI(R0, 16), - GEN_ANDI(R1, 0xf), - GEN_SHLI(R1, 8), + GEN_SRLI(R0, 5), + GEN_SRLI(R1, 5), + GEN_ADD(R0, R1), + GEN_ANDI(R0, 1), + + GEN_MOV(R1, R0), + GEN_SLLI(R1, 1), GEN_OR(R0, R1), + + GEN_MOV(R1, R0), + GEN_SLLI(R1, 2), + GEN_OR(R0, R1), + + GEN_MOV(R1, R0), + GEN_SLLI(R1, 4), + GEN_OR(R0, R1), + + GEN_MOV(R1, R0), + GEN_SLLI(R1, 8), + GEN_OR(R0, R1), + + GEN_MOV(R1, R0), + GEN_SLLI(R1, 8), + GEN_OR(R0, R1), + GEN_RET(), }; - uint8_t mem[100]; + uint8_t mem[256]; ASSERT(jit_compile(insns, sizeof(insns)/sizeof(insns[0]), mem)); for (unsigned y = 0; y < CANVAS_HEIGHT; y++) { for (unsigned x = 0; x < CANVAS_WIDTH; x++) { diff --git a/src/x86_64/jit.c b/src/x86_64/jit.c index dc621de..f223c12 100644 --- a/src/x86_64/jit.c +++ b/src/x86_64/jit.c @@ -95,13 +95,20 @@ uint8_t *jit_compile_single(struct insn *insn, uint8_t *mem) { insn->imm >>= 8; } break; - case SHLI: + case SLLI: *mem++ = OPBYTE(0x48, 0, x86a); *mem++ = 0xc1; *mem++ = MODRM(0xe0, 0, x86a); ASSERT(insn->imm < 64); *mem++ = insn->imm; break; + case SRLI: + *mem++ = OPBYTE(0x48, 0, x86a); + *mem++ = 0xc1; + *mem++ = MODRM(0xe8, 0, x86a); + ASSERT(insn->imm < 64); + *mem++ = insn->imm; + break; case LD: case SD: case LW: @@ -130,6 +137,7 @@ uint8_t *jit_compile_single(struct insn *insn, uint8_t *mem) { case RET: *mem++ = 0xc3; break; + default: TODO(); } return mem; }