📄 msvc_block_decode_asm.h
字号:
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 + -