Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
0ac4bd56
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0ac4bd56
编写于
1月 04, 2004
作者:
B
bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
float access fixes
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@489
c046a42c-6fe2-441c-8c8c-71466251a162
上级
3811a291
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
86 addition
and
42 deletion
+86
-42
cpu-all.h
cpu-all.h
+86
-42
未找到文件。
cpu-all.h
浏览文件 @
0ac4bd56
...
...
@@ -20,6 +20,40 @@
#ifndef CPU_ALL_H
#define CPU_ALL_H
#if defined(__arm__) || defined(__sparc__)
#define WORDS_ALIGNED
#endif
/* some important defines:
*
* WORDS_ALIGNED : if defined, the host cpu can only make word aligned
* memory accesses.
*
* WORDS_BIGENDIAN : if defined, the host cpu is big endian and
* otherwise little endian.
*
* (TARGET_WORDS_ALIGNED : same for target cpu (not supported yet))
*
* TARGET_WORDS_BIGENDIAN : same for target cpu
*/
/* NOTE: arm is horrible as double 32 bit words are stored in big endian ! */
typedef
union
{
double
d
;
#if !defined(WORDS_BIGENDIAN) && !defined(__arm__)
struct
{
uint32_t
lower
;
uint32_t
upper
;
}
l
;
#else
struct
{
uint32_t
upper
;
uint32_t
lower
;
}
l
;
#endif
uint64_t
ll
;
}
CPU_DoubleU
;
/* CPU memory access without any memory or io remapping */
static
inline
int
ldub_raw
(
void
*
ptr
)
...
...
@@ -40,7 +74,7 @@ static inline void stb_raw(void *ptr, int v)
/* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the
kernel handles unaligned load/stores may give better results, but
it is a system wide setting : bad */
#if
defined(WORDS_BIGENDIAN) || defined(__arm__
)
#if
!defined(TARGET_WORDS_BIGENDIAN) && (defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
)
/* conservative code for little endian unaligned accesses */
static
inline
int
lduw_raw
(
void
*
ptr
)
...
...
@@ -141,55 +175,23 @@ static inline void stfl_raw(void *ptr, float v)
stl_raw
(
ptr
,
u
.
i
);
}
#if defined(__arm__) && !defined(WORDS_BIGENDIAN)
/* NOTE: arm is horrible as double 32 bit words are stored in big endian ! */
static
inline
double
ldfq_raw
(
void
*
ptr
)
{
union
{
double
d
;
uint32_t
tab
[
2
];
}
u
;
u
.
tab
[
1
]
=
ldl_raw
(
ptr
);
u
.
tab
[
0
]
=
ldl_raw
(
ptr
+
4
);
CPU_DoubleU
u
;
u
.
l
.
lower
=
ldl_raw
(
ptr
);
u
.
l
.
upper
=
ldl_raw
(
ptr
+
4
);
return
u
.
d
;
}
static
inline
void
stfq_raw
(
void
*
ptr
,
double
v
)
{
union
{
double
d
;
uint32_t
tab
[
2
];
}
u
;
CPU_DoubleU
u
;
u
.
d
=
v
;
stl_raw
(
ptr
,
u
.
tab
[
1
]
);
stl_raw
(
ptr
+
4
,
u
.
tab
[
0
]
);
stl_raw
(
ptr
,
u
.
l
.
lower
);
stl_raw
(
ptr
+
4
,
u
.
l
.
upper
);
}
#else
static
inline
double
ldfq_raw
(
void
*
ptr
)
{
union
{
double
d
;
uint64_t
i
;
}
u
;
u
.
i
=
ldq_raw
(
ptr
);
return
u
.
d
;
}
static
inline
void
stfq_raw
(
void
*
ptr
,
double
v
)
{
union
{
double
d
;
uint64_t
i
;
}
u
;
u
.
d
=
v
;
stq_raw
(
ptr
,
u
.
i
);
}
#endif
#elif defined(TARGET_WORDS_BIGENDIAN) && !defined(WORDS_BIGENDIAN)
#elif defined(TARGET_WORDS_BIGENDIAN) && (!defined(WORDS_BIGENDIAN) || defined(WORDS_ALIGNED))
static
inline
int
lduw_raw
(
void
*
ptr
)
{
...
...
@@ -235,8 +237,46 @@ static inline void stl_raw(void *ptr, int v)
static
inline
void
stq_raw
(
void
*
ptr
,
uint64_t
v
)
{
stl_raw
(
ptr
,
v
);
stl_raw
(
ptr
+
4
,
v
>>
32
);
stl_raw
(
ptr
,
v
>>
32
);
stl_raw
(
ptr
+
4
,
v
);
}
/* float access */
static
inline
float
ldfl_raw
(
void
*
ptr
)
{
union
{
float
f
;
uint32_t
i
;
}
u
;
u
.
i
=
ldl_raw
(
ptr
);
return
u
.
f
;
}
static
inline
void
stfl_raw
(
void
*
ptr
,
float
v
)
{
union
{
float
f
;
uint32_t
i
;
}
u
;
u
.
f
=
v
;
stl_raw
(
ptr
,
u
.
i
);
}
static
inline
double
ldfq_raw
(
void
*
ptr
)
{
CPU_DoubleU
u
;
u
.
l
.
upper
=
ldl_raw
(
ptr
);
u
.
l
.
lower
=
ldl_raw
(
ptr
+
4
);
return
u
.
d
;
}
static
inline
void
stfq_raw
(
void
*
ptr
,
double
v
)
{
CPU_DoubleU
u
;
u
.
d
=
v
;
stl_raw
(
ptr
,
u
.
l
.
upper
);
stl_raw
(
ptr
+
4
,
u
.
l
.
lower
);
}
#else
...
...
@@ -330,10 +370,14 @@ static inline void stfq_raw(void *ptr, double v)
#define lduw_kernel(p) lduw_raw(p)
#define ldsw_kernel(p) ldsw_raw(p)
#define ldl_kernel(p) ldl_raw(p)
#define ldfl_kernel(p) ldfl_raw(p)
#define ldfq_kernel(p) ldfq_raw(p)
#define stb_kernel(p, v) stb_raw(p, v)
#define stw_kernel(p, v) stw_raw(p, v)
#define stl_kernel(p, v) stl_raw(p, v)
#define stq_kernel(p, v) stq_raw(p, v)
#define stfl_kernel(p, v) stfl_raw(p, v)
#define stfq_kernel(p, vt) stfq_raw(p, v)
#endif
/* defined(CONFIG_USER_ONLY) */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录