1*5dda2efdSMircea Trofin #include <benchmark/benchmark.h>
2*5dda2efdSMircea Trofin
3*5dda2efdSMircea Trofin #ifdef __clang__
4*5dda2efdSMircea Trofin #pragma clang diagnostic ignored "-Wreturn-type"
5*5dda2efdSMircea Trofin #endif
6*5dda2efdSMircea Trofin
7*5dda2efdSMircea Trofin // clang-format off
8*5dda2efdSMircea Trofin extern "C" {
9*5dda2efdSMircea Trofin extern int ExternInt;
10*5dda2efdSMircea Trofin benchmark::State& GetState();
11*5dda2efdSMircea Trofin void Fn();
12*5dda2efdSMircea Trofin }
13*5dda2efdSMircea Trofin // clang-format on
14*5dda2efdSMircea Trofin
15*5dda2efdSMircea Trofin using benchmark::State;
16*5dda2efdSMircea Trofin
17*5dda2efdSMircea Trofin // CHECK-LABEL: test_for_auto_loop:
test_for_auto_loop()18*5dda2efdSMircea Trofin extern "C" int test_for_auto_loop() {
19*5dda2efdSMircea Trofin State& S = GetState();
20*5dda2efdSMircea Trofin int x = 42;
21*5dda2efdSMircea Trofin // CHECK: [[CALL:call(q)*]] _ZN9benchmark5State16StartKeepRunningEv
22*5dda2efdSMircea Trofin // CHECK-NEXT: testq %rbx, %rbx
23*5dda2efdSMircea Trofin // CHECK-NEXT: je [[LOOP_END:.*]]
24*5dda2efdSMircea Trofin
25*5dda2efdSMircea Trofin for (auto _ : S) {
26*5dda2efdSMircea Trofin // CHECK: .L[[LOOP_HEAD:[a-zA-Z0-9_]+]]:
27*5dda2efdSMircea Trofin // CHECK-GNU-NEXT: subq $1, %rbx
28*5dda2efdSMircea Trofin // CHECK-CLANG-NEXT: {{(addq \$1, %rax|incq %rax|addq \$-1, %rbx)}}
29*5dda2efdSMircea Trofin // CHECK-NEXT: jne .L[[LOOP_HEAD]]
30*5dda2efdSMircea Trofin benchmark::DoNotOptimize(x);
31*5dda2efdSMircea Trofin }
32*5dda2efdSMircea Trofin // CHECK: [[LOOP_END]]:
33*5dda2efdSMircea Trofin // CHECK: [[CALL]] _ZN9benchmark5State17FinishKeepRunningEv
34*5dda2efdSMircea Trofin
35*5dda2efdSMircea Trofin // CHECK: movl $101, %eax
36*5dda2efdSMircea Trofin // CHECK: ret
37*5dda2efdSMircea Trofin return 101;
38*5dda2efdSMircea Trofin }
39*5dda2efdSMircea Trofin
40*5dda2efdSMircea Trofin // CHECK-LABEL: test_while_loop:
test_while_loop()41*5dda2efdSMircea Trofin extern "C" int test_while_loop() {
42*5dda2efdSMircea Trofin State& S = GetState();
43*5dda2efdSMircea Trofin int x = 42;
44*5dda2efdSMircea Trofin
45*5dda2efdSMircea Trofin // CHECK: j{{(e|mp)}} .L[[LOOP_HEADER:[a-zA-Z0-9_]+]]
46*5dda2efdSMircea Trofin // CHECK-NEXT: .L[[LOOP_BODY:[a-zA-Z0-9_]+]]:
47*5dda2efdSMircea Trofin while (S.KeepRunning()) {
48*5dda2efdSMircea Trofin // CHECK-GNU-NEXT: subq $1, %[[IREG:[a-z]+]]
49*5dda2efdSMircea Trofin // CHECK-CLANG-NEXT: {{(addq \$-1,|decq)}} %[[IREG:[a-z]+]]
50*5dda2efdSMircea Trofin // CHECK: movq %[[IREG]], [[DEST:.*]]
51*5dda2efdSMircea Trofin benchmark::DoNotOptimize(x);
52*5dda2efdSMircea Trofin }
53*5dda2efdSMircea Trofin // CHECK-DAG: movq [[DEST]], %[[IREG]]
54*5dda2efdSMircea Trofin // CHECK-DAG: testq %[[IREG]], %[[IREG]]
55*5dda2efdSMircea Trofin // CHECK-DAG: jne .L[[LOOP_BODY]]
56*5dda2efdSMircea Trofin // CHECK-DAG: .L[[LOOP_HEADER]]:
57*5dda2efdSMircea Trofin
58*5dda2efdSMircea Trofin // CHECK: cmpb $0
59*5dda2efdSMircea Trofin // CHECK-NEXT: jne .L[[LOOP_END:[a-zA-Z0-9_]+]]
60*5dda2efdSMircea Trofin // CHECK: [[CALL:call(q)*]] _ZN9benchmark5State16StartKeepRunningEv
61*5dda2efdSMircea Trofin
62*5dda2efdSMircea Trofin // CHECK: .L[[LOOP_END]]:
63*5dda2efdSMircea Trofin // CHECK: [[CALL]] _ZN9benchmark5State17FinishKeepRunningEv
64*5dda2efdSMircea Trofin
65*5dda2efdSMircea Trofin // CHECK: movl $101, %eax
66*5dda2efdSMircea Trofin // CHECK: ret
67*5dda2efdSMircea Trofin return 101;
68*5dda2efdSMircea Trofin }
69