Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
085339a1
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看板
提交
085339a1
编写于
1月 08, 2005
作者:
B
bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
MMX/SSE test
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@1204
c046a42c-6fe2-441c-8c8c-71466251a162
上级
abd2c7dc
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
434 addition
and
3 deletion
+434
-3
tests/Makefile
tests/Makefile
+1
-1
tests/test-i386.c
tests/test-i386.c
+433
-2
未找到文件。
tests/Makefile
浏览文件 @
085339a1
-include
../config-host.mak
CFLAGS
=
-Wall
-O2
-g
CFLAGS
=
-Wall
-O2
-g
#-msse2
LDFLAGS
=
ifeq
($(ARCH),i386)
...
...
tests/test-i386.c
浏览文件 @
085339a1
...
...
@@ -35,6 +35,7 @@
#define TEST_VM86
//#define LINUX_VM86_IOPL_FIX
//#define TEST_P4_FLAGS
//#define TEST_SSE
#define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y)
...
...
@@ -647,8 +648,8 @@ void test_fbcd(double a)
memset((env), 0xaa, sizeof(*(env)));\
for(i=0;i<5;i++)\
asm volatile ("fldl %0" : : "m" (dtab[i]));\
asm(save " %0\n" : : "m" (*(env)));\
asm(restore " %0\n": : "m" (*(env)));\
asm
volatile
(save " %0\n" : : "m" (*(env)));\
asm
volatile
(restore " %0\n": : "m" (*(env)));\
for(i=0;i<5;i++)\
asm volatile ("fstpl %0" : "=m" (rtab[i]));\
for(i=0;i<5;i++)\
...
...
@@ -1674,6 +1675,433 @@ static void test_enter(void)
TEST_ENTER
(
"w"
,
uint16_t
,
31
);
}
#ifdef TEST_SSE
typedef
int
__m64
__attribute__
((
__mode__
(
__V2SI__
)));
typedef
int
__m128
__attribute__
((
__mode__
(
__V4SF__
)));
typedef
union
{
double
d
[
2
];
float
s
[
4
];
uint32_t
l
[
4
];
uint64_t
q
[
2
];
__m128
dq
;
}
XMMReg
;
static
uint64_t
__attribute__
((
aligned
(
16
)))
test_values
[
4
][
2
]
=
{
{
0x456723c698694873
,
0xdc515cff944a58ec
},
{
0x1f297ccd58bad7ab
,
0x41f21efba9e3e146
},
{
0x007c62c2085427f8
,
0x231be9e8cde7438d
},
{
0x0f76255a085427f8
,
0xc233e9e8c4c9439a
},
};
#define SSE_OP(op)\
{\
asm volatile (#op " %2, %0" : "=x" (r.dq) : "0" (a.dq), "x" (b.dq));\
printf("%-9s: a=%016llx%016llx b=%016llx%016llx r=%016llx%016llx\n",\
#op,\
a.q[1], a.q[0],\
b.q[1], b.q[0],\
r.q[1], r.q[0]);\
}
#define SSE_OP2(op)\
{\
int i;\
for(i=0;i<2;i++) {\
a.q[0] = test_values[2*i][0];\
a.q[1] = test_values[2*i][1];\
b.q[0] = test_values[2*i+1][0];\
b.q[1] = test_values[2*i+1][1];\
SSE_OP(op);\
}\
}
#define MMX_OP2(op)\
{\
int i;\
for(i=0;i<2;i++) {\
a.q[0] = test_values[2*i][0];\
b.q[0] = test_values[2*i+1][0];\
asm volatile (#op " %2, %0" : "=y" (r.q[0]) : "0" (a.q[0]), "y" (b.q[0]));\
printf("%-9s: a=%016llx b=%016llx r=%016llx\n",\
#op,\
a.q[0],\
b.q[0],\
r.q[0]);\
}\
SSE_OP2(op);\
}
#define PSHUF_OP(op, ib)\
{\
int i;\
for(i=0;i<2;i++) {\
a.q[0] = test_values[2*i][0];\
a.q[1] = test_values[2*i][1];\
asm volatile (#op " $" #ib ", %1, %0" : "=x" (r.dq) : "x" (a.dq));\
printf("%-9s: a=%016llx%016llx ib=%02x r=%016llx%016llx\n",\
#op,\
a.q[1], a.q[0],\
ib,\
r.q[1], r.q[0]);\
}\
}
#define SHIFT_IM(op, ib)\
{\
int i;\
for(i=0;i<2;i++) {\
a.q[0] = test_values[2*i][0];\
a.q[1] = test_values[2*i][1];\
asm volatile (#op " $" #ib ", %0" : "=x" (r.dq) : "0" (a.dq));\
printf("%-9s: a=%016llx%016llx ib=%02x r=%016llx%016llx\n",\
#op,\
a.q[1], a.q[0],\
ib,\
r.q[1], r.q[0]);\
}\
}
#define SHIFT_OP(op, ib)\
{\
int i;\
SHIFT_IM(op, ib);\
for(i=0;i<2;i++) {\
a.q[0] = test_values[2*i][0];\
a.q[1] = test_values[2*i][1];\
b.q[0] = ib;\
b.q[1] = 0;\
asm volatile (#op " %2, %0" : "=x" (r.dq) : "0" (a.dq), "x" (b.dq));\
printf("%-9s: a=%016llx%016llx b=%016llx%016llx r=%016llx%016llx\n",\
#op,\
a.q[1], a.q[0],\
b.q[1], b.q[0],\
r.q[1], r.q[0]);\
}\
}
#define MOVMSK(op)\
{\
int i, reg;\
for(i=0;i<2;i++) {\
a.q[0] = test_values[2*i][0];\
a.q[1] = test_values[2*i][1];\
asm volatile (#op " %1, %0" : "=r" (reg) : "x" (a.dq));\
printf("%-9s: a=%016llx%016llx r=%08x\n",\
#op,\
a.q[1], a.q[0],\
reg);\
}\
}
#define SSE_OPS(a) \
SSE_OP(a ## ps);\
SSE_OP(a ## ss);
#define SSE_OPD(a) \
SSE_OP(a ## pd);\
SSE_OP(a ## sd);
#define SSE_COMI(op, field)\
{\
unsigned int eflags;\
XMMReg a, b;\
a.field[0] = a1;\
b.field[0] = b1;\
asm volatile (#op " %2, %1\n"\
"pushf\n"\
"pop %0\n"\
: "=m" (eflags)\
: "x" (a.dq), "x" (b.dq));\
printf("%-9s: a=%f b=%f cc=%04x\n",\
#op, a1, b1,\
eflags & (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A));\
}
void
test_sse_comi
(
double
a1
,
double
b1
)
{
SSE_COMI
(
ucomiss
,
s
);
SSE_COMI
(
ucomisd
,
d
);
SSE_COMI
(
comiss
,
s
);
SSE_COMI
(
comisd
,
d
);
}
#define CVT_OP_XMM(op)\
{\
asm volatile (#op " %1, %0" : "=x" (r.dq) : "x" (a.dq));\
printf("%-9s: a=%016llx%016llx r=%016llx%016llx\n",\
#op,\
a.q[1], a.q[0],\
r.q[1], r.q[0]);\
}
#define CVT_OP_XMM2MMX(op)\
{\
asm volatile (#op " %1, %0" : "=y" (r.q[0]) : "x" (a.dq));\
printf("%-9s: a=%016llx%016llx r=%016llx\n",\
#op,\
a.q[1], a.q[0],\
r.q[0]);\
}
#define CVT_OP_MMX2XMM(op)\
{\
asm volatile (#op " %1, %0" : "=x" (r.dq) : "y" (a.q[0]));\
printf("%-9s: a=%016llx r=%016llx%016llx\n",\
#op,\
a.q[0],\
r.q[1], r.q[0]);\
}
#define CVT_OP_REG2XMM(op)\
{\
asm volatile (#op " %1, %0" : "=x" (r.dq) : "r" (a.l[0]));\
printf("%-9s: a=%08x r=%016llx%016llx\n",\
#op,\
a.l[0],\
r.q[1], r.q[0]);\
}
#define CVT_OP_XMM2REG(op)\
{\
asm volatile (#op " %1, %0" : "=r" (r.l[0]) : "x" (a.dq));\
printf("%-9s: a=%016llx%016llx r=%08x\n",\
#op,\
a.q[1], a.q[0],\
r.l[0]);\
}
void
test_sse
(
void
)
{
XMMReg
r
,
a
,
b
;
MMX_OP2
(
punpcklbw
);
MMX_OP2
(
punpcklwd
);
MMX_OP2
(
punpckldq
);
MMX_OP2
(
packsswb
);
MMX_OP2
(
pcmpgtb
);
MMX_OP2
(
pcmpgtw
);
MMX_OP2
(
pcmpgtd
);
MMX_OP2
(
packuswb
);
MMX_OP2
(
punpckhbw
);
MMX_OP2
(
punpckhwd
);
MMX_OP2
(
punpckhdq
);
MMX_OP2
(
packssdw
);
MMX_OP2
(
pcmpeqb
);
MMX_OP2
(
pcmpeqw
);
MMX_OP2
(
pcmpeqd
);
MMX_OP2
(
paddq
);
MMX_OP2
(
pmullw
);
MMX_OP2
(
psubusb
);
MMX_OP2
(
psubusw
);
MMX_OP2
(
pminub
);
MMX_OP2
(
pand
);
MMX_OP2
(
paddusb
);
MMX_OP2
(
paddusw
);
MMX_OP2
(
pmaxub
);
MMX_OP2
(
pandn
);
MMX_OP2
(
pmulhuw
);
MMX_OP2
(
pmulhw
);
MMX_OP2
(
psubsb
);
MMX_OP2
(
psubsw
);
MMX_OP2
(
pminsw
);
MMX_OP2
(
por
);
MMX_OP2
(
paddsb
);
MMX_OP2
(
paddsw
);
MMX_OP2
(
pmaxsw
);
MMX_OP2
(
pxor
);
MMX_OP2
(
pmuludq
);
MMX_OP2
(
pmaddwd
);
MMX_OP2
(
psadbw
);
MMX_OP2
(
psubb
);
MMX_OP2
(
psubw
);
MMX_OP2
(
psubd
);
MMX_OP2
(
psubq
);
MMX_OP2
(
paddb
);
MMX_OP2
(
paddw
);
MMX_OP2
(
paddd
);
MMX_OP2
(
pavgb
);
MMX_OP2
(
pavgw
);
asm
volatile
(
"pinsrw $1, %1, %0"
:
"=y"
(
r
.
q
[
0
])
:
"r"
(
0x12345678
));
printf
(
"%-9s: r=%016llx
\n
"
,
"pinsrw"
,
r
.
q
[
0
]);
asm
volatile
(
"pinsrw $5, %1, %0"
:
"=x"
(
r
.
dq
)
:
"r"
(
0x12345678
));
printf
(
"%-9s: r=%016llx%016llx
\n
"
,
"pinsrw"
,
r
.
q
[
1
],
r
.
q
[
0
]);
a
.
q
[
0
]
=
test_values
[
0
][
0
];
a
.
q
[
1
]
=
test_values
[
0
][
1
];
asm
volatile
(
"pextrw $1, %1, %0"
:
"=r"
(
r
.
l
[
0
])
:
"y"
(
a
.
q
[
0
]));
printf
(
"%-9s: r=%08x
\n
"
,
"pextrw"
,
r
.
l
[
0
]);
asm
volatile
(
"pextrw $5, %1, %0"
:
"=r"
(
r
.
l
[
0
])
:
"x"
(
a
.
dq
));
printf
(
"%-9s: r=%08x
\n
"
,
"pextrw"
,
r
.
l
[
0
]);
asm
volatile
(
"pmovmskb %1, %0"
:
"=r"
(
r
.
l
[
0
])
:
"y"
(
a
.
q
[
0
]));
printf
(
"%-9s: r=%08x
\n
"
,
"pmovmskb"
,
r
.
l
[
0
]);
asm
volatile
(
"pmovmskb %1, %0"
:
"=r"
(
r
.
l
[
0
])
:
"x"
(
a
.
dq
));
printf
(
"%-9s: r=%08x
\n
"
,
"pmovmskb"
,
r
.
l
[
0
]);
asm
volatile
(
"emms"
);
SSE_OP2
(
punpcklqdq
);
SSE_OP2
(
punpckhqdq
);
SSE_OP2
(
andps
);
SSE_OP2
(
andpd
);
SSE_OP2
(
andnps
);
SSE_OP2
(
andnpd
);
SSE_OP2
(
orps
);
SSE_OP2
(
orpd
);
SSE_OP2
(
xorps
);
SSE_OP2
(
xorpd
);
SSE_OP2
(
unpcklps
);
SSE_OP2
(
unpcklpd
);
SSE_OP2
(
unpckhps
);
SSE_OP2
(
unpckhpd
);
PSHUF_OP
(
shufps
,
0x78
);
PSHUF_OP
(
shufpd
,
0x02
);
PSHUF_OP
(
pshufd
,
0x78
);
PSHUF_OP
(
pshuflw
,
0x78
);
PSHUF_OP
(
pshufhw
,
0x78
);
SHIFT_OP
(
psrlw
,
7
);
SHIFT_OP
(
psrlw
,
16
);
SHIFT_OP
(
psraw
,
7
);
SHIFT_OP
(
psraw
,
16
);
SHIFT_OP
(
psllw
,
7
);
SHIFT_OP
(
psllw
,
16
);
SHIFT_OP
(
psrld
,
7
);
SHIFT_OP
(
psrld
,
32
);
SHIFT_OP
(
psrad
,
7
);
SHIFT_OP
(
psrad
,
32
);
SHIFT_OP
(
pslld
,
7
);
SHIFT_OP
(
pslld
,
32
);
SHIFT_OP
(
psrlq
,
7
);
SHIFT_OP
(
psrlq
,
32
);
SHIFT_OP
(
psllq
,
7
);
SHIFT_OP
(
psllq
,
32
);
SHIFT_IM
(
psrldq
,
16
);
SHIFT_IM
(
psrldq
,
7
);
SHIFT_IM
(
pslldq
,
16
);
SHIFT_IM
(
pslldq
,
7
);
MOVMSK
(
movmskps
);
MOVMSK
(
movmskpd
);
/* FPU specific ops */
{
uint32_t
mxcsr
;
asm
volatile
(
"stmxcsr %0"
:
"=m"
(
mxcsr
));
printf
(
"mxcsr=%08x
\n
"
,
mxcsr
&
0x1f80
);
asm
volatile
(
"ldmxcsr %0"
:
:
"m"
(
mxcsr
));
}
test_sse_comi
(
2
,
-
1
);
test_sse_comi
(
2
,
2
);
test_sse_comi
(
2
,
3
);
a
.
s
[
0
]
=
2
.
7
;
a
.
s
[
1
]
=
3
.
4
;
a
.
s
[
2
]
=
4
;
a
.
s
[
3
]
=
-
6
.
3
;
b
.
s
[
0
]
=
45
.
7
;
b
.
s
[
1
]
=
353
.
4
;
b
.
s
[
2
]
=
4
;
b
.
s
[
3
]
=
56
.
3
;
SSE_OPS
(
add
);
SSE_OPS
(
mul
);
SSE_OPS
(
sub
);
SSE_OPS
(
min
);
SSE_OPS
(
div
);
SSE_OPS
(
max
);
SSE_OPS
(
sqrt
);
SSE_OPS
(
cmpeq
);
SSE_OPS
(
cmplt
);
SSE_OPS
(
cmple
);
SSE_OPS
(
cmpunord
);
SSE_OPS
(
cmpneq
);
SSE_OPS
(
cmpnlt
);
SSE_OPS
(
cmpnle
);
SSE_OPS
(
cmpord
);
a
.
d
[
0
]
=
2
.
7
;
a
.
d
[
1
]
=
-
3
.
4
;
b
.
d
[
0
]
=
45
.
7
;
b
.
d
[
1
]
=
-
53
.
4
;
SSE_OPD
(
add
);
SSE_OPD
(
mul
);
SSE_OPD
(
sub
);
SSE_OPD
(
min
);
SSE_OPD
(
div
);
SSE_OPD
(
max
);
SSE_OPD
(
sqrt
);
SSE_OPD
(
cmpeq
);
SSE_OPD
(
cmplt
);
SSE_OPD
(
cmple
);
SSE_OPD
(
cmpunord
);
SSE_OPD
(
cmpneq
);
SSE_OPD
(
cmpnlt
);
SSE_OPD
(
cmpnle
);
SSE_OPD
(
cmpord
);
/* float to float/int */
a
.
s
[
0
]
=
2
.
7
;
a
.
s
[
1
]
=
3
.
4
;
a
.
s
[
2
]
=
4
;
a
.
s
[
3
]
=
-
6
.
3
;
CVT_OP_XMM
(
cvtps2pd
);
CVT_OP_XMM
(
cvtss2sd
);
CVT_OP_XMM2MMX
(
cvtps2pi
);
CVT_OP_XMM2MMX
(
cvttps2pi
);
CVT_OP_XMM2REG
(
cvtss2si
);
CVT_OP_XMM2REG
(
cvttss2si
);
CVT_OP_XMM
(
cvtps2dq
);
CVT_OP_XMM
(
cvttps2dq
);
a
.
d
[
0
]
=
2
.
6
;
a
.
d
[
1
]
=
-
3
.
4
;
CVT_OP_XMM
(
cvtpd2ps
);
CVT_OP_XMM
(
cvtsd2ss
);
CVT_OP_XMM2MMX
(
cvtpd2pi
);
CVT_OP_XMM2MMX
(
cvttpd2pi
);
CVT_OP_XMM2REG
(
cvtsd2si
);
CVT_OP_XMM2REG
(
cvttsd2si
);
CVT_OP_XMM
(
cvtpd2dq
);
CVT_OP_XMM
(
cvttpd2dq
);
/* int to float */
a
.
l
[
0
]
=
-
6
;
a
.
l
[
1
]
=
2
;
a
.
l
[
2
]
=
100
;
a
.
l
[
3
]
=
-
60000
;
CVT_OP_MMX2XMM
(
cvtpi2ps
);
CVT_OP_MMX2XMM
(
cvtpi2pd
);
CVT_OP_REG2XMM
(
cvtsi2ss
);
CVT_OP_REG2XMM
(
cvtsi2sd
);
CVT_OP_XMM
(
cvtdq2ps
);
CVT_OP_XMM
(
cvtdq2pd
);
/* XXX: test PNI insns */
#if 0
SSE_OP2(movshdup);
#endif
}
#endif
static
void
*
call_end
__init_call
=
NULL
;
int
main
(
int
argc
,
char
**
argv
)
...
...
@@ -1704,5 +2132,8 @@ int main(int argc, char **argv)
test_self_modifying_code
();
test_single_step
();
test_enter
();
#ifdef TEST_SSE
test_sse
();
#endif
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录