projects
/
uebersetzerbau-ss10.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
12be827
)
codea: 'optimierungen' fuer die multiplikation
author
Bernhard Urban
<lewurm@gmail.com>
Wed, 5 May 2010 15:02:14 +0000
(17:02 +0200)
committer
Bernhard Urban
<lewurm@gmail.com>
Wed, 5 May 2010 15:02:14 +0000
(17:02 +0200)
codea/code.bfe
patch
|
blob
|
history
diff --git
a/codea/code.bfe
b/codea/code.bfe
index 7c0c074ec50049bc936ae75def47947b5821290c..d014d3916329415c89b036981fe7e109b1423fbc 100644
(file)
--- a/
codea/code.bfe
+++ b/
codea/code.bfe
@@
-5,6
+5,9
@@
#define KID_VAL(A) bnode->kids[A]->val
#define BN_REG bnode->reg
#define BN_VAL bnode->val
#define KID_VAL(A) bnode->kids[A]->val
#define BN_REG bnode->reg
#define BN_VAL bnode->val
+
+/* falls ein parameter auf der "leseseite" ist, soll das statt ein weiteres
+ * register verwendet werden */
#define KIDREG2PARM(A) if(bnode->kids[A]->param_index > -1) { bnode->kids[A]->reg = param_reg(bnode->kids[A]->param_index); }
#include <stdio.h>
#define KIDREG2PARM(A) if(bnode->kids[A]->param_index > -1) { bnode->kids[A]->reg = param_reg(bnode->kids[A]->param_index); }
#include <stdio.h>
@@
-21,15
+24,25
@@
void gen_e_eno(struct treenode *bnode, char *instr)
void gen_e_imm(struct treenode *bnode, char *instr)
{
void gen_e_imm(struct treenode *bnode, char *instr)
{
- printf("\t%s $%li, %%%s\n", instr, KID_VAL(1), KID_REG(0));
- move(KID_REG(0), BN_REG);
+ /* man kann sich ein move der konstante bei der multiplikation ersparen */
+ if(strcmp(instr, "imulq") == 0) {
+ printf("\timulq $%li, %%%s, %%%s\n", KID_VAL(1), KID_REG(0), BN_REG);
+ } else {
+ printf("\t%s $%li, %%%s\n", instr, KID_VAL(1), KID_REG(0));
+ move(KID_REG(0), BN_REG);
+ }
}
void gen_imm_eno(struct treenode *bnode, char *instr)
{
}
void gen_imm_eno(struct treenode *bnode, char *instr)
{
- moveimm(KID_VAL(0), BN_REG);
KIDREG2PARM(1);
KIDREG2PARM(1);
- printf("\tsubq %%%s, %%%s\n", KID_REG(1), BN_REG);
+ /* man kann sich ein move der konstante bei der multiplikation ersparen */
+ if(strcmp(instr, "imulq") == 0) {
+ printf("\timulq $%li, %%%s, %%%s\n", KID_VAL(0), KID_REG(1), BN_REG);
+ } else {
+ moveimm(KID_VAL(0), BN_REG);
+ printf("\t%s %%%s, %%%s\n", instr, KID_REG(1), BN_REG);
+ }
}
%}
}
%}
@@
-47,13
+60,14
@@
expr: imm # 1 # moveimm(BN_VAL, BN_REG);
expr: O_SUB(expr,exprno) # 1 # gen_e_eno(bnode, "subq");
expr: O_SUB(expr,imm) # 2 # gen_e_imm(bnode, "subq");
expr: O_SUB(expr,exprno) # 1 # gen_e_eno(bnode, "subq");
expr: O_SUB(expr,imm) # 2 # gen_e_imm(bnode, "subq");
-expr: O_SUB(imm,exprno) #
3
# gen_imm_eno(bnode, "subq");
+expr: O_SUB(imm,exprno) #
2
# gen_imm_eno(bnode, "subq");
expr: O_ADD(expr,exprno) # 1 # gen_e_eno(bnode, "addq");
expr: O_ADD(imm,expr) # 2 # gen_e_imm(bnode, "addq");
expr: O_MUL(expr,exprno) # 1 # gen_e_eno(bnode, "imulq");
expr: O_ADD(expr,exprno) # 1 # gen_e_eno(bnode, "addq");
expr: O_ADD(imm,expr) # 2 # gen_e_imm(bnode, "addq");
expr: O_MUL(expr,exprno) # 1 # gen_e_eno(bnode, "imulq");
-expr: O_MUL(expr,imm) # 2 # gen_e_imm(bnode, "imulq");
+expr: O_MUL(expr,imm) # 1 # gen_e_imm(bnode, "imulq");
+expr: O_MUL(imm,exprno) # 1 # gen_imm_eno(bnode, "imulq");
expr: O_OR(expr,exprno) # 1 # gen_e_eno(bnode, "orq");
expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "orq");
expr: O_OR(expr,exprno) # 1 # gen_e_eno(bnode, "orq");
expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "orq");