The new tests are bss_e.c, structcopy_e.c. We do clear the BSS before calling _m_a_i_n, so fix the comments in the other tests.
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#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();
 | 
						|
}
 |