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