1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  unsigned int  UInt;
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt test_jcxz ( UInt arg )
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt block[2];
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block[0] = arg;
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block[1] = 0xdeadbeef;
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__(
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "movl %0,%%ecx\n\t"
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "movl $0,%%eax\n"
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "0:\n\t"
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "jcxz 1f\n\t"
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "addl $1, %%eax\n\t"
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "subl $1, %%ecx\n\t"
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "jmp 0b\n"
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "1:\n\t"
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "movl %%eax, %1"
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      : /*out*/ : /*in*/ "m"(block[0]),
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         "m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return block[1];
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt test_jecxz ( UInt arg )
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt block[2];
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block[0] = arg;
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block[1] = 0xdeadbeef;
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__ __volatile__(
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "movl %0,%%ecx\n\t"
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "movl $0,%%eax\n"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "0:\n\t"
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "jecxz 1f\n\t"
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "addl $1, %%eax\n\t"
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "subl $1, %%ecx\n\t"
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "jmp 0b\n"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "1:\n\t"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      "movl %%eax, %1"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      : /*out*/ : /*in*/ "m"(block[0]),
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         "m"(block[1]) : /*trash*/ "eax","ecx","cc","memory"
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   );
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return block[1];
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt arg = 0x01028374;
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("test_jcxz(0x%x)  = 0x%x\n", arg, test_jcxz(arg));
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("test_jecxz(0x%x) = 0x%x\n", arg, test_jecxz(arg));
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
55