https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98849
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ktkachov at gcc dot gnu.org, | |rearnsha at gcc dot gnu.org --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Ah, so on powerpc64le this works fine, expand_binop has: 1558 /* If this is a vector shift by a scalar, see if we can do a vector 1559 shift by a vector. If so, broadcast the scalar into a vector. */ 1560 if (mclass == MODE_VECTOR_INT) 1561 { 1562 optab otheroptab = unknown_optab; 1563 1564 if (binoptab == ashl_optab) 1565 otheroptab = vashl_optab; 1566 else if (binoptab == ashr_optab) 1567 otheroptab = vashr_optab; 1568 else if (binoptab == lshr_optab) 1569 otheroptab = vlshr_optab; 1570 else if (binoptab == rotl_optab) 1571 otheroptab = vrotl_optab; 1572 else if (binoptab == rotr_optab) 1573 otheroptab = vrotr_optab; 1574 1575 if (otheroptab 1576 && (icode = optab_handler (otheroptab, mode)) != CODE_FOR_nothing) 1577 { 1578 /* The scalar may have been extended to be too wide. Truncate 1579 it back to the proper size to fit in the broadcast vector. */ 1580 scalar_mode inner_mode = GET_MODE_INNER (mode); 1581 if (!CONST_INT_P (op1) 1582 && (GET_MODE_BITSIZE (as_a <scalar_int_mode> (GET_MODE (op1))) 1583 > GET_MODE_BITSIZE (inner_mode))) 1584 op1 = force_reg (inner_mode, 1585 simplify_gen_unary (TRUNCATE, inner_mode, op1, 1586 GET_MODE (op1))); 1587 rtx vop1 = expand_vector_broadcast (mode, op1); 1588 if (vop1) 1589 { 1590 temp = expand_binop_directly (icode, mode, otheroptab, op0, vop1, 1591 target, unsignedp, methods, last); 1592 if (temp) (gdb) 1593 return temp; 1594 } 1595 } 1596 } code for this. It doesn't work in the ARM case, because it doesn't support either vec_duplicate_optab nor vec_init_optab for the mode. I'm declaring this a backend bug, it shouldn't advertise such vector shifts in configurations in which it can't even init such vectors.