? gas/testsuite/gas/all/sleb128-6.d.copy ? gas/testsuite/gas/all/sleb128-6.s.copy Index: gas/expr.c =================================================================== RCS file: /cvs/src/src/gas/expr.c,v retrieving revision 1.93 diff -u -p -r1.93 expr.c --- gas/expr.c 11 Apr 2013 10:54:13 -0000 1.93 +++ gas/expr.c 12 Apr 2013 14:06:42 -0000 @@ -1729,7 +1729,7 @@ operatorf (int *num_chars) signed word values can be represented in an O_constant expression, which is useful e.g. for .sleb128 directives. */ -static void +void add_to_result (expressionS *resultP, offsetT amount, int rhs_highbit) { valueT ures = resultP->X_add_number; @@ -1745,7 +1745,7 @@ add_to_result (expressionS *resultP, off /* Similarly, for subtraction. */ -static void +void subtract_from_result (expressionS *resultP, offsetT amount, int rhs_highbit) { valueT ures = resultP->X_add_number; Index: gas/expr.h =================================================================== RCS file: /cvs/src/src/gas/expr.h,v retrieving revision 1.22 diff -u -p -r1.22 expr.h --- gas/expr.h 11 Apr 2013 10:54:13 -0000 1.22 +++ gas/expr.h 12 Apr 2013 14:06:42 -0000 @@ -175,6 +175,8 @@ extern char get_symbol_end (void); extern void expr_begin (void); extern void expr_set_precedence (void); extern void expr_set_rank (operatorT, operator_rankT); +extern void add_to_result (expressionS *, offsetT, int); +extern void subtract_from_result (expressionS *, offsetT, int); extern segT expr (int, expressionS *, enum expr_mode); extern unsigned int get_single_number (void); extern symbolS *make_expr_symbol (expressionS * expressionP); Index: gas/config/tc-sh.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-sh.c,v retrieving revision 1.140 diff -u -p -r1.140 tc-sh.c --- gas/config/tc-sh.c 21 Mar 2012 08:58:40 -0000 1.140 +++ gas/config/tc-sh.c 12 Apr 2013 14:06:42 -0000 @@ -931,10 +931,11 @@ sh_optimize_expr (expressionS *l, operat symbol_get_frag (r->X_add_symbol), &frag_off)) { - l->X_add_number -= r->X_add_number; - l->X_add_number -= frag_off / OCTETS_PER_BYTE; - l->X_add_number += (S_GET_VALUE (l->X_add_symbol) - - S_GET_VALUE (r->X_add_symbol)); + offsetT symval_diff = S_GET_VALUE (l->X_add_symbol) + - S_GET_VALUE (r->X_add_symbol); + subtract_from_result (l, r->X_add_number, r->X_extrabit); + subtract_from_result (l, frag_off / OCTETS_PER_BYTE, 0); + add_to_result (l, symval_diff, symval_diff < 0); l->X_op = O_constant; l->X_add_symbol = 0; return 1; Index: gas/testsuite/gas/all/gas.exp =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/all/gas.exp,v retrieving revision 1.81 diff -u -p -r1.81 gas.exp --- gas/testsuite/gas/all/gas.exp 11 Apr 2013 10:54:13 -0000 1.81 +++ gas/testsuite/gas/all/gas.exp 12 Apr 2013 14:06:42 -0000 @@ -373,7 +373,10 @@ run_dump_test sleb128-2 run_dump_test sleb128-3 run_dump_test sleb128-4 run_dump_test sleb128-5 -run_dump_test sleb128-7 +# .byte is not 8 bits on either tic4x or tic54x +if { ![istarget "tic4x*-*-*"] && ![istarget "tic54x*-*-*"] } { + run_dump_test sleb128-7 +} # .byte is 32 bits on tic4x, and .p2align isn't supported on tic54x # .space is different on hppa*-hpux. Index: gas/testsuite/gas/all/sleb128-2.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/all/sleb128-2.s,v retrieving revision 1.1 diff -u -p -r1.1 sleb128-2.s --- gas/testsuite/gas/all/sleb128-2.s 11 Apr 2013 10:54:13 -0000 1.1 +++ gas/testsuite/gas/all/sleb128-2.s 12 Apr 2013 14:06:42 -0000 @@ -1,13 +1,10 @@ -.text -.globl foo -foo: -.L1: -.byte 0 -.byte 0 -.byte 0 -.L2: + .text +_L1: + .byte 0 + .byte 0 + .byte 0 +_L2: -.data -bar: -.sleb128 .L1 - .L2 -.byte 42 + .data + .sleb128 _L1 - _L2 + .byte 42 Index: gas/testsuite/gas/all/sleb128-3.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/all/sleb128-3.s,v retrieving revision 1.1 diff -u -p -r1.1 sleb128-3.s --- gas/testsuite/gas/all/sleb128-3.s 11 Apr 2013 10:54:13 -0000 1.1 +++ gas/testsuite/gas/all/sleb128-3.s 12 Apr 2013 14:06:42 -0000 @@ -1,4 +1,3 @@ -.data -bar: -.sleb128 100 - 200 -.byte 42 + .data + .sleb128 100 - 200 + .byte 42 Index: gas/testsuite/gas/all/sleb128-4.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/all/sleb128-4.s,v retrieving revision 1.1 diff -u -p -r1.1 sleb128-4.s --- gas/testsuite/gas/all/sleb128-4.s 11 Apr 2013 10:54:13 -0000 1.1 +++ gas/testsuite/gas/all/sleb128-4.s 12 Apr 2013 14:06:42 -0000 @@ -1,13 +1,10 @@ -.text -.globl foo -foo: -.L1: -.byte 0 -.byte 0 -.byte 0 -.L2: + .text +_L1: + .byte 0 + .byte 0 + .byte 0 +_L2: -.data -bar: -.sleb128 .L2 - .L1 + (1 << 31) -.byte 42 + .data + .sleb128 _L2 - _L1 + (1 << 31) + .byte 42 Index: gas/testsuite/gas/all/sleb128-5.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/all/sleb128-5.s,v retrieving revision 1.1 diff -u -p -r1.1 sleb128-5.s --- gas/testsuite/gas/all/sleb128-5.s 11 Apr 2013 10:54:13 -0000 1.1 +++ gas/testsuite/gas/all/sleb128-5.s 12 Apr 2013 14:06:42 -0000 @@ -1,13 +1,10 @@ -.text -.globl foo -foo: -.L1: -.byte 0 -.byte 0 -.byte 0 -.L2: + .text +_L1: + .byte 0 + .byte 0 + .byte 0 +_L2: -.data -bar: -.sleb128 .L1 - .L2 + 4 -.byte 42 + .data + .sleb128 _L1 - _L2 + 4 + .byte 42 Index: gas/testsuite/gas/all/sleb128-7.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/all/sleb128-7.s,v retrieving revision 1.1 diff -u -p -r1.1 sleb128-7.s --- gas/testsuite/gas/all/sleb128-7.s 11 Apr 2013 10:54:13 -0000 1.1 +++ gas/testsuite/gas/all/sleb128-7.s 12 Apr 2013 14:06:42 -0000 @@ -1,19 +1,16 @@ -.text -.globl foo -foo: -.L1: -.byte 0 -.byte 0 -.byte 0 -.L2: + .text +_L1: + .byte 0 + .byte 0 + .byte 0 +_L2: -.data -bar: -.sleb128 200+(.L2 - .L1) -.byte 42 -.sleb128 200+(.L1 - .L2) -.byte 42 -.sleb128 (.L2 - .L1)+200 -.byte 42 -.sleb128 (.L1 - .L2)+200 -.byte 42 + .data + .sleb128 200+(_L2 - _L1) + .byte 42 + .sleb128 200+(_L1 - _L2) + .byte 42 + .sleb128 (_L2 - _L1)+200 + .byte 42 + .sleb128 (_L1 - _L2)+200 + .byte 42