diff options
Diffstat (limited to 'gas/config/tc-alpha.c')
-rw-r--r-- | gas/config/tc-alpha.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c index 0ca87ca..743e9be 100644 --- a/gas/config/tc-alpha.c +++ b/gas/config/tc-alpha.c @@ -87,6 +87,12 @@ unsigned long alpha_gprmask, alpha_fprmask; /* Used for LITUSE relocations. */ static expressionS lituse_basereg, lituse_byteoff, lituse_jsr; +/* Address size: In OSF/1 1.3, an undocumented "-32addr" option will + cause all addresses to be treated as 32-bit values in memory. (The + in-register versions are all sign-extended to 64 bits, of course.) + Some other systems may want this option too. */ +static int addr32; + /* Imported functions -- they should be defined in header files somewhere. */ extern segT subseg_get (); extern PTR bfd_alloc_by_size_t (); @@ -713,10 +719,16 @@ load_symbol_address (reg, insn) /* Overflow? */ as_fatal ("overflow in literal (.lita) table"); x = retval; - insn->opcode = (0xa4000000 /* ldq */ - | (reg << SA) - | (base_register << SB) - | (x & 0xffff)); + if (addr32) + insn->opcode = (0xa0000000 /* ldl */ + | (reg << SA) + | (base_register << SB) + | (x & 0xffff)); + else + insn->opcode = (0xa4000000 /* ldq */ + | (reg << SA) + | (base_register << SB) + | (x & 0xffff)); note_gpreg (base_register); } @@ -748,7 +760,7 @@ load_expression (reg, insn) num_insns++; { valueT x = addend; - if (x & ~0x7fff != 0 + if ((x & ~0x7fff) != 0 && (x & ~0x7fff) + 0x8000 != 0) { as_bad ("assembler not prepared to handle constants >16 bits yet"); @@ -1612,6 +1624,12 @@ md_parse_option (argP, cntP, vecP) return 1; } #endif + if (!strcmp (*argP, "32addr")) + { + addr32 = 1; + *argP += 6; + return 1; + } if (!strcmp (*argP, "nocpp")) { *argP += 5; |