public override void ToSpecifiedRegister(ICodeGenerator g, Register result) { string opCode; string shifter; int multiplier; switch(array.ExpressionType) { case ExpressionType.WordArray: opCode="LDR"; shifter=",LSL 2"; multiplier=4; break; case ExpressionType.ByteArray: opCode="LDRB"; shifter=""; multiplier=1; break; default: throw new Exception("Can't index an expression of type "+array.ExpressionType); } throw new NotImplementedException("NIY"); // // array.LoadToNewRegister(g, arrayRegister => // index.ToRegisterOrImmediate(g, // indexRegister => g.Emit(OpCodes.TODO, opCode+" "+result+",["+arrayRegister+",+"+indexRegister+shifter+"]"), // indexImmediate => g.Emit(OpCodes.TODO, opCode+" "+result+",["+arrayRegister+",+#"+indexImmediate*multiplier+"]"))); }
public void Emit(Format5OpCode opCode, Register rd, Register rs, string nopExplanation=null) { string fluentComment; var rsIsHigh=rs is HighRegister; var rdIsHigh=rd is HighRegister; if(opCode==Format5OpCode.BX) { //rd is ignored on BX instruction rd=Register.R0; fluentComment="BX "+rs; } else if(!rsIsHigh && !rdIsHigh) { throw new Exception("illegal use of this instruction"); } else if(rd.EqualTo(rs)) { fluentComment="NOP"; } else { fluentComment=opCode.ToHumanReadable().MyConcat(" ", rd, ",", rs); } if(nopExplanation!=null) { fluentComment=fluentComment+" ("+nopExplanation+")"; } var maskedRs=rs.Index&7; var maskedRd=rd.Index&7; var h1Bits=rdIsHigh ? 1 : 0; var h2Bits=rsIsHigh ? 1 : 0; EmitHelper(rd, 5, fluentComment, 17, 6, (int)opCode, 2, h1Bits, 1, h2Bits, 1, maskedRs, 3, maskedRd, 3); }
public override void FromRegister(Register register) { var f=FuncBuilder.Instance; var emitter=CodeGenerator.Emitter; var lowRegister=register as LowRegister; if(lowRegister==null) { lowRegister=f.Scratch0; emitter.EmitRegisterMoveIfDifferent(lowRegister, register); } emitter.Emit(Format11OpCode.STR, lowRegister, (uint)CalculateOffset()); }
public override void FromRegister(Register register) { var f=FuncBuilder.Instance; var emitter=CodeGenerator.Emitter; var scratch0=f.Scratch0; var scratch1=f.Scratch1; var lowRegister=register as LowRegister; if(lowRegister==null) { lowRegister=scratch0; emitter.EmitRegisterMoveIfDifferent(lowRegister, register); } var scratchToUse=lowRegister.Index==scratch0.Index ? scratch1 : scratch0; var address=StorageLabel.GetLabelAddressBestEffort(); emitter.EmitLoadAddress(Format12OpCode.LDADDR_PC, scratchToUse, address, false); emitter.Emit(Format9OpCode.STR, lowRegister, scratchToUse, 0); }
public override void FromSpecifiedRegister(ICodeGenerator g, Register register) { throw new NotImplementedException(); }
/// <summary> /// A params array would be simpler here, but the IL space it takes to populate such an array /// depresses me /// </summary> private void EmitHelper(Register writtenRegister, int format, string fluentComment, int field0, int length0, int field1, int length1, int field2, int length2, int field3, int length3, int field4=0, int length4=0, int field5=0, int length5=0) { var ocb=new OpCodeBuilder(); ocb.Add(field0, length0); ocb.Add(field1, length1); ocb.Add(field2, length2); ocb.Add(field3, length3); ocb.Add(field4, length4); ocb.Add(field5, length5); var assemblerComment=ocb.GetAssemblerComment().PaddedTo(25)+"(Format "+format+")"; Emit((short)ocb.OpCode, fluentComment, assemblerComment); if(writtenRegister!=null) { RegistersWritten|=1<<writtenRegister.Index; } }
private void EmitHelper(Register writtenRegister, int format, string fluentComment, int field0, int length0, int field1, int length1, int field2=0, int length2=0) { EmitHelper(writtenRegister, format, fluentComment, field0, length0, field1, length1, field2, length2, 0, 0, 0, 0, 0, 0); }
public void EmitRegisterMoveIfDifferent(Register rd, Register rs) { if(rd.Index!=rs.Index) { var lowRd=rd as LowRegister; var lowRs=rs as LowRegister; if(lowRd!=null && lowRs!=null) { Emit(Format2OpCode.ADD, lowRd, lowRs, 0); } else { Emit(Format5OpCode.MOV, rd, rs); } } }
public abstract void FromRegister(Register register);
public static void FromRegister(this IReference self, Register register) { self.GetRepresentation().FromRegister(register); }
public override void FromRegister(Register register) { CodeGenerator.Emitter.EmitRegisterMoveIfDifferent(this, register); }
public override void FromRegister(Register register) { throw new NotImplementedException(); }