On Sun, Jul 7, 2024 at 5:00 PM Roger Sayle <ro...@nextmovesoftware.com> wrote:
>
>
> Hi Hongtao,
> This should address concerns about the remaining use of force_reg.
>
 51@@ -25793,15 +25792,20 @@ ix86_expand_ternlog_binop (enum rtx_code
code, machine_mode mode,
 52   if (GET_MODE (op1) != mode)
 53     op1 = gen_lowpart (mode, op1);
 54
 55-  if (GET_CODE (op0) == CONST_VECTOR)
 56+  if (CONST_VECTOR_P (op0))
 57     op0 = validize_mem (force_const_mem (mode, op0));
 58-  if (GET_CODE (op1) == CONST_VECTOR)
 59+  if (CONST_VECTOR_P (op1))
 60     op1 = validize_mem (force_const_mem (mode, op1));
 61
 62   if (memory_operand (op0, mode))
 63     {
 64       if (memory_operand (op1, mode))
 65-       op0 = force_reg (mode, op0);
 66+       {
 67+         /* We can't use force_reg (op0, mode).  */
 68+         rtx reg = gen_reg_rtx (mode);
 69+         emit_move_insn (reg, op0);
 70+         op0 = reg;
 71+       }
Shouldn't we handle bcst_mem_operand instead of
memory_operand(bcst_memory_operand is not a memory_operand)?
so maybe
if (memory_operand (op0, mode0) || bcst_mem_operand (op0, mode0)
  if (memory_operand (op1, mode) || bcst_mem_operand (op1, mode0)?
 72       else
 73        std::swap (op0, op1);
 74     }

Also there's force_reg in below 3 cases, are there any restrictions to
avoid bcst_mem_operand into them?
case 0x0f:  /* ~a */
case 0x33:  /* ~b */
case 0x33:  /* ~b */
..
         if (!TARGET_64BIT && !register_operand (op2, mode))
           op2 = force_reg (mode, op2);

-- 
BR,
Hongtao

Reply via email to