Deutsch English Français Italiano |
<uvn2gr$ql2d$3@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Stephen Fuld <sfuld@alumni.cmu.edu.invalid> Newsgroups: comp.arch Subject: Re: "Mini" tags to reduce the number of op codes Date: Tue, 16 Apr 2024 16:44:27 -0700 Organization: A noiseless patient Spider Lines: 152 Message-ID: <uvn2gr$ql2d$3@dont-email.me> References: <uuk100$inj$1@dont-email.me> <uukduu$4o4p$1@dont-email.me> <420556afacf3ef3eea07b95498bcbef0@www.novabbs.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Wed, 17 Apr 2024 01:44:28 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e4560d6e9e80920818ac28626eb60e90"; logging-data="873549"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19PxXJH7XWpNloOwihnkImyuH+K1NSlnRw=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:wv6JX54YZLfoBVQ0pmWQ+PRoubw= Content-Language: en-US In-Reply-To: <420556afacf3ef3eea07b95498bcbef0@www.novabbs.org> Bytes: 7558 On 4/3/2024 2:30 PM, MitchAlsup1 wrote: > BGB-Alt wrote: > >> On 4/3/2024 11:43 AM, Stephen Fuld wrote: >>> There has been discussion here about the benefits of reducing the >>> number of op codes. One reason not mentioned before is if you have >>> fixed length instructions, you may want to leave as many codes as >>> possible available for future use. Of course, if you are doing a >>> 16-bit instruction design, where instruction bits are especially >>> tight, you may save enough op-codes to save a bit, perhaps allowing a >>> larger register specifier field, or to allow more instructions in the >>> smaller subset. >>> >>> It is in this spirit that I had an idea, partially inspired by Mill’s >>> use of tags in registers, but not memory. I worked through this idea >>> using the My 6600 as an example “substrate” for two reasons. First, it > 66000 Sorry. Typo. >>> has several features that are “friendly” to the idea. Second, I know >>> Mitch cares about keeping the number of op codes low. >>> >>> Please bear in mind that this is just the germ of an idea. It is >>> certainly not fully worked out. I present it here to stimulate >>> discussions, and because it has been fun to think about. >>> >>> The idea is to add 32 bits to the processor state, one per register >>> (though probably not physically part of the register file) as a tag. >>> If set, the bit indicates that the corresponding register contains a >>> floating-point value. Clear indicates not floating point (integer, >>> address, etc.). There would be two additional instructions, load >>> single floating and load double floating, which work the same as the >>> other 32- and 64-bit loads, but in addition to loading the value, set >>> the tag bit for the destination register. Non-floating-point loads >>> would clear the tag bit. As I show below, I don’t think you need any >>> special "store tag" instructions. > > What do you do when you want a FP bit pattern interpreted as an integer, > or vice versa. As I said below, if you need that, you can use an otherwise :"useless" instruction, such as ORing a register with itself the modify the tag bits. > >>> When executing arithmetic instructions, if the tag bits of both >>> sources of an instruction are the same, do the appropriate operation >>> (floating or integer), and set the tag bit of the result register >>> appropriately. >>> If the tag bits of the two sources are different, I see several >>> possibilities. >>> >>> 1. Generate an exception. >>> 2. Use the sense of source 1 for the arithmetic operation, but >>> perform the appropriate conversion on the second operand first, >>> potentially saving an instruction > > Conversions to/from FP often require a rounding mode. How do you specify > that? Good point. > >>> 3. Always do the operation in floating point and convert the >>> integer operand prior to the operation. (Or, if you prefer, change >>> floating point to integer in the above description.) >>> 4. Same as 2 or 3 above, but don’t do the conversions. >>> >>> I suspect this is the least useful choice. I am not sure which is >>> the best option. >>> >>> Given that, use the same op code for the floating-point and fixed >>> versions of the same operations. So we can save eight op codes, the >>> four arithmetic operations, max, min, abs and compare. So far, a net >>> savings of six opcodes. >>> >>> But we can go further. There are some opcodes that only make sense >>> for FP operands, e.g. the transcendental instructions. And there are >>> some operations that probably only make sense for non-FP operands, >>> e.g. POP, FF1, probably shifts. Given the tag bit, these could share >>> the same op-code. There may be several more of these. > > Hands waving:: "Danger Will Robinson, Danger" more waving of hands. Agreed. >>> I think this all works fine for a single compilation unit, as the >>> compiler certainly knows the type of the data. But what happens with >>> separate compilations? The called function probably doesn’t know the > > The compiler will certainly have a function prototype. In any event, if FP > and Integers share a register file the lack of prototype is much less > stress- > full to the compiler/linking system. > >>> tag value for callee saved registers. Fortunately, the My 66000 >>> architecture comes to the rescue here. You would modify the Enter >>> and Exit instructions to save/restore the tag bits of the registers >>> they are saving or restoring in the same data structure it uses for >>> the registers (yes, it adds 32 bits to that structure – minimal >>> cost). The same mechanism works for interrupts that take control >>> away from a running process. > > Yes, but we do just fine without the tag and without the stuff mentioned > above. Neither ENTER nor EXIT care about the 64-bit pattern in the > register. I think you need it for callee saved registers to insure the tag is set correctly for the calling program upon return to it. > >>> I don’t think you need to set or clear the tag bits without doing >>> anything else, but if you do, I think you could “repurpose” some >>> other instructions to do this, without requiring another op-code. >>> For example, Oring a register with itself could be used to set the >>> tag bit and Oring a register with zero could clear it. These should >>> be pretty rare. > >>> That is as far as I got. I think you could net save perhaps 8-12 op >>> codes, which is about 10% of the existing op codes - not bad. Is it >>> worth it? > > No. > >> To me, a major question is the effect on performance. What >>> is the cost of having to decode the source registers and reading >>> their respective tag bits before knowing which FU to use? > > The problem is you have put decode dependent on dynamic pipeline > information. > I suggest you don't want to do that. Consider a change from int to FP > instruction > as a predicated instruction, so the pipeline cannot DECODE the > instruction at > hand until the predicate resolves. Yech. Good point. -- - Stephen Fuld (e-mail address disguised to prevent spam)