summaryrefslogtreecommitdiff
path: root/support/regression/tests/preserves_regs.c
blob: ea48ce61e566a98ccf9d8b961dd5cbc4dfef6b9c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* __preserves_regs test
   type: unsigned char, unsigned int, unsigned long
*/

#include <testfwk.h>

#if defined(__SDCC_z80) || defined(__SDCC_z180) || defined(__SDCC_r2k) || defined(__SDCC_r3ka) || defined(__SDCC_tlcs90) || defined(__SDCC_ez80_z80)
void write_bc(void) __preserves_regs(a, d, e, h, l, iyl, iyh) __naked
{
__asm
	ld bc, #0
	ret
__endasm;
}

void write_de(void) __preserves_regs(a, b, c, h, l, iyl, iyh) __naked
{
__asm
	ld de, #0
	ret
__endasm;
}

void write_hl(void) __preserves_regs(a, b, c, d, e, iyl, iyh) __naked
{
__asm
	ld hl, #0
	ret
__endasm;
}

{type} add_bc({type} a, {type} b)
{
	{type} r = a + b;

	write_de();
	write_hl();

	return(r);
}

{type} add_de({type} a, {type} b)
{
	{type} r = a + b;

	write_bc();
	write_hl();

	return(r);
}


{type} add_hl({type} a, {type} b)
{
	{type} r = a + b;

	write_bc();
	write_de();

	return(r);
}


{type} add_iy({type} a, {type} b)
{
	{type} r = a + b;

	write_bc();
	write_de();
	write_hl();

	return(r);
}
#endif

void testRegs(void)
{
#if defined(__SDCC_z80) || defined(__SDCC_z180) || defined(__SDCC_r2k)|| defined(__SDCC_r3ka)
	ASSERT(add_bc(0x55, 0xaa) == ({type})(0x55 + 0xaa));
	ASSERT(add_de(0x55, 0xaa) == ({type})(0x55 + 0xaa));
	ASSERT(add_hl(0x55, 0xaa) == ({type})(0x55 + 0xaa));
	ASSERT(add_iy(0x55, 0xaa) == ({type})(0x55 + 0xaa));
#endif
}