diff --git a/src/codegen/x86_64/isel.ts b/src/codegen/x86_64/isel.ts new file mode 100644 index 0000000..6c305ab --- /dev/null +++ b/src/codegen/x86_64/isel.ts @@ -0,0 +1,4 @@ +import * as mir from "../../mir.ts"; + +export function selectFnInstructions(fn: mir.Fn) { +} diff --git a/src/codegen/x86_64/module.ts b/src/codegen/x86_64/module.ts new file mode 100644 index 0000000..78b9947 --- /dev/null +++ b/src/codegen/x86_64/module.ts @@ -0,0 +1,66 @@ +export class Module { + private fns: Fn[] = []; +} + +export class Fn { + private blocks: Block[] = []; +} + +export class Block { + private insts: Inst[] = []; + + push(inst: Inst) { + this.insts.push(inst); + } +} + +export class Inst { +} + +export type InstKind = + | { tag: "PushR"; src: Reg } + | { tag: "PopR"; dst: Reg } + | { tag: "MovRR"; dst: Reg; src: Reg } + | { tag: "SubRI"; dst: Reg; imm: number } + | { tag: "MovRI"; dst: Reg; imm: number } + | { tag: "MovMRR"; dst: Reg; offset: number; src: Reg } + | { tag: "MovRMR"; dst: Reg; src: Reg; offset: number } + | { tag: "AddR"; dst_op1: Reg; op2: Reg } + | { tag: "Jmp"; bb: number } + | { tag: "Ret" }; + +export class Reg { + static tempId = 1000; + + private constructor( + private id: number, + ) {} + + static reg(reg: Regs): Reg { + return new Reg(reg); + } + + static temp(): Reg { + return new Reg(this.tempId++); + } +} + +export const Regs = { + a: 1, + b: 2, + c: 3, + si: 4, + di: 5, + sp: 6, + bp: 7, + r8: 8, + r9: 9, + r10: 10, + r11: 11, + r12: 12, + r13: 13, + r14: 14, + r15: 15, +} as const; + +export type Regs = typeof Regs[keyof typeof Regs];