summaryrefslogtreecommitdiffstats
path: root/src/arch/sparc/test.c
blob: 0d4ad1869b99ee241a9d3c4e451c799b5ec8fad6 (plain)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <glib.h>
#include "sparc-codegen.h"

/* don't run the resulting program, it will destroy your computer,
 * just objdump -d it to inspect we generated the correct assembler.
 */

int
main ()
{
	guint32 *p;
	guint32 code_buffer [500];
	guint32 local_size = 0, stack_size = 0, code_size = 6;
	guint32 arg_pos, simpletype;
	unsigned char *ins;
	int i, stringp, cur_out_reg, size;

	p = code_buffer;

	printf (".text\n.align 4\n.globl main\n.type main,@function\nmain:\n");

	/*
	 * Standard function prolog.
	 */
	sparc_save_imm (p, sparc_sp, -112-stack_size, sparc_sp);
	cur_out_reg = sparc_o0;
	arg_pos = 0;

	if (1) {
		sparc_mov_reg_reg (p, sparc_i2, cur_out_reg);
		++cur_out_reg;
	}

	sparc_ld_imm (p, sparc_i3, arg_pos, cur_out_reg);
	++cur_out_reg;
	sparc_ld_imm (p, sparc_i3, arg_pos+4, cur_out_reg);
	++cur_out_reg;
	/* 
	 * Insert call to function 
	 */
	sparc_jmpl (p, sparc_i0, 0, sparc_callsite);
	sparc_nop (p);

	sparc_jmpl_imm (p, sparc_i7, 8, sparc_zero);
	sparc_restore (p, sparc_zero, sparc_zero, sparc_zero);

	sparc_ldsb (p, sparc_i3, sparc_l0, sparc_o5);
	sparc_ldsb_imm (p, sparc_i3, 2, sparc_o5);

	sparc_ldsh (p, sparc_i3, sparc_l0, sparc_o5);
	sparc_ldsh_imm (p, sparc_i3, 2, sparc_o5);

	sparc_ldub (p, sparc_i3, sparc_l0, sparc_o5);
	sparc_ldub_imm (p, sparc_i3, 2, sparc_o5);

	sparc_lduh (p, sparc_i3, sparc_l0, sparc_o5);
	sparc_lduh_imm (p, sparc_i3, 2, sparc_o5);

	sparc_ldf (p, sparc_i3, sparc_l0, sparc_o5);
	sparc_ldf_imm (p, sparc_i3, 2, sparc_o5);

	sparc_stb (p, sparc_i3, sparc_l0, sparc_l2);
	sparc_stb_imm (p, sparc_i3, sparc_o5, 2);

	sparc_sethi (p, 0xff000000, sparc_o2);
	sparc_rdy (p, sparc_l0);
	sparc_wry (p, sparc_l0, sparc_l1);
	sparc_wry_imm (p, sparc_l0, 16);
	sparc_stbar (p);
	sparc_unimp (p, 24);
	sparc_flush (p, sparc_l4, 0);

	sparc_and (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_and_imm (p, FALSE, sparc_l0, 0xff, sparc_o1);
	sparc_andn (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_or (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_orn (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_xor (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_xnor (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);

	sparc_sll (p, sparc_l0, sparc_l1, sparc_o1);
	sparc_sll_imm (p, sparc_l0, 2, sparc_o1);
	sparc_srl (p, sparc_l0, sparc_l1, sparc_o1);
	sparc_srl_imm (p, sparc_l0, 2, sparc_o1);
	sparc_sra (p, sparc_l0, sparc_l1, sparc_o1);
	sparc_sra_imm (p, sparc_l0, 2, sparc_o1);

	sparc_add (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_add_imm (p, FALSE, sparc_l0, 0xff, sparc_o1);
	sparc_addx (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_sub (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_subx (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);

	sparc_muls (p, sparc_l0, sparc_l1, sparc_o1);
	sparc_umul (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_smul (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_udiv (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
	sparc_sdiv (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);

	sparc_branch (p, FALSE, sparc_bne, -12);
	sparc_ret (p);
	sparc_retl (p);
	sparc_test (p, sparc_l4);
	sparc_cmp (p, sparc_l4, sparc_l6);
	sparc_cmp_imm (p, sparc_l4, 4);
	sparc_restore_simple (p);

	sparc_set (p, 0xff000000, sparc_l7);
	sparc_set (p, 1, sparc_l7);
	sparc_set (p, 0xff0000ff, sparc_l7);

	sparc_not (p, sparc_g2);
	sparc_neg (p, sparc_g3);
	sparc_clr_reg (p, sparc_g4);


	size = (p-code_buffer)*4;
	ins = (gchar*)code_buffer;
	for (i = 0; i < size; ++i)
		printf (".byte %d\n", (unsigned int) ins [i]);
	return 0;
}

OpenPOWER on IntegriCloud