shift right logical; chessboard drawing example

This commit is contained in:
uosfz 2026-06-17 23:07:00 +02:00
parent 308947c23d
commit 288801f902
Signed by: uosfz
SSH key fingerprint: SHA256:FlktuluyhTQg3jHZNLKwxOOC5hbfrUXM0tz3IA3lGJo
3 changed files with 45 additions and 7 deletions

View file

@ -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 })

View file

@ -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++) {

View file

@ -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;
}