https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118410
Bug ID: 118410 Summary: Use Zbb extensions to improve code generation for some logicals Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: law at gcc dot gnu.org Target Milestone: --- The Zbb extension has andn, orn and xorn instructions which operate on two register inputs X AND/OR/XOR ~Y. For X op C we often have to synthesize C with multiple instructions. For a subset of constants we can instead generate X op' ~C Essentially double-complementing the constant argument. In the case where ~C can be synthesized with fewer instructions than C, this is a win. Where op' is the -not version of the original op. For some constants that will save us an instruction in synthesis step. So something like long orlow(long x) { return x | ((1L << 24) - 1); } Currently generates something like this: lui a1, 4096 addiw a1, a1, -1 or a0, a0, a1 But instead we could generate: lui a1, -4096 orn a0, a0, a1 Now it's likely the case that the lui+addiw would fuse, so it may not help that much. But it's ultimately smaller and at least as fast as the original. Thanks to Piotr Fusik or i the LLVM project for pointing this out to me.