projects
/
uebersetzerbau-ss10.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
arm64: codea/abgabe_aa.0
[uebersetzerbau-ss10.git]
/
gesamt_arm
/
chelper.c
diff --git
a/gesamt_arm/chelper.c
b/gesamt_arm/chelper.c
index 2e736ea421618c08867b07b598b27cfdbbf2d615..20e81bffd435e389df1e2487f43d2c33b5d75bf5 100644
(file)
--- a/
gesamt_arm/chelper.c
+++ b/
gesamt_arm/chelper.c
@@
-8,8
+8,9
@@
#define DDCHELP
#endif
#define DDCHELP
#endif
+/* TODO */
#define REGLEN 5
#define REGLEN 5
-static char *regsppc[] = {"
14", "15", "16", "17", "18
"};
+static char *regsppc[] = {"
r10", "r11", "r12", "r13", "r14
"};
/* ja, dirty.. */
static char *akt_func_name = (char*) NULL;
/* ja, dirty.. */
static char *akt_func_name = (char*) NULL;
@@
-17,8
+18,8
@@
static char need_stack = 0;
void func_header(char *s, int vars, int parms, int call)
{
void func_header(char *s, int vars, int parms, int call)
{
- printf("\t.globl %1$s\n\t.type %1$s,
@
function\n%1$s:\n", s);
- printf("\t
#
vars: %i, parms: %i, call(bool): %i\n", vars, parms, call);
+ printf("\t.globl %1$s\n\t.type %1$s,
%%
function\n%1$s:\n", s);
+ printf("\t
@
vars: %i, parms: %i, call(bool): %i\n", vars, parms, call);
akt_func_name = s;
need_stack = (vars || parms) && call;
akt_func_name = s;
need_stack = (vars || parms) && call;
@@
-43,27
+44,26
@@
void func_footer(void)
/* restore link register */
printf("\tlwz 0,-8(1); mtlr 0\n");
}
/* restore link register */
printf("\tlwz 0,-8(1); mtlr 0\n");
}
- printf("\tblr\n\n\n");
+ printf("\tb
x
lr\n\n\n");
}
void move(char *src, char *dst)
{
if(src == (char*) NULL) return;
if(strcmp(src,dst) != 0) {
}
void move(char *src, char *dst)
{
if(src == (char*) NULL) return;
if(strcmp(src,dst) != 0) {
- printf("\tm
r %s,
%s\n", dst, src);
+ printf("\tm
ov %s,
%s\n", dst, src);
}
}
void moveimm(long imm, char *dst)
{
}
}
void moveimm(long imm, char *dst)
{
+ static int constlbl = 1;
if((imm > 65536-1) || (imm < -65536)) {
if((imm > 65536-1) || (imm < -65536)) {
- /* high word */
- printf("\tlis %s,%d@ha\n", dst, imm);
- /* low word */
- printf("\taddi %s,%s,%d@l\n", dst, dst, imm);
+ printf("\t.align 2\n\t.CONSTLBL%i\n\t.word %i\n", constlbl++);
+ printf("\tldr %s, .CONSTLBL%i\n", dst, constlbl);
} else {
/* just low word */
} else {
/* just low word */
- printf("\t
li %s,%d@l\n", dst, imm
);
+ printf("\t
%s %s, #%d\n", imm >= 0 ? "mov" : "mvn", dst, imm >= 0 ? imm : (-1 * imm) - 1
);
}
}
}
}
@@
-90,8
+90,8
@@
char *reg_64to8l(char *s)
}
char *param_reg(int num)
}
char *param_reg(int num)
-{
- char *regs[] = {"
3", "4", "5", "6", "7", "8", "9", "10
"};
+{
/* TODO */
+ char *regs[] = {"
r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9
"};
return regs[num];
}
return regs[num];
}