mirror of https://github.com/aamine/cbc
* 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:
parent
9af6bc364f
commit
19ca32a89d
33
ChangeLog
33
ChangeLog
|
|
@ -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
3
ToDo
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
package net.loveruby.cflat.asm;
|
||||
|
||||
abstract public class Address extends AsmEntity {
|
||||
public boolean isAddress() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package net.loveruby.cflat.asm;
|
||||
|
||||
abstract public class MemoryReference extends AsmEntity {
|
||||
public boolean isMemoryReference() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -35,7 +35,7 @@ public class CastNode extends ExprNode {
|
|||
return expr.isConstantAddress();
|
||||
}
|
||||
|
||||
public Address memref() {
|
||||
public MemoryReference memref() {
|
||||
return expr.memref();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ abstract public class Function extends Entity {
|
|||
return returnType().isVoid();
|
||||
}
|
||||
|
||||
public Address memref() {
|
||||
public MemoryReference memref() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ public class VariableNode extends ExprNode {
|
|||
return entity.address();
|
||||
}
|
||||
|
||||
public Address memref() {
|
||||
public MemoryReference memref() {
|
||||
return entity.memref();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
|
|
|
|||
Loading…
Reference in New Issue