⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msvc_block_decode_asm.h

📁 JPEG2000压缩解压图像源码
💻 H
📖 第 1 页 / 共 5 页
字号:
row0_skip_non_causal:      // Broadcast significance to left and right neighbours      MOV ECX,[EDI-4]      OR ECX,__SIGMA_CR_BIT*1      MOV [EDI-4],ECX      MOV ECX,[EDI+4]      OR ECX,__SIGMA_CL_BIT*1      MOV [EDI+4],ECX      // Recover and update context word, using ECX register      MOV ECX,EAX      SHL ECX,CHI_POS      OR ECX,[EDI]      OR ECX,__SIGMA_CC_BIT*1      MOV [EDI],ECX      // Write newly significant sample value      SHL EAX,31 // Get sign bit of result into right position      ADD EAX,one_point_five      MOV EBX,cp_to_sp0      MOV [EDI+EBX],EAXrow1:      // Test for coding pass membership      TEST ECX,__CLEANUP_MEMBER_MASK*8      JNZ row2      // Find pointer to the relevant context state record      SHR ECX,3      AND ECX,__NBRHD_MASK      ADD ECX,sig_lut      MOVZX ECX,byte ptr [ECX]      MOV EBX,states      LEA ECX,[EBX+8*ECX]      // Decode symbol      MOV EAX,[ECX] // Get `p_bar_mps' to EAX      SUB EDX,EAX      AND EAX,1 // Get MPS identity in LSB of EAX      ADD EDX,EAX // Correct for the effect of the MPS      JGE significance_test1      CALL mq_non_cdpsignificance_test1:      MOV ECX,[EDI] // Get context word back again      TEST EAX,EAX // If symbol != 0      JZ row2row1_significant:      // If we get here, we know that stripe row 1 is newly significant      AND ECX,__CHI_BIT+__SIGMA_CC_BIT+__CHI_BIT*64+__SIGMA_CC_BIT*64      SHR ECX,4      MOV EAX,[EDI-4] // Get context word on left      AND EAX,__CHI_BIT*8+__SIGMA_CC_BIT*8      SHR EAX,5      ADD ECX,EAX      MOV EAX,[EDI+4] // Get context word on right      AND EAX,__CHI_BIT*8+__SIGMA_CC_BIT*8      SHR EAX,3      ADD ECX,EAX      MOV EAX,ECX      SHR EAX,CHI_POS-1-SIGMA_CC_POS      OR ECX,EAX      AND ECX,0x000000FF      MOVZX ECX,byte ptr [sign_lut+ECX]      MOV EAX,ECX // Save the sign LUT result in EAX      SHR ECX,1 // Get context label part of the LUT result      MOV EBX,states      LEA ECX,[EBX+8*ECX+8*KAPPA_SIGN_BASE] // ECX has pointer to context state      MOV EBX,[ECX] // Get `p_bar_mps' to EBX      XOR EAX,EBX      AND EAX,1 // Leaves EAX with the MPS sign value in its LSB.      BTR EBX,0 // Leaves `p_bar' in EBX      SUB EDX,EBX      JGE row1_broadcast      CALL mq_non_cdprow1_broadcast: // Process newly significant sample; sign is in LSB of EAX      // Broadcast significance to left and right neighbours      MOV ECX,[EDI-4]      OR ECX,__SIGMA_CR_BIT*8      MOV [EDI-4],ECX      MOV ECX,[EDI+4]      OR ECX,__SIGMA_CL_BIT*8      MOV [EDI+4],ECX      // Recover and update context word, using ECX register      MOV ECX,EAX      SHL ECX,CHI_POS+3      OR ECX,[EDI]      OR ECX,__SIGMA_CC_BIT*8      MOV [EDI],ECX      // Write new significant sample value      SHL EAX,31 // Get sign bit of result into right position      ADD EAX,one_point_five      MOV EBX,cp_to_sp1      MOV [EDI+EBX],EAXrow2:      // Test for coding pass membership      TEST ECX,__CLEANUP_MEMBER_MASK*64      JNZ row3      // Find pointer to the relevant context state record      SHR ECX,6      AND ECX,__NBRHD_MASK      ADD ECX,sig_lut      MOVZX ECX,byte ptr [ECX]      MOV EBX,states      LEA ECX,[EBX+8*ECX]      // Decode symbol      MOV EAX,[ECX] // Get `p_bar_mps' to EAX      SUB EDX,EAX      AND EAX,1 // Get MPS identity in LSB of EAX      ADD EDX,EAX // Correct for the effect of the MPS      JGE significance_test2      CALL mq_non_cdpsignificance_test2:      MOV ECX,[EDI] // Get context word back again      TEST EAX,EAX // If symbol != 0      JZ row3row2_significant:      // If we get here, we know that stripe row 2 is newly significant      AND ECX,__CHI_BIT*8+__SIGMA_CC_BIT*8+__CHI_BIT*512+__SIGMA_CC_BIT*512      SHR ECX,7      MOV EAX,[EDI-4] // Get context word on left      AND EAX,__CHI_BIT*64+__SIGMA_CC_BIT*64      SHR EAX,8      ADD ECX,EAX      MOV EAX,[EDI+4] // Get context word on right      AND EAX,__CHI_BIT*64+__SIGMA_CC_BIT*64      SHR EAX,6      ADD ECX,EAX      MOV EAX,ECX      SHR EAX,CHI_POS-1-SIGMA_CC_POS      OR ECX,EAX      AND ECX,0x000000FF      MOVZX ECX,byte ptr [sign_lut+ECX]      MOV EAX,ECX // Save the sign LUT result in EAX      SHR ECX,1 // Get context label part of the LUT result      MOV EBX,states      LEA ECX,[EBX+8*ECX+8*KAPPA_SIGN_BASE] // ECX has pointer to context state      MOV EBX,[ECX] // Get `p_bar_mps' to EBX      XOR EAX,EBX      AND EAX,1 // Leaves EAX with the MPS sign value in its LSB.      BTR EBX,0 // Leaves `p_bar' in EBX      SUB EDX,EBX      JGE row2_broadcast      CALL mq_non_cdprow2_broadcast: // Process newly significant sample; sign is in LSB of EAX      // Broadcast significance to left and right neighbours      MOV ECX,[EDI-4]      OR ECX,__SIGMA_CR_BIT*64      MOV [EDI-4],ECX      MOV ECX,[EDI+4]      OR ECX,__SIGMA_CL_BIT*64      MOV [EDI+4],ECX      // Recover and update context word, using ECX register      MOV ECX,EAX      SHL ECX,CHI_POS+6      OR ECX,[EDI]      OR ECX,__SIGMA_CC_BIT*64      MOV [EDI],ECX      // Write new significant sample value      SHL EAX,31 // Get sign bit of result into right position      ADD EAX,one_point_five      MOV EBX,cp_to_sp2      MOV [EDI+EBX],EAXrow3:      // Test for coding pass membership      TEST ECX,__CLEANUP_MEMBER_MASK*512      JNZ advance_stripe_column      // Find pointer to the relevant context state record      SHR ECX,9      AND ECX,__NBRHD_MASK      ADD ECX,sig_lut      MOVZX ECX,byte ptr [ECX]      MOV EBX,states      LEA ECX,[EBX+8*ECX]      // Decode symbol      MOV EAX,[ECX] // Get `p_bar_mps' to EAX      SUB EDX,EAX      AND EAX,1 // Get MPS identity in LSB of EAX      ADD EDX,EAX // Correct for the effect of the MPS      JGE significance_test3      CALL mq_non_cdpsignificance_test3:      MOV ECX,[EDI] // Get context word back again      TEST EAX,EAX // If symbol != 0      JZ advance_stripe_columnrow3_significant:      // If we get here, we know that stripe row 3 is newly significant      MOV EBX,ECX // Make copy of ECX for exceptional sign processing      AND ECX,__CHI_BIT*64+__SIGMA_CC_BIT*64+__SIGMA_CC_BIT*4096      SHR ECX,10      TEST EBX,EBX      JGE no_exceptional_sign_processing      OR ECX,__CHI_BIT*4no_exceptional_sign_processing:      MOV EAX,[EDI-4] // Get context word on left      AND EAX,__CHI_BIT*512+__SIGMA_CC_BIT*512      SHR EAX,11      ADD ECX,EAX      MOV EAX,[EDI+4] // Get context word on right      AND EAX,__CHI_BIT*512+__SIGMA_CC_BIT*512      SHR EAX,9      ADD ECX,EAX      MOV EAX,ECX      SHR EAX,CHI_POS-1-SIGMA_CC_POS      OR ECX,EAX      AND ECX,0x000000FF      MOVZX ECX,byte ptr [sign_lut+ECX]      MOV EAX,ECX // Save the sign LUT result in EAX      SHR ECX,1 // Get context label part of the LUT result      MOV EBX,states      LEA ECX,[EBX+8*ECX+8*KAPPA_SIGN_BASE] // ECX has pointer to context state      MOV EBX,[ECX] // Get `p_bar_mps' to EBX      XOR EAX,EBX      AND EAX,1 // Leaves EAX with the MPS sign value in its LSB.      BTR EBX,0 // Leaves `p_bar' in EBX      SUB EDX,EBX      JGE row3_broadcast      CALL mq_non_cdprow3_broadcast: // Process newly significant sample; sign is in LSB of EAX      // Broadcast significance and sign to first row of next stripe      MOV EBX,EDI      ADD EBX,context_row_gap      MOV ECX,[EBX-4]      OR ECX,__SIGMA_TR_BIT      MOV [EBX-4],ECX      MOV ECX,EAX      SHL ECX,PREV_CHI_POS      OR ECX,[EBX]      OR ECX,__SIGMA_TC_BIT      MOV [EBX],ECX      MOV ECX,[EBX+4]      OR ECX,__SIGMA_TL_BIT      MOV [EBX+4],ECX      // Broadcast significance to left and right neighbours      MOV ECX,[EDI-4]      OR ECX,__SIGMA_CR_BIT*512      MOV [EDI-4],ECX      MOV ECX,[EDI+4]      OR ECX,__SIGMA_CL_BIT*512      MOV [EDI+4],ECX      // Recover and update context word, using ECX register      MOV ECX,EAX      SHL ECX,CHI_POS+9      OR ECX,[EDI]      OR ECX,__SIGMA_CC_BIT*512      MOV [EDI],ECX      // Write new significant sample value      SHL EAX,31 // Get sign bit of result into right position      ADD EAX,one_point_five      MOV EBX,cp_to_sp3      MOV [EDI+EBX],EAXadvance_stripe_column:    MOV EBX,ECX    SHL EBX,MU_POS-SIGMA_CC_POS    AND EBX,__MU_BIT+__MU_BIT*8+__MU_BIT*64+__MU_BIT*512    OR ECX,EBX    AND ECX,0xFFFFFFFF-__PI_BIT-__PI_BIT*8-__PI_BIT*64-__PI_BIT*512    MOV [EDI],ECX    ADD EDI,4    CMP EDI,stripe_end    JNZ next_stripe_columnadvance_stripe:    ADD EDI,EXTRA_DECODE_CWORDS*4    MOV EAX,cp_to_sp_adjust    MOV EBX,cp_to_sp0    ADD EBX,EAX    MOV cp_to_sp0,EBX    MOV EBX,cp_to_sp1    ADD EBX,EAX    MOV cp_to_sp1,EBX    MOV EBX,cp_to_sp2    ADD EBX,EAX    MOV cp_to_sp2,EBX    MOV EBX,cp_to_sp3    ADD EBX,EAX    MOV cp_to_sp3,EBX    MOV EAX,num_stripes    SUB EAX,1    MOV num_stripes,EAX    JNZ next_stripe    JMP finished    // We insert local fast function calls heremq_non_cdp:    ASM_MQ_NON_CDP_DECODE    ret // Return from fast function callfinished:    MOV D_var,EDX // Save the D register ready for `coder.check_in'    MOV A_var,ESI // Save the A register ready for `coder.check_in'    EMMS // Restore the FPU registers from any MMX calls which we have used  }  coder.check_in(A_var,C_var,D_var,t_var,temp_var,store_var,S_var);}#endif // MSVC_BLOCK_DECODE_ASM_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -