diff --git a/mach/proto/mcg/treebuilder.c b/mach/proto/mcg/treebuilder.c index 4060b206f..c2083b8ab 100644 --- a/mach/proto/mcg/treebuilder.c +++ b/mach/proto/mcg/treebuilder.c @@ -504,6 +504,23 @@ static void insn_ivalue(int opcode, arith value) ); break; + case op_lof: + { + struct ir* ptr = pop(EM_pointersize); + + push( + new_ir1( + IR_LOAD, EM_wordsize, + new_ir2( + IR_ADD, EM_pointersize, + ptr, + new_wordir(value) + ) + ) + ); + break; + } + case op_sti: { struct ir* ptr = pop(EM_pointersize); @@ -518,6 +535,25 @@ static void insn_ivalue(int opcode, arith value) break; } + case op_stf: + { + struct ir* ptr = pop(EM_pointersize); + struct ir* val = pop(value); + + appendir( + new_ir2( + IR_STORE, EM_wordsize, + new_ir2( + IR_ADD, EM_pointersize, + ptr, + new_wordir(value) + ), + val + ) + ); + break; + } + case op_cmi: push( tristate_compare(value, IR_COMPARES)