Our server costs ~$56 per month to run. Please consider donating or becoming a Patron to help keep the site running. Help us gain new members by following us on Twitter and liking our page on Facebook!
Current time: December 22, 2024, 4:21 am

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PicoBlaze Simulator in JavaScript
#41
RE: PicoBlaze Simulator in JavaScript
bennyboy Wrote:Now, I'm not an expert in computer languages.
As somebody who has made a compiler for his programming language, I would expect compilers to output the same code for switch-case and if-else. Think of it this way, the way to translate this:
Code:
var codebyte = currentDirective & 0xff000;

switch (codebyte){
     case  0x00000:
        //Call a Register load from register function here.
     break;
      case 0x01000:
         //Call a Register load from value function here.
      break;
}
to assembly code is this:
Code:
mov eax, dword ptr [currentDirective]
and eax, 0xff000
mov dword ptr [codebyte], eax

cmp dword ptr [codebyte], 0x00000 # Point #1
jnz label0
#Call a Register load from register function here.
label0:
cmp dword ptr [codebyte], 0x01000 # Point #2
jnz label1
#Call a Register load from value function here.
label1:
The compiler does not benefit from knowing the variable codebyte is the same at both Point #1 and Point #2.
#42
RE: PicoBlaze Simulator in JavaScript
(August 16, 2022 at 7:24 pm)LadyForCamus Wrote:
(November 14, 2020 at 3:35 pm)FlatAssembler Wrote: Can anybody here diagnose why the layout breaks in Firefox for Android when in the Landscape mode?

Why are you always asking us to do your homework for you?

That's not really my homework, that is my bachelor thesis.
#43
RE: PicoBlaze Simulator in JavaScript
(August 17, 2022 at 2:02 pm)FlatAssembler Wrote: As somebody who has made a compiler for his programming language, I would expect compilers to output the same code for switch-case and if-else. Think of it this way, the way to translate this:
Code:
var codebyte = currentDirective & 0xff000;

switch (codebyte){
    case  0x00000:
       //Call a Register load from register function here.
    break;
     case 0x01000:
        //Call a Register load from value function here.
     break;
}
to assembly code is this:
Code:
mov eax, dword ptr [currentDirective]
and eax, 0xff000
mov dword ptr [codebyte], eax

cmp dword ptr [codebyte], 0x00000 # Point #1
jnz label0
#Call a Register load from register function here.
label0:
cmp dword ptr [codebyte], 0x01000 # Point #2
jnz label1
#Call a Register load from value function here.
label1:
The compiler does not benefit from knowing the variable codebyte is the same at both Point #1 and Point #2.

In .NET, if the switch statement has more than 5 elements, it changes to using a jump table, instead of nested if's (this is from Microsoft's documentation).

In C++ the compiler is free to do whatever the heck it wants.

Do you ever wonder why switch statements in most languages are only for enumberable types (enum or integer)?  It is so one can create a jump table or map in situations where that gives better performance.
#44
RE: PicoBlaze Simulator in JavaScript
(August 17, 2022 at 3:08 pm)HappySkeptic Wrote:
(August 17, 2022 at 2:02 pm)FlatAssembler Wrote: As somebody who has made a compiler for his programming language, I would expect compilers to output the same code for switch-case and if-else. Think of it this way, the way to translate this:
Code:
var codebyte = currentDirective & 0xff000;

switch (codebyte){
    case  0x00000:
       //Call a Register load from register function here.
    break;
     case 0x01000:
        //Call a Register load from value function here.
     break;
}
to assembly code is this:
Code:
mov eax, dword ptr [currentDirective]
and eax, 0xff000
mov dword ptr [codebyte], eax

cmp dword ptr [codebyte], 0x00000 # Point #1
jnz label0
#Call a Register load from register function here.
label0:
cmp dword ptr [codebyte], 0x01000 # Point #2
jnz label1
#Call a Register load from value function here.
label1:
The compiler does not benefit from knowing the variable codebyte is the same at both Point #1 and Point #2.

In .NET, if the switch statement has more than 5 elements, it changes to using a jump table, instead of nested if's (this is from Microsoft's documentation).

In C++ the compiler is free to do whatever the heck it wants.

Do you ever wonder why switch statements in most languages are only for enumberable types (enum or integer)?  It is so one can create a jump table or map in situations where that gives better performance.

What's a "jump table"? Can JavaScript do that, since it allows strings to be used in switch statements?
#45
RE: PicoBlaze Simulator in JavaScript
(August 17, 2022 at 2:02 pm)FlatAssembler Wrote:
bennyboy Wrote:Now, I'm not an expert in computer languages.
As somebody who has made a compiler for his programming language, I would expect compilers to output the same code for switch-case and if-else. Think of it this way, the way to translate this:
Code:
var codebyte = currentDirective & 0xff000;

switch (codebyte){
    case  0x00000:
       //Call a Register load from register function here.
    break;
     case 0x01000:
        //Call a Register load from value function here.
     break;
}
to assembly code is this:
Code:
mov eax, dword ptr [currentDirective]
and eax, 0xff000
mov dword ptr [codebyte], eax

cmp dword ptr [codebyte], 0x00000 # Point #1
jnz label0
#Call a Register load from register function here.
label0:
cmp dword ptr [codebyte], 0x01000 # Point #2
jnz label1
#Call a Register load from value function here.
label1:
The compiler does not benefit from knowing the variable codebyte is the same at both Point #1 and Point #2.
This is a series of if/else statements, not a jump table.  But the issue is whether, as you believe, a switch statement will compile to this same code.  This isn't something we have to philosophize on-- go ahead and make a simple switch statement and check the assembled code.

