1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h> 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdint.h> 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <inttypes.h> 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "test.h" 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovuint32_t data[64]; 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The result of a checksum operation */ 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef struct { 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint64_t addr; 11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint64_t len; 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint32_t sum; 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov char cc; 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} cksm_t; 15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Compute the checksum via the cksm insn */ 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __attribute__((noinline)) cksm_t 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcksm_by_insn(const uint32_t *buff, uint64_t len, uint32_t sum) 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov const uint32_t *init_addr = buff; 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint64_t init_length = len; 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint64_t addr; 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov char cc; 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cksm_t result; 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register uint64_t reg2 asm("2") = (uint64_t) buff; 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register uint64_t reg3 asm("3") = len; 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( " lhi 4,42\n\t" 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " xr 4,4\n\t" /* set cc to != 0 */ 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "0: cksm %0,%1\n\t" /* do checksum on longs */ 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov " jo 0b\n\t" 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+d" (sum), "+d" (reg2), "+d" (reg3) : : "cc", "memory"); 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cc = get_cc(); 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = reg3; 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov addr = reg2; 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Check the results */ 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if(addr != (uint64_t)init_addr + init_length) 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: address not updated properly\n"); 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if(len != 0) 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: length not zero\n"); 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (cc != 0) 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: condition code not zero\n"); 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.addr = addr; 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.len = len; 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.cc = cc; 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.sum = sum; 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return result; 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Compute the checksum via hand-crafted algorithm */ 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic __attribute__((noinline)) cksm_t 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcksm_by_hand(const uint32_t *buff, uint64_t len, uint32_t sum) 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cksm_t result; 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned int n; 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint64_t v64; 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint32_t final; 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (n=0; n < len/4; n++) { 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 4 bytes to the sum. Do this in 64-bit arithmetic so it's 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov easy to see whether there was a carry-out. */ 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov v64 = sum; 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov v64 += buff[n]; 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* If there was a carry-out, add 1 to the sum. */ 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (v64 >> 32) 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = sum + buff[n] + 1; 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = sum + buff[n]; 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (len != 0) { 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov switch (len % 4) { 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 0: 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov final = 0; // suppress gcc warning 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* done */ 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 1: 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov final = buff[n] & 0xFF000000; 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 2: 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov final = buff[n] & 0xFFFF0000; 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov case 3: 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov final = buff[n] & 0xFFFFFF00; 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov break; 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (len % 4) { 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov v64 = sum; 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov v64 += final; 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* If there was a carry-out, add 1 to the sum. */ 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (v64 >> 32) 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = sum + final + 1; 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = sum + final; 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.addr = (uint64_t)buff + len; 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.len = 0; 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.cc = 0; 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov result.sum = sum; 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return result; 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* The results computed by-insn and by-hand must compare equal and 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov the sum must be identical to EXPECTED_SUM. */ 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovcompare_results(cksm_t by_hand, cksm_t by_insn, uint32_t expected_sum) 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int rc = 0; 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (by_hand.sum != by_insn.sum) { 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ++rc; 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: sum: by-hand %"PRIx32" by-insn %"PRIx32"\n", 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_hand.sum, by_insn.sum); 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (by_hand.addr != by_insn.addr) { 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ++rc; 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: addr: by-hand %"PRIx64" by-insn %"PRIx64"\n", 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_hand.addr, by_insn.addr); 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (by_hand.len != by_insn.len) { 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ++rc; 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: len: by-hand %"PRIx64" by-insn %"PRIx64"\n", 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_hand.len, by_insn.len); 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (by_hand.cc != by_insn.cc) { 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ++rc; 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: cc: by-hand %d by-insn %d\n", 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_hand.cc, by_insn.cc); 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (by_insn.sum != expected_sum) { 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ++rc; 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: sum: by-insn %"PRIx32" expected %"PRIx32"\n", 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_insn.sum, expected_sum); 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (by_hand.sum != expected_sum) { 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ++rc; 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("FAIL: sum: by-hand %"PRIx32" expected %"PRIx32"\n", 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_hand.sum, expected_sum); 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return rc; 162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Run a testcase. Compute the checksum by-hand and by-insn and compare 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov the results */ 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid 167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovrun_test(const char *name, const uint32_t *buff, uint64_t len, uint32_t sum, 168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint32_t expected_sum) 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cksm_t by_hand, by_insn; 171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_hand = cksm_by_hand(buff, len, sum); 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov by_insn = cksm_by_insn(buff, len, sum); 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (compare_results(by_hand, by_insn, expected_sum) != 0) { 175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("%s failed\n", name); 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main () 180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint32_t sum, expected_sum; 182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov uint64_t len; 183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 1 ------------------------------ */ 185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add one word to an initial sum; no carry */ 186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 2; 187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 1; 188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 4; 189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 3; 190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test1", data, len, sum, expected_sum); 191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 2 ------------------------------ */ 193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add one word to an initial sum; with carry */ 194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 1; 195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0xffffffff; 196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 4; 197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 1; 198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test2", data, len, sum, expected_sum); 199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 3 ------------------------------ */ 201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 15 words to an initial sum; no carry */ 202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0x1; 203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0x4; 204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[1] = 0x10; 205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[2] = 0x40; 206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[3] = 0x100; 207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[4] = 0x400; 208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[5] = 0x1000; 209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[6] = 0x4000; 210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[7] = 0x10000; 211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[8] = 0x40000; 212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[9] = 0x100000; 213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[10] = 0x400000; 214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[11] = 0x1000000; 215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[12] = 0x4000000; 216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[13] = 0x10000000; 217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[14] = 0x40000000; 218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 60; 219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x55555555; 220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test3", data, len, sum, expected_sum); 221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 4 ------------------------------ */ 223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add some words such that every addition generates a carry. 224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The data is such that the least significant byte is zero, 225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov and the carrys from intermediate additions will accumulate 226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov in the least significant byte. */ 227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0xff000000; 228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0x80000000; /* 7f0000001 */ 229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[1] = 0x85000000; /* 040000002 */ 230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[2] = 0xff000000; /* 030000003 */ 231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[3] = 0xff000000; /* 020000004 */ 232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[4] = 0xff000000; /* 010000005 */ 233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[5] = 0xff000000; /* 000000006 */ 234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 24; 235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x00000006; 236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test4", data, len, sum, expected_sum); 237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 5 ------------------------------ */ 239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* No words are added. Pass a NULL pointer so an attempt to 240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov load would raise a SIGSEGV. */ 241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 0; 242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 42; 243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = sum; 244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test5", NULL, len, sum, expected_sum); 245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 6 ------------------------------ */ 247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 1 byte; no carry */ 248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0x02000000; 249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 1; 250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0x7fffffff; 251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x81000000; 252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test6", data, len, sum, expected_sum); 253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 7 ------------------------------ */ 255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 1 byte; carry */ 256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0x02000000; 257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 1; 258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0xffffffff; 259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x01000001; 260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test7", data, len, sum, expected_sum); 261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 8 ------------------------------ */ 263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 2 bytes; no carry */ 264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0x00020000; 265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 2; 266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0x7fffffff; 267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x80010000; 268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test8", data, len, sum, expected_sum); 269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 9 ------------------------------ */ 271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 2 bytes; carry */ 272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0x00020000; 273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 2; 274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0xffffffff; 275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x00010001; 276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test9", data, len, sum, expected_sum); 277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 10 ------------------------------ */ 279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 3 bytes; no carry */ 280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0x00000200; 281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 3; 282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0x7fffffff; 283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x80000100; 284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test10", data, len, sum, expected_sum); 285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* ---------------- test 11 ------------------------------ */ 287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* Add 3 bytes; carry */ 288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sum = 0x00000200; 289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov len = 3; 290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov data[0] = 0xffffffff; 291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov expected_sum = 0x00000101; 292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov run_test("test11", data, len, sum, expected_sum); 293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return 0; 295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 296