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