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