From: Lulu Cai Date: Mon, 2 Sep 2024 04:05:54 +0000 (+0800) Subject: LoongArch: Fixed precedence of expression operators in instructions X-Git-Tag: gdb-16-branchpoint~946 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6c2358b90adb376f0b2cec4e19759d37e9abdd28;p=thirdparty%2Fbinutils-gdb.git LoongArch: Fixed precedence of expression operators in instructions The precedence of the operators "+" and "-" in the current loongarch instruction expression is higher than "<<" and ">>", which is different from the explanation in the user guide. We modified the precedence of "<<" and ">>" to be higher than "+" and "-". --- diff --git a/gas/config/loongarch-parse.y b/gas/config/loongarch-parse.y index 63a4fcf0cda..0607248bb41 100644 --- a/gas/config/loongarch-parse.y +++ b/gas/config/loongarch-parse.y @@ -368,24 +368,24 @@ multiplicative_expression | multiplicative_expression '%' unary_expression {emit_bin ('%');} ; -additive_expression +shift_expression : multiplicative_expression - | additive_expression '+' multiplicative_expression {emit_bin ('+');} - | additive_expression '-' multiplicative_expression {emit_bin ('-');} + | shift_expression LEFT_OP multiplicative_expression {emit_bin (LEFT_OP);} + | shift_expression RIGHT_OP multiplicative_expression {emit_bin (RIGHT_OP);} ; -shift_expression - : additive_expression - | shift_expression LEFT_OP additive_expression {emit_bin (LEFT_OP);} - | shift_expression RIGHT_OP additive_expression {emit_bin (RIGHT_OP);} +additive_expression + : shift_expression + | additive_expression '+' shift_expression {emit_bin ('+');} + | additive_expression '-' shift_expression {emit_bin ('-');} ; relational_expression - : shift_expression - | relational_expression '<' shift_expression {emit_bin ('<');} - | relational_expression '>' shift_expression {emit_bin ('>');} - | relational_expression LE_OP shift_expression {emit_bin (LE_OP);} - | relational_expression GE_OP shift_expression {emit_bin (GE_OP);} + : additive_expression + | relational_expression '<' additive_expression {emit_bin ('<');} + | relational_expression '>' additive_expression {emit_bin ('>');} + | relational_expression LE_OP additive_expression {emit_bin (LE_OP);} + | relational_expression GE_OP additive_expression {emit_bin (GE_OP);} ; equality_expression diff --git a/gas/testsuite/gas/loongarch/insn_expr.d b/gas/testsuite/gas/loongarch/insn_expr.d new file mode 100644 index 00000000000..9abc711a317 --- /dev/null +++ b/gas/testsuite/gas/loongarch/insn_expr.d @@ -0,0 +1,10 @@ +#as: +#objdump: -d + +.*: file format .* + + +Disassembly of section \.text: + +0+ <\.text>: + 0: 02c00ca4 addi.d \$a0, \$a1, 3 diff --git a/gas/testsuite/gas/loongarch/insn_expr.s b/gas/testsuite/gas/loongarch/insn_expr.s new file mode 100644 index 00000000000..3b9ef08afc9 --- /dev/null +++ b/gas/testsuite/gas/loongarch/insn_expr.s @@ -0,0 +1 @@ +addi.d $a0,$a1,(8 >> 2 + 1)