You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.5 KiB
124 lines
3.5 KiB
8 years ago
|
#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;
|
||
|
}
|
||
|
|