News for hackers. Stuff that matters.
Re:XOR'ing a register with itself is the idiom for zeroing i... by repelsteeltje on Wednesday April 22, 2026 @04:19AM (#47860637)
Yep. The XOR trick - relying on special use of opcode rather than special register - is probably related to limited number of (general purpose) registers in typical '70 era CPU design (8080, 6502, Z80, 8086).
Re:XOR'ing a register with itself is the idiom for zeroing i... by bonzini on Wednesday April 22, 2026 @09:03AM (#47862977)
A move on SPARC is technically an OR of the source with the zero register. "move %l0, %l1" is assembled as "or %g0, %l0, %l1". So if you want to zero a register you OR %g0 with itself.
Re:XOR'ing a register with itself is the idiom for zeroing i... by classichasclass on Wednesday April 22, 2026 @09:04AM (#47862991)
Unfortunately, 6502 can't XOR the accumulator with itself. I don't recall if the Z80 can, and loading an immediate 0 would be most efficient on those anyway.
Re:XOR'ing a register with itself is the idiom for zeroing i... by blywi on Wednesday April 22, 2026 @09:23AM (#47863263)
XOR A absolutely works on Z80 and it's of course faster and shorter than loading a zero value with LD A,0. LD A,0 is encoded to 2 bytes while XOR A is encoded as a single opcode. XOR A has the additional benefit to also clear all the flags to 0. Sub A will clear the accumulator, but it will always set the N flag on Z80.
Re:XOR'ing a register with itself is the idiom for zeroing i... by classichasclass on Wednesday April 22, 2026 @10:41AM (#47864351)
Ah, thanks, I couldn't recall off the top of my head.
Re:XOR'ing a register with itself is the idiom for zeroing i... by eichin on Wednesday April 22, 2026 @02:10PM (#47867162)
Yeah, the article seems to have missed the likely biggest reason that this is the popular x86 idiom - that it was already the popular 8080/Z80 idiom from the CP/M era, and there's a direct line (and a bunch of early 8086 DOS applications were mechanically translated assembly code, so while they are "different" architectures they're still solidly related.)
Re:XOR'ing a register with itself is the idiom for zeroing i... by dmitrygr on Wednesday April 22, 2026 @05:18PM (#47869416)
should set Z too
Re:XOR'ing a register with itself is the idiom for zeroing i... by bonzini on Wednesday April 22, 2026 @09:20AM (#47863230)
The Z80 can do either LD A,0 or SUB A or XOR A, but the LD is slower due to the extra memory cycle to load the second byte of the instruction.
Re:XOR'ing a register with itself is the idiom for zeroing i... by repelsteeltje on Wednesday April 22, 2026 @10:28AM (#47864165)
You're absolutely right, I stand corrected.

The 6502 gets by doing immediate load: 2 clock cycles, 2 bytes (frequently followed by single byte register transfer instruction). Out of curiosity I did a quick scan of the MOS 1.20 rom of the BBC micro:

  LDY #0 (a0 00): 38 hits
  LDX #0 (a2 00): 28 hits
  LDA #0 (a9 00): 48 hits
Re:XOR'ing a register with itself is the idiom for zeroing i... by tom_ on Wednesday April 22, 2026 @09:47PM (#47871457)
Are you sure you're not an LLM? There is no way anybody writing 6502 would do anything else, because there's no other way to do it.

(You can squeeze in a cheeky Txx instruction afterwards to get a 2-or-more-for-1, if that would be what you need - but this only saves bytes. Every instruction on the 6502 takes 2+ cycles! You could have done repeated immediate loads. The cycle count would be the same and the code would be more general.)

Re:XOR'ing a register with itself is the idiom for zeroing i... by repelsteeltje on Thursday April 23, 2026 @09:19AM (#47875445)
> Are you sure you're not an LLM?

Hard to tell, but I don't think so ;-)

I suppose using Txx instructions rather than LDx is more of an idiom than intended to conserve space. Also, could an LDx #0 potentially be 3 cycles in the edge case where the PC crosses a page boundary? (I'm probably confused? Red herring?)

Re:XOR'ing a register with itself is the idiom for zeroing i... by tom_ on Thursday April 23, 2026 @08:45PM (#47884156)
I don't know how the 6502's PC increment actually worked, but it was an exception to the general rule of page crossings (or the possibility thereof) incurring a penalty, or, as was also sometimes the case, just ignored entirely. (One big advantage of the latter approach: doing nothing does take 0 cycles.)

The full 16 bits would be incremented after each instruction byte fetched, and it didn't cost any extra if there was a carry out of the MSB.

Re:XOR'ing a register with itself is the idiom for zeroing i... by wongarsu on Wednesday April 22, 2026 @09:21AM (#47863238)
And [as mentioned in the article] even modern x86 implementations have a zero register. So you have this weird special opcode that (when called with identical source and destination) only triggers register renaming