* net/loveruby/cflat/asm/Address.java -> MemoryReference.java

* net/loveruby/cflat/asm/DirectAddress.java -> DirectMemoryReference.java
* net/loveruby/cflat/asm/IndirectAddress.java -> IndirectMemoryReference.java
* net/loveruby/cflat/compiler/CodeGenerator.java: Address -> MemoryReference.
* net/loveruby/cflat/asm/AsmEntity.java: ditto.
* net/loveruby/cflat/asm/AbsoluteAddress.java: ditto.
* net/loveruby/cflat/ast/Entity.java: ditto.
* net/loveruby/cflat/ast/Variable.java: ditto.
* net/loveruby/cflat/ast/DefinedVariable.java: ditto.
* net/loveruby/cflat/ast/UndefinedVariable.java: ditto.
* net/loveruby/cflat/ast/Function.java: ditto.
* net/loveruby/cflat/ast/ExprNode.java: ditto.
* net/loveruby/cflat/ast/VariableNode.java: ditto.
* net/loveruby/cflat/ast/CastNode.java: ditto.


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4026 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2008-09-15 17:37:49 +00:00
parent 9af6bc364f
commit 19ca32a89d
17 changed files with 80 additions and 44 deletions

View File

@ -1,3 +1,36 @@
Tue Sep 16 02:37:46 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/asm/Address.java -> MemoryReference.java
* net/loveruby/cflat/asm/DirectAddress.java ->
DirectMemoryReference.java
* net/loveruby/cflat/asm/IndirectAddress.java ->
IndirectMemoryReference.java
* net/loveruby/cflat/compiler/CodeGenerator.java: Address ->
MemoryReference.
* net/loveruby/cflat/asm/AsmEntity.java: ditto.
* net/loveruby/cflat/asm/AbsoluteAddress.java: ditto.
* net/loveruby/cflat/ast/Entity.java: ditto.
* net/loveruby/cflat/ast/Variable.java: ditto.
* net/loveruby/cflat/ast/DefinedVariable.java: ditto.
* net/loveruby/cflat/ast/UndefinedVariable.java: ditto.
* net/loveruby/cflat/ast/Function.java: ditto.
* net/loveruby/cflat/ast/ExprNode.java: ditto.
* net/loveruby/cflat/ast/VariableNode.java: ditto.
* net/loveruby/cflat/ast/CastNode.java: ditto.
Tue Sep 16 02:18:06 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/CodeGenerator.java: both of "puts"

3
ToDo
View File

@ -2,6 +2,8 @@
== Current
* AsmEntity -> AsmOperand
* reject struct/union/array on stmt context
* -O (peephole optimization)
* movl $0, %eax => xorl %eax, %eax
* addl $1, %eax => incl %eax
@ -236,3 +238,4 @@
- write install.sh
- va_list
- objectify instruction
- fix &puts

View File

