87 lines
3.1 KiB
Diff
87 lines
3.1 KiB
Diff
From 75fd1d4832ec228aa66be49e24ba686bfeb5507b Mon Sep 17 00:00:00 2001
|
|
From: Lulu Cai <cailulu@loongson.cn>
|
|
Date: Mon, 2 Sep 2024 12:05:54 +0800
|
|
Subject: [PATCH 119/123] 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 "-".
|
|
---
|
|
gas/config/loongarch-parse.y | 24 ++++++++++++------------
|
|
gas/testsuite/gas/loongarch/insn_expr.d | 10 ++++++++++
|
|
gas/testsuite/gas/loongarch/insn_expr.s | 1 +
|
|
3 files changed, 23 insertions(+), 12 deletions(-)
|
|
create mode 100644 gas/testsuite/gas/loongarch/insn_expr.d
|
|
create mode 100644 gas/testsuite/gas/loongarch/insn_expr.s
|
|
|
|
diff --git a/gas/config/loongarch-parse.y b/gas/config/loongarch-parse.y
|
|
index f786fdae..ec5a4166 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 00000000..9abc711a
|
|
--- /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 00000000..3b9ef08a
|
|
--- /dev/null
|
|
+++ b/gas/testsuite/gas/loongarch/insn_expr.s
|
|
@@ -0,0 +1 @@
|
|
+addi.d $a0,$a1,(8 >> 2 + 1)
|
|
--
|
|
2.33.0
|
|
|