package de.fuberlin.optimierung.commands; import de.fuberlin.optimierung.*; /* * Syntax: br i1 <cond>, label <iftrue>, label <iffalse> br label <dest> ; Unconditional branch */ public class LLVM_BranchCommand extends LLVM_GenericCommand{ public LLVM_BranchCommand(String cmdLine, LLVM_GenericCommand predecessor, LLVM_Block block){ super(predecessor, block, cmdLine); StringBuilder cmd = new StringBuilder(cmdLine); parseEraseComment(cmd); parseEraseString(cmd, "br"); if (parseEraseString(cmd, "i1")){ setOperation(LLVM_Operation.BR_CON); String cond = parseReadValue(cmd); parseEraseString(cmd, ","); parseEraseString(cmd, "label"); String iftrue = parseReadValue(cmd); parseEraseString(cmd, ","); parseEraseString(cmd, "label"); String iffalse = parseReadValue(cmd); operands.add(new LLVM_Parameter(cond, "i1")); operands.add(new LLVM_Parameter(iftrue, "label")); operands.add(new LLVM_Parameter(iffalse, "label")); }else{ setOperation(LLVM_Operation.BR); parseEraseString(cmd, "label"); String dest = parseReadValue(cmd); operands.add(new LLVM_Parameter(dest, "label")); } if (LLVM_Optimization.DEBUG) System.out.println("Operation generiert: " + this.toString()); } public String toString() { if (operands == null || (operation == LLVM_Operation.BR && operands.size() < 1) || (operation == LLVM_Operation.BR_CON && operands.size() < 3)) return null; String cmd_output = "br "; switch(operation){ case BR : cmd_output += operands.get(0).getTypeString() + " "; cmd_output += operands.get(0).getName() + " "; break; case BR_CON : cmd_output += operands.get(0).getTypeString() + " "; cmd_output += operands.get(0).getName() + ", "; cmd_output += operands.get(1).getTypeString() + " "; cmd_output += operands.get(1).getName() + ", "; cmd_output += operands.get(2).getTypeString() + " "; cmd_output += operands.get(2).getName() + " "; break; default: return ""; } cmd_output += " " + getComment(); return cmd_output; } }