package de.fuberlin.optimierung.commands; import de.fuberlin.optimierung.*; /* * Syntax: * <result> = insertvalue <aggregate type> <val>, <ty> <elt>, <idx>{, <idx>}* ; yields <aggregate type> * <result> = extractvalue <aggregate type> <val>, <idx>{, <idx>}* */ public class LLVM_InsertExtractValueCommand extends LLVM_GenericCommand { public LLVM_InsertExtractValueCommand(String cmdLine, LLVM_GenericCommand predecessor, LLVM_Block block){ super(predecessor, block, cmdLine); StringBuilder cmd = new StringBuilder(cmdLine); parseEraseComment(cmd); String result = parseReadResult(cmd); String cond = parseReadValue(cmd); if (cond.startsWith("insertvalue")) setOperation(LLVM_Operation.INSERTVALUE); if (cond.startsWith("extractvalue")) setOperation(LLVM_Operation.EXTRACTVALUE); String aggr = parseReadType(cmd); String val = parseReadValue(cmd); parseEraseString(cmd, ","); target = new LLVM_Parameter(result, aggr); operands.add(new LLVM_Parameter(val, aggr)); if (this.getOperation() == LLVM_Operation.INSERTVALUE){ String ty = parseReadType(cmd); String elt = parseReadValue(cmd); parseEraseString(cmd, ","); operands.add(new LLVM_Parameter(elt, ty)); } // alle idx einlesen while(cmd.toString().length() > 0){ String idx = parseReadValue(cmd); parseEraseString(cmd, ","); operands.add(new LLVM_Parameter(idx, "i32")); } if (LLVM_Optimization.DEBUG) System.out.println("Operation generiert: " + this.toString()); } public String toString(){ if (target == null || operands == null) return null; String cmd_out = target.getName() + " = "; if (this.getOperation() == LLVM_Operation.INSERTVALUE){ cmd_out += "insertvalue "; }else{ cmd_out += "extractvalue "; } int start = 0; cmd_out += operands.get(start).getTypeString() + " "; cmd_out += operands.get(start).getName(); start++; if (this.getOperation() == LLVM_Operation.INSERTVALUE){ cmd_out += ", " + operands.get(start).getTypeString() + " "; cmd_out += operands.get(start).getName(); start++; } for (int i = start; i < operands.size(); i++){ cmd_out += ", " + operands.get(i).getName(); } cmd_out += " " + getComment(); return cmd_out; } }