M qbe/free.ha => qbe/free.ha +4 -0
@@ 118,6 118,10 @@ fn free_funcdef(f: funcdef) void = {
case variadic => void;
};
};
+ case let b: blit =>
+ free_val(b.src);
+ free_val(b.dst);
+ free_val(b.sz);
};
free(b.insts);
match (b.jump) {
M qbe/inst.ha => qbe/inst.ha +7 -1
@@ 209,7 209,13 @@ export type call = struct {
args: []arg,
};
-export type inst = (onearg | twoarg | _vastart | call);
+export type blit = struct {
+ src: val,
+ dst: val,
+ sz: val,
+};
+
+export type inst = (onearg | twoarg | _vastart | call | blit);
export fn strinst(i: (itype1 | itype2)) str = match (i) {
case let o: itype1 =>
M qbe/parse.ha => qbe/parse.ha +13 -0
@@ 315,6 315,19 @@ fn parse_statement(in: *lexer) (inst | phi | void | error) = {
args = args,
};
};
+ if (try(in, ltok::BLIT) is token) {
+ let src = parse_val(in)?;
+ want(in, ltok::COMMA)?;
+ let dst = parse_val(in)?;
+ want(in, ltok::COMMA)?;
+ let sz = parse_val(in)?;
+ parse_nl(in)?;
+ return blit {
+ src = src,
+ dst = dst,
+ sz = sz,
+ };
+ };
let out = match (out) {
case void => void;
case let out: (str, abity) =>
M qbe/token.ha => qbe/token.ha +3 -0
@@ 20,6 20,7 @@ export type ltok = enum {
ARGV,
ARGW,
B,
+ BLIT,
CALL,
CAST,
CEQD,
@@ 169,6 170,7 @@ const bmap: [_]str = [
"argv",
"argw",
"b",
+ "blit",
"call",
"cast",
"ceqd",
@@ 317,6 319,7 @@ case ltok::ARGS => return "ARGS";
case ltok::ARGV => return "ARGV";
case ltok::ARGW => return "ARGW";
case ltok::B => return "B";
+case ltok::BLIT => return "BLIT";
case ltok::CALL => return "CALL";
case ltok::CAST => return "CAST";
case ltok::CEQD => return "CEQD";