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