📄 round_xsig.s
字号:
/*---------------------------------------------------------------------------+ | round_Xsig.S | | | | Copyright (C) 1992,1993,1994,1995 | | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | | Australia. E-mail billm@jacobi.maths.monash.edu.au | | | | Normalize and round a 12 byte quantity. | | Call from C as: | | int round_Xsig(Xsig *n) | | | | Normalize a 12 byte quantity. | | Call from C as: | | int norm_Xsig(Xsig *n) | | | | Each function returns the size of the shift (nr of bits). | | | +---------------------------------------------------------------------------*/ .file "round_Xsig.S"#include "fpu_emu.h".textENTRY(round_Xsig) pushl %ebp movl %esp,%ebp pushl %ebx /* Reserve some space */ pushl %ebx pushl %esi movl PARAM1,%esi movl 8(%esi),%edx movl 4(%esi),%ebx movl (%esi),%eax movl $0,-4(%ebp) orl %edx,%edx /* ms bits */ js L_round /* Already normalized */ jnz L_shift_1 /* Shift left 1 - 31 bits */ movl %ebx,%edx movl %eax,%ebx xorl %eax,%eax movl $-32,-4(%ebp)/* We need to shift left by 1 - 31 bits */L_shift_1: bsrl %edx,%ecx /* get the required shift in %ecx */ subl $31,%ecx negl %ecx subl %ecx,-4(%ebp) shld %cl,%ebx,%edx shld %cl,%eax,%ebx shl %cl,%eaxL_round: testl $0x80000000,%eax jz L_exit addl $1,%ebx adcl $0,%edx jnz L_exit movl $0x80000000,%edx incl -4(%ebp)L_exit: movl %edx,8(%esi) movl %ebx,4(%esi) movl %eax,(%esi) movl -4(%ebp),%eax popl %esi popl %ebx leave retENTRY(norm_Xsig) pushl %ebp movl %esp,%ebp pushl %ebx /* Reserve some space */ pushl %ebx pushl %esi movl PARAM1,%esi movl 8(%esi),%edx movl 4(%esi),%ebx movl (%esi),%eax movl $0,-4(%ebp) orl %edx,%edx /* ms bits */ js L_n_exit /* Already normalized */ jnz L_n_shift_1 /* Shift left 1 - 31 bits */ movl %ebx,%edx movl %eax,%ebx xorl %eax,%eax movl $-32,-4(%ebp) orl %edx,%edx /* ms bits */ js L_n_exit /* Normalized now */ jnz L_n_shift_1 /* Shift left 1 - 31 bits */ movl %ebx,%edx movl %eax,%ebx xorl %eax,%eax addl $-32,-4(%ebp) jmp L_n_exit /* Might not be normalized, but shift no more. *//* We need to shift left by 1 - 31 bits */L_n_shift_1: bsrl %edx,%ecx /* get the required shift in %ecx */ subl $31,%ecx negl %ecx subl %ecx,-4(%ebp) shld %cl,%ebx,%edx shld %cl,%eax,%ebx shl %cl,%eaxL_n_exit: movl %edx,8(%esi) movl %ebx,4(%esi) movl %eax,(%esi) movl -4(%ebp),%eax popl %esi popl %ebx leave ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -