mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-29 08:24:05 +08:00
Handle overflow from signed divide by -1.
This commit is contained in:
@ -3488,6 +3488,14 @@ build_instruction (doisa, features, mips16, insn)
|
|||||||
{
|
{
|
||||||
char hi = (i == 0 ? ' ' : '1');
|
char hi = (i == 0 ? ' ' : '1');
|
||||||
int d = i * 2;
|
int d = i * 2;
|
||||||
|
if (! (insn->flags & UNSIGNED))
|
||||||
|
{
|
||||||
|
printf("if (RT_SW(%d) == -1)\n", d );
|
||||||
|
printf(" {\n");
|
||||||
|
printf(" LO%c = -RS_%sW(%d);\n", hi, sign, d );
|
||||||
|
printf(" HI%c = 0;\n", hi );
|
||||||
|
printf(" }\nelse ");
|
||||||
|
};
|
||||||
printf("if (RT_UW(%d) != 0)\n", d );
|
printf("if (RT_UW(%d) != 0)\n", d );
|
||||||
printf(" {\n");
|
printf(" {\n");
|
||||||
printf(" LO%c = (signed32)(RS_%sW(%d) / RT_%sW(%d));\n", hi, sign, d, sign, d );
|
printf(" LO%c = (signed32)(RS_%sW(%d) / RT_%sW(%d));\n", hi, sign, d, sign, d );
|
||||||
@ -3499,7 +3507,18 @@ build_instruction (doisa, features, mips16, insn)
|
|||||||
|
|
||||||
case PDIVBW:
|
case PDIVBW:
|
||||||
printf("signed32 devisor = RT_SH(0);\n");
|
printf("signed32 devisor = RT_SH(0);\n");
|
||||||
printf("if (devisor != 0)\n");
|
printf("if (devisor == -1)\n");
|
||||||
|
printf(" {\n");
|
||||||
|
printf(" LO_SW(0) = -RS_SW(0);\n");
|
||||||
|
printf(" HI_SW(0) = 0;\n");
|
||||||
|
printf(" LO_SW(1) = -RS_SW(1);\n");
|
||||||
|
printf(" HI_SW(1) = 0;\n");
|
||||||
|
printf(" LO_SW(2) = -RS_SW(2);\n");
|
||||||
|
printf(" HI_SW(2) = 0;\n");
|
||||||
|
printf(" LO_SW(3) = -RS_SW(3);\n");
|
||||||
|
printf(" HI_SW(3) = 0;\n");
|
||||||
|
printf(" }\n");
|
||||||
|
printf("else if (devisor != 0)\n");
|
||||||
printf(" {\n");
|
printf(" {\n");
|
||||||
printf(" LO_SW(0) = RS_SW(0) / devisor;\n");
|
printf(" LO_SW(0) = RS_SW(0) / devisor;\n");
|
||||||
printf(" HI_SW(0) = SIGNEXTEND( (RS_SW(0) %% devisor), 16 );\n");
|
printf(" HI_SW(0) = SIGNEXTEND( (RS_SW(0) %% devisor), 16 );\n");
|
||||||
|
Reference in New Issue
Block a user