17dbbd19ccd8585dd8214109a758eeb590c541ec6florian#include <stdio.h>
27dbbd19ccd8585dd8214109a758eeb590c541ec6florian#include <stdint.h>
37dbbd19ccd8585dd8214109a758eeb590c541ec6florian#include <inttypes.h>
47dbbd19ccd8585dd8214109a758eeb590c541ec6florian#include <assert.h>
57dbbd19ccd8585dd8214109a758eeb590c541ec6florian
67dbbd19ccd8585dd8214109a758eeb590c541ec6florian/* The golden logs were obtained by running this test natively. */
77dbbd19ccd8585dd8214109a758eeb590c541ec6florian
87dbbd19ccd8585dd8214109a758eeb590c541ec6florian/* The abstracted result of a CLCL insn */
97dbbd19ccd8585dd8214109a758eeb590c541ec6floriantypedef struct {
107dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t addr1;
117dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint32_t len1;
127dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t addr2;
137dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint32_t len2;
147dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t  pad;
157dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint32_t cc;
167dbbd19ccd8585dd8214109a758eeb590c541ec6florian} clcl_t;
177dbbd19ccd8585dd8214109a758eeb590c541ec6florian
187dbbd19ccd8585dd8214109a758eeb590c541ec6florian/* Register contents after CLCL insn */
197dbbd19ccd8585dd8214109a758eeb590c541ec6floriantypedef struct {
207dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t r1;
217dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t r1p1;
227dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t r2;
237dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t r2p1;
247dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t cc;
257dbbd19ccd8585dd8214109a758eeb590c541ec6florian} clcl_regs;
267dbbd19ccd8585dd8214109a758eeb590c541ec6florian
277dbbd19ccd8585dd8214109a758eeb590c541ec6florian/* Run a single CLCL insn and return its raw result. */
287dbbd19ccd8585dd8214109a758eeb590c541ec6florianstatic clcl_regs
297dbbd19ccd8585dd8214109a758eeb590c541ec6floriando_clcl(uint64_t r1, uint64_t r1p1, uint64_t r2, uint64_t r2p1)
307dbbd19ccd8585dd8214109a758eeb590c541ec6florian{
317dbbd19ccd8585dd8214109a758eeb590c541ec6florian  clcl_regs regs;
327dbbd19ccd8585dd8214109a758eeb590c541ec6florian
337dbbd19ccd8585dd8214109a758eeb590c541ec6florian  register uint64_t a1 asm ("2") = r1;
347dbbd19ccd8585dd8214109a758eeb590c541ec6florian  register uint64_t l1 asm ("3") = r1p1;
357dbbd19ccd8585dd8214109a758eeb590c541ec6florian  register uint64_t a2 asm ("4") = r2;
367dbbd19ccd8585dd8214109a758eeb590c541ec6florian  register uint64_t l2 asm ("5") = r2p1;
377dbbd19ccd8585dd8214109a758eeb590c541ec6florian  register uint32_t cc asm ("7");
387dbbd19ccd8585dd8214109a758eeb590c541ec6florian
397dbbd19ccd8585dd8214109a758eeb590c541ec6florian  asm volatile(	"0: clcl 2,4\n\t"
407dbbd19ccd8585dd8214109a758eeb590c541ec6florian                "jo 0b\n\t"
417dbbd19ccd8585dd8214109a758eeb590c541ec6florian                "ipm %0\n\t"
427dbbd19ccd8585dd8214109a758eeb590c541ec6florian                "srl %0,28\n\t"
437dbbd19ccd8585dd8214109a758eeb590c541ec6florian                :"=d" (cc), "+d" (a1),"+d" (l1), "+d" (a2), "+d" (l2)
447dbbd19ccd8585dd8214109a758eeb590c541ec6florian                : : "memory", "cc");
457dbbd19ccd8585dd8214109a758eeb590c541ec6florian
467dbbd19ccd8585dd8214109a758eeb590c541ec6florian  regs.r1   = a1;
477dbbd19ccd8585dd8214109a758eeb590c541ec6florian  regs.r1p1 = l1;
487dbbd19ccd8585dd8214109a758eeb590c541ec6florian  regs.r2   = a2;
497dbbd19ccd8585dd8214109a758eeb590c541ec6florian  regs.r2p1 = l2;
507dbbd19ccd8585dd8214109a758eeb590c541ec6florian  regs.cc   = cc;
517dbbd19ccd8585dd8214109a758eeb590c541ec6florian
527dbbd19ccd8585dd8214109a758eeb590c541ec6florian  return regs;
537dbbd19ccd8585dd8214109a758eeb590c541ec6florian}
547dbbd19ccd8585dd8214109a758eeb590c541ec6florian
557dbbd19ccd8585dd8214109a758eeb590c541ec6florianclcl_t
567dbbd19ccd8585dd8214109a758eeb590c541ec6florianresult_from_regs(clcl_regs regs)
577dbbd19ccd8585dd8214109a758eeb590c541ec6florian{
587dbbd19ccd8585dd8214109a758eeb590c541ec6florian  clcl_t result;
597dbbd19ccd8585dd8214109a758eeb590c541ec6florian
607dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result.addr1 = regs.r1;
617dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result.len1  = regs.r1p1 & 0xFFFFFF;
627dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result.addr2 = regs.r2;
637dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result.len2  = regs.r2p1 & 0xFFFFFF;
647dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result.pad   = (regs.r2p1 & 0xFF000000u) >> 24;
657dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result.cc    = regs.cc;
667dbbd19ccd8585dd8214109a758eeb590c541ec6florian
677dbbd19ccd8585dd8214109a758eeb590c541ec6florian  return result;
687dbbd19ccd8585dd8214109a758eeb590c541ec6florian}
697dbbd19ccd8585dd8214109a758eeb590c541ec6florian
707dbbd19ccd8585dd8214109a758eeb590c541ec6florian/* Run CLCL twice using different fill bits for unused register bits.
717dbbd19ccd8585dd8214109a758eeb590c541ec6florian   Results ought to be the same */
727dbbd19ccd8585dd8214109a758eeb590c541ec6florianstatic clcl_t
737dbbd19ccd8585dd8214109a758eeb590c541ec6florianclcl(void *addr1, uint32_t len1,
747dbbd19ccd8585dd8214109a758eeb590c541ec6florian     void *addr2, uint32_t len2, uint32_t pad)
757dbbd19ccd8585dd8214109a758eeb590c541ec6florian{
767dbbd19ccd8585dd8214109a758eeb590c541ec6florian  clcl_t result1, result2;
777dbbd19ccd8585dd8214109a758eeb590c541ec6florian  clcl_regs regs;
787dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint64_t r1, r1p1, r2, r2p1;
797dbbd19ccd8585dd8214109a758eeb590c541ec6florian
807dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Check input arguments */
817dbbd19ccd8585dd8214109a758eeb590c541ec6florian  assert((pad & 0xFF) == pad);  /* an 8-byte value */
827dbbd19ccd8585dd8214109a758eeb590c541ec6florian  assert((len1 & 0xFFFFFF) == len1);
837dbbd19ccd8585dd8214109a758eeb590c541ec6florian  assert((len2 & 0xFFFFFF) == len2);
847dbbd19ccd8585dd8214109a758eeb590c541ec6florian
857dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Build up register contents setting unused bits to 0 */
867dbbd19ccd8585dd8214109a758eeb590c541ec6florian  r1   = (uint64_t)addr1;
877dbbd19ccd8585dd8214109a758eeb590c541ec6florian  r1p1 = len1;
887dbbd19ccd8585dd8214109a758eeb590c541ec6florian  r2   = (uint64_t)addr2;
897dbbd19ccd8585dd8214109a758eeb590c541ec6florian  r2p1 = len2 | (pad << 24);
907dbbd19ccd8585dd8214109a758eeb590c541ec6florian
917dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Run clcl */
927dbbd19ccd8585dd8214109a758eeb590c541ec6florian  regs = do_clcl(r1, r1p1, r2, r2p1);
937dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result1 = result_from_regs(regs);
947dbbd19ccd8585dd8214109a758eeb590c541ec6florian
957dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Check unused bits */
967dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if ((regs.r1p1 >> 24) != 0)
977dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: r1[0:39] modified (unused bits 0)\n");
987dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if ((regs.r2p1 >> 32) != 0)
997dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: r2[0:31] modified (unused bits 0)\n");
1007dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1017dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Check pad value */
1027dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result1.pad != pad)
1037dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: pad byte modified (unused bits 0)\n");
1047dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1057dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Build up register contents setting unused bits to 1 */
1067dbbd19ccd8585dd8214109a758eeb590c541ec6florian  r1p1 |= 0xFFFFFFFFFFull << 24;
1077dbbd19ccd8585dd8214109a758eeb590c541ec6florian  r2p1 |= ((uint64_t)0xFFFFFFFF) << 32;
1087dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1097dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Run clcl again */
1107dbbd19ccd8585dd8214109a758eeb590c541ec6florian  regs = do_clcl(r1, r1p1, r2, r2p1);
1117dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result2 = result_from_regs(regs);
1127dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1137dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Check unused bits */
1147dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if ((regs.r1p1 >> 24) != 0xFFFFFFFFFFull)
1157dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: r1[0:39] modified (unused bits 1)\n");
1167dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if ((regs.r2p1 >> 32) != 0xFFFFFFFFu)
1177dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: r2[0:31] modified (unused bits 1)\n");
1187dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1197dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Check pad value */
1207dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result2.pad != pad)
1217dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: pad byte modified (unused bits 1)\n");
1227dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1237dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Compare results */
1247dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result1.addr1 != result2.addr1)
1257dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: addr1 result is different\n");
1267dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result1.addr2 != result2.addr2)
1277dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: addr2 result is different\n");
1287dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result1.len1 != result2.len1)
1297dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: len1 result is different\n");
1307dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result1.len2 != result2.len2)
1317dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: len2 result is different\n");
1327dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result1.pad != result2.pad)
1337dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: pad result is different\n");
1347dbbd19ccd8585dd8214109a758eeb590c541ec6florian  if (result1.cc != result2.cc)
1357dbbd19ccd8585dd8214109a758eeb590c541ec6florian    printf("FAIL: cc result is different\n");
1367dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1377dbbd19ccd8585dd8214109a758eeb590c541ec6florian  return result1;
1387dbbd19ccd8585dd8214109a758eeb590c541ec6florian}
1397dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1407dbbd19ccd8585dd8214109a758eeb590c541ec6florianvoid
1417dbbd19ccd8585dd8214109a758eeb590c541ec6florianrun_test(void *addr1, uint32_t len1, void *addr2, uint32_t len2, uint32_t pad)
1427dbbd19ccd8585dd8214109a758eeb590c541ec6florian{
1437dbbd19ccd8585dd8214109a758eeb590c541ec6florian  clcl_t result;
1447dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1457dbbd19ccd8585dd8214109a758eeb590c541ec6florian  result = clcl(addr1, len1, addr2, len2, pad);
1467dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1477dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("cc: %"PRIu32", len1: %"PRIu32", len2: %"PRIu32
1487dbbd19ccd8585dd8214109a758eeb590c541ec6florian         ", addr1 diff: %"PRId64", addr2 diff: %"PRId64"\n", result.cc,
1497dbbd19ccd8585dd8214109a758eeb590c541ec6florian         result.len1, result.len2, (int64_t)result.addr1 - (int64_t)addr1,
1507dbbd19ccd8585dd8214109a758eeb590c541ec6florian         (int64_t)result.addr2 - (int64_t)addr2);
1517dbbd19ccd8585dd8214109a758eeb590c541ec6florian}
1527dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1537dbbd19ccd8585dd8214109a758eeb590c541ec6florianint main()
1547dbbd19ccd8585dd8214109a758eeb590c541ec6florian{
1557dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t byte, byte1, byte2;
1567dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1577dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 1: both lengths are 0; nothing loaded from memory */
1587dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 1 ---\n");
1597dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(NULL, 0, NULL, 0, 0x00);
1607dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(NULL, 0, NULL, 0, 0xff);
1617dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1627dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 2: Compare two single bytes */
1637dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 2 ---\n");
1647dbbd19ccd8585dd8214109a758eeb590c541ec6florian  byte1 = 10;
1657dbbd19ccd8585dd8214109a758eeb590c541ec6florian  byte2 = 20;
1667dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte1, 1, &byte2, 1, 0x00);  // first operand low
1677dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte1, 1, &byte1, 1, 0x00);  // equal
1687dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte2, 1, &byte1, 1, 0x00);  // first operand high
1697dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte1, 1, &byte2, 1, 0xFF);  // first operand low
1707dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte1, 1, &byte1, 1, 0xFF);  // equal
1717dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte2, 1, &byte1, 1, 0xFF);  // first operand high
1727dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1737dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 3: Compare a single byte against the pad byte */
1747dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 3 ---\n");
1757dbbd19ccd8585dd8214109a758eeb590c541ec6florian  byte = 10;
1767dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(NULL, 0, &byte, 1, 10);  // equal
1777dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(NULL, 0, &byte, 1,  9);  // first operand low
1787dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(NULL, 0, &byte, 1, 11);  // first operand high
1797dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Swap operands */
1807dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte, 1, NULL, 0, 10);  // equal
1817dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte, 1, NULL, 0,  9);  // first operand high
1827dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte, 1, NULL, 0, 11);  // first operand low
1837dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1847dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 4: Make sure pad byte is interpreted as unsigned value */
1857dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 4 ---\n");
1867dbbd19ccd8585dd8214109a758eeb590c541ec6florian  byte = 10;
1877dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte, 1, NULL, 0, 0xFF);  // first operand low
1887dbbd19ccd8585dd8214109a758eeb590c541ec6florian  byte = 0xFF;
1897dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(&byte, 1, NULL, 0, 0xFF);  // equal
1907dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1917dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 5: Compare a buffer against the pad byte */
1927dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 5 ---\n");
1937dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t buf1[4] = "yyyy";
1947dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(buf1, 4, NULL, 0, 'y');    // equal
1957dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(buf1, 4, NULL, 0, 'x');    // greater
1967dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(buf1, 4, NULL, 0, 'z');    // less
1977dbbd19ccd8585dd8214109a758eeb590c541ec6florian
1987dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 6: Compare two buffers of same size (difference in 1st byte) */
1997dbbd19ccd8585dd8214109a758eeb590c541ec6florian  {
2007dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 6 ---\n");
2017dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t x[5] = "pqrst";
2027dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t y[5] = "abcde";
2037dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t z[5] = "abcde";
2047dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(x, 5, y, 5, 'a');   // first operand low
2057dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(y, 5, x, 5, 'a');   // first operand high
2067dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(y, 5, z, 5, 'q');   // equal
2077dbbd19ccd8585dd8214109a758eeb590c541ec6florian  }
2087dbbd19ccd8585dd8214109a758eeb590c541ec6florian
2097dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 7: Compare two buffers of same size (difference in last byte) */
2107dbbd19ccd8585dd8214109a758eeb590c541ec6florian  {
2117dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 7 ---\n");
2127dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t x[5] = "abcdd";
2137dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t y[5] = "abcde";
2147dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t z[5] = "abcdf";
2157dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(x, 5, y, 5, 'a');   // first operand low
2167dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(z, 5, z, 5, 'a');   // first operand high
2177dbbd19ccd8585dd8214109a758eeb590c541ec6florian  }
2187dbbd19ccd8585dd8214109a758eeb590c541ec6florian
2197dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 8: Compare two buffers of different size. The difference
2207dbbd19ccd8585dd8214109a758eeb590c541ec6florian     is past the end of the shorter string. */
2217dbbd19ccd8585dd8214109a758eeb590c541ec6florian  {
2227dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 8 ---\n");
2237dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t x[5] = "abcde";
2247dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t y[7] = "abcdeff";
2257dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(x, 5, y, 7, 0);   // first operand low
2267dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(y, 7, x, 5, 0);   // first operand high
2277dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(x, 5, y, 7, 'f'); // equal
2287dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(y, 7, x, 5, 'f'); // equal
2297dbbd19ccd8585dd8214109a758eeb590c541ec6florian  }
2307dbbd19ccd8585dd8214109a758eeb590c541ec6florian
2317dbbd19ccd8585dd8214109a758eeb590c541ec6florian  /* Test 9: Compare two buffers of different size. The difference
2327dbbd19ccd8585dd8214109a758eeb590c541ec6florian     is before the end of the shorter string. */
2337dbbd19ccd8585dd8214109a758eeb590c541ec6florian  {
2347dbbd19ccd8585dd8214109a758eeb590c541ec6florian  printf("--- test 9 ---\n");
2357dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t x[5] = "abcab";
2367dbbd19ccd8585dd8214109a758eeb590c541ec6florian  uint8_t y[7] = "abcdeff";
2377dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(x, 5, y, 7, 0);   // first operand low
2387dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(y, 7, x, 5, 0);   // first operand high
2397dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(x, 5, y, 7, 'f'); // first operand low
2407dbbd19ccd8585dd8214109a758eeb590c541ec6florian  run_test(y, 7, x, 5, 'f'); // first operand high
2417dbbd19ccd8585dd8214109a758eeb590c541ec6florian  }
2427dbbd19ccd8585dd8214109a758eeb590c541ec6florian
2437dbbd19ccd8585dd8214109a758eeb590c541ec6florian  return 0;
2447dbbd19ccd8585dd8214109a758eeb590c541ec6florian}
245