1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- Cachegrind: cache configuration.                             ---*/
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- The architecture specific void VG_(configure_caches) are     ---*/
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- located in the cg-<architecture>.c files.                    ---*/
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---                                                    cg-arch.c ---*/
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--------------------------------------------------------------------*/
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This file is part of Cachegrind, a Valgrind tool for cache
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   profiling programs.
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 2011-2011 Nicholas Nethercote
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      njn@valgrind.org
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is free software; you can redistribute it and/or
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   modify it under the terms of the GNU General Public License as
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   published by the Free Software Foundation; either version 2 of the
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   License, or (at your option) any later version.
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is distributed in the hope that it will be useful, but
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   WITHOUT ANY WARRANTY; without even the implied warranty of
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   General Public License for more details.
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   You should have received a copy of the GNU General Public License
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   along with this program; if not, write to the Free Software
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   02111-1307, USA.
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   The GNU General Public License is contained in the file COPYING.
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_basics.h"
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_libcassert.h"
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_libcbase.h"
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_libcprint.h"
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_tool_options.h"
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "cg_arch.h"
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// Checks cache config is ok.  Returns NULL if ok, or a pointer to an error
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// string otherwise.
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Char* check_cache(cache_t* cache)
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Simulator requires set count to be a power of two.
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if ((cache->size % (cache->line_size * cache->assoc) != 0) ||
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       (-1 == VG_(log2)(cache->size/cache->line_size/cache->assoc)))
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   {
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "Cache set count is not a power of two.\n";
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Simulator requires line size to be a power of two.
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (-1 == VG_(log2)(cache->line_size)) {
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "Cache line size is not a power of two.\n";
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Then check line size >= 16 -- any smaller and a single instruction could
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // straddle three cache lines, which breaks a simulation assertion and is
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // stupid anyway.
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (cache->line_size < MIN_LINE_SIZE) {
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "Cache line size is too small.\n";
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Then check cache size > line size (causes seg faults if not). */
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (cache->size <= cache->line_size) {
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "Cache size <= line size.\n";
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Then check assoc <= (size / line size) (seg faults otherwise). */
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (cache->assoc > (cache->size / cache->line_size)) {
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return "Cache associativity > (size / line size).\n";
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void parse_cache_opt ( cache_t* cache, Char* opt, Char* optval )
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Long i1, i2, i3;
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Char* endptr;
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Char* checkRes;
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Option argument looks like "65536,2,64".  Extract them.
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i1 = VG_(strtoll10)(optval,   &endptr); if (*endptr != ',')  goto bad;
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i2 = VG_(strtoll10)(endptr+1, &endptr); if (*endptr != ',')  goto bad;
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   i3 = VG_(strtoll10)(endptr+1, &endptr); if (*endptr != '\0') goto bad;
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Check for overflow.
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cache->size      = (Int)i1;
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cache->assoc     = (Int)i2;
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   cache->line_size = (Int)i3;
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (cache->size      != i1) goto overflow;
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (cache->assoc     != i2) goto overflow;
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (cache->line_size != i3) goto overflow;
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   checkRes = check_cache(cache);
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (checkRes) {
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(fmsg)("%s", checkRes);
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      goto bad;
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return;
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  bad:
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(fmsg_bad_option)(opt, "");
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  overflow:
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(fmsg_bad_option)(opt,
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      "One of the cache parameters was too large and overflowed.\n");
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovBool VG_(str_clo_cache_opt)(Char *arg,
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            cache_t* clo_I1c,
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            cache_t* clo_D1c,
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            cache_t* clo_LLc)
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Char* tmp_str;
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if      VG_STR_CLO(arg, "--I1", tmp_str) {
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      parse_cache_opt(clo_I1c, arg, tmp_str);
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return True;
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else if VG_STR_CLO(arg, "--D1", tmp_str) {
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      parse_cache_opt(clo_D1c, arg, tmp_str);
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return True;
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else if (VG_STR_CLO(arg, "--L2", tmp_str) || // for backwards compatibility
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              VG_STR_CLO(arg, "--LL", tmp_str)) {
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      parse_cache_opt(clo_LLc, arg, tmp_str);
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return True;
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   } else
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return False;
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void umsg_cache_img(Char* desc, cache_t* c)
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(umsg)("  %s: %'d B, %d-way, %d B lines\n", desc,
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             c->size, c->assoc, c->line_size);
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// Verifies if c is a valid cache.
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// An invalid value causes an assert, unless clo_redefined is True.
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void check_cache_or_override(Char* desc, cache_t* c, Bool clo_redefined)
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Char* checkRes;
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   checkRes = check_cache(c);
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (checkRes) {
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(umsg)("Auto-detected %s cache configuration not supported: %s",
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                desc, checkRes);
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      umsg_cache_img(desc, c);
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (!clo_redefined) {
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(umsg)("As it probably should be supported, please report a bug!\n");
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(umsg)("Bypass this message by using option --%s=...\n", desc);
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         tl_assert(0);
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid VG_(post_clo_init_configure_caches)(cache_t* I1c,
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         cache_t* D1c,
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         cache_t* LLc,
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         cache_t* clo_I1c,
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         cache_t* clo_D1c,
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                         cache_t* clo_LLc)
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DEFINED(L)   (-1 != L->size  || -1 != L->assoc || -1 != L->line_size)
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Count how many were defined on the command line.
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Bool all_caches_clo_defined =
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      (DEFINED(clo_I1c) &&
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       DEFINED(clo_D1c) &&
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       DEFINED(clo_LLc));
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Set the cache config (using auto-detection, if supported by the
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // architecture).
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(configure_caches)( I1c, D1c, LLc, all_caches_clo_defined );
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Check the default/auto-detected values.
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Allow the user to override invalid auto-detected caches
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // with command line.
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   check_cache_or_override ("I1", I1c, DEFINED(clo_I1c));
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   check_cache_or_override ("D1", D1c, DEFINED(clo_D1c));
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   check_cache_or_override ("LL", LLc, DEFINED(clo_LLc));
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Then replace with any defined on the command line.  (Already checked in
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // VG(parse_clo_cache_opt)().)
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (DEFINED(clo_I1c)) { *I1c = *clo_I1c; }
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (DEFINED(clo_D1c)) { *D1c = *clo_D1c; }
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (DEFINED(clo_LLc)) { *LLc = *clo_LLc; }
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (VG_(clo_verbosity) >= 2) {
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(umsg)("Cache configuration used:\n");
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      umsg_cache_img ("I1", I1c);
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      umsg_cache_img ("D1", D1c);
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      umsg_cache_img ("LL", LLc);
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#undef DEFINED
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid VG_(print_cache_clo_opts)()
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(printf)(
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"    --I1=<size>,<assoc>,<line_size>  set I1 cache manually\n"
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"    --D1=<size>,<assoc>,<line_size>  set D1 cache manually\n"
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"    --LL=<size>,<assoc>,<line_size>  set LL cache manually\n"
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               );
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
209