| 1273 | } |
| 1274 | |
| 1275 | inline s32 __THPHuffDecodeTab(register THPFileInfo *info, register THPHuffmanTab *h) |
| 1276 | { |
| 1277 | register s32 code; |
| 1278 | register u32 cnt; |
| 1279 | register s32 cb; |
| 1280 | register u32 increment; |
| 1281 | register s32 tmp; |
| 1282 | |
| 1283 | #define cnt4 code |
| 1284 | asm |
| 1285 | { |
| 1286 | lwz cnt, info->cnt; |
| 1287 | addi increment, h, 32; |
| 1288 | lwz cb, info->currByte; |
| 1289 | addi cnt4, cnt, 4; |
| 1290 | cmpwi cnt, 28; |
| 1291 | rlwnm tmp, cb, cnt4, 27, 31; |
| 1292 | bgt _notEnoughBits; |
| 1293 | lbzx code, h, tmp; |
| 1294 | lbzx increment, increment, tmp; |
| 1295 | cmpwi code, 0xFF; |
| 1296 | beq _FailedCheckEnoughBits; |
| 1297 | add cnt, cnt, increment; |
| 1298 | stw cnt, info->cnt; |
| 1299 | } |
| 1300 | _done: |
| 1301 | return code; |
| 1302 | |
| 1303 | { |
| 1304 | register u32 maxcodebase; |
| 1305 | register u32 tmp2; |
| 1306 | |
| 1307 | _FailedCheckEnoughBits: |
| 1308 | maxcodebase = (u32) & (h->maxCode); |
| 1309 | cnt += 5; |
| 1310 | |
| 1311 | asm { |
| 1312 | li tmp2, sizeof(s32)*(5); |
| 1313 | li code, 5; |
| 1314 | add maxcodebase, maxcodebase, tmp2; |
| 1315 | __WHILE_START: |
| 1316 | cmpwi cnt, 33; |
| 1317 | slwi tmp, tmp, 1 |
| 1318 | |
| 1319 | beq _FCEB_faster; |
| 1320 | rlwnm increment, cb, cnt, 31, 31; |
| 1321 | lwzu tmp2, 4(maxcodebase); |
| 1322 | or tmp, tmp, increment |
| 1323 | addi cnt, cnt, 1; |
| 1324 | b __WHILE_CHECK; |
| 1325 | |
| 1326 | _FCEB_faster: |
| 1327 | lwz increment, info->c; |
| 1328 | li cnt, 1; |
| 1329 | lwzu cb, 4(increment); |
| 1330 | lwzu tmp2, 4(maxcodebase); |
| 1331 | |
| 1332 | stw increment, info->c; |
no outgoing calls
no test coverage detected