shift right logical; chessboard drawing example
This commit is contained in:
parent
308947c23d
commit
288801f902
3 changed files with 45 additions and 7 deletions
|
|
@ -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 })
|
||||
|
|
|
|||
|
|
@ -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++) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue