You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.1 KiB
121 lines
2.1 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
.text
|
|
.global RaiseIntDivideByZeroException
|
|
## ADDRINT RaiseIntDivideByZeroException(ADDRINT catchAddr , ADDRINT value);
|
|
|
|
.type RaiseIntDivideByZeroException, @function
|
|
RaiseIntDivideByZeroException:
|
|
push %rbp
|
|
mov %rsp, %rbp
|
|
push %rbx # save rbx
|
|
mov %rdi, %rbx # fptr
|
|
# value in %rsi
|
|
push %rsi
|
|
xor %rax, %rax
|
|
idiv %rax
|
|
leave
|
|
ret
|
|
|
|
.global CatchIntDivideByZeroException
|
|
|
|
.type CatchIntDivideByZeroException, @function
|
|
CatchIntDivideByZeroException:
|
|
pop %rax # exc code -> %rax
|
|
pop %rbx
|
|
leave
|
|
ret
|
|
|
|
.global UnmaskFpZeroDivide
|
|
.type UnmaskFpZeroDivide, @function
|
|
UnmaskFpZeroDivide:
|
|
push %rbp
|
|
mov %rsp, %rbp
|
|
call GetFCW
|
|
mov $0x4, %rdi
|
|
not %rdi
|
|
and %rax, %rdi
|
|
call SetFCW
|
|
leave
|
|
ret
|
|
|
|
.global MaskFpZeroDivide
|
|
.type MaskFpZeroDivide, @function
|
|
MaskFpZeroDivide:
|
|
push %rbp
|
|
mov %rsp, %rbp
|
|
call GetFCW
|
|
mov $0x4, %rdi
|
|
or %rax, %rdi
|
|
call SetFCW
|
|
fnclex
|
|
leave
|
|
ret
|
|
|
|
.global GetFCW
|
|
.type GetFCW, @function
|
|
GetFCW:
|
|
xor %rax, %rax
|
|
push %rax
|
|
fstcw (%rsp)
|
|
pop %rax
|
|
ret
|
|
|
|
|
|
.global SetFCW
|
|
.type SetFCW, @function
|
|
SetFCW:
|
|
push %rbp
|
|
mov %rsp, %rbp
|
|
fnclex
|
|
push %rdi
|
|
fldcw (%rsp)
|
|
fnclex
|
|
leave
|
|
ret
|
|
|
|
.global UnmaskZeroDivideInMxcsr
|
|
.type UnmaskZeroDivideInMxcsr, @function
|
|
UnmaskZeroDivideInMxcsr:
|
|
call GetMxcsr
|
|
mov $0x200, %rdi
|
|
not %rdi
|
|
and %rax, %rdi
|
|
call SetMxcsr
|
|
ret
|
|
|
|
.global MaskZeroDivideInMxcsr
|
|
.type MaskZeroDivideInMxcsr, @function
|
|
MaskZeroDivideInMxcsr:
|
|
call GetMxcsr
|
|
mov $0x200, %rdi
|
|
or %rax, %rdi
|
|
call SetMxcsr
|
|
ret
|
|
|
|
.global GetMxcsr
|
|
.type GetMxcsr, @function
|
|
GetMxcsr:
|
|
push %rax
|
|
stmxcsr (%rsp)
|
|
pop %rax
|
|
ret
|
|
|
|
.global SetMxcsr
|
|
.type SetMxcsr, @function
|
|
SetMxcsr:
|
|
push %rdi
|
|
ldmxcsr (%rsp)
|
|
pop %rax
|
|
ret
|
|
|