d6938108a6
Fix PowerPC ncg so setjmp() returns the correct value. I got unlucky when ncg picked r3 for "uses REG"; this destroyed the return value in r3 and caused the new test to fail.
59 lines
1.2 KiB
C
59 lines
1.2 KiB
C
#include <setjmp.h>
|
|
#include "test.h"
|
|
|
|
/*
|
|
* Sets i = 2 * i for each i in nums, until i == 0, but stops if
|
|
* 2 * i >= 1000.
|
|
*
|
|
* Uses setjmp() and longjmp() in libc. For ACK's libc, the back end
|
|
* must provides EM's _gto_, and _gto_ must preserve the function
|
|
* return area.
|
|
*/
|
|
int nums1[] = { 79, 245, 164, 403, 0};
|
|
const int expect1[] = {158, 490, 328, 806, 0};
|
|
int nums2[] = {20, 221, 411, 643, 48, 272, 448, 0};
|
|
const int expect2[] = {40, 442, 822, 643, 48, 272, 448, 0};
|
|
int nums3[] = {371, 265, 500, 124, 117, 0};
|
|
const int expect3[] = {742, 530, 500, 124, 117, 0};
|
|
int docount = 0;
|
|
|
|
int twice(int i, jmp_buf esc) {
|
|
if (i >= 500)
|
|
longjmp(esc, i);
|
|
return 2 * i;
|
|
}
|
|
|
|
void donums(int *nums, jmp_buf esc) {
|
|
int *p;
|
|
|
|
docount++;
|
|
for (p = nums; *p != 0; p++) {
|
|
*p = twice(*p, esc);
|
|
}
|
|
}
|
|
|
|
int cknums(int *nums, const int *expect) {
|
|
jmp_buf env;
|
|
int ret;
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
donums(nums, env);
|
|
for (;;) {
|
|
ASSERT(*nums == *expect);
|
|
if (*expect == 0)
|
|
break;
|
|
nums++;
|
|
expect++;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int main(void) {
|
|
ASSERT(cknums(nums1, expect1) == 0);
|
|
ASSERT(cknums(nums2, expect2) == 643);
|
|
ASSERT(cknums(nums3, expect3) == 500);
|
|
ASSERT(docount == 3);
|
|
finished();
|
|
}
|