Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
6fbf9877
Commit
6fbf9877
authored
11 years ago
by
Uros Bizjak
Committed by
Uros Bizjak
11 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fenv.c: New file.
* config/x86/fenv.c: New file. From-SVN: r204634
parent
d859c1b8
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
120 additions
and
0 deletions
+120
-0
libatomic/ChangeLog
+4
-0
libatomic/config/x86/fenv.c
+116
-0
No files found.
libatomic/ChangeLog
View file @
6fbf9877
2013-11-10 Uros Bizjak <ubizjak@gmail.com>
* config/x86/fenv.c: New file.
2013-11-07 Joseph Myers <joseph@codesourcery.com>
* fenv.c: New file.
...
...
This diff is collapsed.
Click to expand it.
libatomic/config/x86/fenv.c
0 → 100644
View file @
6fbf9877
/* Copyright (C) 2013 Free Software Foundation, Inc.
This file is part of the GNU Atomic Library (libatomic).
Libatomic is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#include "libatomic_i.h"
#define FE_INVALID 0x01
#define FE_DENORM 0x02
#define FE_DIVBYZERO 0x04
#define FE_OVERFLOW 0x08
#define FE_UNDERFLOW 0x10
#define FE_INEXACT 0x20
struct
fenv
{
unsigned
short
int
__control_word
;
unsigned
short
int
__unused1
;
unsigned
short
int
__status_word
;
unsigned
short
int
__unused2
;
unsigned
short
int
__tags
;
unsigned
short
int
__unused3
;
unsigned
int
__eip
;
unsigned
short
int
__cs_selector
;
unsigned
int
__opcode
:
11
;
unsigned
int
__unused4
:
5
;
unsigned
int
__data_offset
;
unsigned
short
int
__data_selector
;
unsigned
short
int
__unused5
;
};
/* Raise the supported floating-point exceptions from EXCEPTS. Other
bits in EXCEPTS are ignored. */
void
__atomic_feraiseexcept
(
int
excepts
)
{
if
(
excepts
&
FE_INVALID
)
{
float
f
=
0
.
0
f
;
#ifdef __x86_64__
volatile
float
r
__attribute__
((
unused
));
asm
volatile
(
"%vdivss
\t
{%0, %d0|%d0, %0}"
:
"+x"
(
f
));
r
=
f
;
/* Needed to trigger exception. */
#else
asm
volatile
(
"fdiv
\t
{%y0, %0|%0, %y0}"
:
"+t"
(
f
));
/* No need for fwait, exception is triggered by emitted fstp. */
#endif
}
if
(
excepts
&
FE_DENORM
)
{
struct
fenv
temp
;
asm
volatile
(
"fnstenv
\t
%0"
:
"=m"
(
temp
));
temp
.
__status_word
|=
FE_DENORM
;
asm
volatile
(
"fldenv
\t
%0"
:
:
"m"
(
temp
));
asm
volatile
(
"fwait"
);
}
if
(
excepts
&
FE_DIVBYZERO
)
{
float
f
=
1
.
0
f
,
g
=
0
.
0
f
;
#ifdef __x86_64__
volatile
float
r
__attribute__
((
unused
));
asm
volatile
(
"%vdivss
\t
{%1, %d0|%d0, %1}"
:
"+x"
(
f
)
:
"xm"
(
g
));
r
=
f
;
/* Needed to trigger exception. */
#else
asm
volatile
(
"fdivs
\t
%1"
:
"+t"
(
f
)
:
"m"
(
g
));
/* No need for fwait, exception is triggered by emitted fstp. */
#endif
}
if
(
excepts
&
FE_OVERFLOW
)
{
struct
fenv
temp
;
asm
volatile
(
"fnstenv
\t
%0"
:
"=m"
(
temp
));
temp
.
__status_word
|=
FE_OVERFLOW
;
asm
volatile
(
"fldenv
\t
%0"
:
:
"m"
(
temp
));
asm
volatile
(
"fwait"
);
}
if
(
excepts
&
FE_UNDERFLOW
)
{
struct
fenv
temp
;
asm
volatile
(
"fnstenv
\t
%0"
:
"=m"
(
temp
));
temp
.
__status_word
|=
FE_UNDERFLOW
;
asm
volatile
(
"fldenv
\t
%0"
:
:
"m"
(
temp
));
asm
volatile
(
"fwait"
);
}
if
(
excepts
&
FE_INEXACT
)
{
float
f
=
1
.
0
f
,
g
=
3
.
0
f
;
#ifdef __x86_64__
volatile
float
r
__attribute__
((
unused
));
asm
volatile
(
"%vdivss
\t
{%1, %d0|%d0, %1}"
:
"+x"
(
f
)
:
"xm"
(
g
));
r
=
f
;
/* Needed to trigger exception. */
#else
asm
volatile
(
"fdivs
\t
%1"
:
"+t"
(
f
)
:
"m"
(
g
));
/* No need for fwait, exception is triggered by emitted fstp. */
#endif
}
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment