1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdint.h>
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <inttypes.h>
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <assert.h>
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The golden logs were obtained by running this test natively. */
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The abstracted result of a CLCL insn */
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct {
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t addr1;
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint32_t len1;
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t addr2;
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint32_t len2;
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t  pad;
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint32_t cc;
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} clcl_t;
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Register contents after CLCL insn */
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct {
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t r1;
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t r1p1;
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t r2;
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t r2p1;
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t cc;
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} clcl_regs;
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Run a single CLCL insn and return its raw result. */
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic clcl_regs
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovdo_clcl(uint64_t r1, uint64_t r1p1, uint64_t r2, uint64_t r2p1)
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  clcl_regs regs;
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  register uint64_t a1 asm ("2") = r1;
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  register uint64_t l1 asm ("3") = r1p1;
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  register uint64_t a2 asm ("4") = r2;
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  register uint64_t l2 asm ("5") = r2p1;
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  register uint32_t cc asm ("7");
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  asm volatile(	"0: clcl 2,4\n\t"
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                "jo 0b\n\t"
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                "ipm %0\n\t"
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                "srl %0,28\n\t"
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                :"=d" (cc), "+d" (a1),"+d" (l1), "+d" (a2), "+d" (l2)
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                : : "memory", "cc");
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  regs.r1   = a1;
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  regs.r1p1 = l1;
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  regs.r2   = a2;
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  regs.r2p1 = l2;
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  regs.cc   = cc;
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return regs;
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovclcl_t
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovresult_from_regs(clcl_regs regs)
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  clcl_t result;
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result.addr1 = regs.r1;
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result.len1  = regs.r1p1 & 0xFFFFFF;
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result.addr2 = regs.r2;
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result.len2  = regs.r2p1 & 0xFFFFFF;
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result.pad   = (regs.r2p1 & 0xFF000000u) >> 24;
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result.cc    = regs.cc;
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return result;
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Run CLCL twice using different fill bits for unused register bits.
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Results ought to be the same */
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic clcl_t
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovclcl(void *addr1, uint32_t len1,
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     void *addr2, uint32_t len2, uint32_t pad)
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  clcl_t result1, result2;
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  clcl_regs regs;
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint64_t r1, r1p1, r2, r2p1;
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Check input arguments */
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  assert((pad & 0xFF) == pad);  /* an 8-byte value */
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  assert((len1 & 0xFFFFFF) == len1);
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  assert((len2 & 0xFFFFFF) == len2);
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Build up register contents setting unused bits to 0 */
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  r1   = (uint64_t)addr1;
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  r1p1 = len1;
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  r2   = (uint64_t)addr2;
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  r2p1 = len2 | (pad << 24);
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Run clcl */
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  regs = do_clcl(r1, r1p1, r2, r2p1);
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result1 = result_from_regs(regs);
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Check unused bits */
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if ((regs.r1p1 >> 24) != 0)
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: r1[0:39] modified (unused bits 0)\n");
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if ((regs.r2p1 >> 32) != 0)
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: r2[0:31] modified (unused bits 0)\n");
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Check pad value */
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result1.pad != pad)
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: pad byte modified (unused bits 0)\n");
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Build up register contents setting unused bits to 1 */
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  r1p1 |= 0xFFFFFFFFFFull << 24;
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  r2p1 |= ((uint64_t)0xFFFFFFFF) << 32;
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Run clcl again */
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  regs = do_clcl(r1, r1p1, r2, r2p1);
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result2 = result_from_regs(regs);
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Check unused bits */
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if ((regs.r1p1 >> 24) != 0xFFFFFFFFFFull)
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: r1[0:39] modified (unused bits 1)\n");
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if ((regs.r2p1 >> 32) != 0xFFFFFFFFu)
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: r2[0:31] modified (unused bits 1)\n");
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Check pad value */
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result2.pad != pad)
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: pad byte modified (unused bits 1)\n");
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Compare results */
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result1.addr1 != result2.addr1)
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: addr1 result is different\n");
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result1.addr2 != result2.addr2)
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: addr2 result is different\n");
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result1.len1 != result2.len1)
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: len1 result is different\n");
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result1.len2 != result2.len2)
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: len2 result is different\n");
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result1.pad != result2.pad)
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: pad result is different\n");
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (result1.cc != result2.cc)
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    printf("FAIL: cc result is different\n");
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return result1;
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovrun_test(void *addr1, uint32_t len1, void *addr2, uint32_t len2, uint32_t pad)
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  clcl_t result;
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  result = clcl(addr1, len1, addr2, len2, pad);
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("cc: %"PRIu32", len1: %"PRIu32", len2: %"PRIu32
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ", addr1 diff: %"PRId64", addr2 diff: %"PRId64"\n", result.cc,
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         result.len1, result.len2, (int64_t)result.addr1 - (int64_t)addr1,
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         (int64_t)result.addr2 - (int64_t)addr2);
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main()
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t byte, byte1, byte2;
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 1: both lengths are 0; nothing loaded from memory */
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 1 ---\n");
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(NULL, 0, NULL, 0, 0x00);
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(NULL, 0, NULL, 0, 0xff);
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 2: Compare two single bytes */
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 2 ---\n");
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  byte1 = 10;
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  byte2 = 20;
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte1, 1, &byte2, 1, 0x00);  // first operand low
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte1, 1, &byte1, 1, 0x00);  // equal
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte2, 1, &byte1, 1, 0x00);  // first operand high
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte1, 1, &byte2, 1, 0xFF);  // first operand low
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte1, 1, &byte1, 1, 0xFF);  // equal
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte2, 1, &byte1, 1, 0xFF);  // first operand high
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 3: Compare a single byte against the pad byte */
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 3 ---\n");
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  byte = 10;
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(NULL, 0, &byte, 1, 10);  // equal
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(NULL, 0, &byte, 1,  9);  // first operand low
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(NULL, 0, &byte, 1, 11);  // first operand high
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Swap operands */
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte, 1, NULL, 0, 10);  // equal
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte, 1, NULL, 0,  9);  // first operand high
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte, 1, NULL, 0, 11);  // first operand low
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 4: Make sure pad byte is interpreted as unsigned value */
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 4 ---\n");
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  byte = 10;
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte, 1, NULL, 0, 0xFF);  // first operand low
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  byte = 0xFF;
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(&byte, 1, NULL, 0, 0xFF);  // equal
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 5: Compare a buffer against the pad byte */
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 5 ---\n");
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t buf1[4] = "yyyy";
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(buf1, 4, NULL, 0, 'y');    // equal
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(buf1, 4, NULL, 0, 'x');    // greater
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(buf1, 4, NULL, 0, 'z');    // less
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 6: Compare two buffers of same size (difference in 1st byte) */
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  {
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 6 ---\n");
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t x[5] = "pqrst";
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t y[5] = "abcde";
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t z[5] = "abcde";
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(x, 5, y, 5, 'a');   // first operand low
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(y, 5, x, 5, 'a');   // first operand high
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(y, 5, z, 5, 'q');   // equal
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 7: Compare two buffers of same size (difference in last byte) */
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  {
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 7 ---\n");
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t x[5] = "abcdd";
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t y[5] = "abcde";
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t z[5] = "abcdf";
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(x, 5, y, 5, 'a');   // first operand low
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(z, 5, z, 5, 'a');   // first operand high
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 8: Compare two buffers of different size. The difference
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     is past the end of the shorter string. */
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  {
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 8 ---\n");
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t x[5] = "abcde";
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t y[7] = "abcdeff";
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(x, 5, y, 7, 0);   // first operand low
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(y, 7, x, 5, 0);   // first operand high
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(x, 5, y, 7, 'f'); // equal
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(y, 7, x, 5, 'f'); // equal
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  /* Test 9: Compare two buffers of different size. The difference
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     is before the end of the shorter string. */
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  {
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("--- test 9 ---\n");
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t x[5] = "abcab";
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  uint8_t y[7] = "abcdeff";
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(x, 5, y, 7, 0);   // first operand low
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(y, 7, x, 5, 0);   // first operand high
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(x, 5, y, 7, 'f'); // first operand low
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  run_test(y, 7, x, 5, 'f'); // first operand high
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return 0;
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
245