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+"]")));
        }
Example #2
0
 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);
 }
Example #3
0
        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());
        }
Example #4
0
        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();
 }
Example #6
0
        /// <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;
              }
        }
Example #7
0
   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);
   }
Example #8
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);
Example #10
0
 public static void FromRegister(this IReference self, Register register)
 {
     self.GetRepresentation().FromRegister(register);
 }
Example #11
0
 public override void FromRegister(Register register)
 {
     CodeGenerator.Emitter.EmitRegisterMoveIfDifferent(this, register);
 }
Example #12
0
 public override void FromRegister(Register register)
 {
     throw new NotImplementedException();
 }