https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111252

            Bug ID: 111252
           Summary: LoongArch: Suboptimal code for (a & ~mask) | (b &
                    mask) where mask is a constant with value ((1 << n) -
                    1) << m
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xry111 at gcc dot gnu.org
  Target Milestone: ---

int test(int a, int b)
{
  return (a & ~0x10) | (b & 0x10);
}

compiles to:

        addi.w  $r12,$r0,-17                    # 0xffffffffffffffef
        and     $r12,$r12,$r4
        andi    $r5,$r5,16
        or      $r12,$r12,$r5
        slli.w  $r4,$r12,0
        jr      $r1

It should be improved:

bstrpick.w $r4, $r4, 4, 4
bstrins.w  $r5, $r4, 4, 4
or         $r5, $r4, $r0

Reply via email to