Anyway, your js code is calculating [codebyte] again and again in the conditional check of every single "if" statement, which is not the same as what you have in the above example.
#46
RE: PicoBlaze Simulator in JavaScript
I am a bit amazed people here are recommending me to use switch-case. In our "Razvoj Programske Podrške po Objektno Orijentiranim Načelima" classes, we were taught that using switch-case is a sign of bad style. Domagoj Kusalić in his book "Napredno Programiranje i Algoritmi u C-u i C++-u" also says switch-case should be used only rarely, if ever.
#47
RE: PicoBlaze Simulator in JavaScript
(August 17, 2022 at 3:30 pm)FlatAssembler Wrote: I am a bit amazed people here are recommending me to use switch-case. In our "Razvoj Programske Podrške po Objektno Orijentiranim Načelima" classes, we were taught that using switch-case is a sign of bad style. Domagoj Kusalić in his book "Napredno Programiranje i Algoritmi u C-u i C++-u" also says switch-case should be used only rarely, if ever.
Does it say why?

Let me ask you a question. In your .js file (Hi, mom, I got mentioned in someone's github!), you have a series of conditions formed like this:
Code:
if ((currentDirective & 0xff000) === 0x00000) {  // Do your LOAD register,register stuff }
else if ((currentDirective & 0xff000) === 0x01000) {  // Do your LOAD register,constant stuff }

So you will have to do that bit operation every time. Why do you not do this:
Code:
var filteredDirective = currentDirective & 0xff000;
if (filteredDirective  === 0x00000) {  // Do your LOAD register,register stuff }
else if (filteredDirective === 0x01000) { // Do your LOAD register,constant stuff }

Now, personally, I don't think that this difference will matter much unless you have hamsters running the code, but it seems like a lot of unnecessary operations to me.

Also, for style, I'd probably replace the hex constanst with meaningful labels, so you can check them all in code easily without scanning through many nested conditionals, though I don't know enough about JavaScript to know if it is comparable with "===":
Code:
const LRR = 0x00000; // Load register, register
. . .
if (filteredDirective === LRR) { // Do your LRR stuff }
#48
RE: PicoBlaze Simulator in JavaScript
Do you want style points or utility?
I am the Infantry. I am my country’s strength in war, her deterrent in peace. I am the heart of the fight… wherever, whenever. I carry America’s faith and honor against her enemies. I am the Queen of Battle. I am what my country expects me to be, the best trained Soldier in the world. In the race for victory, I am swift, determined, and courageous, armed with a fierce will to win. Never will I fail my country’s trust. Always I fight on…through the foe, to the objective, to triumph overall. If necessary, I will fight to my death. By my steadfast courage, I have won more than 200 years of freedom. I yield not to weakness, to hunger, to cowardice, to fatigue, to superior odds, For I am mentally tough, physically strong, and morally straight. I forsake not, my country, my mission, my comrades, my sacred duty. I am relentless. I am always there, now and forever. I AM THE INFANTRY! FOLLOW ME!
#49
RE: PicoBlaze Simulator in JavaScript
(August 17, 2022 at 3:30 pm)FlatAssembler Wrote: I am a bit amazed people here are recommending me to use switch-case. In our "Razvoj Programske Podrške po Objektno Orijentiranim Načelima" classes, we were taught that using switch-case is a sign of bad style. Domagoj Kusalić in his book "Napredno Programiranje i Algoritmi u C-u i C++-u" also says switch-case should be used only rarely, if ever.

I don't know those books, but if I search for "are switch statements bad", I get a bunch of reasons which would be "even more bad" in a bunch of nested if's.

Do you know what one "preferred" solution to a large switch statement is?  A map that calls different pieces of code.  The map can then be dynamic, and modified at runtime, while a switch statement needs direct modification when new functionality is added.

But, when switching on a fixed set of enumerated types, a switch is preferred.  In some languages, switching on an enum will actually give a warning or error if all the values of the enum aren't included as cases (without a default case).  In this way, adding values to the enumeration would not be a maintenance nightmare.  You get none of that with nested If's.
#50
RE: PicoBlaze Simulator in JavaScript
(August 17, 2022 at 3:42 pm)The Grand Nudger Wrote: Do you want style points or utility?

In programming, there's normally utility in style-- something that new programmers ignore when they try to write ultra-compact code.  More readable code can reduce mistakes, and allow other programmers to understand it quickly: a potential savings of hours of real-life human time instead of a few milliseconds of CPU time.  For most tasks, even a primitive CPU will be overkill by orders of magnitutde.

FA's case is different-- he's having performance issues, and he'll have to axe style wherever necessary to maximize efficiency-- even if that means dog-shit-looking code that nobody will enjoy reading.

@FlatAssembler
I'm assuming you're using JavaScript because this is meant to run online. Did I miss (or forget) a link to a webpage that is actually running this? Do you have sample code that you feel is executing too slowly?



Possibly Related Threads...
Thread Author Replies Views Last Post
  A weird bug in the preprocessor of PicoBlaze Simulator in JavaScript FlatAssembler 81 9539 December 19, 2023 at 4:46 pm
Last Post: BrianSoddingBoru4
  Reformatting tools for JavaScript FlatAssembler 0 453 June 14, 2020 at 10:13 am
Last Post: FlatAssembler
  Anatomy of religion in RELIGION SIMULATOR game gravitysoftware 12 3394 February 8, 2015 at 12:52 pm
Last Post: c172
  Analysis of a Facebook social engineering/Javascript "hack" Autumnlicious 4 3501 March 2, 2011 at 9:29 am
Last Post: fr0d0



Users browsing this thread: 1 Guest(s)