From 2397b9dbf90e04363dc8cd564f4cc64df760b7f4 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 9 Apr 2003 03:09:12 +0000 Subject: [PATCH] * config/tc-mips.c (macro): Add comments explaining the rationale for Chris' change. --- gas/ChangeLog | 5 +++++ gas/config/tc-mips.c | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index dd82150bd8..9c32d9dc65 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2003-04-09 Alexandre Oliva + + * config/tc-mips.c (macro): Add comments explaining the rationale + for Chris' change. + 2003-04-09 Chris Demetriou * config/tc-mips.c (macro): Put back `+ 0x8000' in test for 64-bit diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 7fa025169c..3204ce9ae3 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -5846,7 +5846,23 @@ macro (ip) range is shifted down by 32768 here. This code should probably attempt to generate 64-bit constants more efficiently in general. - */ + + As an extension for architectures with 64-bit registers, + we don't truncate 64-bit addresses given as literal + constants down to 32 bits, to support existing practice + in the mips64 Linux (the kernel), that compiles source + files with -mabi=64, assembling them as o32 or n32 (with + -Wa,-32 or -Wa,-n32). This is not beautiful, but since + the whole kernel is loaded into a memory region that is + addressible with sign-extended 32-bit addresses, it is + wasteful to compute the upper 32 bits of every + non-literal address, that takes more space and time. + Some day this should probably be implemented as an + assembler option, such that the kernel doesn't have to + use such ugly hacks, even though it will still have to + end up converting the binary to ELF32 for a number of + platforms whose boot loaders don't support ELF64 + binaries. */ if ((offset_expr.X_op != O_constant && HAVE_64BIT_ADDRESSES) || (offset_expr.X_op == O_constant && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000) -- 2.11.0