from cinap: add idiv instruction. Reference: /n/atom/patch/applied/realemuidiv Date: Tue Mar 4 21:49:49 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/aux/realemu/main.c Tue Mar 4 21:49:35 2014 +++ /sys/src/cmd/aux/realemu/main.c Tue Mar 4 21:49:36 2014 @@ -288,7 +288,7 @@ /* B */ nil, rrealmem, wrealmem, /* RAM: VGA framebuffer */ /* C */ memory, rmem, wmem, /* ROM: VGA BIOS */ /* D */ nil, rbad, wbad, - /* E */ memory, rmem, wbad, /* ROM: BIOS */ + /* E */ memory, rmem, wmem, /* ROM: BIOS */ /* F */ memory, rmem, wbad, /* ROM: BIOS */ }; --- /sys/src/cmd/aux/realemu/xec.c Tue Mar 4 21:49:38 2014 +++ /sys/src/cmd/aux/realemu/xec.c Tue Mar 4 21:49:40 2014 @@ -769,12 +769,45 @@ n = (uvlong)ar(ra)< m) - trap(cpu, EGPF); + trap(cpu, EDIV0); r = n%d; aw(ra, r); aw(qa, q); } - + +static void +opidiv(Cpu *cpu, Inst *i) +{ + Iarg *qa, *ra; + vlong n, q, min, max; + long r, d; + int s; + + s = i->a1->len*8; + d = ars(i->a1); + if(d == 0) + trap(cpu, EDIV0); + if(s == 8){ + qa = areg(cpu, 1, RAX); + ra = adup(qa); + ra->tag |= TH; + } else { + qa = areg(cpu, i->olen, RAX); + ra = areg(cpu, i->olen, RDX); + } + n = (vlong)ars(ra)< max || q < min) + trap(cpu, EDIV0); + + aw(ra, r); + aw(qa, q); +} static int cctrue(Cpu *cpu, Inst *i) @@ -1249,6 +1282,7 @@ [OMUL] = opmul, [OIMUL] = opimul, [ODIV] = opdiv, + [OIDIV] = opidiv, [OLEA] = oplea, [OMOV] = opmov,