From 909734beb71dbf888dfda464541f5acd614e5d25 Mon Sep 17 00:00:00 2001 From: James Greenhalgh Date: Fri, 16 May 2014 09:25:48 +0000 Subject: [PATCH] [AArch64 costs 17/18] Cost for SYMBOL_REF, HIGH and LO_SUM gcc/ * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost SYMBOL_REF, HIGH, LO_SUM. From-SVN: r210509 --- gcc/ChangeLog | 5 +++++ gcc/config/aarch64/aarch64.c | 41 ++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3515c6c4042..5e7c0850279 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-05-16 James Greenhalgh + + * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost SYMBOL_REF, + HIGH, LO_SUM. + 2014-05-16 James Greenhalgh Philipp Tomsich diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 58627b5e4ce..9eff2fd8e6a 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -5508,15 +5508,44 @@ cost_plus: return false; /* All arguments need to be in registers. */ } - case HIGH: - if (!CONSTANT_P (XEXP (x, 0))) - *cost += rtx_cost (XEXP (x, 0), HIGH, 0, speed); + case SYMBOL_REF: + + if (aarch64_cmodel == AARCH64_CMODEL_LARGE) + { + /* LDR. */ + if (speed) + *cost += extra_cost->ldst.load; + } + else if (aarch64_cmodel == AARCH64_CMODEL_SMALL + || aarch64_cmodel == AARCH64_CMODEL_SMALL_PIC) + { + /* ADRP, followed by ADD. */ + *cost += COSTS_N_INSNS (1); + if (speed) + *cost += 2 * extra_cost->alu.arith; + } + else if (aarch64_cmodel == AARCH64_CMODEL_TINY + || aarch64_cmodel == AARCH64_CMODEL_TINY_PIC) + { + /* ADR. */ + if (speed) + *cost += extra_cost->alu.arith; + } + + if (flag_pic) + { + /* One extra load instruction, after accessing the GOT. */ + *cost += COSTS_N_INSNS (1); + if (speed) + *cost += extra_cost->ldst.load; + } return true; + case HIGH: case LO_SUM: - if (!CONSTANT_P (XEXP (x, 1))) - *cost += rtx_cost (XEXP (x, 1), LO_SUM, 1, speed); - *cost += rtx_cost (XEXP (x, 0), LO_SUM, 0, speed); + /* ADRP/ADD (immediate). */ + if (speed) + *cost += extra_cost->alu.arith; return true; case ZERO_EXTRACT: