From dd42f060364b48544301451a4b68e01bc978b281 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 15 Jan 2013 08:45:45 +0000 Subject: [PATCH] * config/tc-v850.c (md_assemble): Allow signed values for V850E_IMMEDIATE. * gas/v850/basic.exp: Allow for variations in reloc names. * gas/v850/split-lo16.d: Likewise. * gas/v850/v850e1.s: Add more tests of the PREPARE insn. * gas/v850/v850e1.d: Update expected disassembly. * v850-dis.c (get_operand_value): Sign extend V850E_IMMEDIATE values. * v850-opc.c (IMM16LO): Add V850_OPERAND_SIGNED attribute. --- gas/ChangeLog | 5 +++++ gas/config/tc-v850.c | 3 ++- gas/testsuite/ChangeLog | 8 ++++++++ gas/testsuite/gas/v850/basic.exp | 12 ++++++------ gas/testsuite/gas/v850/split-lo16.d | 8 ++++---- gas/testsuite/gas/v850/v850e1.d | 1 + gas/testsuite/gas/v850/v850e1.s | 1 + opcodes/ChangeLog | 6 ++++++ opcodes/v850-dis.c | 2 ++ opcodes/v850-opc.c | 4 ++-- 10 files changed, 37 insertions(+), 13 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index a7758bf668..d632dcaa2d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2013-01-15 Nick Clifton + + * config/tc-v850.c (md_assemble): Allow signed values for + V850E_IMMEDIATE. + 2013-01-11 Sean Keys * config/tc-xgate.c (md_begin): Fix mistake made when going from diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c index 7053e9300b..ad1fb30eb8 100644 --- a/gas/config/tc-v850.c +++ b/gas/config/tc-v850.c @@ -2350,7 +2350,8 @@ md_assemble (char *str) } if (operand->flags & V850E_IMMEDIATE16) { - if (ex.X_add_number & 0xffff0000) + if ((ex.X_add_number & 0xffff0000) + && ((ex.X_add_number & 0xffff0000) != 0xffff0000)) { errmsg = _("constant too big to fit into instruction"); goto error; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index fafd84feff..47d6d15e30 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-01-15 Nick Clifton + + * gas/v850/basic.exp: Allow for variations in reloc names. + * gas/v850/split-lo16.d: Likewise. + + * gas/v850/v850e1.s: Add more tests of the PREPARE insn. + * gas/v850/v850e1.d: Update expected disassembly. + 2013-01-14 Alan Modra * gas/v850/basic.exp (reloc part 1): Pass -mgcc-abi to gas. diff --git a/gas/testsuite/gas/v850/basic.exp b/gas/testsuite/gas/v850/basic.exp index aaf377a0d0..cf6aaa3537 100644 --- a/gas/testsuite/gas/v850/basic.exp +++ b/gas/testsuite/gas/v850/basic.exp @@ -386,17 +386,17 @@ proc do_simple_reloc_tests {} { while 1 { expect { - -re "^00000002\[^\n\]*R_V850_LO16\[^\n\]*\n" + -re "^00000002\[^\n\]*R_V8\[A-Z0-9_\]+\[^\n\]*\n" { set x [expr $x+1] } - -re "^00000006\[^\n\]*R_V850_HI16_S\[^\n\]*\n" + -re "^00000006\[^\n\]*R_V8\[A-Z0-9_\]+\[^\n\]*\n" { set x [expr $x+1] } - -re "^0000000a\[^\n\]*R_V850_HI16\[^\n\]*\n" + -re "^0000000a\[^\n\]*R_V8\[A-Z0-9_\]+\[^\n\]*\n" { set x [expr $x+1] } - -re "^0000000e\[^\n\]*R_V850_ZDA_16_16_OFFSET\[^\n\]*\n" + -re "^0000000e\[^\n\]*R_V8\[A-Z0-9_\]+\[^\n\]*\n" { set x [expr $x+1] } - -re "^00000012\[^\n\]*R_V850_TDA_16_16_OFFSET\[^\n\]*\n" + -re "^00000012\[^\n\]*R_V8\[A-Z0-9_\]+\[^\n\]*\n" { set x [expr $x+1] } - -re "^00000016\[^\n\]*R_V850_SDA_16_16_OFFSET\[^\n\]*\n" + -re "^00000016\[^\n\]*R_V8\[A-Z0-9_\]+\[^\n\]*\n" { set x [expr $x+1] } -re "\[^\n\]*\n" { } timeout { perror "timeout\n"; break } diff --git a/gas/testsuite/gas/v850/split-lo16.d b/gas/testsuite/gas/v850/split-lo16.d index f742084585..9580c80e55 100644 --- a/gas/testsuite/gas/v850/split-lo16.d +++ b/gas/testsuite/gas/v850/split-lo16.d @@ -4,13 +4,13 @@ #... 00000000 <.*>: 0: 40 0e 00 00 movhi 0, r0, r1 - 2: R_V850_HI16_S foo + 2: R_V8.* foo 4: 01 16 00 00 addi 0, r1, r2 - 6: R_V850_LO16 foo + 6: R_V8.* foo 8: 01 17 00 00 ld\.b 0\[r1\], r2 - a: R_V850_LO16 foo + a: R_V8.* foo c: 81 17 01 00 ld\.bu 0\[r1\], r2 - c: R_V850_LO16_SPLIT_OFFSET foo + c: R_V8.* foo 10: a1 17 45 23 ld\.bu 9029\[r1\], r2 14: 81 17 57 34 ld\.bu 13398\[r1\], r2 18: 20 57 01 00 ld.w 0\[r0\], r10 diff --git a/gas/testsuite/gas/v850/v850e1.d b/gas/testsuite/gas/v850/v850e1.d index 7560d88d83..6773c5c82a 100644 --- a/gas/testsuite/gas/v850/v850e1.d +++ b/gas/testsuite/gas/v850/v850e1.d @@ -43,3 +43,4 @@ Disassembly of section .text: 0x0+7a 83 00 [ ]*zxb sp 0x0+7c c4 00 [ ]*zxh gp 0x0+7e 63 ff 9d 00[ ]*st.w lp, 156\[sp\] +0x0+82 80 07 0b e8 f6 ff[ ]*prepare {r20, r24 - r26}, 0, -10 diff --git a/gas/testsuite/gas/v850/v850e1.s b/gas/testsuite/gas/v850/v850e1.s index 2e6d640a24..b60be43689 100644 --- a/gas/testsuite/gas/v850/v850e1.s +++ b/gas/testsuite/gas/v850/v850e1.s @@ -37,3 +37,4 @@ zxb r3 zxh r4 st.w lp, 156[sp] + prepare {r20,r24,r25,r26},0,-10 diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 6ccf7acdd5..27607884dd 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2013-01-15 Nick Clifton + + * v850-dis.c (get_operand_value): Sign extend V850E_IMMEDIATE + values. + * v850-opc.c (IMM16LO): Add V850_OPERAND_SIGNED attribute. + 2013-01-14 Will Newton * metag-dis.c (REG_WIDTH): Increase to 64. diff --git a/opcodes/v850-dis.c b/opcodes/v850-dis.c index 5f9d87b8f8..7d2e72025a 100644 --- a/opcodes/v850-dis.c +++ b/opcodes/v850-dis.c @@ -118,6 +118,8 @@ get_operand_value (const struct v850_operand *operand, if (operand->flags & V850E_IMMEDIATE16HI) value <<= 16; + else if (value & 0x8000) + value |= (-1L << 16); return value; } diff --git a/opcodes/v850-opc.c b/opcodes/v850-opc.c index 0867d432ca..806651f362 100644 --- a/opcodes/v850-opc.c +++ b/opcodes/v850-opc.c @@ -747,9 +747,9 @@ const struct v850_operand v850_operands[] = #define IMM16 (I16 + 1) { 16, 32, NULL, NULL, V850E_IMMEDIATE16, BFD_RELOC_16 }, -/* The 16 bit immediate following a 32 bit instruction. */ +/* The signed 16 bit immediate following a prepare instruction. */ #define IMM16LO (IMM16 + 1) - { 16, 32, NULL, NULL, V850E_IMMEDIATE16, BFD_RELOC_LO16 }, + { 16, 32, NULL, NULL, V850E_IMMEDIATE16 | V850_OPERAND_SIGNED, BFD_RELOC_LO16 }, /* The hi 16 bit immediate following a 32 bit instruction. */ #define IMM16HI (IMM16LO + 1) -- 2.34.1