summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-11-17 17:16:50 -0800
committerRuss Cox <rsc@golang.org>2008-11-17 17:16:50 -0800
commitc0d91c9a6cb755b991b960b936c7bef3df016986 (patch)
treee38a02627e76c7997a3b436a5d1ca27950438cf0
parent1ed5c644e2930beea483489c67d881f817c13f1d (diff)
downloadgolang-c0d91c9a6cb755b991b960b936c7bef3df016986.tar.gz
work around more commonly-unreachable 6g code sequences.
R=r DELTA=23 (23 added, 0 deleted, 0 changed) OCL=19405 CL=19420
-rw-r--r--src/cmd/cov/main.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/cmd/cov/main.c b/src/cmd/cov/main.c
index 061f30267..dbd9d0dae 100644
--- a/src/cmd/cov/main.c
+++ b/src/cmd/cov/main.c
@@ -160,6 +160,29 @@ missing(uvlong pc, uvlong epc)
return;
}
+ if(epc - pc == 2 || epc -pc == 3) {
+ // check for XORL inside shift.
+ // (on x86 have to implement large shift with explicit zeroing).
+ // f+90 0x00002c9f CMPL CX,$20
+ // f+93 0x00002ca2 JCS f+97(SB)
+ // f+95 0x00002ca4 XORL AX,AX <<<
+ // f+97 0x00002ca6 SHLL CL,AX
+ // f+99 0x00002ca8 MOVL $1,CX
+ //
+ // f+c8 0x00002cd7 CMPL CX,$40
+ // f+cb 0x00002cda JCS f+d0(SB)
+ // f+cd 0x00002cdc XORQ AX,AX <<<
+ // f+d0 0x00002cdf SHLQ CL,AX
+ // f+d3 0x00002ce2 MOVQ $1,CX
+ buf[0] = 0;
+ machdata->das(text, pc, 0, buf, sizeof buf);
+ if(strncmp(buf, "XOR", 3) == 0) {
+ machdata->das(text, epc, 0, buf, sizeof buf);
+ if(strncmp(buf, "SHL", 3) == 0 || strncmp(buf, "SHR", 3) == 0)
+ return;
+ }
+ }
+
// show first instruction to make clear where we were.
machdata->das(text, pc, 0, buf, sizeof buf);