It looks like my modified 3e comp-power.c didn't make it into Vitanuova's tree. I added code to generate instructions to zero R0: ; grep -ni 'set r0 to 0' `{files | grep '\.[cshy]$'} ./interp/comp-power.c:682: AIRR(Oaddi, Rzero, 0, 0); /* set R0 to 0 */ ./interp/comp-power.c:1550: AIRR(Oaddi, Rzero, 0, 0); /* set R0 to 0 */ ./interp/comp-power.c:1589: AIRR(Oaddi, Rzero, 0, 0); /* set R0 to 0 */ ./interp/comp-power.c:1742: AIRR(Oaddi, Rzero, 0, 0); /* set R0 to 0 */ ./interp/comp-power.c:1778: AIRR(Oaddi, Rzero, 0, 0); /* set R0 to 0 */ ./interp/comp-power.c:1816: AIRR(Oaddi, Rzero, 0, 0); /* set R0 to 0 */ but these don't appear in December's preliminary 4e tree: ; cd /i/libinterp; grep -i airr comp-power.c | grep -i rzero AIRR(Oaddis, reg,Rzero,c>>16); AIRR(Oaddi, reg, Rzero, c); AIRR(Oaddis, reg,Rzero,c>>16); AIRR(Ostw, Rzero, Rreg,O(REG,st)); AIRR(Ostw, Rzero, Ro1,O(Frame,mr)); // Ro1->mr = nil Adding these instructions made the JIT start working on OS X. Quoting some mail from Charles about why the `zero R0' instructions are necessary: i decided to define R0==0 in the Inferno compilers ([...]). the run time start up code and the native kernel load R0 with 0 once or twice and keep it there. that could be done in preamble(). i haven't got my powepc handbook here, but i think this will do that much: s = code = malloc(PREFLEN*sizeof(*code)); ldc((ulong)&R, Rreg); AIRR(Oaddi, Rzero, 0, 0); /* set R0 to zero */ in fact you need to add that line after every ldc((ulong)&R, Rreg); in punt, and several mac*, so that the zero value is reset after every call out to C code. I'll send my comp-power.c to Charles and Jeff Sickel. I'll keep looking through my changes, but I'm pretty sure that this is the one that matters. Speaking of changes getting missed, I've attached a bundle of a program that I use a lot when merging trees. It sounds dangerous, but it's pretty cautious and I've used it for years without trouble. Given an original tree and a modified tree, cd into the modified tree (or a copy thereof if you want to preserve the modified tree), and run diff -rw /original/tree . >/tmp/diffs rmsame /original/tree This removes all empty directories and all files in the current tree that exactly match files in /original/tree. (One could argue that it should remove the matching contents of the argument tree instead, but this is the way it's always been. There may be a small performance advantage to removing using relative path names in the current tree.) Obvious attempts to shoot yourself in the foot, such as `rmsame .' and `rmsame `{pwd}' are rejected. The reason to run diff -r first is to see if any files in the original tree had been removed from the modified tree, if you care. One can then prowl the remaining degenerate tree with acme or cd and remove files as they are merged (or rejected) into the original tree.