(set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*")
(set_attr "neg_pool_range" "*,*,*,996,*,*,*,996,*")])
+/* We define these mov expanders to match the standard mov$a optab to prevent
+ the mid-end from trying to do a subreg for these modes which is the most
+ inefficient way to expand the move. Also big-endian subreg's aren't
+ allowed for a subset of modes, See TARGET_CAN_CHANGE_MODE_CLASS.
+ Without these RTL generation patterns the mid-end would attempt to take a
+ sub-reg and may ICE if it can't. */
+
(define_expand "movti"
[(set (match_operand:TI 0 "nonimmediate_operand" "")
(match_operand:TI 1 "general_operand" ""))]
}
})
-(define_expand "movv4hf"
- [(set (match_operand:V4HF 0 "s_register_operand")
- (match_operand:V4HF 1 "s_register_operand"))]
- "TARGET_NEON && TARGET_FP16"
+(define_expand "mov<mode>"
+ [(set (match_operand:VH 0 "s_register_operand")
+ (match_operand:VH 1 "s_register_operand"))]
+ "TARGET_NEON"
{
- /* We need to use force_reg to avoid TARGET_CAN_CHANGE_MODE_CLASS
- causing an ICE on big-endian because it cannot extract subregs in
- this case. */
- if (can_create_pseudo_p ())
- {
- if (!REG_P (operands[0]))
- operands[1] = force_reg (V4HFmode, operands[1]);
- }
-})
-
-(define_expand "movv8hf"
- [(set (match_operand:V8HF 0 "")
- (match_operand:V8HF 1 ""))]
- "TARGET_NEON && TARGET_FP16"
-{
- /* We need to use force_reg to avoid TARGET_CAN_CHANGE_MODE_CLASS
- causing an ICE on big-endian because it cannot extract subregs in
- this case. */
if (can_create_pseudo_p ())
{
if (!REG_P (operands[0]))
- operands[1] = force_reg (V8HFmode, operands[1]);
+ operands[1] = force_reg (<MODE>mode, operands[1]);
}
})