1/* Copyright 2019 Google LLC. All Rights Reserved.
2
3Licensed under the Apache License, Version 2.0 (the "License");
4you may not use this file except in compliance with the License.
5You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9Unless required by applicable law or agreed to in writing, software
10distributed under the License is distributed on an "AS IS" BASIS,
11WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12See the License for the specific language governing permissions and
13limitations under the License.
14==============================================================================*/
15
16#ifndef RUY_RUY_OPT_SET_H_
17#define RUY_RUY_OPT_SET_H_
18
19// RUY_OPT_SET is a compile-time API that Ruy provides for enabling/disabling
20// certain optimizations. It should be used by defining that macro on the
21// compiler command line.
22//
23// Each bit in RUY_OPT_SET controls a particular optimization done in Ruy.
24#define RUY_OPT_BIT_INTRINSICS 0x1
25#define RUY_OPT_BIT_ASM 0x2
26#define RUY_OPT_BIT_TUNING 0x4
27#define RUY_OPT_BIT_FAT_KERNEL 0x8
28// 0x10 used to be RUY_OPT_BIT_NATIVE_ROUNDING
29#define RUY_OPT_BIT_AVOID_ALIASING 0x20
30#define RUY_OPT_BIT_MAX_STREAMING 0x40
31#define RUY_OPT_BIT_PACK_AHEAD 0x80
32#define RUY_OPT_BIT_PREFETCH_LOAD 0x100
33#define RUY_OPT_BIT_PREFETCH_STORE 0x200
34#define RUY_OPT_BIT_FRACTAL_Z 0x400
35#define RUY_OPT_BIT_FRACTAL_U 0x800
36#define RUY_OPT_BIT_FRACTAL_HILBERT 0x1000
37
38#if !defined(RUY_OPT_SET)
39#ifdef RUY_OPTIMIZE_FOR_MATMUL_BENCHMARK
40// Load prefetching is detrimental in matrix multiplication benchmarks.
41// Store prefetching is not.
42#define RUY_OPT_SET (~RUY_OPT_BIT_PREFETCH_LOAD)
43#else
44// Default to all optimizations.
45#define RUY_OPT_SET (~0)
46#endif
47#endif
48
49#define RUY_OPT(X) ((RUY_OPT_SET & RUY_OPT_BIT_##X) != 0)
50
51#endif // RUY_RUY_OPT_SET_H_
52