Fix possible invalid instruction in inlined memmove, optimized LDDR path #9
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Inlined memmove was generating a comparison pseudo-instruction using the input destination pointer register directly, which could end up being an invalid register such as IY, generating an
sbc hl, iy
instruction.I moved the comparison into the memmove pseudo-instruction itself to ensure it always uses
sbc hl, de
, and also optimized the LDDR path to use the subtraction result to add BC-1 to DE prior to adding it back into HL.I also managed to ensure the BC, DE, HL registers are carried directly into the LDIR/LDDR paths, though I'm not 100% sure if what I did was valid (I allocated virtual registers to pass them into the blocks, then replaced all usages of those virtual registers with the physical registers). LLVM didn't yell at me though, unlike with some other approaches I tried.
Example code output before this fix:
And after: