Cosmos/source/Indy.IL2CPU.IL.X86/CustomImplementations/System.Runtime.CompilerServices/RuntimeHelpersImpl.cs
2008-02-04 08:17:37 +00:00

51 lines
No EOL
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using Indy.IL2CPU.Plugs;
namespace Indy.IL2CPU.IL.X86.CustomImplementations.System.Runtime.CompilerServices {
[Plug(Target = typeof(RuntimeHelpers))]
public static class RuntimeHelpersImpl {
[PlugMethod(Signature = "System_Void__System_Runtime_CompilerServices_RuntimeHelpers__cctor__")]
public static void CCtor() {
//todo: do something
}
[PlugMethod(MethodAssembler = typeof(InitializeArrayAssembler))]
public static void InitializeArray(Array array, RuntimeFieldHandle fldHandle) {
}
}
public class InitializeArrayAssembler: AssemblerMethod {
public override void Assemble(Indy.IL2CPU.Assembler.Assembler aAssembler) {
// Arguments:
// Array aArray, RuntimeFieldHandle aFieldHandle
new Assembler.X86.Move(Assembler.X86.Registers.EDI, "[ebp+0xC]"); // aArray
new Assembler.X86.Move(Assembler.X86.Registers.ESI, "[ebp+8]"); // aFieldHandle
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "8");
new Assembler.X86.Push("dword [edi]");
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "4");
new Assembler.X86.Move("eax", "[edi]");
new Assembler.X86.Multiply("dword [esp]");
new Assembler.X86.Pop("ecx");
new Assembler.X86.Move("ecx", "eax");
new Assembler.X86.Move(Assembler.X86.Registers.EAX, "0");
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "4");
new Assembler.X86.Add(Assembler.X86.Registers.ESI, "16");
new Assembler.Label(".StartLoop");
new Assembler.X86.Move("byte", Assembler.X86.Registers.DL, Assembler.X86.Registers.AtESI);
new Assembler.X86.Move("byte", Assembler.X86.Registers.AtEDI, Assembler.X86.Registers.DL);
new Assembler.X86.Add(Assembler.X86.Registers.EAX, "1");
new Assembler.X86.Add(Assembler.X86.Registers.ESI, "1");
new Assembler.X86.Add(Assembler.X86.Registers.EDI, "1");
new Assembler.X86.Compare(Assembler.X86.Registers.EAX, Assembler.X86.Registers.ECX);
new Assembler.X86.JumpIfEquals(".EndLoop");
new Assembler.X86.JumpAlways(".StartLoop");
new Assembler.Label(".EndLoop");
}
}
}