An error occurred while loading the file. Please try again.
-
王陈洋 authored1acf95eb
package cn.edu.nju.software.backend;
import cn.edu.nju.software.ir.type.ArrayType;
import cn.edu.nju.software.ir.type.FloatType;
import cn.edu.nju.software.ir.type.IntType;
import cn.edu.nju.software.ir.type.Pointer;
import cn.edu.nju.software.ir.value.ArrayValue;
import cn.edu.nju.software.ir.value.ConstValue;
import cn.edu.nju.software.ir.value.GlobalVar;
import cn.edu.nju.software.ir.value.ValueRef;
import java.util.List;
public class RiscGlobalVar {
private final String name;
private final GlobalVar globalVar;
public RiscGlobalVar(GlobalVar globalVar) {
this.name = globalVar.getName();
this.globalVar = globalVar;
}
//todo() 全局变量之间的相互赋值未处理
public void dumpToConsole() {
System.out.println(".globl " + name);
if(globalVar.isZeroInitializer()){
System.out.println(name + ":");
int totalSize= ArrayType.getTotalSize(((Pointer)globalVar.getType()).getBase());
System.out.println(".zero "+totalSize);
return;
}
if( globalVar.getInitVal() instanceof ConstValue){
if(globalVar.getInitVal().getType() instanceof IntType) {
String initValue = globalVar.getInitVal().toString();
System.out.println(name + ":");
System.out.println(".dword " + initValue);
}
else if(globalVar.getInitVal().getType() instanceof FloatType) {
String initValue = globalVar.getInitVal().toString();
System.out.println(name + ":");
System.out.println(".double " + initValue);
}
else if(globalVar.getInitVal().getType() instanceof ArrayType) {
assert false;
}
} else if (globalVar.getInitVal() instanceof ArrayValue) {
//todo暂时不考虑zeroInitializer
if(globalVar.getInitVal() instanceof ArrayValue arrayValue){
System.out.println(name + ":");
List<ValueRef> initValues = arrayValue.getLinerList();
int zeroCount=0;
for(ValueRef valueRef : initValues){
if(valueRef instanceof ConstValue){
if(valueRef.getType() instanceof IntType){
if(((ConstValue) valueRef).getValue().equals(0)){
zeroCount++;
}else {
if(zeroCount>0){
System.out.println(".zero " + zeroCount * 8);
zeroCount=0;
}
System.out.println(".dword " + valueRef);
}
}
else if(valueRef.getType() instanceof FloatType){
if(((ConstValue) valueRef).getValue().equals(0)){
7172737475767778798081828384858687888990919293
zeroCount++;
}else {
if(zeroCount>0){
System.out.println(".zero " + zeroCount * 8);
zeroCount=0;
}
System.out.println(".double " + valueRef);
}
}
}
}
if(zeroCount>0){
System.out.println(".zero " + String.valueOf(zeroCount*8));
}
}
} else {
assert false;
}
}
}