package de.fuberlin.optimierung.commands;
import de.fuberlin.optimierung.*;
/*
* Syntax;
<result> = load [volatile] <ty>* <pointer>[, align <alignment>][, !nontemporal !<index>][, !invariant.load !<index>]
<result> = load atomic [volatile] <ty>* <pointer> [singlethread] <ordering>, align <alignment>
!<index> = !{ i32 1 }
*/
public class LLVM_LoadCommand extends LLVM_GenericCommand{
private boolean vol = false;
private boolean atom = false;
public LLVM_LoadCommand(String cmdLine, LLVM_GenericCommand predecessor, LLVM_Block block){
super(predecessor, block, cmdLine);
setOperation(LLVM_Operation.LOAD);
StringBuilder cmd = new StringBuilder(cmdLine);
parseEraseComment(cmd);
String result = parseReadResult(cmd);
parseOptionalString(cmd, "load");
atom = parseOptionalString(cmd, "atomic");
vol = parseOptionalString(cmd, "volatile");
String ty = parseReadType(cmd);
target = new LLVM_Parameter(result, ty);
String pointer = parseReadValue(cmd);
operands.add(new LLVM_Parameter(pointer, ty));
while (parseEraseString(cmd, ",")){
String typ = parseReadType(cmd);
String name = parseReadValue(cmd);
operands.add(new LLVM_Parameter(name, typ));
}
if (LLVM_Optimization.DEBUG) System.out.println("Operation generiert: " + this.toString());
}
public String toString() {
if (target == null || operands == null || operands.size() < 1) return null;
String cmd_out = target.getName() + " = ";
cmd_out += "load ";
if (atom) cmd_out += "atomic ";
if (vol) cmd_out += "volatile ";
cmd_out += operands.get(0).getTypeString() + " ";
cmd_out += operands.get(0).getName();
for (int i = 1; i < operands.size(); i++){
cmd_out += ", " + operands.get(i).getTypeString() + " ";
cmd_out += operands.get(i).getName();
}
cmd_out += " " + getComment();
return cmd_out;
}
}