ack/tests/plat/structcopy_e.c

114 lines
2.3 KiB
C
Raw Normal View History

#include "test.h"
/* ACK's C compiler uses EM's loi, sti, blm, or an inline loop to copy
* these structs. The compiler doesn't call memcpy() or other
* functions in libc, so this test passes without linking the CRT.
*/
struct c5 { /* not a whole number of words */
char one[5];
};
struct ii { /* two words */
int one;
int two;
};
struct iii { /* three words */
int one;
int two;
int three;
};
int equal5(char *a, char *b) { /* a, b must have 5 characters */
int i;
for (i = 0; i < 5; i++)
if (a[i] != b[i]) return 0;
return 1;
}
struct c5 make_c5(char *str) { /* str must have 5 characters */
struct c5 out;
int i;
for (i = 0; i < 5; i++)
out.one[i] = str[i];
return out;
}
struct ii make_ii(int i, int j) {
struct ii out;
out.one = i;
out.two = j;
return out;
}
struct iii make_iii(struct ii in, int k) {
struct iii out;
out.one = in.one;
out.two = in.two;
out.three = k;
return out;
}
struct c5 rotate_left_c5(struct c5 in) {
int i;
char c = in.one[0];
/* Modifies our copy of _in_, not caller's copy. */
for (i = 0; i < 4; i++)
in.one[i] = in.one[i + 1];
in.one[4] = c;
return in;
}
struct iii rotate_left_iii(struct iii in) {
int i = in.one;
/* Modifies our copy of _in_, not caller's copy. */
in.one = in.two;
in.two = in.three;
in.three = i;
return in;
}
/* Bypasses the CRT, so there's no stdio. */
void _m_a_i_n(void) {
struct c5 earth, heart, dup_heart, rol_heart;
struct ii pair, dup_pair;
struct iii triple, dup_triple, rol_triple;
earth = make_c5("earth");
heart = make_c5("heart");
dup_heart = heart;
rol_heart = rotate_left_c5(heart);
ASSERT(equal5(earth.one, "earth"));
ASSERT(equal5(heart.one, "heart"));
ASSERT(equal5(dup_heart.one, "heart"));
ASSERT(equal5(rol_heart.one, "earth"));
pair = make_ii(29, 31);
dup_pair = pair;
triple = make_iii(pair, -9);
dup_triple = triple;
rol_triple = rotate_left_iii(triple);
ASSERT(pair.one == 29);
ASSERT(pair.two == 31);
ASSERT(dup_pair.one == 29);
ASSERT(dup_pair.two == 31);
ASSERT(triple.one == 29);
ASSERT(triple.two == 31);
ASSERT(triple.three == -9);
ASSERT(dup_triple.one == 29);
ASSERT(dup_triple.two == 31);
ASSERT(dup_triple.three == -9);
ASSERT(rol_triple.one == 31);
ASSERT(rol_triple.two == -9);
ASSERT(rol_triple.three == 29);
finished();
}