Despite only testing the low-order bit of its operand, the blbc and blbs
authormiod <miod@openbsd.org>
Wed, 1 Feb 2023 20:56:23 +0000 (20:56 +0000)
committermiod <miod@openbsd.org>
Wed, 1 Feb 2023 20:56:23 +0000 (20:56 +0000)
commit827d5b5a1fd0468b743c975020f9335c8f040f1b
tree410f81da8110ad4f49f763e8de24f2d3b04b5841
parent0bd8ca4ac38b898e216d95544f90f11cd082dd63
Despite only testing the low-order bit of its operand, the blbc and blbs
instructions always fetch a 32-bit word when operand is a memory address.
This works unless the address is within the last 3 bytes of a page, with
the next page being invalid, something which can happen with small malloc'ed
structures (I'm looking at you, perl).

Work around the problem by requiring a register operand in all cases; the
register load will be a zero-extension load of the right width.

This is my entry into the "fix a 30-year old bug" contest of 2023.
gnu/usr.bin/gcc/gcc/config/vax/vax.h
gnu/usr.bin/gcc/gcc/config/vax/vax.md