diff options
Diffstat (limited to 'meta-microblaze/recipes-devtools/gcc/gcc-13/0045-fixed-typos-in-mul-div-and-mod-assembly-files.patch')
| -rw-r--r-- | meta-microblaze/recipes-devtools/gcc/gcc-13/0045-fixed-typos-in-mul-div-and-mod-assembly-files.patch | 465 |
1 files changed, 465 insertions, 0 deletions
diff --git a/meta-microblaze/recipes-devtools/gcc/gcc-13/0045-fixed-typos-in-mul-div-and-mod-assembly-files.patch b/meta-microblaze/recipes-devtools/gcc/gcc-13/0045-fixed-typos-in-mul-div-and-mod-assembly-files.patch new file mode 100644 index 00000000..4760926f --- /dev/null +++ b/meta-microblaze/recipes-devtools/gcc/gcc-13/0045-fixed-typos-in-mul-div-and-mod-assembly-files.patch | |||
| @@ -0,0 +1,465 @@ | |||
| 1 | From 3c6f051ce41f06eab29932859be52ed864bef52f Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Wed, 17 Apr 2019 12:36:16 +0530 | ||
| 4 | Subject: [PATCH 45/54] fixed typos in mul,div and mod assembly files. | ||
| 5 | |||
| 6 | --- | ||
| 7 | libgcc/config/microblaze/divsi3.S | 47 ++++++++++++++++++++---- | ||
| 8 | libgcc/config/microblaze/modsi3.S | 40 ++++++++++++++++++--- | ||
| 9 | libgcc/config/microblaze/mulsi3.S | 33 ++++++++++++++++- | ||
| 10 | libgcc/config/microblaze/udivsi3.S | 54 +++++++++++++++++++++++++--- | ||
| 11 | libgcc/config/microblaze/umodsi3.S | 58 +++++++++++++++++++++++++++--- | ||
| 12 | 5 files changed, 212 insertions(+), 20 deletions(-) | ||
| 13 | |||
| 14 | diff --git a/libgcc/config/microblaze/divsi3.S b/libgcc/config/microblaze/divsi3.S | ||
| 15 | index 9f04f59104e..e1dfccbf257 100644 | ||
| 16 | --- a/libgcc/config/microblaze/divsi3.S | ||
| 17 | +++ b/libgcc/config/microblaze/divsi3.S | ||
| 18 | @@ -46,7 +46,7 @@ | ||
| 19 | __divsi3: | ||
| 20 | .frame r1,0,r15 | ||
| 21 | |||
| 22 | - ADDIK r1,r1,-32 | ||
| 23 | + ADDLIK r1,r1,-32 | ||
| 24 | SLI r28,r1,0 | ||
| 25 | SLI r29,r1,8 | ||
| 26 | SLI r30,r1,16 | ||
| 27 | @@ -61,13 +61,23 @@ __divsi3: | ||
| 28 | SWI r30,r1,8 | ||
| 29 | SWI r31,r1,12 | ||
| 30 | #endif | ||
| 31 | - BEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 32 | - BEQI r5,$LaResult_Is_Zero # Result is Zero | ||
| 33 | - BGEID r5,$LaR5_Pos | ||
| 34 | +#ifdef __arch64__ | ||
| 35 | + BEAEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 36 | + BEAEQI r5,$LaResult_Is_Zero # Result is Zero | ||
| 37 | + BEAGEID r5,$LaR5_Pos | ||
| 38 | +#else | ||
| 39 | + BEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 40 | + BEQI r5,$LaResult_Is_Zero # Result is Zero | ||
| 41 | + BGEID r5,$LaR5_Pos | ||
| 42 | +#endif | ||
| 43 | XOR r28,r5,r6 # Get the sign of the result | ||
| 44 | RSUBI r5,r5,0 # Make r5 positive | ||
| 45 | $LaR5_Pos: | ||
| 46 | - BGEI r6,$LaR6_Pos | ||
| 47 | +#ifdef __arch64__ | ||
| 48 | + BEAGEI r6,$LaR6_Pos | ||
| 49 | +#else | ||
| 50 | + BGEI r6,$LaR6_Pos | ||
| 51 | +#endif | ||
| 52 | RSUBI r6,r6,0 # Make r6 positive | ||
| 53 | $LaR6_Pos: | ||
| 54 | ADDIK r30,r0,0 # Clear mod | ||
| 55 | @@ -76,26 +86,51 @@ $LaR6_Pos: | ||
| 56 | |||
| 57 | # First part try to find the first '1' in the r5 | ||
| 58 | $LaDIV0: | ||
| 59 | - BLTI r5,$LaDIV2 # This traps r5 == 0x80000000 | ||
| 60 | +#ifdef __arch64__ | ||
| 61 | + BEALTI r5,$LaDIV2 # This traps r5 == 0x80000000 | ||
| 62 | +#else | ||
| 63 | + BLTI r5,$LaDIV2 # This traps r5 == 0x80000000 | ||
| 64 | +#endif | ||
| 65 | $LaDIV1: | ||
| 66 | ADD r5,r5,r5 # left shift logical r5 | ||
| 67 | +#ifdef __arch64__ | ||
| 68 | + BEAGTID r5,$LaDIV1 | ||
| 69 | +#else | ||
| 70 | BGTID r5,$LaDIV1 | ||
| 71 | +#endif | ||
| 72 | ADDIK r29,r29,-1 | ||
| 73 | $LaDIV2: | ||
| 74 | ADD r5,r5,r5 # left shift logical r5 get the '1' into the Carry | ||
| 75 | ADDC r30,r30,r30 # Move that bit into the Mod register | ||
| 76 | RSUB r31,r6,r30 # Try to subtract (r30 a r6) | ||
| 77 | +#ifdef __arch64__ | ||
| 78 | + BEALTI r31,$LaMOD_TOO_SMALL | ||
| 79 | +#else | ||
| 80 | BLTI r31,$LaMOD_TOO_SMALL | ||
| 81 | +#endif | ||
| 82 | OR r30,r0,r31 # Move the r31 to mod since the result was positive | ||
| 83 | ADDIK r3,r3,1 | ||
| 84 | $LaMOD_TOO_SMALL: | ||
| 85 | ADDIK r29,r29,-1 | ||
| 86 | +#ifdef __arch64__ | ||
| 87 | + BEAEQi r29,$LaLOOP_END | ||
| 88 | +#else | ||
| 89 | BEQi r29,$LaLOOP_END | ||
| 90 | +#endif | ||
| 91 | ADD r3,r3,r3 # Shift in the '1' into div | ||
| 92 | +#ifdef __arch64__ | ||
| 93 | + BREAI $LaDIV2 # Div2 | ||
| 94 | +#else | ||
| 95 | BRI $LaDIV2 # Div2 | ||
| 96 | +#endif | ||
| 97 | $LaLOOP_END: | ||
| 98 | +#ifdef __arch64__ | ||
| 99 | + BEAGEI r28,$LaRETURN_HERE | ||
| 100 | + BREAID $LaRETURN_HERE | ||
| 101 | +#else | ||
| 102 | BGEI r28,$LaRETURN_HERE | ||
| 103 | BRID $LaRETURN_HERE | ||
| 104 | +#endif | ||
| 105 | RSUBI r3,r3,0 # Negate the result | ||
| 106 | $LaDiv_By_Zero: | ||
| 107 | $LaResult_Is_Zero: | ||
| 108 | diff --git a/libgcc/config/microblaze/modsi3.S b/libgcc/config/microblaze/modsi3.S | ||
| 109 | index f8684db721e..3bf9b10ec3e 100644 | ||
| 110 | --- a/libgcc/config/microblaze/modsi3.S | ||
| 111 | +++ b/libgcc/config/microblaze/modsi3.S | ||
| 112 | @@ -62,40 +62,72 @@ __modsi3: | ||
| 113 | swi r31,r1,12 | ||
| 114 | #endif | ||
| 115 | |||
| 116 | +#ifdef __arch64__ | ||
| 117 | + BEAEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 118 | + BEAEQI r5,$LaResult_Is_Zero # Result is Zero | ||
| 119 | + BEAGEId r5,$LaR5_Pos | ||
| 120 | +#else | ||
| 121 | BEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 122 | BEQI r5,$LaResult_Is_Zero # Result is Zero | ||
| 123 | BGEId r5,$LaR5_Pos | ||
| 124 | +#endif | ||
| 125 | ADD r28,r5,r0 # Get the sign of the result [ Depends only on the first arg] | ||
| 126 | RSUBI r5,r5,0 # Make r5 positive | ||
| 127 | $LaR5_Pos: | ||
| 128 | - BGEI r6,$LaR6_Pos | ||
| 129 | +#ifdef __arch64__ | ||
| 130 | + BEAGEI r6,$LaR6_Pos | ||
| 131 | +#else | ||
| 132 | + BGEI r6,$LaR6_Pos | ||
| 133 | +#endif | ||
| 134 | RSUBI r6,r6,0 # Make r6 positive | ||
| 135 | $LaR6_Pos: | ||
| 136 | ADDIK r3,r0,0 # Clear mod | ||
| 137 | ADDIK r30,r0,0 # clear div | ||
| 138 | - BLTId r5,$LaDIV2 # If r5 is still negative (0x80000000), skip | ||
| 139 | +#ifdef __arch64__ | ||
| 140 | + BEALTId r5,$LaDIV2 # If r5 is still negative (0x80000000), skip | ||
| 141 | # the first bit search. | ||
| 142 | +#else | ||
| 143 | + BLTId r5,$LaDIV2 # If r5 is still negative (0x80000000), skip | ||
| 144 | + # the first bit search. | ||
| 145 | +#endif | ||
| 146 | ADDIK r29,r0,32 # Initialize the loop count | ||
| 147 | # First part try to find the first '1' in the r5 | ||
| 148 | $LaDIV1: | ||
| 149 | ADD r5,r5,r5 # left shift logical r5 | ||
| 150 | - BGEID r5,$LaDIV1 # | ||
| 151 | +#ifdef __arch64__ | ||
| 152 | + BEAGEID r5,$LaDIV1 # | ||
| 153 | +#else | ||
| 154 | + BGEID r5,$LaDIV1 # | ||
| 155 | +#endif | ||
| 156 | ADDIK r29,r29,-1 | ||
| 157 | $LaDIV2: | ||
| 158 | ADD r5,r5,r5 # left shift logical r5 get the '1' into the Carry | ||
| 159 | ADDC r3,r3,r3 # Move that bit into the Mod register | ||
| 160 | rSUB r31,r6,r3 # Try to subtract (r30 a r6) | ||
| 161 | +#ifdef __arch64__ | ||
| 162 | + BEALTi r31,$LaMOD_TOO_SMALL | ||
| 163 | +#else | ||
| 164 | BLTi r31,$LaMOD_TOO_SMALL | ||
| 165 | +#endif | ||
| 166 | OR r3,r0,r31 # Move the r31 to mod since the result was positive | ||
| 167 | ADDIK r30,r30,1 | ||
| 168 | $LaMOD_TOO_SMALL: | ||
| 169 | ADDIK r29,r29,-1 | ||
| 170 | +#ifdef __arch64__ | ||
| 171 | + BEAEQi r29,$LaLOOP_END | ||
| 172 | + ADD r30,r30,r30 # Shift in the '1' into div | ||
| 173 | + BREAI $LaDIV2 # Div2 | ||
| 174 | +$LaLOOP_END: | ||
| 175 | + BEAGEI r28,$LaRETURN_HERE | ||
| 176 | + BREAId $LaRETURN_HERE | ||
| 177 | +#else | ||
| 178 | BEQi r29,$LaLOOP_END | ||
| 179 | ADD r30,r30,r30 # Shift in the '1' into div | ||
| 180 | BRI $LaDIV2 # Div2 | ||
| 181 | $LaLOOP_END: | ||
| 182 | BGEI r28,$LaRETURN_HERE | ||
| 183 | BRId $LaRETURN_HERE | ||
| 184 | +#endif | ||
| 185 | rsubi r3,r3,0 # Negate the result | ||
| 186 | $LaDiv_By_Zero: | ||
| 187 | $LaResult_Is_Zero: | ||
| 188 | @@ -108,7 +140,7 @@ $LaRETURN_HERE: | ||
| 189 | lli r29,r1,8 | ||
| 190 | lli r30,r1,16 | ||
| 191 | lli r31,r1,24 | ||
| 192 | - addik r1,r1,32 | ||
| 193 | + addlik r1,r1,32 | ||
| 194 | rtsd r15,8 | ||
| 195 | nop | ||
| 196 | #else | ||
| 197 | diff --git a/libgcc/config/microblaze/mulsi3.S b/libgcc/config/microblaze/mulsi3.S | ||
| 198 | index 437e2bc309e..bc9ff9cdc89 100644 | ||
| 199 | --- a/libgcc/config/microblaze/mulsi3.S | ||
| 200 | +++ b/libgcc/config/microblaze/mulsi3.S | ||
| 201 | @@ -43,7 +43,37 @@ | ||
| 202 | .type __mulsi3,@function | ||
| 203 | #ifdef __arch64__ | ||
| 204 | .align 3 | ||
| 205 | -#endif | ||
| 206 | +__mulsi3: | ||
| 207 | + .frame r1,0,r15 | ||
| 208 | + add r3,r0,r0 | ||
| 209 | + BEAEQI r5,$L_Result_Is_Zero # Multiply by Zero | ||
| 210 | + BEAEQI r6,$L_Result_Is_Zero # Multiply by Zero | ||
| 211 | + BEAGEId r5,$L_R5_Pos | ||
| 212 | + XOR r4,r5,r6 # Get the sign of the result | ||
| 213 | + RSUBI r5,r5,0 # Make r5 positive | ||
| 214 | +$L_R5_Pos: | ||
| 215 | + BEAGEI r6,$L_R6_Pos | ||
| 216 | + RSUBI r6,r6,0 # Make r6 positive | ||
| 217 | +$L_R6_Pos: | ||
| 218 | + breai $L1 | ||
| 219 | +$L2: | ||
| 220 | + add r5,r5,r5 | ||
| 221 | +$L1: | ||
| 222 | + srl r6,r6 | ||
| 223 | + addc r7,r0,r0 | ||
| 224 | + beaeqi r7,$L2 | ||
| 225 | + beaneid r6,$L2 | ||
| 226 | + add r3,r3,r5 | ||
| 227 | + bealti r4,$L_NegateResult | ||
| 228 | + rtsd r15,8 | ||
| 229 | + nop | ||
| 230 | +$L_NegateResult: | ||
| 231 | + rtsd r15,8 | ||
| 232 | + rsub r3,r3,r0 | ||
| 233 | +$L_Result_Is_Zero: | ||
| 234 | + rtsd r15,8 | ||
| 235 | + addi r3,r0,0 | ||
| 236 | +#else | ||
| 237 | __mulsi3: | ||
| 238 | .frame r1,0,r15 | ||
| 239 | add r3,r0,r0 | ||
| 240 | @@ -74,5 +104,6 @@ $L_NegateResult: | ||
| 241 | $L_Result_Is_Zero: | ||
| 242 | rtsd r15,8 | ||
| 243 | addi r3,r0,0 | ||
| 244 | +#endif | ||
| 245 | .end __mulsi3 | ||
| 246 | .size __mulsi3, . - __mulsi3 | ||
| 247 | diff --git a/libgcc/config/microblaze/udivsi3.S b/libgcc/config/microblaze/udivsi3.S | ||
| 248 | index 496dd6794bf..486bc8f0819 100644 | ||
| 249 | --- a/libgcc/config/microblaze/udivsi3.S | ||
| 250 | +++ b/libgcc/config/microblaze/udivsi3.S | ||
| 251 | @@ -59,52 +59,96 @@ __udivsi3: | ||
| 252 | SWI r30,r1,4 | ||
| 253 | SWI r31,r1,8 | ||
| 254 | #endif | ||
| 255 | +#ifdef __arch64__ | ||
| 256 | + BEAEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 257 | + BEAEQID r5,$LaResult_Is_Zero # Result is Zero | ||
| 258 | +#else | ||
| 259 | BEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 260 | BEQID r5,$LaResult_Is_Zero # Result is Zero | ||
| 261 | +#endif | ||
| 262 | ADDIK r30,r0,0 # Clear mod | ||
| 263 | ADDIK r29,r0,32 # Initialize the loop count | ||
| 264 | |||
| 265 | # Check if r6 and r5 are equal # if yes, return 1 | ||
| 266 | RSUB r18,r5,r6 | ||
| 267 | +#ifdef __arch64__ | ||
| 268 | + BEAEQID r18,$LaRETURN_HERE | ||
| 269 | +#else | ||
| 270 | BEQID r18,$LaRETURN_HERE | ||
| 271 | +#endif | ||
| 272 | ADDIK r3,r0,1 | ||
| 273 | |||
| 274 | # Check if (uns)r6 is greater than (uns)r5. In that case, just return 0 | ||
| 275 | XOR r18,r5,r6 | ||
| 276 | - BGEID r18,16 | ||
| 277 | +#ifdef __arch64__ | ||
| 278 | + BEAGEID r18,16 | ||
| 279 | +#else | ||
| 280 | + BGEID r18,16 | ||
| 281 | +#endif | ||
| 282 | ADD r3,r0,r0 # We would anyways clear r3 | ||
| 283 | +#ifdef __arch64__ | ||
| 284 | + BEALTI r6,$LaRETURN_HERE # r6[bit 31 = 1] hence is greater | ||
| 285 | + BREAI $LCheckr6 | ||
| 286 | + RSUB r18,r6,r5 # MICROBLAZEcmp | ||
| 287 | + BEALTI r18,$LaRETURN_HERE | ||
| 288 | +#else | ||
| 289 | BLTI r6,$LaRETURN_HERE # r6[bit 31 = 1] hence is greater | ||
| 290 | BRI $LCheckr6 | ||
| 291 | RSUB r18,r6,r5 # MICROBLAZEcmp | ||
| 292 | BLTI r18,$LaRETURN_HERE | ||
| 293 | - | ||
| 294 | +#endif | ||
| 295 | # If r6 [bit 31] is set, then return result as 1 | ||
| 296 | $LCheckr6: | ||
| 297 | - BGTI r6,$LaDIV0 | ||
| 298 | - BRID $LaRETURN_HERE | ||
| 299 | +#ifdef __arch64__ | ||
| 300 | + BEAGTI r6,$LaDIV0 | ||
| 301 | + BREAID $LaRETURN_HERE | ||
| 302 | +#else | ||
| 303 | + BGTI r6,$LaDIV0 | ||
| 304 | + BRID $LaRETURN_HERE | ||
| 305 | +#endif | ||
| 306 | ADDIK r3,r0,1 | ||
| 307 | |||
| 308 | # First part try to find the first '1' in the r5 | ||
| 309 | $LaDIV0: | ||
| 310 | +#ifdef __arch64__ | ||
| 311 | + BEALTI r5,$LaDIV2 | ||
| 312 | +#else | ||
| 313 | BLTI r5,$LaDIV2 | ||
| 314 | +#endif | ||
| 315 | $LaDIV1: | ||
| 316 | ADD r5,r5,r5 # left shift logical r5 | ||
| 317 | +#ifdef __arch64__ | ||
| 318 | + BEAGTID r5,$LaDIV1 | ||
| 319 | +#else | ||
| 320 | BGTID r5,$LaDIV1 | ||
| 321 | +#endif | ||
| 322 | ADDIK r29,r29,-1 | ||
| 323 | $LaDIV2: | ||
| 324 | ADD r5,r5,r5 # left shift logical r5 get the '1' into the Carry | ||
| 325 | ADDC r30,r30,r30 # Move that bit into the Mod register | ||
| 326 | RSUB r31,r6,r30 # Try to subtract (r30 a r6) | ||
| 327 | +#ifdef __arch64__ | ||
| 328 | + BEALTI r31,$LaMOD_TOO_SMALL | ||
| 329 | +#else | ||
| 330 | BLTI r31,$LaMOD_TOO_SMALL | ||
| 331 | +#endif | ||
| 332 | OR r30,r0,r31 # Move the r31 to mod since the result was positive | ||
| 333 | ADDIK r3,r3,1 | ||
| 334 | $LaMOD_TOO_SMALL: | ||
| 335 | ADDIK r29,r29,-1 | ||
| 336 | +#ifdef __arch64__ | ||
| 337 | + BEAEQi r29,$LaLOOP_END | ||
| 338 | + ADD r3,r3,r3 # Shift in the '1' into div | ||
| 339 | + BREAI $LaDIV2 # Div2 | ||
| 340 | +$LaLOOP_END: | ||
| 341 | + BREAI $LaRETURN_HERE | ||
| 342 | +#else | ||
| 343 | BEQi r29,$LaLOOP_END | ||
| 344 | ADD r3,r3,r3 # Shift in the '1' into div | ||
| 345 | BRI $LaDIV2 # Div2 | ||
| 346 | $LaLOOP_END: | ||
| 347 | BRI $LaRETURN_HERE | ||
| 348 | +#endif | ||
| 349 | $LaDiv_By_Zero: | ||
| 350 | $LaResult_Is_Zero: | ||
| 351 | OR r3,r0,r0 # set result to 0 | ||
| 352 | @@ -115,7 +159,7 @@ $LaRETURN_HERE: | ||
| 353 | LLI r29,r1,0 | ||
| 354 | LLI r30,r1,8 | ||
| 355 | LLI r31,r1,16 | ||
| 356 | - ADDIK r1,r1,24 | ||
| 357 | + ADDLIK r1,r1,24 | ||
| 358 | RTSD r15,8 | ||
| 359 | NOP | ||
| 360 | #else | ||
| 361 | diff --git a/libgcc/config/microblaze/umodsi3.S b/libgcc/config/microblaze/umodsi3.S | ||
| 362 | index a706017c634..1d8e2921745 100644 | ||
| 363 | --- a/libgcc/config/microblaze/umodsi3.S | ||
| 364 | +++ b/libgcc/config/microblaze/umodsi3.S | ||
| 365 | @@ -46,7 +46,7 @@ | ||
| 366 | __umodsi3: | ||
| 367 | .frame r1,0,r15 | ||
| 368 | |||
| 369 | - addik r1,r1,-24 | ||
| 370 | + addlik r1,r1,-24 | ||
| 371 | sli r29,r1,0 | ||
| 372 | sli r30,r1,8 | ||
| 373 | sli r31,r1,16 | ||
| 374 | @@ -59,27 +59,77 @@ __umodsi3: | ||
| 375 | swi r30,r1,4 | ||
| 376 | swi r31,r1,8 | ||
| 377 | #endif | ||
| 378 | +#ifdef __arch64__ | ||
| 379 | + BEAEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 380 | + BEAEQId r5,$LaResult_Is_Zero # Result is Zero | ||
| 381 | +#else | ||
| 382 | BEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error | ||
| 383 | BEQId r5,$LaResult_Is_Zero # Result is Zero | ||
| 384 | +#endif | ||
| 385 | ADDIK r3,r0,0 # Clear div | ||
| 386 | ADDIK r30,r0,0 # clear mod | ||
| 387 | ADDIK r29,r0,32 # Initialize the loop count | ||
| 388 | |||
| 389 | # Check if r6 and r5 are equal # if yes, return 0 | ||
| 390 | rsub r18,r5,r6 | ||
| 391 | - beqi r18,$LaRETURN_HERE | ||
| 392 | |||
| 393 | +#ifdef __arch64__ | ||
| 394 | + beaeqi r18,$LaRETURN_HERE | ||
| 395 | +#else | ||
| 396 | + beqi r18,$LaRETURN_HERE | ||
| 397 | +#endif | ||
| 398 | # Check if (uns)r6 is greater than (uns)r5. In that case, just return r5 | ||
| 399 | xor r18,r5,r6 | ||
| 400 | +#ifdef __arch64__ | ||
| 401 | + beageid r18,16 | ||
| 402 | + addik r3,r5,0 | ||
| 403 | + bealti r6,$LaRETURN_HERE | ||
| 404 | + breai $LCheckr6 | ||
| 405 | + rsub r18,r5,r6 # MICROBLAZEcmp | ||
| 406 | + beagti r18,$LaRETURN_HERE | ||
| 407 | +#else | ||
| 408 | bgeid r18,16 | ||
| 409 | addik r3,r5,0 | ||
| 410 | blti r6,$LaRETURN_HERE | ||
| 411 | bri $LCheckr6 | ||
| 412 | rsub r18,r5,r6 # MICROBLAZEcmp | ||
| 413 | bgti r18,$LaRETURN_HERE | ||
| 414 | - | ||
| 415 | +#endif | ||
| 416 | # If r6 [bit 31] is set, then return result as r5-r6 | ||
| 417 | $LCheckr6: | ||
| 418 | +#ifdef __arch64__ | ||
| 419 | + beagtid r6,$LaDIV0 | ||
| 420 | + addik r3,r0,0 | ||
| 421 | + addik r18,r0,0x7fffffff | ||
| 422 | + and r5,r5,r18 | ||
| 423 | + and r6,r6,r18 | ||
| 424 | + breaid $LaRETURN_HERE | ||
| 425 | + rsub r3,r6,r5 | ||
| 426 | +# First part: try to find the first '1' in the r5 | ||
| 427 | +$LaDIV0: | ||
| 428 | + BEALTI r5,$LaDIV2 | ||
| 429 | +$LaDIV1: | ||
| 430 | + ADD r5,r5,r5 # left shift logical r5 | ||
| 431 | + BEAGEID r5,$LaDIV1 # | ||
| 432 | + ADDIK r29,r29,-1 | ||
| 433 | +$LaDIV2: | ||
| 434 | + ADD r5,r5,r5 # left shift logical r5 get the '1' into the Carry | ||
| 435 | + ADDC r3,r3,r3 # Move that bit into the Mod register | ||
| 436 | + rSUB r31,r6,r3 # Try to subtract (r3 a r6) | ||
| 437 | + BEALTi r31,$LaMOD_TOO_SMALL | ||
| 438 | + OR r3,r0,r31 # Move the r31 to mod since the result was positive | ||
| 439 | + ADDIK r30,r30,1 | ||
| 440 | +$LaMOD_TOO_SMALL: | ||
| 441 | + ADDIK r29,r29,-1 | ||
| 442 | + BEAEQi r29,$LaLOOP_END | ||
| 443 | + ADD r30,r30,r30 # Shift in the '1' into div | ||
| 444 | + BREAI $LaDIV2 # Div2 | ||
| 445 | +$LaLOOP_END: | ||
| 446 | + BREAI $LaRETURN_HERE | ||
| 447 | +$LaDiv_By_Zero: | ||
| 448 | +$LaResult_Is_Zero: | ||
| 449 | + or r3,r0,r0 # set result to 0 | ||
| 450 | +#else | ||
| 451 | bgtid r6,$LaDIV0 | ||
| 452 | addik r3,r0,0 | ||
| 453 | addik r18,r0,0x7fffffff | ||
| 454 | @@ -111,7 +161,7 @@ $LaLOOP_END: | ||
| 455 | $LaDiv_By_Zero: | ||
| 456 | $LaResult_Is_Zero: | ||
| 457 | or r3,r0,r0 # set result to 0 | ||
| 458 | - | ||
| 459 | +#endif | ||
| 460 | #ifdef __arch64__ | ||
| 461 | $LaRETURN_HERE: | ||
| 462 | # Restore values of CSRs and that of r3 and the divisor and the dividend | ||
| 463 | -- | ||
| 464 | 2.34.1 | ||
| 465 | |||
