https://github.com/akkartik/mu/blob/main/linux/bootstrap/021div.cc
 1 //: helper for division operations: sign-extend EAX into EDX
 2 
 3 :(before "End Initialize Op Names")
 4 put_new(Name, "99", "sign-extend EAX into EDX (cdq)");
 5 
 6 :(code)
 7 void test_cdq() {
 8   Reg[EAX].i = 10;
 9   run(
10       "== code 0x1\n"
11       "99\n"
12   );
13   CHECK_TRACE_CONTENTS(
14       "run: sign-extend EAX into EDX\n"
15       "run: EDX is now 0x00000000\n"
16   );
17 }
18 
19 :(before "End Single-Byte Opcodes")
20 case 0x99: {  // sign-extend EAX into EDX
21   trace(Callstack_depth+1, "run") << "sign-extend EAX into EDX" << end();
22   Reg[EDX].i = (Reg[EAX].i < 0) ? -1 : 0;
23   trace(Callstack_depth+1, "run") << "EDX is now 0x" << HEXWORD << Reg[EDX].u << end();
24   break;
25 }
26 
27 :(code)
28 void test_cdq_negative() {
29   Reg[EAX].i = -10;
30   run(
31       "== code 0x1\n"
32       "99\n"
33   );
34   CHECK_TRACE_CONTENTS(
35       "run: sign-extend EAX into EDX\n"
36       "run: EDX is now 0xffffffff\n"
37   );
38 }