ReC98/libs/BorlandC/H_LLSH.ASM

50 lines
1.6 KiB
NASM

; *Not* the original file, but an edit to turn it into an includable slice.
; Changes include:
; * removal of RULES.ASI to eliminate redundancy
; * removal of the 'CODE' segment declaration (for obvious reasons)
;[]-----------------------------------------------------------------[]
;| H_LLSH.ASM -- long shift left |
;[]-----------------------------------------------------------------[]
;
; C/C++ Run Time Library - Version 5.0
;
; Copyright (c) 1987, 1992 by Borland International
; All Rights Reserved.
;
public LXLSH@
public F_LXLSH@
public N_LXLSH@
N_LXLSH@:
pop bx ;fix up for far return
push cs
push bx
LXLSH@:
F_LXLSH@:
cmp cl,16
jae llsh_@small
mov bx,ax ; save the low bits
shl ax,cl ; now shift each half
shl dx,cl
;
; We now have a hole in DX where the upper bits of
; AX should have been shifted. So we must take our
; copy of AX and do a reverse shift to get the proper
; bits to be or'ed into DX.
;
neg cl
add cl,16
shr bx,cl
or dx,bx
retf
llsh_@small:
sub cl,16 ; for shifts more than 15, do this
; short sequence.
xchg ax,dx
xor ax,ax ; We have now done a shift by 16.
shl dx,cl ; Now shift the remainder.
retf