diff options
author | Lulu Cai <cailulu@loongson.cn> | 2024-09-02 12:05:54 +0800 |
---|---|---|
committer | liuzhensong <liuzhensong@loongson.cn> | 2024-09-09 15:11:53 +0800 |
commit | 6c2358b90adb376f0b2cec4e19759d37e9abdd28 (patch) | |
tree | 0c99eeea4ce2e7fced5b712d36379af836d27dd9 /gas | |
parent | 4bc828f8765d0b342d3d57837172170d14d36966 (diff) | |
download | gdb-6c2358b90adb376f0b2cec4e19759d37e9abdd28.zip gdb-6c2358b90adb376f0b2cec4e19759d37e9abdd28.tar.gz gdb-6c2358b90adb376f0b2cec4e19759d37e9abdd28.tar.bz2 |
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 "-".
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/loongarch-parse.y | 24 | ||||
-rw-r--r-- | gas/testsuite/gas/loongarch/insn_expr.d | 10 | ||||
-rw-r--r-- | gas/testsuite/gas/loongarch/insn_expr.s | 1 |
3 files changed, 23 insertions, 12 deletions
diff --git a/gas/config/loongarch-parse.y b/gas/config/loongarch-parse.y index 63a4fcf..0607248 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 0000000..9abc711 --- /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 0000000..3b9ef08 --- /dev/null +++ b/gas/testsuite/gas/loongarch/insn_expr.s @@ -0,0 +1 @@ +addi.d $a0,$a1,(8 >> 2 + 1) |