History

use proper serialization; use RDTSCP if possible

Sigrid Solveig Haflínudóttir committed 6 years ago

Commit bbdcad51 parent cce6dfb3 files · +55 −5Browse files

Unified · Split

3 files
  1. b.c +26 −0
  2. b.h +4 −4
  3. b_amd64.s +25 −1
b.c+26−0
@@ -13,6 +13,19 @@ enum { · 12 unmodified lines
13 13
14static uvlong adj;14static uvlong adj;
15 15
16typedef struct Res {
17 ulong ax, bx, cx, dx;
18}Res;
19
20Res cpuid(ulong ax, ulong cx);
21
22void _tstart(uvlong *c);
23void _tend(uvlong *c);
24void _tstartp(uvlong *c);
25void _tendp(uvlong *c);
26void (*tstart)(uvlong *c);
27void (*tend)(uvlong *c);
28
16uvlong29uvlong
17cycles2ns(uvlong x)30cycles2ns(uvlong x)
18{31{
@@ -47,10 +60,23 @@ static int · 28 unmodified lines
47void60void
48benchinit(B *b, char *name)61benchinit(B *b, char *name)
49{62{
63 Res r;
50 int i;64 int i;
51 65
52 fmtinstall(L'σ', σfmt);66 fmtinstall(L'σ', σfmt);
53 fmtinstall(L'τ', τfmt);67 fmtinstall(L'τ', τfmt);
68
69 if(tstart == nil){
70 r = cpuid(0x80000001, 2);
71 if((r.dx & (1<<27)) != 0){
72 tstart = _tstartp;
73 tend = _tendp;
74 }else{
75 tstart = _tstart;
76 tend = _tend;
77 }
78 }
79
54 memset(b, 0, sizeof(*b));80 memset(b, 0, sizeof(*b));
55 b->name = name;81 b->name = name;
56 b->n = b->nc = Bstepmin;82 b->n = b->nc = Bstepmin;
b.h+4−4
@@ -24,11 +24,11 @@ struct B { · 23 unmodified lines
24 24
25/* private */25/* private */
26void benchstep(B *b);26void benchstep(B *b);
27void _tstart(uvlong *c);27extern void (*tstart)(uvlong *c);
28void _tend(uvlong *c);28extern void (*tend)(uvlong *c);
29 29
30/* public */30/* public */
31void benchinit(B *b, char *name);31void benchinit(B *b, char *name);
32void benchprint(B *b, int nb, int fd);32void benchprint(B *b, int nb, int fd);
33#define benchin(b) do{ _tstart(&(b)->tin); }while(0)33#define benchin(b) do{ tstart(&(b)->tin); }while(0)
34#define benchout(b) do{ _tend(&(b)->tout); benchstep(b); }while(0)34#define benchout(b) do{ tend(&(b)->tout); benchstep(b); }while(0)
b_amd64.s+25−1
@@ -1,13 +1,37 @@
1TEXT _tstart(SB), 1, $01TEXT _tstart(SB), 1, $0
2 LFENCE2 CPUID
3 RDTSC3 RDTSC
4 MOVL AX, 0(RARG)4 MOVL AX, 0(RARG)
5 MOVL DX, 4(RARG)5 MOVL DX, 4(RARG)
6 RET6 RET
7 7
8TEXT _tend(SB), 1, $08TEXT _tend(SB), 1, $0
9 CPUID
9 RDTSC10 RDTSC
10 MOVL AX, 0(RARG)11 MOVL AX, 0(RARG)
11 MOVL DX, 4(RARG)12 MOVL DX, 4(RARG)
13 RET
14
15TEXT _tstartp(SB), 1, $0
16 CPUID
17 WORD $0x010f; BYTE $0xf9 // RDTSCP
18 MOVL AX, 0(RARG)
19 MOVL DX, 4(RARG)
20 RET
21
22TEXT _tendp(SB), 1, $0
23 WORD $0x010f; BYTE $0xf9 // RDTSCP
24 MOVL AX, 0(RARG)
25 MOVL DX, 4(RARG)
26 CPUID
27 RET
28
29TEXT cpuid(SB), 1, $0
30 MOVL ax+8(FP), AX
31 MOVL cx+16(FP), CX
12 CPUID32 CPUID
33 MOVL AX, 0(BP)
34 MOVL BX, 4(BP)
35 MOVL CX, 8(BP)
36 MOVL DX, 12(BP)
13 RET37 RET

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t