[binutils-gdb] LoongArch: Fixed precedence of expression operators in instructions

liu & zhensong liuzhensong@sourceware.org
Mon Sep 9 07:12:24 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6c2358b90adb376f0b2cec4e19759d37e9abdd28

commit 6c2358b90adb376f0b2cec4e19759d37e9abdd28
Author: Lulu Cai <cailulu@loongson.cn>
Date:   Mon Sep 2 12:05:54 2024 +0800

    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:
---
 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(-)

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)


More information about the Binutils-cvs mailing list