Yes, you’re right, the pick was essential; I overlooked the call op in my (admitted cursory) look through.
It’s not so much returns with values need Fn, as any op that uses the controlFU (of which there are three on Silver), including br, call, retn, inner, leave, setjmp, longjmp and a few NYF. (As a special case, a retn with no result that is the only op in its instruction can be encoded as a flow skinny, but that’s just an encoding optimization; it still occupies a controlFU slot.) However, a Mill can be configured with more flow slots than it has controlFUs. That’s true for Silver, which has four flow slots but only three carry controlFUs. The relevant part of the Silver spec is:
c->flowSlots = newRow<slot>(4); c->flowSlots << cacheFU << conFU << conformFU << controlFU << lsFU << lsbFU; c->flowSlots << conFU << conformFU << controlFU << lsFU << lsbFU << miscFU; c->flowSlots << conFU << conformFU << controlFU << lsFU << lsbFU << miscFU; c->flowSlots << conFU << lsFU << lsbFU << miscFU;
As you see, slot 4 lacks a controlFU. BTW, the provisioning of all the Mill test configurations (in the Metal series like Silver and elsewhere) can and will change as we tune for workload/market; don’t take this spec as stone-graven.
As for writing conAsm manually: selecting the ops to match the source is quite easy because Mill ISA is high level and closely matches the HLL input; for any given source there’s usually only one way to do it on the core. Op placement (putting the selected ops into instructions with maximal density) is a little more difficult but not that bad. But then you have to determine the numeric value of belt references, which means you must in effect symbolically execute the program and keep track of where everything is on the belt, and that’s a real pain; I admit I did not check that part of your code. The pain is acute when there are in-flight ops started in one ebb that retire somewhere else after possibly several control transfers. Then lastly you must verify that a value you need hasn’t fallen off the belt, and insert spill/fill or rescue ops as necessary – and then go recalculate the belt numbers again. Software is much better at that sort of thing than are humans.
Remember us when you want something more fun than your present employer 🙂 Mill Computing is a distributed virtual company; we have people all over the world.