1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
other: 0.979
assembly: 0.959
device: 0.954
KVM: 0.953
vnc: 0.950
instruction: 0.947
semantic: 0.945
graphic: 0.944
network: 0.942
mistranslation: 0.913
socket: 0.912
boot: 0.895
[i386] Parity Flag Not Set On xor %eax,%eax
Tested against qemu-1.7.0 as well as qemu-1.7.50 on Debian Sid
Steps To Reproduce
$ cat > prog.hex << EOF
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00
00 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00
00 00 00 00 01 00 00 00 00 00 00 00 00 80 04 08
00 80 04 08 76 00 00 00 76 00 00 00 05 00 00 00
00 10 00 00
31 c0
9c
b8 04 00 00 00
bb 01 00 00 00
89 e1
ba 04 00 00 00
cd 80
b8 01 00 00 00
bb 00 00 00 00
cd 80
EOF
$ xxd -p -r prog.hex > prog
$ chmod 700 prog
$ ./prog | hexdump -vC
00000000 46 02 00 00 |F...|
00000004
$ qemu-i386 ./prog | hexdump -vC
00000000 42 02 00 00 |B...|
00000004
On the other hand if [xor %eax, %eax] (31 c0) is replaced with sub %eax,%eax (29 c0), then the parity flag is set correctly.
Parity should be set for a zero result.
Signed-off-by: Richard Henderson <email address hidden>
---
target-i386/cc_helper.c | 2 +-
target-i386/translate.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/target-i386/cc_helper.c b/target-i386/cc_helper.c
index ee04092..05dd12b 100644
--- a/target-i386/cc_helper.c
+++ b/target-i386/cc_helper.c
@@ -103,7 +103,7 @@ target_ulong helper_cc_compute_all(target_ulong dst, target_ulong src1,
case CC_OP_EFLAGS:
return src1;
case CC_OP_CLR:
- return CC_Z;
+ return CC_Z | CC_P;
case CC_OP_MULB:
return compute_all_mulb(dst, src1);
diff --git a/target-i386/translate.c b/target-i386/translate.c
index b0f2279..34f35e7 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -748,7 +748,7 @@ static void gen_compute_eflags(DisasContext *s)
return;
}
if (s->cc_op == CC_OP_CLR) {
- tcg_gen_movi_tl(cpu_cc_src, CC_Z);
+ tcg_gen_movi_tl(cpu_cc_src, CC_Z | CC_P);
set_cc_op(s, CC_OP_EFLAGS);
return;
}
--
1.8.4.2
On Fri, Jan 10, 2014 at 12:39:56PM -0800, Richard Henderson wrote:
> Parity should be set for a zero result.
>
> Signed-off-by: Richard Henderson <email address hidden>
Reviewed-by: Edgar E. Iglesias <email address hidden>
> ---
> target-i386/cc_helper.c | 2 +-
> target-i386/translate.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target-i386/cc_helper.c b/target-i386/cc_helper.c
> index ee04092..05dd12b 100644
> --- a/target-i386/cc_helper.c
> +++ b/target-i386/cc_helper.c
> @@ -103,7 +103,7 @@ target_ulong helper_cc_compute_all(target_ulong dst, target_ulong src1,
> case CC_OP_EFLAGS:
> return src1;
> case CC_OP_CLR:
> - return CC_Z;
> + return CC_Z | CC_P;
>
> case CC_OP_MULB:
> return compute_all_mulb(dst, src1);
> diff --git a/target-i386/translate.c b/target-i386/translate.c
> index b0f2279..34f35e7 100644
> --- a/target-i386/translate.c
> +++ b/target-i386/translate.c
> @@ -748,7 +748,7 @@ static void gen_compute_eflags(DisasContext *s)
> return;
> }
> if (s->cc_op == CC_OP_CLR) {
> - tcg_gen_movi_tl(cpu_cc_src, CC_Z);
> + tcg_gen_movi_tl(cpu_cc_src, CC_Z | CC_P);
> set_cc_op(s, CC_OP_EFLAGS);
> return;
> }
> --
> 1.8.4.2
>
>
Quoting Richard Henderson (2014-01-10 14:39:56)
> Parity should be set for a zero result.
>
> Signed-off-by: Richard Henderson <email address hidden>
ping for 1.7.1
> ---
> target-i386/cc_helper.c | 2 +-
> target-i386/translate.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target-i386/cc_helper.c b/target-i386/cc_helper.c
> index ee04092..05dd12b 100644
> --- a/target-i386/cc_helper.c
> +++ b/target-i386/cc_helper.c
> @@ -103,7 +103,7 @@ target_ulong helper_cc_compute_all(target_ulong dst, target_ulong src1,
> case CC_OP_EFLAGS:
> return src1;
> case CC_OP_CLR:
> - return CC_Z;
> + return CC_Z | CC_P;
>
> case CC_OP_MULB:
> return compute_all_mulb(dst, src1);
> diff --git a/target-i386/translate.c b/target-i386/translate.c
> index b0f2279..34f35e7 100644
> --- a/target-i386/translate.c
> +++ b/target-i386/translate.c
> @@ -748,7 +748,7 @@ static void gen_compute_eflags(DisasContext *s)
> return;
> }
> if (s->cc_op == CC_OP_CLR) {
> - tcg_gen_movi_tl(cpu_cc_src, CC_Z);
> + tcg_gen_movi_tl(cpu_cc_src, CC_Z | CC_P);
> set_cc_op(s, CC_OP_EFLAGS);
> return;
> }
> --
> 1.8.4.2
Fix had been included here:
http://git.qemu.org/?p=qemu.git;a=commitdiff;h=d2fe51bda8adf33d07c21
==> Closing
|