aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLulu Cai <cailulu@loongson.cn>2024-09-02 12:05:54 +0800
committerliuzhensong <liuzhensong@loongson.cn>2024-09-09 15:11:53 +0800
commit6c2358b90adb376f0b2cec4e19759d37e9abdd28 (patch)
tree0c99eeea4ce2e7fced5b712d36379af836d27dd9
parent4bc828f8765d0b342d3d57837172170d14d36966 (diff)
downloadgdb-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 "-".
-rw-r--r--gas/config/loongarch-parse.y24
-rw-r--r--gas/testsuite/gas/loongarch/insn_expr.d10
-rw-r--r--gas/testsuite/gas/loongarch/insn_expr.s1
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)