From 8f773312b015a2eba70ff757c008673574467c9e Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 14 Oct 2025 00:45:29 +0200 Subject: [PATCH] Opcodes massiv erweitert --- STCompiler.Common/Bytecode.cs | 38 +- .../bin/Debug/net8.0/STCompiler.Common.dll | Bin 9728 -> 12288 bytes .../bin/Debug/net8.0/STCompiler.Common.pdb | Bin 11132 -> 11132 bytes .../net8.0/STCompiler.Common.AssemblyInfo.cs | 2 +- ...STCompiler.Common.AssemblyInfoInputs.cache | 2 +- .../obj/Debug/net8.0/STCompiler.Common.dll | Bin 9728 -> 12288 bytes .../obj/Debug/net8.0/STCompiler.Common.pdb | Bin 11132 -> 11132 bytes .../Debug/net8.0/ref/STCompiler.Common.dll | Bin 7680 -> 8704 bytes .../Debug/net8.0/refint/STCompiler.Common.dll | Bin 7680 -> 8704 bytes STCompiler.Compiler/Program.cs | 60 +- .../bin/Debug/net8.0/STCompiler.Common.dll | Bin 9728 -> 12288 bytes .../bin/Debug/net8.0/STCompiler.Common.pdb | Bin 11132 -> 11132 bytes .../bin/Debug/net8.0/STCompiler.Compiler.dll | Bin 31744 -> 31744 bytes .../bin/Debug/net8.0/STCompiler.Compiler.pdb | Bin 20852 -> 20852 bytes STCompiler.Compiler/input.st | 11 + .../STCompiler.Compiler.AssemblyInfo.cs | 2 +- ...Compiler.Compiler.AssemblyInfoInputs.cache | 2 +- ...er.Compiler.csproj.AssemblyReference.cache | Bin 458 -> 458 bytes .../obj/Debug/net8.0/STCompiler.Compiler.dll | Bin 31744 -> 31744 bytes .../obj/Debug/net8.0/STCompiler.Compiler.pdb | Bin 20852 -> 20852 bytes .../Debug/net8.0/ref/STCompiler.Compiler.dll | Bin 9728 -> 9728 bytes .../net8.0/refint/STCompiler.Compiler.dll | Bin 9728 -> 9728 bytes STCompiler.Compiler/output.bin | Bin 356 -> 356 bytes STCompiler.Disassembler/Program.cs | 106 ++++ .../bin/Debug/net8.0/STCompiler.Common.dll | Bin 9728 -> 12288 bytes .../bin/Debug/net8.0/STCompiler.Common.pdb | Bin 11132 -> 11132 bytes .../Debug/net8.0/STCompiler.Disassembler.dll | Bin 9728 -> 13312 bytes .../Debug/net8.0/STCompiler.Disassembler.pdb | Bin 12364 -> 13368 bytes .../STCompiler.Disassembler.AssemblyInfo.cs | 2 +- ...iler.Disassembler.AssemblyInfoInputs.cache | 2 +- ...isassembler.csproj.AssemblyReference.cache | Bin 458 -> 458 bytes .../Debug/net8.0/STCompiler.Disassembler.dll | Bin 9728 -> 13312 bytes .../Debug/net8.0/STCompiler.Disassembler.pdb | Bin 12364 -> 13368 bytes .../net8.0/ref/STCompiler.Disassembler.dll | Bin 6144 -> 6144 bytes .../net8.0/refint/STCompiler.Disassembler.dll | Bin 6144 -> 6144 bytes STCompiler.Simulator/Program.cs | 598 +++++++++++++++--- .../bin/Debug/net8.0/STCompiler.Common.dll | Bin 9728 -> 12288 bytes .../bin/Debug/net8.0/STCompiler.Common.pdb | Bin 11132 -> 11132 bytes .../bin/Debug/net8.0/STCompiler.Simulator.dll | Bin 16384 -> 64512 bytes .../bin/Debug/net8.0/STCompiler.Simulator.pdb | Bin 14340 -> 30976 bytes .../STCompiler.Simulator.AssemblyInfo.cs | 2 +- ...ompiler.Simulator.AssemblyInfoInputs.cache | 2 +- ...r.Simulator.csproj.AssemblyReference.cache | Bin 458 -> 458 bytes .../obj/Debug/net8.0/STCompiler.Simulator.dll | Bin 16384 -> 64512 bytes .../obj/Debug/net8.0/STCompiler.Simulator.pdb | Bin 14340 -> 30976 bytes .../Debug/net8.0/ref/STCompiler.Simulator.dll | Bin 6656 -> 10752 bytes .../net8.0/refint/STCompiler.Simulator.dll | Bin 6656 -> 10752 bytes 47 files changed, 691 insertions(+), 138 deletions(-) diff --git a/STCompiler.Common/Bytecode.cs b/STCompiler.Common/Bytecode.cs index 771393f..9582e19 100644 --- a/STCompiler.Common/Bytecode.cs +++ b/STCompiler.Common/Bytecode.cs @@ -30,16 +30,25 @@ public static class Bytecode { public const byte ADD_REAL = 0x40; public const byte SUB_REAL = 0x41; public const byte MUL_REAL = 0x42; public const byte DIV_REAL = 0x43; public const byte ADD_LREAL = 0x44; public const byte SUB_LREAL = 0x45; public const byte MUL_LREAL = 0x46; public const byte DIV_LREAL = 0x47; - // Comparisons signed - public const byte LT_S = 0x50; public const byte GT_S = 0x51; public const byte LE_S = 0x52; public const byte GE_S = 0x53; public const byte EQ_S = 0x54; public const byte NEQ_S = 0x55; - // Comparisons unsigned - public const byte LT_U = 0x56; public const byte GT_U = 0x57; public const byte LE_U = 0x58; public const byte GE_U = 0x59; public const byte EQ_U = 0x5A; public const byte NEQ_U = 0x5B; - // Comparisons floating - public const byte LT_F = 0x5C; public const byte GT_F = 0x5D; public const byte LE_F = 0x5E; public const byte GE_F = 0x5F; public const byte EQ_F = 0x60; public const byte NEQ_F = 0x61; + // Signed integer comparisons + public const byte LT_SINT = 0x50; public const byte GT_SINT = 0x51; public const byte LE_SINT = 0x52; public const byte GE_SINT = 0x53; public const byte EQ_SINT = 0x54; public const byte NEQ_SINT = 0x55; + public const byte LT_INT = 0x56; public const byte GT_INT = 0x57; public const byte LE_INT = 0x58; public const byte GE_INT = 0x59; public const byte EQ_INT = 0x5A; public const byte NEQ_INT = 0x5B; + public const byte LT_DINT = 0x5C; public const byte GT_DINT = 0x5D; public const byte LE_DINT = 0x5E; public const byte GE_DINT = 0x5F; public const byte EQ_DINT = 0x60; public const byte NEQ_DINT = 0x61; + public const byte LT_LINT = 0x62; public const byte GT_LINT = 0x63; public const byte LE_LINT = 0x64; public const byte GE_LINT = 0x65; public const byte EQ_LINT = 0x66; public const byte NEQ_LINT = 0x67; + + // Unsigned integer comparisons + public const byte LT_USINT = 0x70; public const byte GT_USINT = 0x71; public const byte LE_USINT = 0x72; public const byte GE_USINT = 0x73; public const byte EQ_USINT = 0x74; public const byte NEQ_USINT = 0x75; + public const byte LT_UINT = 0x76; public const byte GT_UINT = 0x77; public const byte LE_UINT = 0x78; public const byte GE_UINT = 0x79; public const byte EQ_UINT = 0x7A; public const byte NEQ_UINT = 0x7B; + public const byte LT_UDINT = 0x7C; public const byte GT_UDINT = 0x7D; public const byte LE_UDINT = 0x7E; public const byte GE_UDINT = 0x7F; public const byte EQ_UDINT = 0x80; public const byte NEQ_UDINT = 0x81; + public const byte LT_ULINT = 0x82; public const byte GT_ULINT = 0x83; public const byte LE_ULINT = 0x84; public const byte GE_ULINT = 0x85; public const byte EQ_ULINT = 0x86; public const byte NEQ_ULINT = 0x87; + + // Floating point comparisons + public const byte LT_REAL = 0x90; public const byte GT_REAL = 0x91; public const byte LE_REAL = 0x92; public const byte GE_REAL = 0x93; public const byte EQ_REAL = 0x94; public const byte NEQ_REAL = 0x95; + public const byte LT_LREAL = 0x96; public const byte GT_LREAL = 0x97; public const byte LE_LREAL = 0x98; public const byte GE_LREAL = 0x99; public const byte EQ_LREAL = 0x9A; public const byte NEQ_LREAL = 0x9B; // Control flow - public const byte JZ = 0x70; - public const byte JMP = 0x71; + public const byte JZ = 0xA0; + public const byte JMP = 0xA1; // Array operations public const byte ARRAY_BOUNDS_CHECK = 0xE0; @@ -63,9 +72,16 @@ public static class Bytecode { { OpCodes.ADD_ULINT, "ADD_ULINT" }, { OpCodes.SUB_ULINT, "SUB_ULINT" }, { OpCodes.MUL_ULINT, "MUL_ULINT" }, { OpCodes.DIV_ULINT, "DIV_ULINT" }, { OpCodes.ADD_REAL, "ADD_REAL" }, { OpCodes.SUB_REAL, "SUB_REAL" }, { OpCodes.MUL_REAL, "MUL_REAL" }, { OpCodes.DIV_REAL, "DIV_REAL" }, { OpCodes.ADD_LREAL, "ADD_LREAL" }, { OpCodes.SUB_LREAL, "SUB_LREAL" }, { OpCodes.MUL_LREAL, "MUL_LREAL" }, { OpCodes.DIV_LREAL, "DIV_LREAL" }, - { OpCodes.LT_S, "LT_S" }, { OpCodes.GT_S, "GT_S" }, { OpCodes.LE_S, "LE_S" }, { OpCodes.GE_S, "GE_S" }, { OpCodes.EQ_S, "EQ_S" }, { OpCodes.NEQ_S, "NEQ_S" }, - { OpCodes.LT_U, "LT_U" }, { OpCodes.GT_U, "GT_U" }, { OpCodes.LE_U, "LE_U" }, { OpCodes.GE_U, "GE_U" }, { OpCodes.EQ_U, "EQ_U" }, { OpCodes.NEQ_U, "NEQ_U" }, - { OpCodes.LT_F, "LT_F" }, { OpCodes.GT_F, "GT_F" }, { OpCodes.LE_F, "LE_F" }, { OpCodes.GE_F, "GE_F" }, { OpCodes.EQ_F, "EQ_F" }, { OpCodes.NEQ_F, "NEQ_F" }, + { OpCodes.LT_SINT, "LT_SINT" }, { OpCodes.GT_SINT, "GT_SINT" }, { OpCodes.LE_SINT, "LE_SINT" }, { OpCodes.GE_SINT, "GE_SINT" }, { OpCodes.EQ_SINT, "EQ_SINT" }, { OpCodes.NEQ_SINT, "NEQ_SINT" }, + { OpCodes.LT_INT, "LT_INT" }, { OpCodes.GT_INT, "GT_INT" }, { OpCodes.LE_INT, "LE_INT" }, { OpCodes.GE_INT, "GE_INT" }, { OpCodes.EQ_INT, "EQ_INT" }, { OpCodes.NEQ_INT, "NEQ_INT" }, + { OpCodes.LT_DINT, "LT_DINT" }, { OpCodes.GT_DINT, "GT_DINT" }, { OpCodes.LE_DINT, "LE_DINT" }, { OpCodes.GE_DINT, "GE_DINT" }, { OpCodes.EQ_DINT, "EQ_DINT" }, { OpCodes.NEQ_DINT, "NEQ_DINT" }, + { OpCodes.LT_LINT, "LT_LINT" }, { OpCodes.GT_LINT, "GT_LINT" }, { OpCodes.LE_LINT, "LE_LINT" }, { OpCodes.GE_LINT, "GE_LINT" }, { OpCodes.EQ_LINT, "EQ_LINT" }, { OpCodes.NEQ_LINT, "NEQ_LINT" }, + { OpCodes.LT_USINT, "LT_USINT" }, { OpCodes.GT_USINT, "GT_USINT" }, { OpCodes.LE_USINT, "LE_USINT" }, { OpCodes.GE_USINT, "GE_USINT" }, { OpCodes.EQ_USINT, "EQ_USINT" }, { OpCodes.NEQ_USINT, "NEQ_USINT" }, + { OpCodes.LT_UINT, "LT_UINT" }, { OpCodes.GT_UINT, "GT_UINT" }, { OpCodes.LE_UINT, "LE_UINT" }, { OpCodes.GE_UINT, "GE_UINT" }, { OpCodes.EQ_UINT, "EQ_UINT" }, { OpCodes.NEQ_UINT, "NEQ_UINT" }, + { OpCodes.LT_UDINT, "LT_UDINT" }, { OpCodes.GT_UDINT, "GT_UDINT" }, { OpCodes.LE_UDINT, "LE_UDINT" }, { OpCodes.GE_UDINT, "GE_UDINT" }, { OpCodes.EQ_UDINT, "EQ_UDINT" }, { OpCodes.NEQ_UDINT, "NEQ_UDINT" }, + { OpCodes.LT_ULINT, "LT_ULINT" }, { OpCodes.GT_ULINT, "GT_ULINT" }, { OpCodes.LE_ULINT, "LE_ULINT" }, { OpCodes.GE_ULINT, "GE_ULINT" }, { OpCodes.EQ_ULINT, "EQ_ULINT" }, { OpCodes.NEQ_ULINT, "NEQ_ULINT" }, + { OpCodes.LT_REAL, "LT_REAL" }, { OpCodes.GT_REAL, "GT_REAL" }, { OpCodes.LE_REAL, "LE_REAL" }, { OpCodes.GE_REAL, "GE_REAL" }, { OpCodes.EQ_REAL, "EQ_REAL" }, { OpCodes.NEQ_REAL, "NEQ_REAL" }, + { OpCodes.LT_LREAL, "LT_LREAL" }, { OpCodes.GT_LREAL, "GT_LREAL" }, { OpCodes.LE_LREAL, "LE_LREAL" }, { OpCodes.GE_LREAL, "GE_LREAL" }, { OpCodes.EQ_LREAL, "EQ_LREAL" }, { OpCodes.NEQ_LREAL, "NEQ_LREAL" }, { OpCodes.JZ, "JZ" }, { OpCodes.JMP, "JMP" }, { OpCodes.ARRAY_BOUNDS_CHECK, "ARRAY_BOUNDS_CHECK" }, { OpCodes.HALT, "HALT" } diff --git a/STCompiler.Common/bin/Debug/net8.0/STCompiler.Common.dll b/STCompiler.Common/bin/Debug/net8.0/STCompiler.Common.dll index e0254d41d5d9fe63415897cdd51b20507b729d44..bd6c133e48cbc1564911f17c044f6cc20351ce15 100644 GIT binary patch delta 5203 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 D*0ny_ delta 149 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 D*0ny_ delta 149 zcmV;G0BZmIR{U0wd=z5kN1#n{u}`1R*cgY+ahihTarlvt7!hFr000aC000L7000>P z003N(xz_@=1GAC=g8?8MX<=~OZOTNpBq_MBc25dXI2-^Tx?ZcDW`3z@ti z#w+91?YnYPN>7}X{=YuS88bwKBI#Hd=q(mTI$mi?I@KUD%PcgD^x7TSsYBx;Ly`C5 zK$e?rjdO3-S%brASgOL7?!Ku7n&qC>u{x&PvHsA&%9;&_&x}|*H~o_SMjKgr6J18{r|Z~t7kz}j zK}WJHKtnV_m(W}3R@y~lgLpcjIkcK)^K>KVB-%oc(06Dbb$Fsz`Tu*C9--%G6Ro4G z={|aqUEjyJJ5E2KXXt6Vg_p9PE~dBAHMEU(@gfe;ois)tr~7Cf&sI(IX%4NlV&=9_ zWYS3=qxaEO^kMoCt>nls9Yu%HakPNW=g8SKObh5VT1)?;mvmzc<4-dAg#Jj+)6=|B zCuk3Si+)0n(?{qIx|BB4jdTM&%*(pOxPlJD`Rl99$1t{6F4%E=%Di+(Mk_w4Rw5gi z>D#XVWCgwl{+0DO?P_1CJc{SYKiQ{tyZWviJ83IEzWoyh4nm(lk;O1@&z1Bjo;Ul| zJQ`FM;ghY>=l`!0@uailGaR+$j6FzNF*pS}G7=7!>lhcqfK<>abUK|)Z>CY05s;rHJhzI#-gUCS(lAQn;-82ks@Cwb{{)0z;A5hRn80U&sR-K ztH(RR`!Ycp{zi$<=U$&Q)qN&uY;kSP!n!#%Q|hEH5!}>R*S|EgW_Ev68%b0}+>erS z$Du3H#J%ZZU|JZU!>fq67n6$I^5iTts zhkrML~I+4L|lEez1%Rp1u%k7-DZ zVZbqrIEIlK<5l54cw@Y@W+C^chk*c@n3A|IE^vlfF(X(JaVr8> zk3~a&eWKj#O|{vhm`5Y-fs0D+ox4a|bg{PT?Ycx)>MC8WZMsI+ z>N>q!@4?sheY##Z;3>IDV;a}Zx<$9@Hr=i}bf>m!hwfHa_voX#S0B@T`nW!!Pim(g za4)5u%`1%tgQ4Qw zceIJCIaKt$E!^89DZ>Qi)0suaK0(GGutR;Z=fYJS<1vBBrWX!mRM} e5@aD%6yrz;>!vR%Ep9CHek&N}ug{L)fWHCiRD`?$ delta 1903 zcmZYAZA@Eb6bJD0Joom33`bkWB8ke9S2nQmhgT3D9M;qYyu ztqu{D80$@@iJI`m50JPS>Y~ON_hFgy(|p%t&M}QMnk9Ugs4>QPo=RD83 z=U#3vx9M=Y^@W+LxPX&0ln~P$bC^f$oHNufKVjh;gRW>Ui$SBh z(xzE0MbyRTF{lwUJ=$}+K|T8S?1H8og;P*q-iP=j^eM+t)rjx0T;TdIb>*+p#a-8K ztVofdCxn$|1uk8r+BZ_h<|EcSvOo{6Nj5(&w@8zEBHq!E^8e)KU5;;zGn5U^QkOunzj*I2?n= z;Bj~Y&cZpk08>{md<}nw*Wq8dtY2V0X6*1T7=Tf@AHIaj=iwZjheu!%9)nZxNBCU| z!&mTAcnN+3yYaWS!&c~nyI~Oapt2L*0sSxxLvR?CZzGPtWwtLslp;Do8M&RGGnEoe zmlp8zFW0jCGtwje$v&3N|H_6etwOs|dB`I8q0Dv3pOCFWzmZK!!4L4-+DW}tSXQ$X zP8e8A=^VYTcL?>?5tPTzwxFl@Kl{HfN%fL=fLAq|k~dKSpV-D4RK^z27Q`ObN`4rG zov5mZN1HRpDnDOm?~0t^NNe!+lGM z(2j_4^VQNHYJJ{hLsN4i8E+WzyN43)_;8D_#pCgec>TUa!sBgjZ1Bb7O&)W;tkJ$V z_cNnz-h(O*WSkr2SYOsCe^X@FJF2u^A9*Rs-$)ZRQ-Y&7$0Ph0xoL=VH|N9DLO$L- k*haYC&v}A3568{?EHrQ)=dFo6W~%ZTIpfC9T*jUEH}mX$SO5S3 diff --git a/STCompiler.Common/obj/Debug/net8.0/refint/STCompiler.Common.dll b/STCompiler.Common/obj/Debug/net8.0/refint/STCompiler.Common.dll index 5816c0ef2965833bf02bb7bf37fdf7c7968c7c77..857b93f5f0f81d86f06c7d2f7b5262c3e9178616 100644 GIT binary patch delta 2822 zcmZYB32YQ)6bJD4W_E|uc1uesv_aY$sV!-@+ihu~kRq)GsZi*)AgFXH6%iyr0S}H{ zZZsY(gNTY+yz7ymmBg5aR7Ii&JQ4+?1ez#lkOYkwjbh^e`%f2*cA4M2_sx6rhRN>i z#w+91?YnYPN>7}X{=YuS88bwKBI#Hd=q(mTI$mi?I@KUD%PcgD^x7TSsYBx;Ly`C5 zK$e?rjdO3-S%brASgOL7?!Ku7n&qC>u{x&PvHsA&%9;&_&x}|*H~o_SMjKgr6J18{r|Z~t7kz}j zK}WJHKtnV_m(W}3R@y~lgLpcjIkcK)^K>KVB-%oc(06Dbb$Fsz`Tu*C9--%G6Ro4G z={|aqUEjyJJ5E2KXXt6Vg_p9PE~dBAHMEU(@gfe;ois)tr~7Cf&sI(IX%4NlV&=9_ zWYS3=qxaEO^kMoCt>nls9Yu%HakPNW=g8SKObh5VT1)?;mvmzc<4-dAg#Jj+)6=|B zCuk3Si+)0n(?{qIx|BB4jdTM&%*(pOxPlJD`Rl99$1t{6F4%E=%Di+(Mk_w4Rw5gi z>D#XVWCgwl{+0DO?P_1CJc{SYKiQ{tyZWviJ83IEzWoyh4nm(lk;O1@&z1Bjo;Ul| zJQ`FM;ghY>=l`!0@uailGaR+$j6FzNF*pS}G7=7!>lhcqfK<>abUK|)Z>CY05s;rHJhzI#-gUCS(lAQn;-82ks@Cwb{{)0z;A5hRn80U&sR-K ztH(RR`!Ycp{zi$<=U$&Q)qN&uY;kSP!n!#%Q|hEH5!}>R*S|EgW_Ev68%b0}+>erS z$Du3H#J%ZZU|JZU!>fq67n6$I^5iTts zhkrML~I+4L|lEez1%Rp1u%k7-DZ zVZbqrIEIlK<5l54cw@Y@W+C^chk*c@n3A|IE^vlfF(X(JaVr8> zk3~a&eWKj#O|{vhm`5Y-fs0D+ox4a|bg{PT?Ycx)>MC8WZMsI+ z>N>q!@4?sheY##Z;3>IDV;a}Zx<$9@Hr=i}bf>m!hwfHa_voX#S0B@T`nW!!Pim(g za4)5u%`1%tgQ4Qw zceIJCIaKt$E!^89DZ>Qi)0suaK0(GGutR;Z=fYJS<1vBBrWX!mRM} e5@aD%6yrz;>!vR%Ep9CHek&N}ug{L)fWHCiRD`?$ delta 1903 zcmZYAZA@Eb6bJD0Joom33`bkWB8ke9S2nQmhgT3D9M;qYyu ztqu{D80$@@iJI`m50JPS>Y~ON_hFgy(|p%t&M}QMnk9Ugs4>QPo=RD83 z=U#3vx9M=Y^@W+LxPX&0ln~P$bC^f$oHNufKVjh;gRW>Ui$SBh z(xzE0MbyRTF{lwUJ=$}+K|T8S?1H8og;P*q-iP=j^eM+t)rjx0T;TdIb>*+p#a-8K ztVofdCxn$|1uk8r+BZ_h<|EcSvOo{6Nj5(&w@8zEBHq!E^8e)KU5;;zGn5U^QkOunzj*I2?n= z;Bj~Y&cZpk08>{md<}nw*Wq8dtY2V0X6*1T7=Tf@AHIaj=iwZjheu!%9)nZxNBCU| z!&mTAcnN+3yYaWS!&c~nyI~Oapt2L*0sSxxLvR?CZzGPtWwtLslp;Do8M&RGGnEoe zmlp8zFW0jCGtwje$v&3N|H_6etwOs|dB`I8q0Dv3pOCFWzmZK!!4L4-+DW}tSXQ$X zP8e8A=^VYTcL?>?5tPTzwxFl@Kl{HfN%fL=fLAq|k~dKSpV-D4RK^z27Q`ObN`4rG zov5mZN1HRpDnDOm?~0t^NNe!+lGM z(2j_4^VQNHYJJ{hLsN4i8E+WzyN43)_;8D_#pCgec>TUa!sBgjZ1Bb7O&)W;tkJ$V z_cNnz-h(O*WSkr2SYOsCe^X@FJF2u^A9*Rs-$)ZRQ-Y&7$0Ph0xoL=VH|N9DLO$L- k*haYC&v}A3568{?EHrQ)=dFo6W~%ZTIpfC9T*jUEH}mX$SO5S3 diff --git a/STCompiler.Compiler/Program.cs b/STCompiler.Compiler/Program.cs index 791f6c2..041fd4f 100644 --- a/STCompiler.Compiler/Program.cs +++ b/STCompiler.Compiler/Program.cs @@ -127,40 +127,40 @@ public class BytecodeEmitter { {(TokType.MUL, VarType.LREAL), Bytecode.OpCodes.MUL_LREAL}, {(TokType.DIV, VarType.LREAL), Bytecode.OpCodes.DIV_LREAL}, // Comparisons signed - {(TokType.LT, VarType.SINT), Bytecode.OpCodes.LT_S}, {(TokType.GT, VarType.SINT), Bytecode.OpCodes.GT_S}, - {(TokType.LE, VarType.SINT), Bytecode.OpCodes.LE_S}, {(TokType.GE, VarType.SINT), Bytecode.OpCodes.GE_S}, - {(TokType.EQ, VarType.SINT), Bytecode.OpCodes.EQ_S}, {(TokType.NEQ, VarType.SINT), Bytecode.OpCodes.NEQ_S}, - {(TokType.LT, VarType.INT), Bytecode.OpCodes.LT_S}, {(TokType.GT, VarType.INT), Bytecode.OpCodes.GT_S}, - {(TokType.LE, VarType.INT), Bytecode.OpCodes.LE_S}, {(TokType.GE, VarType.INT), Bytecode.OpCodes.GE_S}, - {(TokType.EQ, VarType.INT), Bytecode.OpCodes.EQ_S}, {(TokType.NEQ, VarType.INT), Bytecode.OpCodes.NEQ_S}, - {(TokType.LT, VarType.DINT), Bytecode.OpCodes.LT_S}, {(TokType.GT, VarType.DINT), Bytecode.OpCodes.GT_S}, - {(TokType.LE, VarType.DINT), Bytecode.OpCodes.LE_S}, {(TokType.GE, VarType.DINT), Bytecode.OpCodes.GE_S}, - {(TokType.EQ, VarType.DINT), Bytecode.OpCodes.EQ_S}, {(TokType.NEQ, VarType.DINT), Bytecode.OpCodes.NEQ_S}, - {(TokType.LT, VarType.LINT), Bytecode.OpCodes.LT_S}, {(TokType.GT, VarType.LINT), Bytecode.OpCodes.GT_S}, - {(TokType.LE, VarType.LINT), Bytecode.OpCodes.LE_S}, {(TokType.GE, VarType.LINT), Bytecode.OpCodes.GE_S}, - {(TokType.EQ, VarType.LINT), Bytecode.OpCodes.EQ_S}, {(TokType.NEQ, VarType.LINT), Bytecode.OpCodes.NEQ_S}, + {(TokType.LT, VarType.SINT), Bytecode.OpCodes.LT_SINT}, {(TokType.GT, VarType.SINT), Bytecode.OpCodes.GT_SINT}, + {(TokType.LE, VarType.SINT), Bytecode.OpCodes.LE_SINT}, {(TokType.GE, VarType.SINT), Bytecode.OpCodes.GE_SINT}, + {(TokType.EQ, VarType.SINT), Bytecode.OpCodes.EQ_SINT}, {(TokType.NEQ, VarType.SINT), Bytecode.OpCodes.NEQ_SINT}, + {(TokType.LT, VarType.INT), Bytecode.OpCodes.LT_INT}, {(TokType.GT, VarType.INT), Bytecode.OpCodes.GT_INT}, + {(TokType.LE, VarType.INT), Bytecode.OpCodes.LE_INT}, {(TokType.GE, VarType.INT), Bytecode.OpCodes.GE_INT}, + {(TokType.EQ, VarType.INT), Bytecode.OpCodes.EQ_INT}, {(TokType.NEQ, VarType.INT), Bytecode.OpCodes.NEQ_INT}, + {(TokType.LT, VarType.DINT), Bytecode.OpCodes.LT_DINT}, {(TokType.GT, VarType.DINT), Bytecode.OpCodes.GT_DINT}, + {(TokType.LE, VarType.DINT), Bytecode.OpCodes.LE_DINT}, {(TokType.GE, VarType.DINT), Bytecode.OpCodes.GE_DINT}, + {(TokType.EQ, VarType.DINT), Bytecode.OpCodes.EQ_DINT}, {(TokType.NEQ, VarType.DINT), Bytecode.OpCodes.NEQ_DINT}, + {(TokType.LT, VarType.LINT), Bytecode.OpCodes.LT_LINT}, {(TokType.GT, VarType.LINT), Bytecode.OpCodes.GT_LINT}, + {(TokType.LE, VarType.LINT), Bytecode.OpCodes.LE_LINT}, {(TokType.GE, VarType.LINT), Bytecode.OpCodes.GE_LINT}, + {(TokType.EQ, VarType.LINT), Bytecode.OpCodes.EQ_LINT}, {(TokType.NEQ, VarType.LINT), Bytecode.OpCodes.NEQ_LINT}, // Comparisons unsigned - {(TokType.LT, VarType.USINT), Bytecode.OpCodes.LT_U}, {(TokType.GT, VarType.USINT), Bytecode.OpCodes.GT_U}, - {(TokType.LE, VarType.USINT), Bytecode.OpCodes.LE_U}, {(TokType.GE, VarType.USINT), Bytecode.OpCodes.GE_U}, - {(TokType.EQ, VarType.USINT), Bytecode.OpCodes.EQ_U}, {(TokType.NEQ, VarType.USINT), Bytecode.OpCodes.NEQ_U}, - {(TokType.LT, VarType.UINT), Bytecode.OpCodes.LT_U}, {(TokType.GT, VarType.UINT), Bytecode.OpCodes.GT_U}, - {(TokType.LE, VarType.UINT), Bytecode.OpCodes.LE_U}, {(TokType.GE, VarType.UINT), Bytecode.OpCodes.GE_U}, - {(TokType.EQ, VarType.UINT), Bytecode.OpCodes.EQ_U}, {(TokType.NEQ, VarType.UINT), Bytecode.OpCodes.NEQ_U}, - {(TokType.LT, VarType.UDINT), Bytecode.OpCodes.LT_U}, {(TokType.GT, VarType.UDINT), Bytecode.OpCodes.GT_U}, - {(TokType.LE, VarType.UDINT), Bytecode.OpCodes.LE_U}, {(TokType.GE, VarType.UDINT), Bytecode.OpCodes.GE_U}, - {(TokType.EQ, VarType.UDINT), Bytecode.OpCodes.EQ_U}, {(TokType.NEQ, VarType.UDINT), Bytecode.OpCodes.NEQ_U}, - {(TokType.LT, VarType.ULINT), Bytecode.OpCodes.LT_U}, {(TokType.GT, VarType.ULINT), Bytecode.OpCodes.GT_U}, - {(TokType.LE, VarType.ULINT), Bytecode.OpCodes.LE_U}, {(TokType.GE, VarType.ULINT), Bytecode.OpCodes.GE_U}, - {(TokType.EQ, VarType.ULINT), Bytecode.OpCodes.EQ_U}, {(TokType.NEQ, VarType.ULINT), Bytecode.OpCodes.NEQ_U}, + {(TokType.LT, VarType.USINT), Bytecode.OpCodes.LT_USINT}, {(TokType.GT, VarType.USINT), Bytecode.OpCodes.GT_USINT}, + {(TokType.LE, VarType.USINT), Bytecode.OpCodes.LE_USINT}, {(TokType.GE, VarType.USINT), Bytecode.OpCodes.GE_USINT}, + {(TokType.EQ, VarType.USINT), Bytecode.OpCodes.EQ_USINT}, {(TokType.NEQ, VarType.USINT), Bytecode.OpCodes.NEQ_USINT}, + {(TokType.LT, VarType.UINT), Bytecode.OpCodes.LT_UINT}, {(TokType.GT, VarType.UINT), Bytecode.OpCodes.GT_UINT}, + {(TokType.LE, VarType.UINT), Bytecode.OpCodes.LE_UINT}, {(TokType.GE, VarType.UINT), Bytecode.OpCodes.GE_UINT}, + {(TokType.EQ, VarType.UINT), Bytecode.OpCodes.EQ_UINT}, {(TokType.NEQ, VarType.UINT), Bytecode.OpCodes.NEQ_UINT}, + {(TokType.LT, VarType.UDINT), Bytecode.OpCodes.LT_UDINT}, {(TokType.GT, VarType.UDINT), Bytecode.OpCodes.GT_UDINT}, + {(TokType.LE, VarType.UDINT), Bytecode.OpCodes.LE_UDINT}, {(TokType.GE, VarType.UDINT), Bytecode.OpCodes.GE_UDINT}, + {(TokType.EQ, VarType.UDINT), Bytecode.OpCodes.EQ_UDINT}, {(TokType.NEQ, VarType.UDINT), Bytecode.OpCodes.NEQ_UDINT}, + {(TokType.LT, VarType.ULINT), Bytecode.OpCodes.LT_ULINT}, {(TokType.GT, VarType.ULINT), Bytecode.OpCodes.GT_ULINT}, + {(TokType.LE, VarType.ULINT), Bytecode.OpCodes.LE_ULINT}, {(TokType.GE, VarType.ULINT), Bytecode.OpCodes.GE_ULINT}, + {(TokType.EQ, VarType.ULINT), Bytecode.OpCodes.EQ_ULINT}, {(TokType.NEQ, VarType.ULINT), Bytecode.OpCodes.NEQ_ULINT}, // Comparisons floating - {(TokType.LT, VarType.REAL), Bytecode.OpCodes.LT_F}, {(TokType.GT, VarType.REAL), Bytecode.OpCodes.GT_F}, - {(TokType.LE, VarType.REAL), Bytecode.OpCodes.LE_F}, {(TokType.GE, VarType.REAL), Bytecode.OpCodes.GE_F}, - {(TokType.EQ, VarType.REAL), Bytecode.OpCodes.EQ_F}, {(TokType.NEQ, VarType.REAL), Bytecode.OpCodes.NEQ_F}, - {(TokType.LT, VarType.LREAL), Bytecode.OpCodes.LT_F}, {(TokType.GT, VarType.LREAL), Bytecode.OpCodes.GT_F}, - {(TokType.LE, VarType.LREAL), Bytecode.OpCodes.LE_F}, {(TokType.GE, VarType.LREAL), Bytecode.OpCodes.GE_F}, - {(TokType.EQ, VarType.LREAL), Bytecode.OpCodes.EQ_F}, {(TokType.NEQ, VarType.LREAL), Bytecode.OpCodes.NEQ_F} + {(TokType.LT, VarType.REAL), Bytecode.OpCodes.LT_REAL}, {(TokType.GT, VarType.REAL), Bytecode.OpCodes.GT_REAL}, + {(TokType.LE, VarType.REAL), Bytecode.OpCodes.LE_REAL}, {(TokType.GE, VarType.REAL), Bytecode.OpCodes.GE_REAL}, + {(TokType.EQ, VarType.REAL), Bytecode.OpCodes.EQ_REAL}, {(TokType.NEQ, VarType.REAL), Bytecode.OpCodes.NEQ_REAL}, + {(TokType.LT, VarType.LREAL), Bytecode.OpCodes.LT_LREAL}, {(TokType.GT, VarType.LREAL), Bytecode.OpCodes.GT_LREAL}, + {(TokType.LE, VarType.LREAL), Bytecode.OpCodes.LE_LREAL}, {(TokType.GE, VarType.LREAL), Bytecode.OpCodes.GE_LREAL}, + {(TokType.EQ, VarType.LREAL), Bytecode.OpCodes.EQ_LREAL}, {(TokType.NEQ, VarType.LREAL), Bytecode.OpCodes.NEQ_LREAL} }; void EmitStmt(Stmt s){ diff --git a/STCompiler.Compiler/bin/Debug/net8.0/STCompiler.Common.dll b/STCompiler.Compiler/bin/Debug/net8.0/STCompiler.Common.dll index e0254d41d5d9fe63415897cdd51b20507b729d44..bd6c133e48cbc1564911f17c044f6cc20351ce15 100644 GIT binary patch delta 5203 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 D*0ny_ delta 149 zcmV;G0BZmIR{U0wd=z5kN1#n{u}`1R*cgY+ahihTarlvt7!hFr000aC000L7000>P z003N(xz_@=1GAC=g8?8MX<=~OZOTNpBq_MBc25dXI2-^Tx?ZcDW`3z@tELE`#%c?~J?3Qwe zX}L?#beURPcqs`GOrSBD7!3Ge;)4=+G5DZ~0TUAweXtK|tPz2KcFs=@GdVNo|IR<> zpWU-FJ2J;c=GfSo@Na9r`?7p)5j$W0v`_0O19Ss!(*Tbmf?h>id z?Ptr`q&v!-coCER?Nw|NM4;D;OHWoxp{P5rvAyO(jjUa=Y=3R3+v&g0HDy)S=&9gHve@z&-EHsAfXxjqt%FHCHT1S7+V zmsrW0O2{l2@~$Q$*sWZ3Bel7iwfMIclFX%&UYQU+l+5eYZw;BfA@1LV&0oEo^-+v% z@a|;$L(c2F&H+@zGE-SRv>kh9AA!nY6M@E|pFrpE27$rhO#-{-(mNyu$-5-7SsfJHO`?z# zNmP;&iAFL+qWj|bU-=#)gOY|xWK#}`?Ilr2_K~P0`$;sC10*`hK@y`P4wgSeB%4Z5 z>@bN!a)d-BIZC3DI3zlk`Vssw5*mb~0?N4lm6G+x1XT!+3#byF5KtpLDWFbxN8(`bUVC+fN!)PPi z;ZZ~6MQDN_cytX$!_D~C^fOOEvHII^0=~!jF`9oi7KH?)2E-`$T(pi2cw?P^)#;PD zuiaGL3teabOZ@WppFex<;FZ{lRy&!rGRZbOTPURM_H-tjZ?#h`$u>NvTdek!Z6)oj zop-ksFI!iSt-TNIwH|yS!(MFDxUSPBzjUxMJk?-Zj;$7#w|2;FD=jsC?;Pxyy5ITA ztv^2d>E4cbhx=Y>u!-Y8Igb9^`O=1U4I7P_|6ks9v%voo{Fxp1acLndx(kM`dD@ZgWXmP#&!$!|8VC^tzxjh%mFXw9HD&_e9pb+>%HI|SR@0B zWb~%>PF($!99ctlCLgwV7DfRYfPL-({IMmAa^+V5vI%UVSuc|OdMnvT>h(dQ`HGX~ z0zfT0B(Oo2;ggm&Neec8g;%7(xp(*^_UNsloWa1n;a)1Zz0CiIs| zTM&SR%|C-(N+oY<54a)GaX$82=xz)8Gb?>()P-(2$Vy{6(rVEf&x`;#p_s~R`%keE z-N(U=u%Ckmp^1YRp_xMt!T}Dhg7l`D3IeZa)QytKAY?KKnG8ZEL$m+yaN!~9=8_39 z(Ng!EN%501EiOXLnT{RgcPUep7A|fshq!pSv~uy9qM48UFsB@T(h)8$>RJ{<5n?Dp z3`K~c2rW}ImKS33vKWdGLlI&qLJUQSp$ILv+0vX;c#J7>QXz&S#88A7iV#B)VxIJk z9p%qerfJb=8z(msZRg_Qa*T_Y%W*C_TspY8sCQWmMQEX@LJUcWp$IXQ4x?cE)@-e& z(fn^8gva*BunBr__QEl3FNNl&^x9JPjNK2sCXI}Pl-}P?8oijOtw#%BFE^nL=!zRSc#=v05z|P>qzzBp4 z42*1(|FOx{s{z>{;c%cJD-#2Q5Ks!lj{x#Lf&6wTKN86AN0N^M@?Qb@%b@bnK)yLM zLVpa9KLN-u0;&O-7YpQ{WP!-r1Nm`4J`il4%^t|e7`XW@$6+>w=f~N;Dk-%TPrX-f z`M*6nw7OKPZ0(yqX_dPEWe2~lzd88=|6c_erDWDvW>SD ekSzBO1Cr;wb%Ep`?{pxU;uFirv-yzECKdn%Az}#t delta 338 zcmeyei1EuJ#tAhdFTZ7r&#nn|=xX(m_y4R>`0DY7mW>l)*n~c^GBDUNurv5DFajY1 z!+X}r|JdZ}6@YAza5zwqiHU(h2q*>OM*#V5Kz<999|`1lBFRSq`A>lS1yK2DAYYFe zp+5%5ZvpaifNDVI#RB=eSRnHDKzB^Y3iz`1ZJ=?3`3o>%++x`2Q*xOw1Iys2z8=xUhiV$>I5lZ%ZBX&Spql z?o*h@*zVTmzWJ@derAd0`n$(LZd1E2E3}@e%X|IBwDPU96Yp<6B2sR~$T``@+X_gQ cdxrtZbKbf@@{e~qkWBH3W#rs^$Y&D^0IOJH$^ZZW diff --git a/STCompiler.Compiler/input.st b/STCompiler.Compiler/input.st index bd9a298..2445fb1 100644 --- a/STCompiler.Compiler/input.st +++ b/STCompiler.Compiler/input.st @@ -49,3 +49,14 @@ END_FOR; x := x + y / 2.0; END_PROGRAM + +//=== Variable summary === +//Index Type Value +//0 UINT 1 +//1 UINT 12 +//2 UINT 1 +//3 DINT 25 +//4 BOOL 1 +//5 REAL 16,25 +//6 LREAL 25 +//7 INT 3 \ No newline at end of file diff --git a/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfo.cs b/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfo.cs index 5def6d0..8318670 100644 --- a/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfo.cs +++ b/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("STCompiler.Compiler")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+74f256efb2d90ae0bc878111d497ee146327bb51")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5a002806a9ee3a7389c5a14069c534271a20a9ac")] [assembly: System.Reflection.AssemblyProductAttribute("STCompiler.Compiler")] [assembly: System.Reflection.AssemblyTitleAttribute("STCompiler.Compiler")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfoInputs.cache b/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfoInputs.cache index 2e8e2d1..edb476c 100644 --- a/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfoInputs.cache +++ b/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.AssemblyInfoInputs.cache @@ -1 +1 @@ -9e103a7c6db7d257367fcb8e4dc976fb31f0875136636fa357927991b9ce9ddc +d47a514fbef951d9157ec77bff6b43f7e588943a6cbc9cdecac26e64e892fcea diff --git a/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.csproj.AssemblyReference.cache b/STCompiler.Compiler/obj/Debug/net8.0/STCompiler.Compiler.csproj.AssemblyReference.cache index 2b24ac4eda17943d0f62a18e40cd2f7fbeb88326..72443ff685b82108084b866a536d4014087faefd 100644 GIT binary patch delta 16 XcmX@be2RHO8mpz!TerlG+3}13H9ZCa delta 16 XcmX@be2RHO8tY80HELE`#%c?~J?3Qwe zX}L?#beURPcqs`GOrSBD7!3Ge;)4=+G5DZ~0TUAweXtK|tPz2KcFs=@GdVNo|IR<> zpWU-FJ2J;c=GfSo@Na9r`?7p)5j$W0v`_0O19Ss!(*Tbmf?h>id z?Ptr`q&v!-coCER?Nw|NM4;D;OHWoxp{P5rvAyO(jjUa=Y=3R3+v&g0HDy)S=&9gHve@z&-EHsAfXxjqt%FHCHT1S7+V zmsrW0O2{l2@~$Q$*sWZ3Bel7iwfMIclFX%&UYQU+l+5eYZw;BfA@1LV&0oEo^-+v% z@a|;$L(c2F&H+@zGE-SRv>kh9AA!nY6M@E|pFrpE27$rhO#-{-(mNyu$-5-7SsfJHO`?z# zNmP;&iAFL+qWj|bU-=#)gOY|xWK#}`?Ilr2_K~P0`$;sC10*`hK@y`P4wgSeB%4Z5 z>@bN!a)d-BIZC3DI3zlk`Vssw5*mb~0?N4lm6G+x1XT!+3#byF5KtpLDWFbxN8(`bUVC+fN!)PPi z;ZZ~6MQDN_cytX$!_D~C^fOOEvHII^0=~!jF`9oi7KH?)2E-`$T(pi2cw?P^)#;PD zuiaGL3teabOZ@WppFex<;FZ{lRy&!rGRZbOTPURM_H-tjZ?#h`$u>NvTdek!Z6)oj zop-ksFI!iSt-TNIwH|yS!(MFDxUSPBzjUxMJk?-Zj;$7#w|2;FD=jsC?;Pxyy5ITA ztv^2d>E4cbhx=Y>u!-Y8Igb9^`O=1U4I7P_|6ks9v%voo{Fxp1acLndx(kM`dD@ZgWXmP#&!$!|8VC^tzxjh%mFXw9HD&_e9pb+>%HI|SR@0B zWb~%>PF($!99ctlCLgwV7DfRYfPL-({IMmAa^+V5vI%UVSuc|OdMnvT>h(dQ`HGX~ z0zfT0B(Oo2;ggm&Neec8g;%7(xp(*^_UNsloWa1n;a)1Zz0CiIs| zTM&SR%|C-(N+oY<54a)GaX$82=xz)8Gb?>()P-(2$Vy{6(rVEf&x`;#p_s~R`%keE z-N(U=u%Ckmp^1YRp_xMt!T}Dhg7l`D3IeZa)QytKAY?KKnG8ZEL$m+yaN!~9=8_39 z(Ng!EN%501EiOXLnT{RgcPUep7A|fshq!pSv~uy9qM48UFsB@T(h)8$>RJ{<5n?Dp z3`K~c2rW}ImKS33vKWdGLlI&qLJUQSp$ILv+0vX;c#J7>QXz&S#88A7iV#B)VxIJk z9p%qerfJb=8z(msZRg_Qa*T_Y%W*C_TspY8sCQWmMQEX@LJUcWp$IXQ4x?cE)@-e& z(fn^8gva*BunBr__QEl3FNNl&^x9JPjNK2sCXI}Pl-}P?8oijOtw#%BFE^nL=!zRSc#=v05z|P>qzzBp4 z42*1(|FOx{s{z>{;c%cJD-#2Q5Ks!lj{x#Lf&6wTKN86AN0N^M@?Qb@%b@bnK)yLM zLVpa9KLN-u0;&O-7YpQ{WP!-r1Nm`4J`il4%^t|e7`XW@$6+>w=f~N;Dk-%TPrX-f z`M*6nw7OKPZ0(yqX_dPEWe2~lzd88=|6c_erDWDvW>SD ekSzBO1Cr;wb%Ep`?{pxU;uFirv-yzECKdn%Az}#t delta 338 zcmeyei1EuJ#tAhdFTZ7r&#nn|=xX(m_y4R>`0DY7mW>l)*n~c^GBDUNurv5DFajY1 z!+X}r|JdZ}6@YAza5zwqiHU(h2q*>OM*#V5Kz<999|`1lBFRSq`A>lS1yK2DAYYFe zp+5%5ZvpaifNDVI#RB=eSRnHDKzB^Y3iz`1ZJ=?3`3o>%++x`2Q*xOw1Iys2z8=xUhiV$>I5lZ%ZBX&Spql z?o*h@*zVTmzWJ@derAd0`n$(LZd1E2E3}@e%X|IBwDPU96Yp<6B2sR~$T``@+X_gQ cdxrtZbKbf@@{e~qkWBH3W#rs^$Y&D^0IOJH$^ZZW diff --git a/STCompiler.Compiler/obj/Debug/net8.0/ref/STCompiler.Compiler.dll b/STCompiler.Compiler/obj/Debug/net8.0/ref/STCompiler.Compiler.dll index 384289e2ca9cc22f9b50d3ce600985e6378a6f0b..7eccce7633d8bf0c9dfc61a4ebe0799d5f332a33 100644 GIT binary patch delta 194 zcmZqhY4DlQ!SZ-YT*tj4 zF<1aeGa%2BAr%OXfh=<%X#wOXGk{bXGMIo>K={T$o)J)mAyCE$C=Sw>$dJ7Gw4x~s E0D;9a7XSbN delta 194 zcmZqhY4DlQ!Q$f^e_&%z3A2FAl&g^^H|+A>bMNWB%0-M5Hw&_SVBEwOBaA7NBiY5I zVQ!LUWNMb0mSmJ-X^@y|kd$m;ZeeI>m||jSo|!Hgjl$VvjTQy4563>XrDd;=gqnZbg=9Ec6UFa@aI639;lLPH?ijKLVF!yKqC N3227l=F^I%EC3o2Hq-zB diff --git a/STCompiler.Compiler/obj/Debug/net8.0/refint/STCompiler.Compiler.dll b/STCompiler.Compiler/obj/Debug/net8.0/refint/STCompiler.Compiler.dll index 384289e2ca9cc22f9b50d3ce600985e6378a6f0b..7eccce7633d8bf0c9dfc61a4ebe0799d5f332a33 100644 GIT binary patch delta 194 zcmZqhY4DlQ!SZ-YT*tj4 zF<1aeGa%2BAr%OXfh=<%X#wOXGk{bXGMIo>K={T$o)J)mAyCE$C=Sw>$dJ7Gw4x~s E0D;9a7XSbN delta 194 zcmZqhY4DlQ!Q$f^e_&%z3A2FAl&g^^H|+A>bMNWB%0-M5Hw&_SVBEwOBaA7NBiY5I zVQ!LUWNMb0mSmJ-X^@y|kd$m;ZeeI>m||jSo|!Hgjl$VvjTQy4563>XrDd;=gqnZbg=9Ec6UFa@aI639;lLPH?ijKLVF!yKqC N3227l=F^I%EC3o2Hq-zB diff --git a/STCompiler.Compiler/output.bin b/STCompiler.Compiler/output.bin index 63b95dbd080ca2f2cd38863d12ef1f990a8b29b3..40c34d8043742223bdbdde532a2d8f7ad9f7abd2 100644 GIT binary patch delta 126 zcmaFD^n_``T%oE34h)RU3@i)`%4afj01dPHRBLf2q3s^BLPze)5VKzt`kO5Q(BtfPy15KH%z^KDmIN6s` F8~}~j58D6$ diff --git a/STCompiler.Disassembler/Program.cs b/STCompiler.Disassembler/Program.cs index ccfab33..28d5230 100644 --- a/STCompiler.Disassembler/Program.cs +++ b/STCompiler.Disassembler/Program.cs @@ -98,6 +98,112 @@ class Program { if (ip < code.Length) ip++; break; } + // Signed integer arithmetic + case Bytecode.OpCodes.ADD_SINT: Console.WriteLine("ADD_SINT"); break; + case Bytecode.OpCodes.SUB_SINT: Console.WriteLine("SUB_SINT"); break; + case Bytecode.OpCodes.MUL_SINT: Console.WriteLine("MUL_SINT"); break; + case Bytecode.OpCodes.DIV_SINT: Console.WriteLine("DIV_SINT"); break; + case Bytecode.OpCodes.ADD_INT: Console.WriteLine("ADD_INT"); break; + case Bytecode.OpCodes.SUB_INT: Console.WriteLine("SUB_INT"); break; + case Bytecode.OpCodes.MUL_INT: Console.WriteLine("MUL_INT"); break; + case Bytecode.OpCodes.DIV_INT: Console.WriteLine("DIV_INT"); break; + case Bytecode.OpCodes.ADD_DINT: Console.WriteLine("ADD_DINT"); break; + case Bytecode.OpCodes.SUB_DINT: Console.WriteLine("SUB_DINT"); break; + case Bytecode.OpCodes.MUL_DINT: Console.WriteLine("MUL_DINT"); break; + case Bytecode.OpCodes.DIV_DINT: Console.WriteLine("DIV_DINT"); break; + case Bytecode.OpCodes.ADD_LINT: Console.WriteLine("ADD_LINT"); break; + case Bytecode.OpCodes.SUB_LINT: Console.WriteLine("SUB_LINT"); break; + case Bytecode.OpCodes.MUL_LINT: Console.WriteLine("MUL_LINT"); break; + case Bytecode.OpCodes.DIV_LINT: Console.WriteLine("DIV_LINT"); break; + // Unsigned integer arithmetic + case Bytecode.OpCodes.ADD_USINT: Console.WriteLine("ADD_USINT"); break; + case Bytecode.OpCodes.SUB_USINT: Console.WriteLine("SUB_USINT"); break; + case Bytecode.OpCodes.MUL_USINT: Console.WriteLine("MUL_USINT"); break; + case Bytecode.OpCodes.DIV_USINT: Console.WriteLine("DIV_USINT"); break; + case Bytecode.OpCodes.ADD_UINT: Console.WriteLine("ADD_UINT"); break; + case Bytecode.OpCodes.SUB_UINT: Console.WriteLine("SUB_UINT"); break; + case Bytecode.OpCodes.MUL_UINT: Console.WriteLine("MUL_UINT"); break; + case Bytecode.OpCodes.DIV_UINT: Console.WriteLine("DIV_UINT"); break; + case Bytecode.OpCodes.ADD_UDINT: Console.WriteLine("ADD_UDINT"); break; + case Bytecode.OpCodes.SUB_UDINT: Console.WriteLine("SUB_UDINT"); break; + case Bytecode.OpCodes.MUL_UDINT: Console.WriteLine("MUL_UDINT"); break; + case Bytecode.OpCodes.DIV_UDINT: Console.WriteLine("DIV_UDINT"); break; + case Bytecode.OpCodes.ADD_ULINT: Console.WriteLine("ADD_ULINT"); break; + case Bytecode.OpCodes.SUB_ULINT: Console.WriteLine("SUB_ULINT"); break; + case Bytecode.OpCodes.MUL_ULINT: Console.WriteLine("MUL_ULINT"); break; + case Bytecode.OpCodes.DIV_ULINT: Console.WriteLine("DIV_ULINT"); break; + // Floating point arithmetic + case Bytecode.OpCodes.ADD_REAL: Console.WriteLine("ADD_REAL"); break; + case Bytecode.OpCodes.SUB_REAL: Console.WriteLine("SUB_REAL"); break; + case Bytecode.OpCodes.MUL_REAL: Console.WriteLine("MUL_REAL"); break; + case Bytecode.OpCodes.DIV_REAL: Console.WriteLine("DIV_REAL"); break; + case Bytecode.OpCodes.ADD_LREAL: Console.WriteLine("ADD_LREAL"); break; + case Bytecode.OpCodes.SUB_LREAL: Console.WriteLine("SUB_LREAL"); break; + case Bytecode.OpCodes.MUL_LREAL: Console.WriteLine("MUL_LREAL"); break; + case Bytecode.OpCodes.DIV_LREAL: Console.WriteLine("DIV_LREAL"); break; + // Signed integer comparisons + case Bytecode.OpCodes.LT_SINT: Console.WriteLine("LT_SINT"); break; + case Bytecode.OpCodes.GT_SINT: Console.WriteLine("GT_SINT"); break; + case Bytecode.OpCodes.LE_SINT: Console.WriteLine("LE_SINT"); break; + case Bytecode.OpCodes.GE_SINT: Console.WriteLine("GE_SINT"); break; + case Bytecode.OpCodes.EQ_SINT: Console.WriteLine("EQ_SINT"); break; + case Bytecode.OpCodes.NEQ_SINT: Console.WriteLine("NEQ_SINT"); break; + case Bytecode.OpCodes.LT_INT: Console.WriteLine("LT_INT"); break; + case Bytecode.OpCodes.GT_INT: Console.WriteLine("GT_INT"); break; + case Bytecode.OpCodes.LE_INT: Console.WriteLine("LE_INT"); break; + case Bytecode.OpCodes.GE_INT: Console.WriteLine("GE_INT"); break; + case Bytecode.OpCodes.EQ_INT: Console.WriteLine("EQ_INT"); break; + case Bytecode.OpCodes.NEQ_INT: Console.WriteLine("NEQ_INT"); break; + case Bytecode.OpCodes.LT_DINT: Console.WriteLine("LT_DINT"); break; + case Bytecode.OpCodes.GT_DINT: Console.WriteLine("GT_DINT"); break; + case Bytecode.OpCodes.LE_DINT: Console.WriteLine("LE_DINT"); break; + case Bytecode.OpCodes.GE_DINT: Console.WriteLine("GE_DINT"); break; + case Bytecode.OpCodes.EQ_DINT: Console.WriteLine("EQ_DINT"); break; + case Bytecode.OpCodes.NEQ_DINT: Console.WriteLine("NEQ_DINT"); break; + case Bytecode.OpCodes.LT_LINT: Console.WriteLine("LT_LINT"); break; + case Bytecode.OpCodes.GT_LINT: Console.WriteLine("GT_LINT"); break; + case Bytecode.OpCodes.LE_LINT: Console.WriteLine("LE_LINT"); break; + case Bytecode.OpCodes.GE_LINT: Console.WriteLine("GE_LINT"); break; + case Bytecode.OpCodes.EQ_LINT: Console.WriteLine("EQ_LINT"); break; + case Bytecode.OpCodes.NEQ_LINT: Console.WriteLine("NEQ_LINT"); break; + // Unsigned integer comparisons + case Bytecode.OpCodes.LT_USINT: Console.WriteLine("LT_USINT"); break; + case Bytecode.OpCodes.GT_USINT: Console.WriteLine("GT_USINT"); break; + case Bytecode.OpCodes.LE_USINT: Console.WriteLine("LE_USINT"); break; + case Bytecode.OpCodes.GE_USINT: Console.WriteLine("GE_USINT"); break; + case Bytecode.OpCodes.EQ_USINT: Console.WriteLine("EQ_USINT"); break; + case Bytecode.OpCodes.NEQ_USINT: Console.WriteLine("NEQ_USINT"); break; + case Bytecode.OpCodes.LT_UINT: Console.WriteLine("LT_UINT"); break; + case Bytecode.OpCodes.GT_UINT: Console.WriteLine("GT_UINT"); break; + case Bytecode.OpCodes.LE_UINT: Console.WriteLine("LE_UINT"); break; + case Bytecode.OpCodes.GE_UINT: Console.WriteLine("GE_UINT"); break; + case Bytecode.OpCodes.EQ_UINT: Console.WriteLine("EQ_UINT"); break; + case Bytecode.OpCodes.NEQ_UINT: Console.WriteLine("NEQ_UINT"); break; + case Bytecode.OpCodes.LT_UDINT: Console.WriteLine("LT_UDINT"); break; + case Bytecode.OpCodes.GT_UDINT: Console.WriteLine("GT_UDINT"); break; + case Bytecode.OpCodes.LE_UDINT: Console.WriteLine("LE_UDINT"); break; + case Bytecode.OpCodes.GE_UDINT: Console.WriteLine("GE_UDINT"); break; + case Bytecode.OpCodes.EQ_UDINT: Console.WriteLine("EQ_UDINT"); break; + case Bytecode.OpCodes.NEQ_UDINT: Console.WriteLine("NEQ_UDINT"); break; + case Bytecode.OpCodes.LT_ULINT: Console.WriteLine("LT_ULINT"); break; + case Bytecode.OpCodes.GT_ULINT: Console.WriteLine("GT_ULINT"); break; + case Bytecode.OpCodes.LE_ULINT: Console.WriteLine("LE_ULINT"); break; + case Bytecode.OpCodes.GE_ULINT: Console.WriteLine("GE_ULINT"); break; + case Bytecode.OpCodes.EQ_ULINT: Console.WriteLine("EQ_ULINT"); break; + case Bytecode.OpCodes.NEQ_ULINT: Console.WriteLine("NEQ_ULINT"); break; + // Floating point comparisons + case Bytecode.OpCodes.LT_REAL: Console.WriteLine("LT_REAL"); break; + case Bytecode.OpCodes.GT_REAL: Console.WriteLine("GT_REAL"); break; + case Bytecode.OpCodes.LE_REAL: Console.WriteLine("LE_REAL"); break; + case Bytecode.OpCodes.GE_REAL: Console.WriteLine("GE_REAL"); break; + case Bytecode.OpCodes.EQ_REAL: Console.WriteLine("EQ_REAL"); break; + case Bytecode.OpCodes.NEQ_REAL: Console.WriteLine("NEQ_REAL"); break; + case Bytecode.OpCodes.LT_LREAL: Console.WriteLine("LT_LREAL"); break; + case Bytecode.OpCodes.GT_LREAL: Console.WriteLine("GT_LREAL"); break; + case Bytecode.OpCodes.LE_LREAL: Console.WriteLine("LE_LREAL"); break; + case Bytecode.OpCodes.GE_LREAL: Console.WriteLine("GE_LREAL"); break; + case Bytecode.OpCodes.EQ_LREAL: Console.WriteLine("EQ_LREAL"); break; + case Bytecode.OpCodes.NEQ_LREAL: Console.WriteLine("NEQ_LREAL"); break; default: Console.WriteLine($"{Bytecode.OpName(op)}"); break; } } diff --git a/STCompiler.Disassembler/bin/Debug/net8.0/STCompiler.Common.dll b/STCompiler.Disassembler/bin/Debug/net8.0/STCompiler.Common.dll index e0254d41d5d9fe63415897cdd51b20507b729d44..bd6c133e48cbc1564911f17c044f6cc20351ce15 100644 GIT binary patch delta 5203 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 D*0ny_ delta 149 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 diff --git a/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfo.cs b/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfo.cs index a3b4567..a1f7aa5 100644 --- a/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfo.cs +++ b/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("STCompiler.Disassembler")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+74f256efb2d90ae0bc878111d497ee146327bb51")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5a002806a9ee3a7389c5a14069c534271a20a9ac")] [assembly: System.Reflection.AssemblyProductAttribute("STCompiler.Disassembler")] [assembly: System.Reflection.AssemblyTitleAttribute("STCompiler.Disassembler")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfoInputs.cache b/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfoInputs.cache index 9464441..ca62e3d 100644 --- a/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfoInputs.cache +++ b/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.AssemblyInfoInputs.cache @@ -1 +1 @@ -3d4adf0bd5b0dc0665a784bf64e53bbaf5e4ba59d3c539d15229580b865800e1 +127117f0342214ac98d3bad7b812bb24f45bbb46074eff037772675e34d8b027 diff --git a/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.csproj.AssemblyReference.cache b/STCompiler.Disassembler/obj/Debug/net8.0/STCompiler.Disassembler.csproj.AssemblyReference.cache index 2b24ac4eda17943d0f62a18e40cd2f7fbeb88326..72443ff685b82108084b866a536d4014087faefd 100644 GIT binary patch delta 16 XcmX@be2RHO8mpz!TerlG+3}13H9ZCa delta 16 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 diff --git a/STCompiler.Disassembler/obj/Debug/net8.0/ref/STCompiler.Disassembler.dll b/STCompiler.Disassembler/obj/Debug/net8.0/ref/STCompiler.Disassembler.dll index 4346a2146b2d9987c089e17db8115883d8e2e38c..90f74f1c8f25a1e2861ca5a8161793abec3f7489 100644 GIT binary patch delta 194 zcmZoLXfT-2!4ki&W$DJA5@vyiKersU^mykpz4z$1JLNxCZx&>E&$#(N>qZs~smTYp zu4$Mi8WqmrluMvnj2eKCYvT2ni!Y?X=4*3bHhX z0HG0s1&}lY@+=urfzTMpG6#|tKz=d=WBlG=92o%T}<`dGKFwvmncR#?Aj(H?m+zO+LVN zO~c$I&B)X&H7&^~#nK=#)gUR^!ra2p&@jcs(mXZQ(8SEx$UG^@)Nu1Y?q{t2<_snb zX$(dTrVM5bsX$f|ke$L{$zZ^c2;>_8`N<3x4CX*=2!<&@^_D<>Di9h1*=7vJKpo~l PbxA-o3^#ukE&$#(N>qZs~smTYp zu4$Mi8WqmrluMvnj2eKCYvT2ni!Y?X=4*3bHhX z0HG0s1&}lY@+=urfzTMpG6#|tKz=d=WBlG=92o%T}<`dGKFwvmncR#?Aj(H?m+zO+LVN zO~c$I&B)X&H7&^~#nK=#)gUR^!ra2p&@jcs(mXZQ(8SEx$UG^@)Nu1Y?q{t2<_snb zX$(dTrVM5bsX$f|ke$L{$zZ^c2;>_8`N<3x4CX*=2!<&@^_D<>Di9h1*=7vJKpo~l PbxA-o3^#uk 0 && args[0] == "--verbose") { + verbose = true; + args = args[1..]; // Remove the --verbose argument from further processing + } else { + verbose = false; + } + if (args.Length < 1) { - Console.WriteLine("Usage: StSim "); + Console.WriteLine("Usage: StSim [--verbose|--quiet] "); return 1; } var path = args[0]; if (!File.Exists(path)) { Console.WriteLine("File not found: " + path); return 2; } var data = File.ReadAllBytes(path); - try { Simulate(data); } catch(Exception ex) { Console.WriteLine("Error: " + ex.Message); return 3; } + try { Simulate(data, verbose); } catch(Exception ex) { Console.WriteLine("Error: " + ex.Message); return 3; } return 0; } - static void Simulate(byte[] data) { + static void Simulate(byte[] data, bool verbose) { using var ms = new MemoryStream(data); using var r = new BinaryReader(ms); string magic = System.Text.Encoding.ASCII.GetString(r.ReadBytes(4)); if (magic != Bytecode.Magic) throw new Exception("Invalid magic"); ushort ver = r.ReadUInt16(); - Console.WriteLine($"Version: {ver}"); + if (verbose) Console.WriteLine($"Version: {ver}"); bool oldFormat = ver < Bytecode.Version; ushort cycletime = r.ReadUInt16(); - Console.WriteLine($"Cycle: {cycletime} ms"); + if (verbose) Console.WriteLine($"Cycle: {cycletime} ms"); ushort nConsts = r.ReadUInt16(); - Console.WriteLine($"Consts: {nConsts}"); + if (verbose) Console.WriteLine($"Consts: {nConsts}"); var consts = new List(); if (oldFormat) { // old format: constants stored as 4-byte ints - for (int i = 0; i < nConsts; i++) { int v = r.ReadInt32(); consts.Add(v); Console.WriteLine($" [{i}] = {v}"); } + for (int i = 0; i < nConsts; i++) { int v = r.ReadInt32(); consts.Add(v); if (verbose) Console.WriteLine($" [{i}] = {v}"); } } else { for (int i = 0; i < nConsts; i++) { byte t = r.ReadByte(); switch(t) { - case 1: { long v = r.ReadInt64(); consts.Add(v); Console.WriteLine($" [{i}] (long) = {v}"); break; } - case 2: { double v = r.ReadDouble(); consts.Add(v); Console.WriteLine($" [{i}] (double) = {v}"); break; } - case 3: { float v = r.ReadSingle(); consts.Add(v); Console.WriteLine($" [{i}] (float) = {v}"); break; } - case 4: { int v = r.ReadInt32(); consts.Add(v); Console.WriteLine($" [{i}] (int) = {v}"); break; } - default: { Console.WriteLine($" [{i}] Unknown const type {t}"); break; } + case 1: { long v = r.ReadInt64(); consts.Add(v); if (verbose) Console.WriteLine($" [{i}] (long) = {v}"); break; } + case 2: { double v = r.ReadDouble(); consts.Add(v); if (verbose) Console.WriteLine($" [{i}] (double) = {v}"); break; } + case 3: { float v = r.ReadSingle(); consts.Add(v); if (verbose) Console.WriteLine($" [{i}] (float) = {v}"); break; } + case 4: { int v = r.ReadInt32(); consts.Add(v); if (verbose) Console.WriteLine($" [{i}] (int) = {v}"); break; } + default: { if (verbose) Console.WriteLine($" [{i}] Unknown const type {t}"); break; } } } } ushort nVars = r.ReadUInt16(); - Console.WriteLine($"Vars: {nVars}"); + if (verbose) Console.WriteLine($"Vars: {nVars}"); var varTypes = new byte[nVars]; - for (int i = 0; i < nVars; i++) { varTypes[i] = r.ReadByte(); Console.WriteLine($" Var[{i}] type = {varTypes[i]}"); } + for (int i = 0; i < nVars; i++) { varTypes[i] = r.ReadByte(); if (verbose) Console.WriteLine($" Var[{i}] type = {varTypes[i]}"); } ushort codeLen = r.ReadUInt16(); - Console.WriteLine($"CodeLen: {codeLen} bytes"); + if (verbose) Console.WriteLine($"CodeLen: {codeLen} bytes"); var code = r.ReadBytes(codeLen); // Initialize arrays for element type tracking var arrayRanges = new Dictionary(); - Console.WriteLine("\nAnalyzing variable types:"); + if (verbose) Console.WriteLine("\nAnalyzing variable types:"); for (int i = 0; i < nVars; i++) { - Console.WriteLine($" [{i}] = {(VarType)varTypes[i]}"); + if (verbose) Console.WriteLine($" [{i}] = {(VarType)varTypes[i]}"); } - Console.WriteLine("\nDetecting arrays:"); + if (verbose) Console.WriteLine("\nDetecting arrays:"); for (int i = 0; i < nVars; i++) { if (varTypes[i] == (byte)VarType.ARRAY && i + 2 <= nVars) { // An array consists of: @@ -81,10 +90,12 @@ class Program { } arrayRanges[arrayStart] = (startOfElements, length, elementType); - Console.WriteLine($"Found array at index {arrayStart}:"); - Console.WriteLine($" - Element type: {elementType}"); - Console.WriteLine($" - Elements start at: {startOfElements}"); - Console.WriteLine($" - Length: {length}"); + if (verbose) { + Console.WriteLine($"Found array at index {arrayStart}:"); + Console.WriteLine($" - Element type: {elementType}"); + Console.WriteLine($" - Elements start at: {startOfElements}"); + Console.WriteLine($" - Length: {length}"); + } // Skip past the array definition (ARRAY marker + element type) i = startOfElements - 1; @@ -94,28 +105,36 @@ class Program { var stack = new Stack(); var vars = new object[nVars]; int ip = 0; - Console.WriteLine("\n--- Disassembly / Simulation ---"); + var opcodeExecutionTimes = new Dictionary(); + var opcodeCounts = new Dictionary(); + var stopwatch = new Stopwatch(); + + if (verbose) Console.WriteLine("\n--- Disassembly / Simulation ---"); while (ip < code.Length) { int addr = ip; byte op = code[ip++]; - Console.Write($"{addr:0000}: 0x{op:X2} "); + if (verbose) Console.Write($"{addr:0000}: 0x{op:X2} "); + + // Track opcode execution time + stopwatch.Restart(); + switch (op) { - case Bytecode.OpCodes.NOP: Console.WriteLine("NOP"); break; + case Bytecode.OpCodes.NOP: if (verbose) Console.WriteLine("NOP"); break; case Bytecode.OpCodes.PUSH_CONST: { ushort ci = (ushort)(code[ip++] | (code[ip++] << 8)); if (oldFormat) { byte typeMarker = code[ip++]; /* skip legacy type byte */ } - Console.WriteLine($"PUSH_CONST {ci} ({consts[ci]})"); + if (verbose) Console.WriteLine($"PUSH_CONST {ci} ({consts[ci]})"); stack.Push(consts[ci]); break; } case Bytecode.OpCodes.PUSH_REAL_CONST: { ushort ci = (ushort)(code[ip++] | (code[ip++] << 8)); if (oldFormat) { byte typeMarker = code[ip++]; /* skip legacy type byte */ } - Console.WriteLine($"PUSH_REAL_CONST {ci} ({consts[ci]})"); + if (verbose) Console.WriteLine($"PUSH_REAL_CONST {ci} ({consts[ci]})"); stack.Push(consts[ci]); break; } case Bytecode.OpCodes.LOAD_VAR: { ushort vi = (ushort)(code[ip++] | (code[ip++] << 8)); - Console.WriteLine($"LOAD_VAR {vi}"); + if (verbose) Console.WriteLine($"LOAD_VAR {vi}"); // Check if the variable index is within bounds if (vi >= vars.Length) { @@ -134,7 +153,7 @@ class Program { } case Bytecode.OpCodes.STORE_VAR: { ushort vi = (ushort)(code[ip++] | (code[ip++] << 8)); - Console.WriteLine($"STORE_VAR {vi}"); + if (verbose) Console.WriteLine($"STORE_VAR {vi}"); // Check if the variable index is within bounds if (vi >= vars.Length) { @@ -147,7 +166,7 @@ class Program { if (value is object[] arr) { Array.Copy(arr, 0, vars, start, Math.Min(arr.Length, arrayLength)); } else { - Console.WriteLine($"Warning: Attempting to store non-array value in array variable at index {vi}"); + if (verbose) Console.WriteLine($"Warning: Attempting to store non-array value in array variable at index {vi}"); vars[vi] = value; } } else { @@ -155,15 +174,15 @@ class Program { } break; } - case Bytecode.OpCodes.JZ: { ushort target = (ushort)(code[ip++] | (code[ip++] << 8)); Console.WriteLine($"JZ addr={target:0000}"); var cond = stack.Pop(); bool isFalse = cond is int ci ? ci == 0 : cond is long cl ? cl == 0L : cond is double cd ? cd == 0.0 : cond == null; if (isFalse) ip = target; break; } + case Bytecode.OpCodes.JZ: { ushort target = (ushort)(code[ip++] | (code[ip++] << 8)); if (verbose) Console.WriteLine($"JZ addr={target:0000}"); var cond = stack.Pop(); bool isFalse = cond is int ci ? ci == 0 : cond is long cl ? cl == 0L : cond is double cd ? cd == 0.0 : cond == null; if (isFalse) ip = target; break; } case Bytecode.OpCodes.JMP: { ushort target = (ushort)(code[ip++] | (code[ip++] << 8)); - Console.WriteLine($"JMP addr={target:0000}"); + if (verbose) Console.WriteLine($"JMP addr={target:0000}"); ip = target; break; } case Bytecode.OpCodes.HALT: - Console.WriteLine("HALT"); + if (verbose) Console.WriteLine("HALT"); ip = code.Length; break; case Bytecode.OpCodes.ARRAY_BOUNDS_CHECK: @@ -176,11 +195,11 @@ class Program { // Check if this variable is actually an array if (!arrayRanges.ContainsKey(arrayIndex)) { - Console.WriteLine($"Warning: ARRAY_BOUNDS_CHECK instruction for non-array variable {arrayIndex}"); + if (verbose) Console.WriteLine($"Warning: ARRAY_BOUNDS_CHECK instruction for non-array variable {arrayIndex}"); continue; // Skip this instruction } - Console.WriteLine($"ARRAY_BOUNDS_CHECK for array at index {arrayIndex}"); + if (verbose) Console.WriteLine($"ARRAY_BOUNDS_CHECK for array at index {arrayIndex}"); if (stack.Count < 1) { throw new Exception("Stack underflow during array bounds check"); @@ -206,73 +225,453 @@ class Program { // Calculate the actual element address stack.Push(elementsStart + adjustedIndex); - Console.WriteLine($"Accessing element {index} of array, mapped to variable index {elementsStart + adjustedIndex}"); + if (verbose) Console.WriteLine($"Accessing element {index} of array, mapped to variable index {elementsStart + adjustedIndex}"); break; default: -; // fallback handlers if (Bytecode.OpName(op).StartsWith("ADD_") || Bytecode.OpName(op).StartsWith("SUB_") || Bytecode.OpName(op).StartsWith("MUL_") || Bytecode.OpName(op).StartsWith("DIV_")) { - dynamic b = stack.Pop(); dynamic a = stack.Pop(); if (Bytecode.OpName(op).StartsWith("ADD_")) stack.Push(a + b); else if (Bytecode.OpName(op).StartsWith("SUB_")) stack.Push(a - b); else if (Bytecode.OpName(op).StartsWith("MUL_")) stack.Push(a * b); else stack.Push(a / b); + dynamic b = stack.Pop(); dynamic a = stack.Pop(); + if (Bytecode.OpName(op).StartsWith("ADD_")) stack.Push(a + b); + else if (Bytecode.OpName(op).StartsWith("SUB_")) stack.Push(a - b); + else if (Bytecode.OpName(op).StartsWith("MUL_")) stack.Push(a * b); + else stack.Push(a / b); break; } if (Bytecode.OpName(op).StartsWith("LT_") || Bytecode.OpName(op).StartsWith("GT_") || Bytecode.OpName(op).StartsWith("LE_") || Bytecode.OpName(op).StartsWith("GE_") || Bytecode.OpName(op).StartsWith("EQ_") || Bytecode.OpName(op).StartsWith("NEQ_")) { dynamic rVal = stack.Pop(); dynamic lVal = stack.Pop(); - bool res = Bytecode.OpName(op).StartsWith("LT_") ? (lVal < rVal) : - Bytecode.OpName(op).StartsWith("GT_") ? (lVal > rVal) : - Bytecode.OpName(op).StartsWith("LE_") ? (lVal <= rVal) : - Bytecode.OpName(op).StartsWith("GE_") ? (lVal >= rVal) : - Bytecode.OpName(op).StartsWith("EQ_") ? (lVal == rVal) : - (lVal != rVal); - stack.Push(res ? 1 : 0); - break; - } - // Array operations - if (op == Bytecode.OpCodes.ARRAY_BOUNDS_CHECK) { - // Extract the array index from the instruction - byte arrayIndexInner = 0; - if (ip < code.Length) { - arrayIndexInner = code[ip]; - ip++; - } - - // Check if this variable is actually an array - if (!arrayRanges.ContainsKey(arrayIndexInner)) { - Console.WriteLine($"Warning: ARRAY_BOUNDS_CHECK instruction for non-array variable {arrayIndexInner}"); - continue; // Skip this instruction - } - - Console.WriteLine($"ARRAY_BOUNDS_CHECK for array at index {arrayIndexInner}"); - - if (stack.Count < 1) { - throw new Exception("Stack underflow during array bounds check"); - } - - // Convert index value safely - var indexObjInner = stack.Pop(); - int indexInner = Convert.ToInt32(indexObjInner); - - // The arrayStart from the instruction should be the array marker directly - if (!arrayRanges.TryGetValue(arrayIndexInner, out var arrayInfoInner)) { - // This should not happen since we checked above - throw new Exception($"Array metadata missing for index {arrayIndexInner}"); - } - - var (elementsStartInner, lengthInner, elementTypeInner) = arrayInfoInner; - if (indexInner < 0 || indexInner >= lengthInner) { - throw new Exception($"Array index {indexInner} out of bounds [0..{lengthInner-1}]"); - } - - // Calculate the actual element address - stack.Push(elementsStartInner + indexInner); - Console.WriteLine($"Accessing element {indexInner} of array, mapped to variable index {elementsStartInner + indexInner}"); + // Optimized comparison handler with type-specific operations + switch (op) { + // Signed comparisons + case Bytecode.OpCodes.LT_SINT: + if (lVal is byte lb_s && rVal is byte rb_s) stack.Push(lb_s < rb_s ? 1 : 0); + else if (lVal is short ls_s && rVal is short rs_s) stack.Push(ls_s < rs_s ? 1 : 0); + else if (lVal is int li1_s && rVal is int ri1_s) stack.Push(li1_s < ri1_s ? 1 : 0); + else if (lVal is long ll_s && rVal is long rl_s) stack.Push(ll_s < rl_s ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) < Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_SINT: + if (lVal is byte lb_gt && rVal is byte rb_gt) stack.Push(lb_gt > rb_gt ? 1 : 0); + else if (lVal is short ls_gt && rVal is short rs_gt) stack.Push(ls_gt > rs_gt ? 1 : 0); + else if (lVal is int li2_gt && rVal is int ri2_gt) stack.Push(li2_gt > ri2_gt ? 1 : 0); + else if (lVal is long ll_gt && rVal is long rl_gt) stack.Push(ll_gt > rl_gt ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) > Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_SINT: + if (lVal is byte lb_le && rVal is byte rb_le) stack.Push(lb_le <= rb_le ? 1 : 0); + else if (lVal is short ls_le && rVal is short rs_le) stack.Push(ls_le <= rs_le ? 1 : 0); + else if (lVal is int li3_le && rVal is int ri3_le) stack.Push(li3_le <= ri3_le ? 1 : 0); + else if (lVal is long ll_le && rVal is long rl_le) stack.Push(ll_le <= rl_le ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) <= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_SINT: + if (lVal is byte lb_ge && rVal is byte rb_ge) stack.Push(lb_ge >= rb_ge ? 1 : 0); + else if (lVal is short ls_ge && rVal is short rs_ge) stack.Push(ls_ge >= rs_ge ? 1 : 0); + else if (lVal is int li4_ge && rVal is int ri4_ge) stack.Push(li4_ge >= ri4_ge ? 1 : 0); + else if (lVal is long ll_ge && rVal is long rl_ge) stack.Push(ll_ge >= rl_ge ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) >= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_SINT: + if (lVal is byte lb_eq && rVal is byte rb_eq) stack.Push(lb_eq == rb_eq ? 1 : 0); + else if (lVal is short ls_eq && rVal is short rs_eq) stack.Push(ls_eq == rs_eq ? 1 : 0); + else if (lVal is int li5_eq && rVal is int ri5_eq) stack.Push(li5_eq == ri5_eq ? 1 : 0); + else if (lVal is long ll_eq && rVal is long rl_eq) stack.Push(ll_eq == rl_eq ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_SINT: + if (lVal is byte lb_ne && rVal is byte rb_ne) stack.Push(lb_ne != rb_ne ? 1 : 0); + else if (lVal is short ls_ne && rVal is short rs_ne) stack.Push(ls_ne != rs_ne ? 1 : 0); + else if (lVal is int li6_ne && rVal is int ri6_ne) stack.Push(li6_ne != ri6_ne ? 1 : 0); + else if (lVal is long ll_ne && rVal is long rl_ne) stack.Push(ll_ne != rl_ne ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LT_INT: + if (lVal is byte lb_lt && rVal is byte rb_lt) stack.Push(lb_lt < rb_lt ? 1 : 0); + else if (lVal is short ls_lt && rVal is short rs_lt) stack.Push(ls_lt < rs_lt ? 1 : 0); + else if (lVal is int li1_lt && rVal is int ri1_lt) stack.Push(li1_lt < ri1_lt ? 1 : 0); + else if (lVal is long ll_lt && rVal is long rl_lt) stack.Push(ll_lt < rl_lt ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) < Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_INT: + if (lVal is byte lb_gt2 && rVal is byte rb_gt2) stack.Push(lb_gt2 > rb_gt2 ? 1 : 0); + else if (lVal is short ls_gt2 && rVal is short rs_gt2) stack.Push(ls_gt2 > rs_gt2 ? 1 : 0); + else if (lVal is int li2_gt2 && rVal is int ri2_gt2) stack.Push(li2_gt2 > ri2_gt2 ? 1 : 0); + else if (lVal is long ll_gt2 && rVal is long rl_gt2) stack.Push(ll_gt2 > rl_gt2 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) > Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_INT: + if (lVal is byte lb_le2 && rVal is byte rb_le2) stack.Push(lb_le2 <= rb_le2 ? 1 : 0); + else if (lVal is short ls_le2 && rVal is short rs_le2) stack.Push(ls_le2 <= rs_le2 ? 1 : 0); + else if (lVal is int li3_le2 && rVal is int ri3_le2) stack.Push(li3_le2 <= ri3_le2 ? 1 : 0); + else if (lVal is long ll_le2 && rVal is long rl_le2) stack.Push(ll_le2 <= rl_le2 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) <= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_INT: + if (lVal is byte lb_ge2 && rVal is byte rb_ge2) stack.Push(lb_ge2 >= rb_ge2 ? 1 : 0); + else if (lVal is short ls_ge2 && rVal is short rs_ge2) stack.Push(ls_ge2 >= rs_ge2 ? 1 : 0); + else if (lVal is int li4_ge2 && rVal is int ri4_ge2) stack.Push(li4_ge2 >= ri4_ge2 ? 1 : 0); + else if (lVal is long ll_ge2 && rVal is long rl_ge2) stack.Push(ll_ge2 >= rl_ge2 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) >= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_INT: + if (lVal is byte lb_eq2 && rVal is byte rb_eq2) stack.Push(lb_eq2 == rb_eq2 ? 1 : 0); + else if (lVal is short ls_eq2 && rVal is short rs_eq2) stack.Push(ls_eq2 == rs_eq2 ? 1 : 0); + else if (lVal is int li5_eq2 && rVal is int ri5_eq2) stack.Push(li5_eq2 == ri5_eq2 ? 1 : 0); + else if (lVal is long ll_eq2 && rVal is long rl_eq2) stack.Push(ll_eq2 == rl_eq2 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_INT: + if (lVal is byte lb_ne2 && rVal is byte rb_ne2) stack.Push(lb_ne2 != rb_ne2 ? 1 : 0); + else if (lVal is short ls_ne2 && rVal is short rs_ne2) stack.Push(ls_ne2 != rs_ne2 ? 1 : 0); + else if (lVal is int li6_ne2 && rVal is int ri6_ne2) stack.Push(li6_ne2 != ri6_ne2 ? 1 : 0); + else if (lVal is long ll_ne2 && rVal is long rl_ne2) stack.Push(ll_ne2 != rl_ne2 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LT_DINT: + if (lVal is byte lb_dint && rVal is byte rb_dint) stack.Push(lb_dint < rb_dint ? 1 : 0); + else if (lVal is short ls_dint && rVal is short rs_dint) stack.Push(ls_dint < rs_dint ? 1 : 0); + else if (lVal is int li1_dint && rVal is int ri1_dint) stack.Push(li1_dint < ri1_dint ? 1 : 0); + else if (lVal is long ll_dint && rVal is long rl_dint) stack.Push(ll_dint < rl_dint ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) < Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_DINT: + if (lVal is byte lb_dint2 && rVal is byte rb_dint2) stack.Push(lb_dint2 > rb_dint2 ? 1 : 0); + else if (lVal is short ls_dint2 && rVal is short rs_dint2) stack.Push(ls_dint2 > rs_dint2 ? 1 : 0); + else if (lVal is int li2_dint && rVal is int ri2_dint) stack.Push(li2_dint > ri2_dint ? 1 : 0); + else if (lVal is long ll_dint2 && rVal is long rl_dint2) stack.Push(ll_dint2 > rl_dint2 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) > Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_DINT: + if (lVal is byte lb_dint3 && rVal is byte rb_dint3) stack.Push(lb_dint3 <= rb_dint3 ? 1 : 0); + else if (lVal is short ls_dint3 && rVal is short rs_dint3) stack.Push(ls_dint3 <= rs_dint3 ? 1 : 0); + else if (lVal is int li3_dint && rVal is int ri3_dint) stack.Push(li3_dint <= ri3_dint ? 1 : 0); + else if (lVal is long ll_dint3 && rVal is long rl_dint3) stack.Push(ll_dint3 <= rl_dint3 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) <= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_DINT: + if (lVal is byte lb_dint4 && rVal is byte rb_dint4) stack.Push(lb_dint4 >= rb_dint4 ? 1 : 0); + else if (lVal is short ls_dint4 && rVal is short rs_dint4) stack.Push(ls_dint4 >= rs_dint4 ? 1 : 0); + else if (lVal is int li4_dint && rVal is int ri4_dint) stack.Push(li4_dint >= ri4_dint ? 1 : 0); + else if (lVal is long ll_dint4 && rVal is long rl_dint4) stack.Push(ll_dint4 >= rl_dint4 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) >= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_DINT: + if (lVal is byte lb_dint5 && rVal is byte rb_dint5) stack.Push(lb_dint5 == rb_dint5 ? 1 : 0); + else if (lVal is short ls_dint5 && rVal is short rs_dint5) stack.Push(ls_dint5 == rs_dint5 ? 1 : 0); + else if (lVal is int li5_dint && rVal is int ri5_dint) stack.Push(li5_dint == ri5_dint ? 1 : 0); + else if (lVal is long ll_dint5 && rVal is long rl_dint5) stack.Push(ll_dint5 == rl_dint5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_DINT: + if (lVal is byte lb_dint6 && rVal is byte rb_dint6) stack.Push(lb_dint6 != rb_dint6 ? 1 : 0); + else if (lVal is short ls_dint6 && rVal is short rs_dint6) stack.Push(ls_dint6 != rs_dint6 ? 1 : 0); + else if (lVal is int li6_dint && rVal is int ri6_dint) stack.Push(li6_dint != ri6_dint ? 1 : 0); + else if (lVal is long ll_dint6 && rVal is long rl_dint6) stack.Push(ll_dint6 != rl_dint6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LT_LINT: + if (lVal is byte lb_lint && rVal is byte rb_lint) stack.Push(lb_lint < rb_lint ? 1 : 0); + else if (lVal is short ls_lint && rVal is short rs_lint) stack.Push(ls_lint < rs_lint ? 1 : 0); + else if (lVal is int li1_lint && rVal is int ri1_lint) stack.Push(li1_lint < ri1_lint ? 1 : 0); + else if (lVal is long ll_lint && rVal is long rl_lint) stack.Push(ll_lint < rl_lint ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) < Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_LINT: + if (lVal is byte lb_lint2 && rVal is byte rb_lint2) stack.Push(lb_lint2 > rb_lint2 ? 1 : 0); + else if (lVal is short ls_lint2 && rVal is short rs_lint2) stack.Push(ls_lint2 > rs_lint2 ? 1 : 0); + else if (lVal is int li2_lint && rVal is int ri2_lint) stack.Push(li2_lint > ri2_lint ? 1 : 0); + else if (lVal is long ll_lint2 && rVal is long rl_lint2) stack.Push(ll_lint2 > rl_lint2 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) > Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_LINT: + if (lVal is byte lb_lint3 && rVal is byte rb_lint3) stack.Push(lb_lint3 <= rb_lint3 ? 1 : 0); + else if (lVal is short ls_lint3 && rVal is short rs_lint3) stack.Push(ls_lint3 <= rs_lint3 ? 1 : 0); + else if (lVal is int li3_lint && rVal is int ri3_lint) stack.Push(li3_lint <= ri3_lint ? 1 : 0); + else if (lVal is long ll_lint3 && rVal is long rl_lint3) stack.Push(ll_lint3 <= rl_lint3 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) <= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_LINT: + if (lVal is byte lb_lint4 && rVal is byte rb_lint4) stack.Push(lb_lint4 >= rb_lint4 ? 1 : 0); + else if (lVal is short ls_lint4 && rVal is short rs_lint4) stack.Push(ls_lint4 >= rs_lint4 ? 1 : 0); + else if (lVal is int li4_lint && rVal is int ri4_lint) stack.Push(li4_lint >= ri4_lint ? 1 : 0); + else if (lVal is long ll_lint4 && rVal is long rl_lint4) stack.Push(ll_lint4 >= rl_lint4 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) >= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_LINT: + if (lVal is byte lb_lint5 && rVal is byte rb_lint5) stack.Push(lb_lint5 == rb_lint5 ? 1 : 0); + else if (lVal is short ls_lint5 && rVal is short rs_lint5) stack.Push(ls_lint5 == rs_lint5 ? 1 : 0); + else if (lVal is int li5_lint && rVal is int ri5_lint) stack.Push(li5_lint == ri5_lint ? 1 : 0); + else if (lVal is long ll_lint5 && rVal is long rl_lint5) stack.Push(ll_lint5 == rl_lint5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_LINT: + if (lVal is byte lb_lint6 && rVal is byte rb_lint6) stack.Push(lb_lint6 != rb_lint6 ? 1 : 0); + else if (lVal is short ls_lint6 && rVal is short rs_lint6) stack.Push(ls_lint6 != rs_lint6 ? 1 : 0); + else if (lVal is int li6_lint && rVal is int ri6_lint) stack.Push(li6_lint != ri6_lint ? 1 : 0); + else if (lVal is long ll_lint6 && rVal is long rl_lint6) stack.Push(ll_lint6 != rl_lint6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + + // Unsigned comparisons + case Bytecode.OpCodes.LT_USINT: + if (lVal is byte lb_us && rVal is byte rb_us) stack.Push(lb_us < rb_us ? 1 : 0); + else if (lVal is ushort lus_us && rVal is ushort rus_us) stack.Push(lus_us < rus_us ? 1 : 0); + else if (lVal is uint lu1_us && rVal is uint ru1_us) stack.Push(lu1_us < ru1_us ? 1 : 0); + else if (lVal is ulong llu_us && rVal is ulong rlu_us) stack.Push(llu_us < rlu_us ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) < Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_USINT: + if (lVal is byte lb_us2 && rVal is byte rb_us2) stack.Push(lb_us2 > rb_us2 ? 1 : 0); + else if (lVal is ushort lus_us2 && rVal is ushort rus_us2) stack.Push(lus_us2 > rus_us2 ? 1 : 0); + else if (lVal is uint lu2_us && rVal is uint ru2_us) stack.Push(lu2_us > ru2_us ? 1 : 0); + else if (lVal is ulong llu_us2 && rVal is ulong rlu_us2) stack.Push(llu_us2 > rlu_us2 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) > Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_USINT: + if (lVal is byte lb_us3 && rVal is byte rb_us3) stack.Push(lb_us3 <= rb_us3 ? 1 : 0); + else if (lVal is ushort lus_us3 && rVal is ushort rus_us3) stack.Push(lus_us3 <= rus_us3 ? 1 : 0); + else if (lVal is uint lu3_us && rVal is uint ru3_us) stack.Push(lu3_us <= ru3_us ? 1 : 0); + else if (lVal is ulong llu_us3 && rVal is ulong rlu_us3) stack.Push(llu_us3 <= rlu_us3 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) <= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_USINT: + if (lVal is byte lb_us4 && rVal is byte rb_us4) stack.Push(lb_us4 >= rb_us4 ? 1 : 0); + else if (lVal is ushort lus_us4 && rVal is ushort rus_us4) stack.Push(lus_us4 >= rus_us4 ? 1 : 0); + else if (lVal is uint lu4_us && rVal is uint ru4_us) stack.Push(lu4_us >= ru4_us ? 1 : 0); + else if (lVal is ulong llu_us4 && rVal is ulong rlu_us4) stack.Push(llu_us4 >= rlu_us4 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) >= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_USINT: + if (lVal is byte lb_us5 && rVal is byte rb_us5) stack.Push(lb_us5 == rb_us5 ? 1 : 0); + else if (lVal is ushort lus_us5 && rVal is ushort rus_us5) stack.Push(lus_us5 == rus_us5 ? 1 : 0); + else if (lVal is uint lu5_us && rVal is uint ru5_us) stack.Push(lu5_us == ru5_us ? 1 : 0); + else if (lVal is ulong llu_us5 && rVal is ulong rlu_us5) stack.Push(llu_us5 == rlu_us5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_USINT: + if (lVal is byte lb_us6 && rVal is byte rb_us6) stack.Push(lb_us6 != rb_us6 ? 1 : 0); + else if (lVal is ushort lus_us6 && rVal is ushort rus_us6) stack.Push(lus_us6 != rus_us6 ? 1 : 0); + else if (lVal is uint lu6_us && rVal is uint ru6_us) stack.Push(lu6_us != ru6_us ? 1 : 0); + else if (lVal is ulong llu_us6 && rVal is ulong rlu_us6) stack.Push(llu_us6 != rlu_us6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LT_UINT: + if (lVal is byte lb_uint && rVal is byte rb_uint) stack.Push(lb_uint < rb_uint ? 1 : 0); + else if (lVal is ushort lus_uint && rVal is ushort rus_uint) stack.Push(lus_uint < rus_uint ? 1 : 0); + else if (lVal is uint lu1_uint && rVal is uint ru1_uint) stack.Push(lu1_uint < ru1_uint ? 1 : 0); + else if (lVal is ulong llu_uint && rVal is ulong rlu_uint) stack.Push(llu_uint < rlu_uint ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) < Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_UINT: + if (lVal is byte lb_uint2 && rVal is byte rb_uint2) stack.Push(lb_uint2 > rb_uint2 ? 1 : 0); + else if (lVal is ushort lus_uint2 && rVal is ushort rus_uint2) stack.Push(lus_uint2 > rus_uint2 ? 1 : 0); + else if (lVal is uint lu2_uint && rVal is uint ru2_uint) stack.Push(lu2_uint > ru2_uint ? 1 : 0); + else if (lVal is ulong llu_uint2 && rVal is ulong rlu_uint2) stack.Push(llu_uint2 > rlu_uint2 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) > Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_UINT: + if (lVal is byte lb_uint3 && rVal is byte rb_uint3) stack.Push(lb_uint3 <= rb_uint3 ? 1 : 0); + else if (lVal is ushort lus_uint3 && rVal is ushort rus_uint3) stack.Push(lus_uint3 <= rus_uint3 ? 1 : 0); + else if (lVal is uint lu3_uint && rVal is uint ru3_uint) stack.Push(lu3_uint <= ru3_uint ? 1 : 0); + else if (lVal is ulong llu_uint3 && rVal is ulong rlu_uint3) stack.Push(llu_uint3 <= rlu_uint3 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) <= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_UINT: + if (lVal is byte lb_uint4 && rVal is byte rb_uint4) stack.Push(lb_uint4 >= rb_uint4 ? 1 : 0); + else if (lVal is ushort lus_uint4 && rVal is ushort rus_uint4) stack.Push(lus_uint4 >= rus_uint4 ? 1 : 0); + else if (lVal is uint lu4_uint && rVal is uint ru4_uint) stack.Push(lu4_uint >= ru4_uint ? 1 : 0); + else if (lVal is ulong llu_uint4 && rVal is ulong rlu_uint4) stack.Push(llu_uint4 >= rlu_uint4 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) >= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_UINT: + if (lVal is byte lb_uint5 && rVal is byte rb_uint5) stack.Push(lb_uint5 == rb_uint5 ? 1 : 0); + else if (lVal is ushort lus_uint5 && rVal is ushort rus_uint5) stack.Push(lus_uint5 == rus_uint5 ? 1 : 0); + else if (lVal is uint lu5_uint && rVal is uint ru5_uint) stack.Push(lu5_uint == ru5_uint ? 1 : 0); + else if (lVal is ulong llu_uint5 && rVal is ulong rlu_uint5) stack.Push(llu_uint5 == rlu_uint5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_UINT: + if (lVal is byte lb_uint6 && rVal is byte rb_uint6) stack.Push(lb_uint6 != rb_uint6 ? 1 : 0); + else if (lVal is ushort lus_uint6 && rVal is ushort rus_uint6) stack.Push(lus_uint6 != rus_uint6 ? 1 : 0); + else if (lVal is uint lu6_uint && rVal is uint ru6_uint) stack.Push(lu6_uint != ru6_uint ? 1 : 0); + else if (lVal is ulong llu_uint6 && rVal is ulong rlu_uint6) stack.Push(llu_uint6 != rlu_uint6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LT_UDINT: + if (lVal is byte lb_udint && rVal is byte rb_udint) stack.Push(lb_udint < rb_udint ? 1 : 0); + else if (lVal is ushort lus_udint && rVal is ushort rus_udint) stack.Push(lus_udint < rus_udint ? 1 : 0); + else if (lVal is uint lu1_udint && rVal is uint ru1_udint) stack.Push(lu1_udint < ru1_udint ? 1 : 0); + else if (lVal is ulong llu_udint && rVal is ulong rlu_udint) stack.Push(llu_udint < rlu_udint ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) < Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_UDINT: + if (lVal is byte lb_udint2 && rVal is byte rb_udint2) stack.Push(lb_udint2 > rb_udint2 ? 1 : 0); + else if (lVal is ushort lus_udint2 && rVal is ushort rus_udint2) stack.Push(lus_udint2 > rus_udint2 ? 1 : 0); + else if (lVal is uint lu2_udint && rVal is uint ru2_udint) stack.Push(lu2_udint > ru2_udint ? 1 : 0); + else if (lVal is ulong llu_udint2 && rVal is ulong rlu_udint2) stack.Push(llu_udint2 > rlu_udint2 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) > Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_UDINT: + if (lVal is byte lb_udint3 && rVal is byte rb_udint3) stack.Push(lb_udint3 <= rb_udint3 ? 1 : 0); + else if (lVal is ushort lus_udint3 && rVal is ushort rus_udint3) stack.Push(lus_udint3 <= rus_udint3 ? 1 : 0); + else if (lVal is uint lu3_udint && rVal is uint ru3_udint) stack.Push(lu3_udint <= ru3_udint ? 1 : 0); + else if (lVal is ulong llu_udint3 && rVal is ulong rlu_udint3) stack.Push(llu_udint3 <= rlu_udint3 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) <= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_UDINT: + if (lVal is byte lb_udint4 && rVal is byte rb_udint4) stack.Push(lb_udint4 >= rb_udint4 ? 1 : 0); + else if (lVal is ushort lus_udint4 && rVal is ushort rus_udint4) stack.Push(lus_udint4 >= rus_udint4 ? 1 : 0); + else if (lVal is uint lu4_udint && rVal is uint ru4_udint) stack.Push(lu4_udint >= ru4_udint ? 1 : 0); + else if (lVal is ulong llu_udint4 && rVal is ulong rlu_udint4) stack.Push(llu_udint4 >= rlu_udint4 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) >= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_UDINT: + if (lVal is byte lb_udint5 && rVal is byte rb_udint5) stack.Push(lb_udint5 == rb_udint5 ? 1 : 0); + else if (lVal is ushort lus_udint5 && rVal is ushort rus_udint5) stack.Push(lus_udint5 == rus_udint5 ? 1 : 0); + else if (lVal is uint lu5_udint && rVal is uint ru5_udint) stack.Push(lu5_udint == ru5_udint ? 1 : 0); + else if (lVal is ulong llu_udint5 && rVal is ulong rlu_udint5) stack.Push(llu_udint5 == rlu_udint5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_UDINT: + if (lVal is byte lb_udint6 && rVal is byte rb_udint6) stack.Push(lb_udint6 != rb_udint6 ? 1 : 0); + else if (lVal is ushort lus_udint6 && rVal is ushort rus_udint6) stack.Push(lus_udint6 != rus_udint6 ? 1 : 0); + else if (lVal is uint lu6_udint && rVal is uint ru6_udint) stack.Push(lu6_udint != ru6_udint ? 1 : 0); + else if (lVal is ulong llu_udint6 && rVal is ulong rlu_udint6) stack.Push(llu_udint6 != rlu_udint6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LT_ULINT: + if (lVal is byte lb_ulint && rVal is byte rb_ulint) stack.Push(lb_ulint < rb_ulint ? 1 : 0); + else if (lVal is ushort lus_ulint && rVal is ushort rus_ulint) stack.Push(lus_ulint < rus_ulint ? 1 : 0); + else if (lVal is uint lu1_ulint && rVal is uint ru1_ulint) stack.Push(lu1_ulint < ru1_ulint ? 1 : 0); + else if (lVal is ulong llu_ulint && rVal is ulong rlu_ulint) stack.Push(llu_ulint < rlu_ulint ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) < Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_ULINT: + if (lVal is byte lb_ulint2 && rVal is byte rb_ulint2) stack.Push(lb_ulint2 > rb_ulint2 ? 1 : 0); + else if (lVal is ushort lus_ulint2 && rVal is ushort rus_ulint2) stack.Push(lus_ulint2 > rus_ulint2 ? 1 : 0); + else if (lVal is uint lu2_ulint && rVal is uint ru2_ulint) stack.Push(lu2_ulint > ru2_ulint ? 1 : 0); + else if (lVal is ulong llu_ulint2 && rVal is ulong rlu_ulint2) stack.Push(llu_ulint2 > rlu_ulint2 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) > Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_ULINT: + if (lVal is byte lb_ulint3 && rVal is byte rb_ulint3) stack.Push(lb_ulint3 <= rb_ulint3 ? 1 : 0); + else if (lVal is ushort lus_ulint3 && rVal is ushort rus_ulint3) stack.Push(lus_ulint3 <= rus_ulint3 ? 1 : 0); + else if (lVal is uint lu3_ulint && rVal is uint ru3_ulint) stack.Push(lu3_ulint <= ru3_ulint ? 1 : 0); + else if (lVal is ulong llu_ulint3 && rVal is ulong rlu_ulint3) stack.Push(llu_ulint3 <= rlu_ulint3 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) <= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_ULINT: + if (lVal is byte lb_ulint4 && rVal is byte rb_ulint4) stack.Push(lb_ulint4 >= rb_ulint4 ? 1 : 0); + else if (lVal is ushort lus_ulint4 && rVal is ushort rus_ulint4) stack.Push(lus_ulint4 >= rus_ulint4 ? 1 : 0); + else if (lVal is uint lu4_ulint && rVal is uint ru4_ulint) stack.Push(lu4_ulint >= ru4_ulint ? 1 : 0); + else if (lVal is ulong llu_ulint4 && rVal is ulong rlu_ulint4) stack.Push(llu_ulint4 >= rlu_ulint4 ? 1 : 0); + else stack.Push(Convert.ToUInt64(lVal) >= Convert.ToUInt64(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_ULINT: + if (lVal is byte lb_ulint5 && rVal is byte rb_ulint5) stack.Push(lb_ulint5 == rb_ulint5 ? 1 : 0); + else if (lVal is ushort lus_ulint5 && rVal is ushort rus_ulint5) stack.Push(lus_ulint5 == rus_ulint5 ? 1 : 0); + else if (lVal is uint lu5_ulint && rVal is uint ru5_ulint) stack.Push(lu5_ulint == ru5_ulint ? 1 : 0); + else if (lVal is ulong llu_ulint5 && rVal is ulong rlu_ulint5) stack.Push(llu_ulint5 == rlu_ulint5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_ULINT: + if (lVal is byte lb_ulint6 && rVal is byte rb_ulint6) stack.Push(lb_ulint6 != rb_ulint6 ? 1 : 0); + else if (lVal is ushort lus_ulint6 && rVal is ushort rus_ulint6) stack.Push(lus_ulint6 != rus_ulint6 ? 1 : 0); + else if (lVal is uint lu6_ulint && rVal is uint ru6_ulint) stack.Push(lu6_ulint != ru6_ulint ? 1 : 0); + else if (lVal is ulong llu_ulint6 && rVal is ulong rlu_ulint6) stack.Push(llu_ulint6 != rlu_ulint6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + + // Floating point comparisons + case Bytecode.OpCodes.LT_REAL: + if (lVal is float lf1_real && rVal is float rf1_real) stack.Push(lf1_real < rf1_real ? 1 : 0); + else if (lVal is double ld_real && rVal is double rd_real) stack.Push(ld_real < rd_real ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) < Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_REAL: + if (lVal is float lf2_real && rVal is float rf2_real) stack.Push(lf2_real > rf2_real ? 1 : 0); + else if (lVal is double ld_real2 && rVal is double rd_real2) stack.Push(ld_real2 > rd_real2 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) > Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_REAL: + if (lVal is float lf3_real && rVal is float rf3_real) stack.Push(lf3_real <= rf3_real ? 1 : 0); + else if (lVal is double ld_real3 && rVal is double rd_real3) stack.Push(ld_real3 <= rd_real3 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) <= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_REAL: + if (lVal is float lf4_real && rVal is float rf4_real) stack.Push(lf4_real >= rf4_real ? 1 : 0); + else if (lVal is double ld_real4 && rVal is double rd_real4) stack.Push(ld_real4 >= rd_real4 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) >= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_REAL: + if (lVal is float lf5_real && rVal is float rf5_real) stack.Push(lf5_real == rf5_real ? 1 : 0); + else if (lVal is double ld_real5 && rVal is double rd_real5) stack.Push(ld_real5 == rd_real5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_REAL: + if (lVal is float lf6_real && rVal is float rf6_real) stack.Push(lf6_real != rf6_real ? 1 : 0); + else if (lVal is double ld_real6 && rVal is double rd_real6) stack.Push(ld_real6 != rd_real6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LT_LREAL: + if (lVal is float lf1_lreal && rVal is float rf1_lreal) stack.Push(lf1_lreal < rf1_lreal ? 1 : 0); + else if (lVal is double ld_lreal && rVal is double rd_lreal) stack.Push(ld_lreal < rd_lreal ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) < Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GT_LREAL: + if (lVal is float lf2_lreal && rVal is float rf2_lreal) stack.Push(lf2_lreal > rf2_lreal ? 1 : 0); + else if (lVal is double ld_lreal2 && rVal is double rd_lreal2) stack.Push(ld_lreal2 > rd_lreal2 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) > Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.LE_LREAL: + if (lVal is float lf3_lreal && rVal is float rf3_lreal) stack.Push(lf3_lreal <= rf3_lreal ? 1 : 0); + else if (lVal is double ld_lreal3 && rVal is double rd_lreal3) stack.Push(ld_lreal3 <= rd_lreal3 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) <= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.GE_LREAL: + if (lVal is float lf4_lreal && rVal is float rf4_lreal) stack.Push(lf4_lreal >= rf4_lreal ? 1 : 0); + else if (lVal is double ld_lreal4 && rVal is double rd_lreal4) stack.Push(ld_lreal4 >= rd_lreal4 ? 1 : 0); + else stack.Push(Convert.ToDouble(lVal) >= Convert.ToDouble(rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.EQ_LREAL: + if (lVal is float lf5_lreal && rVal is float rf5_lreal) stack.Push(lf5_lreal == rf5_lreal ? 1 : 0); + else if (lVal is double ld_lreal5 && rVal is double rd_lreal5) stack.Push(ld_lreal5 == rd_lreal5 ? 1 : 0); + else stack.Push(Equals(lVal, rVal) ? 1 : 0); + break; + case Bytecode.OpCodes.NEQ_LREAL: + if (lVal is float lf6_lreal && rVal is float rf6_lreal) stack.Push(lf6_lreal != rf6_lreal ? 1 : 0); + else if (lVal is double ld_lreal6 && rVal is double rd_lreal6) stack.Push(ld_lreal6 != rd_lreal6 ? 1 : 0); + else stack.Push(!Equals(lVal, rVal) ? 1 : 0); + break; + } break; } + throw new Exception($"Unknown opcode 0x{op:X2}"); } + + // Stop the stopwatch and record execution time + stopwatch.Stop(); + + // Update execution time and count for this opcode + if (opcodeExecutionTimes.ContainsKey(op)) { + opcodeExecutionTimes[op] += stopwatch.ElapsedTicks; + opcodeCounts[op]++; + } else { + opcodeExecutionTimes[op] = stopwatch.ElapsedTicks; + opcodeCounts[op] = 1; + } } - Console.WriteLine("Execution finished\n"); - // Detailed variable summary + if (verbose) Console.WriteLine("Execution finished\n"); + + // Calculate total execution time in milliseconds + long totalTicks = 0; + foreach (var ticks in opcodeExecutionTimes.Values) { + totalTicks += ticks; + } + double totalMs = totalTicks * 1000.0 / Stopwatch.Frequency; + + // Detailed variable summary - always show this Console.WriteLine("=== Variable summary ==="); Console.WriteLine("Index\tType\t\tValue"); for (int i = 0; i < vars.Length; i++) { @@ -280,5 +679,26 @@ class Program { var value = vars[i] ?? "null"; Console.WriteLine($"{i}\t{typeName.PadRight(8)}\t{value}"); } + + // Performance summary + Console.WriteLine("\n=== Performance summary ==="); + Console.WriteLine($"Total execution time: {totalMs:F4} ms"); + Console.WriteLine($"Target cycle time: {cycletime} ms"); + + if (totalMs > cycletime) { + Console.WriteLine($"⚠️ Execution time exceeds target cycle time by {totalMs - cycletime:F4} ms"); + } else { + Console.WriteLine($"✅ Execution time is within target cycle time by {cycletime - totalMs:F4} ms"); + } + + // Show opcode execution statistics + Console.WriteLine("\nOpcode execution statistics:"); + Console.WriteLine("Opcode\t\tCount\tAvg Time (ms)\tTotal Time (ms)"); + foreach (var opcode in opcodeExecutionTimes.Keys) { + double avgTicks = (double)opcodeExecutionTimes[opcode] / opcodeCounts[opcode]; + double avgMs = avgTicks * 1000.0 / Stopwatch.Frequency; + double totalMsForOpcode = opcodeExecutionTimes[opcode] * 1000.0 / Stopwatch.Frequency; + Console.WriteLine($"{Bytecode.OpName(opcode).PadRight(16)}\t{opcodeCounts[opcode]}\t{avgMs:F6}\t\t{totalMsForOpcode:F6}"); + } } -} +} \ No newline at end of file diff --git a/STCompiler.Simulator/bin/Debug/net8.0/STCompiler.Common.dll b/STCompiler.Simulator/bin/Debug/net8.0/STCompiler.Common.dll index e0254d41d5d9fe63415897cdd51b20507b729d44..bd6c133e48cbc1564911f17c044f6cc20351ce15 100644 GIT binary patch delta 5203 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 D*0ny_ delta 149 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 EKhfU5@&Et; literal 16384 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 AV*mgE diff --git a/STCompiler.Simulator/bin/Debug/net8.0/STCompiler.Simulator.pdb b/STCompiler.Simulator/bin/Debug/net8.0/STCompiler.Simulator.pdb index a1eb4454ab058cd4099cc61fede15504fda51032..c85fc1a68032816315254d3f5ca7afb9fb058111 100644 GIT binary patch literal 30976 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 AuK)l5 delta 3280 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 EKhfU5@&Et; literal 16384 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 AV*mgE diff --git a/STCompiler.Simulator/obj/Debug/net8.0/STCompiler.Simulator.pdb b/STCompiler.Simulator/obj/Debug/net8.0/STCompiler.Simulator.pdb index a1eb4454ab058cd4099cc61fede15504fda51032..c85fc1a68032816315254d3f5ca7afb9fb058111 100644 GIT binary patch literal 30976 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 AuK)l5 delta 3280 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 AJpcdz delta 1292 zcmZ9MTWAwm9LB#h>CS4ZHO8&h+E&wmRg{uRCYc0RN$}EEkw&W3BCAc(v{a?ug=Nvi zD_&3<#|M3p3L@;H?y|wxbp>JfVP6*eB(ke7t1p6rAc%ei|~dA{?{!NFJX%X4(1QN@5Djai=gTW{^B!KQt^K)*JIfsk2?%$rs9dgR&A=0=Q_ z?vUyaKAyoYS=ONYt6HH#?mwzawbV`Hg9 zzIBYZneT8Pm|c|x%s3EpSQV@8)!}RHYY#YUc+tck>a}5Fv!VGOPmMX4&2A`i4*mL&A)( zS2%`^$Y=Ee&b3T)v5G%4&3&3nazDr*`)O^FA!LL(VV`gdrYme1lB6IUClwBo&G=q; zfiy+8B7(z+t1gtdt=(wE4s>H43gjYG$tW(6D{zHO;4g9&{v+4oEx8Gw$N}+pk~y44 zC9T$CFM3ElbwOCd51i;Eo73u+IFCfX5UrHe!WY7Z>X%cb_ez(C zd{O!`unY*7;ITyC^u0EH{=RhdJzKm0->Q^v*Bscr+loP=A1wFkH_M0Op63TE;iU;| zI66@pP9Rr0GQNL;!kfYNqU|;NS<*98UU0mSc5AJx>VLOZj4-d)|E{e&+`h4Cw%Hu+ zQ_bP;0^u!fhWoPpmt~GU8c(Lmqs910CRQlNilwxZwk&JJ&N$_=Wv3Exr&vr{?!yk- zeb*5RU-NIi{*(8$&ekIHjj3L@d+~EOW?Zi~EjbnFcVJ@_aU_vKnW{)V!gChmktmZz t9+Wg3R!g1{_Rlac^RcK?JS1`EMLtPb^?#$C4KuUex9j(`e1mE+^E3Ug=Vt%_ diff --git a/STCompiler.Simulator/obj/Debug/net8.0/refint/STCompiler.Simulator.dll b/STCompiler.Simulator/obj/Debug/net8.0/refint/STCompiler.Simulator.dll index c485bda8f123bdc83b6fd5d133893ea2a51b3992..89c8bdb2989de824ca2fd23ea7e98a32fd2fa5ae 100644 GIT binary patch literal 10752 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 AJpcdz delta 1292 zcmZ9MTWAwm9LB#h>CS4ZHO8&h+E&wmRg{uRCYc0RN$}EEkw&W3BCAc(v{a?ug=Nvi zD_&3<#|M3p3L@;H?y|wxbp>JfVP6*eB(ke7t1p6rAc%ei|~dA{?{!NFJX%X4(1QN@5Djai=gTW{^B!KQt^K)*JIfsk2?%$rs9dgR&A=0=Q_ z?vUyaKAyoYS=ONYt6HH#?mwzawbV`Hg9 zzIBYZneT8Pm|c|x%s3EpSQV@8)!}RHYY#YUc+tck>a}5Fv!VGOPmMX4&2A`i4*mL&A)( zS2%`^$Y=Ee&b3T)v5G%4&3&3nazDr*`)O^FA!LL(VV`gdrYme1lB6IUClwBo&G=q; zfiy+8B7(z+t1gtdt=(wE4s>H43gjYG$tW(6D{zHO;4g9&{v+4oEx8Gw$N}+pk~y44 zC9T$CFM3ElbwOCd51i;Eo73u+IFCfX5UrHe!WY7Z>X%cb_ez(C zd{O!`unY*7;ITyC^u0EH{=RhdJzKm0->Q^v*Bscr+loP=A1wFkH_M0Op63TE;iU;| zI66@pP9Rr0GQNL;!kfYNqU|;NS<*98UU0mSc5AJx>VLOZj4-d)|E{e&+`h4Cw%Hu+ zQ_bP;0^u!fhWoPpmt~GU8c(Lmqs910CRQlNilwxZwk&JJ&N$_=Wv3Exr&vr{?!yk- zeb*5RU-NIi{*(8$&ekIHjj3L@d+~EOW?Zi~EjbnFcVJ@_aU_vKnW{)V!gChmktmZz t9+Wg3R!g1{_Rlac^RcK?JS1`EMLtPb^?#$C4KuUex9j(`e1mE+^E3Ug=Vt%_