skip the tests which use floating point instructions (as their emulators don't support them).
		
			
				
	
	
		
			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();
 | |
| }
 |