@ -1,6 +1,6 @@
package net.loveruby.cflat.asm;
public class AbsoluteAddress extends Address {
public class AbsoluteAddress extends AsmEntity {
protected Register register;
public AbsoluteAddress(Register reg) {

View File

@ -1,7 +0,0 @@
package net.loveruby.cflat.asm;
abstract public class Address extends AsmEntity {
public boolean isAddress() {
return true;
}
}

View File

@ -3,7 +3,7 @@ package net.loveruby.cflat.asm;
abstract public class AsmEntity {
abstract public String toString();
public boolean isAddress() {
public boolean isMemoryReference() {
return false;
}
}

View File

@ -1,13 +1,13 @@
package net.loveruby.cflat.asm;
public class DirectAddress extends Address {
public class DirectMemoryReference extends MemoryReference {
protected Literal value;
public DirectAddress(Label label) {
public DirectMemoryReference(Label label) {
this.value = new Symbol(label);
}
public DirectAddress(IntegerLiteral n) {
public DirectMemoryReference(IntegerLiteral n) {
this.value = n;
}

View File

@ -1,14 +1,14 @@
package net.loveruby.cflat.asm;
public class IndirectAddress extends Address {
public class IndirectMemoryReference extends MemoryReference {
protected long offset;
protected Register base;
public IndirectAddress(Register base) {
public IndirectMemoryReference(Register base) {
this(0, base);
}
public IndirectAddress(long offset, Register base) {
public IndirectMemoryReference(long offset, Register base) {
this.offset = offset;
this.base = base;
}

View File

@ -0,0 +1,7 @@
package net.loveruby.cflat.asm;
abstract public class MemoryReference extends AsmEntity {
public boolean isMemoryReference() {
return true;
}
}

View File

@ -35,7 +35,7 @@ public class CastNode extends ExprNode {
return expr.isConstantAddress();
}
public Address memref() {
public MemoryReference memref() {
return expr.memref();
}

View File

@ -4,7 +4,7 @@ import net.loveruby.cflat.asm.*;
public class DefinedVariable extends Variable {
protected ExprNode initializer;
protected Address memref;
protected MemoryReference memref;
public DefinedVariable(boolean priv, TypeNode type,
String name, ExprNode init) {
@ -33,11 +33,11 @@ public class DefinedVariable extends Variable {
this.initializer = expr;
}
public void setMemref(Address addr) {
this.memref = addr;
public void setMemref(MemoryReference mem) {
this.memref = mem;
}
public Address memref() {
public MemoryReference memref() {
if (memref == null)
throw new Error("unresolved variable address");
return memref;

View File

@ -52,7 +52,7 @@ abstract public class Entity extends Node {
return (nRefered > 0);
}
abstract public Address memref();
abstract public MemoryReference memref();
abstract public AsmEntity address();
public Location location() {

View File

@ -48,7 +48,7 @@ abstract public class ExprNode extends Node {
throw new Error("ExprNode#address called");
}
public Address memref() {
public MemoryReference memref() {
throw new Error("ExprNode#memref called");
}
}

View File

@ -25,7 +25,7 @@ abstract public class Function extends Entity {
return returnType().isVoid();
}
public Address memref() {
public MemoryReference memref() {
return null;
}

View File

@ -15,12 +15,12 @@ public class UndefinedVariable extends Variable {
return name();
}
public void setMemref(Address addr) {
public void setMemref(MemoryReference mem) {
throw new Error("UndefinedVariable#Memref");
}
public Address memref() {
return new DirectAddress(new Label(symbol()));
public MemoryReference memref() {
return new DirectMemoryReference(new Label(symbol()));
}
public AsmEntity address() {

View File

@ -18,5 +18,5 @@ abstract public class Variable extends Entity {
return (sequence < 0) ? name : (name + "." + sequence);
}
abstract public void setMemref(Address addr);
abstract public void setMemref(MemoryReference addr);
}

View File

@ -56,7 +56,7 @@ public class VariableNode extends ExprNode {
return entity.address();
}
public Address memref() {
public MemoryReference memref() {
return entity.memref();
}

View File

@ -81,14 +81,14 @@ public class CodeGenerator extends Visitor implements ASTLHSVisitor {
/** Linux/IA-32 dependent */
// FIXME: PIC
protected Address globalVariableAddress(String sym) {
return new DirectAddress(new Label(csymbol(sym)));
protected MemoryReference globalVariableAddress(String sym) {
return new DirectMemoryReference(new Label(csymbol(sym)));
}
/** Linux/IA-32 dependent */
// FIXME: PIC
protected Address commonSymbolAddress(String sym) {
return new DirectAddress(new Label(csymbol(sym)));
protected MemoryReference commonSymbolAddress(String sym) {
return new DirectMemoryReference(new Label(csymbol(sym)));
}
/** Generates static variable entries */
@ -877,12 +877,12 @@ public class CodeGenerator extends Visitor implements ASTLHSVisitor {
return new Register(name);
}
protected IndirectAddress mem(Register reg) {
return new IndirectAddress(reg);
protected IndirectMemoryReference mem(Register reg) {
return new IndirectMemoryReference(reg);
}
protected IndirectAddress mem(long offset, Register reg) {
return new IndirectAddress(offset, reg);
protected IndirectMemoryReference mem(long offset, Register reg) {
return new IndirectMemoryReference(offset, reg);
}
protected ImmediateValue imm(long n) {
@ -893,30 +893,30 @@ public class CodeGenerator extends Visitor implements ASTLHSVisitor {
return new ImmediateValue(label);
}
protected void load(Type type, Address addr, Register reg) {
protected void load(Type type, MemoryReference mem, Register reg) {
switch ((int)type.size()) {
case 1:
if (type.isSigned()) { // signed char
movsbl(addr, reg);
movsbl(mem, reg);
} else { // unsigned char
movzbl(addr, reg);
movzbl(mem, reg);
}
break;
case 2:
if (type.isSigned()) { // signed short
movswl(addr, reg);
movswl(mem, reg);
} else { // unsigned short
movzwl(addr, reg);
movzwl(mem, reg);
}
break;
default: // int, long, long_long
mov(type, addr, reg.forType(type));
mov(type, mem, reg.forType(type));
break;
}
}
protected void save(Type type, Register reg, Address addr) {
mov(type, reg.forType(type), addr);
protected void save(Type type, Register reg, MemoryReference mem) {
mov(type, reg.forType(type), mem);
}
public void comment(String str) { as.comment(str); }