From 73866e0dfa174c5a4ff4151895b7de6541aaedb0 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 8 Dec 2015 08:55:51 +0000 Subject: [PATCH] ia64.c (ia64_emit_probe_stack_range): Adjust. * config/ia64/ia64.c (ia64_emit_probe_stack_range): Adjust. (output_probe_stack_range): Rotate the loop and simplify. From-SVN: r231398 --- gcc/ChangeLog | 5 +++++ gcc/config/ia64/ia64.c | 34 ++++++++++++++++------------------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e9d0167b34..4ddb77efad2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-12-08 Eric Botcazou + + * config/ia64/ia64.c (ia64_emit_probe_stack_range): Adjust. + (output_probe_stack_range): Rotate the loop and simplify. + 2015-12-08 Uros Bizjak * config/i386/i386.c (ix86_emit_swsqrtsf): Cleanup diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 08e9cb66cbf..f48cebc4036 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -3293,7 +3293,7 @@ ia64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size, else if (size <= PROBE_INTERVAL) emit_stack_probe (r2); - /* The run-time loop is made up of 8 insns in the generic case while this + /* The run-time loop is made up of 9 insns in the generic case while this compile-time loop is made up of 5+2*(n-2) insns for n # of intervals. */ else if (size <= 4 * PROBE_INTERVAL) { @@ -3356,11 +3356,12 @@ ia64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size, /* Step 3: the loop - while (TEST_ADDR != LAST_ADDR) + do { TEST_ADDR = TEST_ADDR + PROBE_INTERVAL probe at TEST_ADDR } + while (TEST_ADDR != LAST_ADDR) probes at FIRST + N * PROBE_INTERVAL for values of N from 1 until it is equal to ROUNDED_SIZE. */ @@ -3391,36 +3392,33 @@ const char * output_probe_stack_range (rtx reg1, rtx reg2) { static int labelno = 0; - char loop_lab[32], end_lab[32]; + char loop_lab[32]; rtx xops[3]; - ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno); - ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++); + ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno++); + /* Loop. */ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab); - /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */ - xops[0] = reg1; - xops[1] = reg2; - xops[2] = gen_rtx_REG (BImode, PR_REG (6)); - output_asm_insn ("cmp.eq %2, %I2 = %0, %1", xops); - fprintf (asm_out_file, "\t(%s) br.cond.dpnt ", reg_names [REGNO (xops[2])]); - assemble_name_raw (asm_out_file, end_lab); - fputc ('\n', asm_out_file); - /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */ + xops[0] = reg1; xops[1] = GEN_INT (-PROBE_INTERVAL); output_asm_insn ("addl %0 = %1, %0", xops); fputs ("\t;;\n", asm_out_file); - /* Probe at TEST_ADDR and branch. */ + /* Probe at TEST_ADDR. */ output_asm_insn ("probe.w.fault %0, 0", xops); - fprintf (asm_out_file, "\tbr "); + + /* Test if TEST_ADDR == LAST_ADDR. */ + xops[1] = reg2; + xops[2] = gen_rtx_REG (BImode, PR_REG (6)); + output_asm_insn ("cmp.eq %2, %I2 = %0, %1", xops); + + /* Branch. */ + fprintf (asm_out_file, "\t(%s) br.cond.dpnt ", reg_names [PR_REG (7)]); assemble_name_raw (asm_out_file, loop_lab); fputc ('\n', asm_out_file); - ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab); - return ""; } -- 2.30.2