~evan/hare-qbe

fbcb44717f3c75381c7c6d4e8ecb0aaca78787df — Ember Sawady 3 months ago 91a883d master
Add blit

Signed-off-by: Ember Sawady <ecs@d2evs.net>
4 files changed, 27 insertions(+), 1 deletions(-)

M qbe/free.ha
M qbe/inst.ha
M qbe/parse.ha
M qbe/token.ha
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";