diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-07-27 16:01:55 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-07-27 17:47:59 -0700 |
commit | 6e1eeeebfb453fa7c871869c19375ce60fbd7413 (patch) | |
tree | 539c4a3fdf1756ae79770d5c4aaf6366f1d1525e /022div.cc | |
parent | 8846a7f85cc04b77b2fe8a67b6d317723437b00c (diff) | |
download | mu-6e1eeeebfb453fa7c871869c19375ce60fbd7413.tar.gz |
5485 - promote SubX to top-level
Diffstat (limited to '022div.cc')
-rw-r--r-- | 022div.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/022div.cc b/022div.cc new file mode 100644 index 00000000..15ed89d8 --- /dev/null +++ b/022div.cc @@ -0,0 +1,38 @@ +//: helper for division operations: sign-extend EAX into EDX + +:(before "End Initialize Op Names") +put_new(Name, "99", "sign-extend EAX into EDX (cdq)"); + +:(code) +void test_cdq() { + Reg[EAX].i = 10; + run( + "== code 0x1\n" + "99\n" + ); + CHECK_TRACE_CONTENTS( + "run: sign-extend EAX into EDX\n" + "run: EDX is now 0x00000000\n" + ); +} + +:(before "End Single-Byte Opcodes") +case 0x99: { // sign-extend EAX into EDX + trace(Callstack_depth+1, "run") << "sign-extend EAX into EDX" << end(); + Reg[EDX].i = (Reg[EAX].i < 0) ? -1 : 0; + trace(Callstack_depth+1, "run") << "EDX is now 0x" << HEXWORD << Reg[EDX].u << end(); + break; +} + +:(code) +void test_cdq_negative() { + Reg[EAX].i = -10; + run( + "== code 0x1\n" + "99\n" + ); + CHECK_TRACE_CONTENTS( + "run: sign-extend EAX into EDX\n" + "run: EDX is now 0xffffffff\n" + ); +} |