diff options
Diffstat (limited to 'gas/config/loongarch-parse.y')
-rw-r--r-- | gas/config/loongarch-parse.y | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/gas/config/loongarch-parse.y b/gas/config/loongarch-parse.y index 97055fe..d575748 100644 --- a/gas/config/loongarch-parse.y +++ b/gas/config/loongarch-parse.y @@ -42,7 +42,7 @@ is_const (struct reloc_info *info) } int -loongarch_parse_expr (const char *expr, +loongarch_parse_expr (const char *exp, struct reloc_info *reloc_stack_top, size_t max_reloc_num, size_t *reloc_num, @@ -52,7 +52,7 @@ loongarch_parse_expr (const char *expr, struct yy_buffer_state *buffstate; top = reloc_stack_top; end = top + max_reloc_num; - buffstate = yy_scan_string (expr); + buffstate = yy_scan_string (exp); ret = yyparse (); if (ret == 0) @@ -207,29 +207,41 @@ emit_bin (int op) switch (op) { case '*': - opr1 = opr1 * opr2; + opr1 = (valueT) opr1 * (valueT) opr2; break; case '/': - opr1 = opr1 / opr2; + if (opr2 == 0) + { + as_warn (_("Divide by zero!")); + opr1 = 0; + } + else + opr1 = opr1 / opr2; break; case '%': - opr1 = opr1 % opr2; + if (opr2 == 0) + { + as_warn (_("Divide by zero!")); + opr1 = 0; + } + else + opr1 = opr1 % opr2; break; case '+': - opr1 = opr1 + opr2; + opr1 = (valueT) opr1 + (valueT) opr2; break; case '-': - opr1 = opr1 - opr2; + opr1 = (valueT) opr1 - (valueT) opr2; break; case LEFT_OP: - opr1 = opr1 << opr2; + opr1 = (valueT) opr1 << opr2; break; case RIGHT_OP: if (opr1 < 0) - as_warn(_("Right shift of negative numbers may be changed " - "from arithmetic right shift to logical right shift!")); - /* Algorithm right shift. */ - opr1 = (offsetT)opr1 >> (offsetT)opr2; + as_warn (_("Right shift of negative numbers may be changed " + "from arithmetic right shift to logical right shift!")); + /* Arithmetic right shift. */ + opr1 = opr1 >> opr2; break; case '<': opr1 = opr1 < opr2; |