+2016-07-28 Kristina Martsenko <kristina.martsenko@arm.com>
+2016-07-28 Wilco Dijkstra <wdijkstr@arm.com>
+
+ * config/aarch64/aarch64.md
+ (zero_extend<SHORT:mode><GPI:mode>2_aarch64): Change output
+ statement and type.
+ (<optab>qihi2_aarch64): Likewise, and split into two.
+ (extendqihi2_aarch64): New.
+ (zero_extendqihi2_aarch64): New.
+ * config/aarch64/iterators.md (ldrxt): Remove.
+ * config/aarch64/aarch64.c (aarch64_rtx_costs): Change cost of
+ uxtb/uxth.
+
2016-07-28 Kristina Martsenko <kristina.martsenko@arm.com>
* config/aarch64/aarch64.c (aarch64_rtx_costs): Fix cost of zero extend.
(zero_extend:GPI (match_operand:SHORT 1 "nonimmediate_operand" "r,m,m")))]
""
"@
- uxt<SHORT:size>\t%<GPI:w>0, %w1
+ and\t%<GPI:w>0, %<GPI:w>1, <SHORT:short_mask>
ldr<SHORT:size>\t%w0, %1
ldr\t%<SHORT:size>0, %1"
- [(set_attr "type" "extend,load1,load1")]
+ [(set_attr "type" "logic_imm,load1,load1")]
)
(define_expand "<optab>qihi2"
""
)
-(define_insn "*<optab>qihi2_aarch64"
+(define_insn "*extendqihi2_aarch64"
[(set (match_operand:HI 0 "register_operand" "=r,r")
- (ANY_EXTEND:HI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
+ (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
""
"@
- <su>xtb\t%w0, %w1
- <ldrxt>b\t%w0, %1"
+ sxtb\t%w0, %w1
+ ldrsb\t%w0, %1"
[(set_attr "type" "extend,load1")]
)
+(define_insn "*zero_extendqihi2_aarch64"
+ [(set (match_operand:HI 0 "register_operand" "=r,r")
+ (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
+ ""
+ "@
+ and\t%w0, %w1, 255
+ ldrb\t%w0, %1"
+ [(set_attr "type" "logic_imm,load1")]
+)
+
;; -------------------------------------------------------------------
;; Simple arithmetic
;; -------------------------------------------------------------------
;; Similar, but when not(op)
(define_code_attr nlogical [(and "bic") (ior "orn") (xor "eon")])
-;; Sign- or zero-extending load
-(define_code_attr ldrxt [(sign_extend "ldrs") (zero_extend "ldr")])
-
;; Sign- or zero-extending data-op
(define_code_attr su [(sign_extend "s") (zero_extend "u")
(sign_extract "s") (zero_extract "u")