Commit e9c2033e by Aaron Sawdey Committed by Aaron Sawdey

rs6000-protos.h (expand_strn_compare): Declare.

	* config/rs6000/rs6000-protos.h (expand_strn_compare): Declare.
	* config/rs6000/rs6000.md (UNSPEC_CMPB): New unspec.
	(cmpb<mode>3): pattern for generating cmpb.
	(cmpstrnsi): pattern to expand strncmp ().
	* config/rs6000/rs6000.opt (mstring-compare-inline-limit): Add a new
	target option for controlling how much code inline expansion of
	strncmp() will be allowed to generate.
	* config/rs6000/rs6000.c (expand_strncmp_align_check): generate code
	for runtime page crossing check of strncmp () args.
	(expand_strn_compare): Function to do builtin expansion of strncmp ().

From-SVN: r243813
parent f4077222
2016-12-19 Aaron Sawdey <acsawdey@linux.vnet.ibm.com>
* config/rs6000/rs6000-protos.h (expand_strn_compare): Declare.
* config/rs6000/rs6000.md (UNSPEC_CMPB): New unspec.
(cmpb<mode>3): pattern for generating cmpb.
(cmpstrnsi): pattern to expand strncmp ().
* config/rs6000/rs6000.opt (mstring-compare-inline-limit): Add a new
target option for controlling how much code inline expansion of
strncmp() will be allowed to generate.
* config/rs6000/rs6000.c (expand_strncmp_align_check): generate code
for runtime page crossing check of strncmp () args.
(expand_strn_compare): Function to do builtin expansion of strncmp ().
2016-12-19 David Malcolm <dmalcolm@redhat.com> 2016-12-19 David Malcolm <dmalcolm@redhat.com>
* print-rtl-function.c (print_rtx_function): Update * print-rtl-function.c (print_rtx_function): Update
...@@ -78,6 +78,7 @@ extern void rs6000_scale_v2df (rtx, rtx, int); ...@@ -78,6 +78,7 @@ extern void rs6000_scale_v2df (rtx, rtx, int);
extern int expand_block_clear (rtx[]); extern int expand_block_clear (rtx[]);
extern int expand_block_move (rtx[]); extern int expand_block_move (rtx[]);
extern bool expand_block_compare (rtx[]); extern bool expand_block_compare (rtx[]);
extern bool expand_strn_compare (rtx[]);
extern const char * rs6000_output_load_multiple (rtx[]); extern const char * rs6000_output_load_multiple (rtx[]);
extern bool rs6000_is_valid_mask (rtx, int *, int *, machine_mode); extern bool rs6000_is_valid_mask (rtx, int *, int *, machine_mode);
extern bool rs6000_is_valid_and_mask (rtx, machine_mode); extern bool rs6000_is_valid_and_mask (rtx, machine_mode);
......
...@@ -117,6 +117,7 @@ ...@@ -117,6 +117,7 @@
UNSPEC_BPERM UNSPEC_BPERM
UNSPEC_COPYSIGN UNSPEC_COPYSIGN
UNSPEC_PARITY UNSPEC_PARITY
UNSPEC_CMPB
UNSPEC_FCTIW UNSPEC_FCTIW
UNSPEC_FCTID UNSPEC_FCTID
UNSPEC_LFIWAX UNSPEC_LFIWAX
...@@ -2316,6 +2317,13 @@ ...@@ -2316,6 +2317,13 @@
"prty<wd> %0,%1" "prty<wd> %0,%1"
[(set_attr "type" "popcnt")]) [(set_attr "type" "popcnt")])
(define_insn "cmpb<mode>3"
[(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
(unspec:GPR [(match_operand:GPR 1 "gpc_reg_operand" "r")
(match_operand:GPR 2 "gpc_reg_operand" "r")] UNSPEC_CMPB))]
"TARGET_CMPB"
"cmpb %0,%1,%2"
[(set_attr "type" "cmp")])
;; Since the hardware zeros the upper part of the register, save generating the ;; Since the hardware zeros the upper part of the register, save generating the
;; AND immediate if we are converting to unsigned ;; AND immediate if we are converting to unsigned
...@@ -8844,7 +8852,28 @@ ...@@ -8844,7 +8852,28 @@
FAIL; FAIL;
}") }")
;; String/block compare insn. ;; String compare N insn.
;; Argument 0 is the target (result)
;; Argument 1 is the destination
;; Argument 2 is the source
;; Argument 3 is the length
;; Argument 4 is the alignment
(define_expand "cmpstrnsi"
[(parallel [(set (match_operand:SI 0)
(compare:SI (match_operand:BLK 1)
(match_operand:BLK 2)))
(use (match_operand:SI 3))
(use (match_operand:SI 4))])]
"TARGET_CMPB && (BYTES_BIG_ENDIAN || TARGET_LDBRX)"
{
if (expand_strn_compare (operands))
DONE;
else
FAIL;
})
;; Block compare insn.
;; Argument 0 is the target (result) ;; Argument 0 is the target (result)
;; Argument 1 is the destination ;; Argument 1 is the destination
;; Argument 2 is the source ;; Argument 2 is the source
......
...@@ -337,6 +337,10 @@ mblock-compare-inline-limit= ...@@ -337,6 +337,10 @@ mblock-compare-inline-limit=
Target Report Var(rs6000_block_compare_inline_limit) Init(5) RejectNegative Joined UInteger Save Target Report Var(rs6000_block_compare_inline_limit) Init(5) RejectNegative Joined UInteger Save
Specify the maximum number pairs of load instructions that should be generated inline for the compare. If the number needed exceeds the limit, a call to memcmp will be generated instead. Specify the maximum number pairs of load instructions that should be generated inline for the compare. If the number needed exceeds the limit, a call to memcmp will be generated instead.
mstring-compare-inline-limit=
Target Report Var(rs6000_string_compare_inline_limit) Init(8) RejectNegative Joined UInteger Save
Specify the maximum number pairs of load instructions that should be generated inline for the compare. If the number needed exceeds the limit, a call to strncmp will be generated instead.
misel misel
Target Report Mask(ISEL) Var(rs6000_isa_flags) Target Report Mask(ISEL) Var(rs6000_isa_flags)
Generate isel instructions. Generate isel instructions.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment