1// Copyright (C) 2018 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14// 15 16package { 17 default_applicable_licenses: ["Android-Apache-2.0"], 18} 19 20python_binary_host { 21 name: "gen_intrinsics", 22 main: "gen_intrinsics.py", 23 srcs: ["gen_intrinsics.py"], 24 libs: ["asm_defs_lib"], 25} 26 27python_library_host { 28 name: "gen_intrinsics_lib", 29 srcs: ["gen_intrinsics.py"], 30} 31 32python_test_host { 33 name: "gen_intrinsics_tests", 34 main: "gen_intrinsics_test.py", 35 srcs: [ 36 "gen_intrinsics_test.py", 37 "gen_intrinsics.py", 38 ], 39 libs: ["asm_defs_lib"], 40 test_suites: ["device-tests"], 41 test_options: { 42 unit_test: true, 43 }, 44} 45 46filegroup { 47 name: "libberberis_intrinsics_gen_inputs_riscv64_to_all", 48 srcs: ["riscv64_to_all/intrinsic_def.json"], 49} 50 51genrule { 52 name: "libberberis_text_assembler_gen_headers_riscv64", 53 out: [ 54 "gen_text_assembler_common_riscv-inl.h", 55 "gen_text_assembler_riscv64-inl.h", 56 ], 57 srcs: [":libberberis_assembler_gen_inputs_riscv64"], 58 tools: ["gen_asm"], 59 cmd: "$(location gen_asm) --text-assembler $(out) $(in)", 60} 61 62genrule { 63 name: "libberberis_text_assembler_gen_headers_x86_32", 64 out: [ 65 "gen_text_assembler_common_x86-inl.h", 66 "gen_text_assembler_x86_32-inl.h", 67 ], 68 srcs: [":libberberis_assembler_gen_inputs_x86_32"], 69 tools: ["gen_asm"], 70 cmd: "$(location gen_asm) --text-assembler $(out) $(in)", 71} 72 73genrule { 74 name: "libberberis_text_assembler_gen_headers_x86_64", 75 out: [ 76 "gen_text_assembler_common_x86-inl.h", 77 "gen_text_assembler_x86_64-inl.h", 78 ], 79 srcs: [":libberberis_assembler_gen_inputs_x86_64"], 80 tools: ["gen_asm"], 81 cmd: "$(location gen_asm) --text-assembler $(out) $(in)", 82} 83 84filegroup { 85 name: "libberberis_machine_ir_intrinsic_binding_riscv64_to_x86_64", 86 srcs: ["riscv64_to_x86_64/machine_ir_intrinsic_binding.json"], 87} 88 89filegroup { 90 name: "libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64", 91 srcs: ["riscv64_to_x86_64/macro_def.json"], 92} 93 94filegroup { 95 name: "dummy_gen_text_asm_intrinsics_srcs", 96 srcs: ["dummy_gen_text_asm_intrinsics.cc"], 97} 98 99filegroup { 100 name: "gen_text_asm_intrinsics_srcs", 101 srcs: ["gen_text_asm_intrinsics.cc"], 102} 103 104genrule { 105 name: "libberberis_intrinsics_gen_inline_headers_riscv64_to_x86_64", 106 out: ["berberis/intrinsics/intrinsics.h"], 107 srcs: [], 108 tools: ["gen_riscv64_to_x86_64_intrinsics"], 109 cmd: "$(location gen_riscv64_to_x86_64_intrinsics) $(out)", 110} 111 112genrule { 113 name: "libberberis_macro_assembler_gen_intrinsics_headers_riscv64_to_x86_64", 114 out: ["text_asm_intrinsics_process_bindings-inl.h"], 115 srcs: [ 116 ":libberberis_intrinsics_gen_inputs_riscv64_to_all", 117 ":libberberis_machine_ir_intrinsic_binding_riscv64_to_x86_64", 118 ":libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64", 119 ":libberberis_assembler_gen_inputs_x86_64", 120 ], 121 tools: ["gen_intrinsics"], 122 cmd: "$(location gen_intrinsics) --text_asm_intrinsics_bindings $(out) $(in)", 123} 124 125genrule { 126 name: "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64", 127 out: [ 128 "berberis/intrinsics/intrinsics-inl.h", 129 "berberis/intrinsics/intrinsics_process_bindings-inl.h", 130 "berberis/intrinsics/interpreter_intrinsics_hooks-inl.h", 131 "berberis/intrinsics/translator_intrinsics_hooks-inl.h", 132 "berberis/intrinsics/mock_semantics_listener_intrinsics_hooks-inl.h", 133 ], 134 srcs: [ 135 ":libberberis_intrinsics_gen_inputs_riscv64_to_all", 136 ":libberberis_machine_ir_intrinsic_binding_riscv64_to_x86_64", 137 ":libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64", 138 ":libberberis_assembler_gen_inputs_x86_64", 139 ], 140 tools: ["gen_intrinsics"], 141 cmd: "$(location gen_intrinsics) --public_headers $(out) $(in)", 142} 143 144genrule { 145 name: "libberberis_macro_assembler_gen_headers_riscv64_to_x86_64", 146 out: ["berberis/intrinsics/macro_assembler_interface-inl.h"], 147 srcs: [":libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64"], 148 tools: ["gen_asm"], 149 cmd: "$(location gen_asm) --binary-assembler $(out) $(in)", 150} 151 152genrule { 153 name: "libberberis_intrinsics_gen_public_headers_riscv64_to_arm64", 154 out: [ 155 "berberis/intrinsics/intrinsics-inl.h", 156 "berberis/intrinsics/interpreter_intrinsics_hooks-inl.h", 157 ], 158 srcs: [ 159 ":libberberis_intrinsics_gen_inputs_riscv64_to_all", 160 ], 161 tools: ["gen_intrinsics"], 162 cmd: "$(location gen_intrinsics) arm64 --public_headers $(out) $(in)", 163} 164 165// Note: the following two genrules and this host binary are working together. 166// 167// gen_riscv64_to_x86_64_intrinsics is C++ program, generated by python script, 168// which does not accept any inputs and produces berberis/intrinsics/intrinsics.h 169// 170// Other modules are not supposed to use gen_riscv64_to_x86_64_intrinsics, they should only 171// depend on libberberis_intrinsics_gen_asm_impl_headers_riscv64_to_x86_64 172// 173// So with 64-bit RISC V headers we have two-step operation: 174// 175// gen_intrinsics 176// -> text_asm_intrinsics_process_bindings-inl.h 177// -> gen_riscv64_to_x86_64_intrinsics 178// -> libberberis_intrinsics_gen_asm_impl_headers_riscv64_to_x86_64 179// 180// Compare to single-step generation of common headers: 181// 182// gen_intrinsics 183// -> libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64 184 185cc_binary_host { 186 name: "gen_riscv64_to_x86_64_intrinsics", 187 defaults: ["gen_text_asm_intrinsics_defaults"], 188 local_include_dirs: ["riscv64_to_x86_64"], 189 target: { 190 linux: { 191 generated_headers: [ 192 "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64", 193 "libberberis_macro_assembler_gen_intrinsics_headers_riscv64_to_x86_64", 194 "libberberis_text_assembler_gen_headers_x86_64", 195 ], 196 header_libs: ["libberberis_macro_assembler_headers_riscv64_to_x86_64"], 197 static_libs: ["libberberis_macro_assembler_riscv64_to_x86_64"], 198 }, 199 }, 200} 201 202cc_defaults { 203 name: "gen_text_asm_intrinsics_defaults", 204 // Note: build system would pick the build OS variant. 205 // Usually that's 64-bit version thus we can only support 64bit version here. 206 // Currently none of Android builds that we care about used 32bit version of host tools. 207 defaults: ["berberis_defaults_64"], 208 host_supported: true, 209 header_libs: ["libberberis_intrinsics_headers"], 210 // Note: since this tool is used in genrule, it has to be buildable and 211 // available on all platforms unconditionally. 212 // 213 // Since we don't support MacOS build for the rest of berberis we are providing 214 // a "dummy" version on non-linux platform: it would always generate empty header. 215 // 216 // That version does not need any internal headers, libraries or sources, 217 // thus we use conditional dependencies only on linux platform here. 218 target: { 219 darwin: { 220 enabled: true, 221 srcs: [":dummy_gen_text_asm_intrinsics_srcs"], 222 }, 223 linux: { 224 // We are only ever executing that binary once, it's faster to build it without 225 // optimizations and spend half-second more running it, than spend tens of seconds 226 // optimizing the code to save that half-second. 227 cflags: ["-O0"], 228 srcs: [":gen_text_asm_intrinsics_srcs"], 229 header_libs: [ 230 "libberberis_assembler_headers", // Immediates. 231 "libberberis_base_headers", 232 "libberberis_runtime_primitives_headers", 233 ], 234 shared_libs: ["liblog"], 235 }, 236 }, 237 // Targets using these defaults must provide the following guest-specific fields on linux: 238 // generated_header: [ 239 // "libberberis_intrinsics_gen_public_headers_<guest>_to_<host>", 240 // "libberberis_text_assembler_gen_headers_<guest>_to_<host>", 241 // ], 242 // header_libs: [ "libberberis_macro_assembler_headers_<guest>_to_<host>" ], 243 // static_libs: [ "libberberis_macro_assembler_<guest>_to_<host>" ], 244} 245 246cc_library_headers { 247 name: "libberberis_intrinsics_riscv64_headers", 248 defaults: ["berberis_all_hosts_defaults"], 249 host_supported: true, 250 header_libs: [ 251 "libberberis_base_headers", 252 "libberberis_intrinsics_headers", 253 "libberberis_runtime_primitives_headers", // for platform.h 254 ], 255 export_header_lib_headers: [ 256 "libberberis_base_headers", 257 "libberberis_intrinsics_headers", 258 "libberberis_runtime_primitives_headers", // for platform.h 259 ], 260 export_include_dirs: [ 261 "riscv64_to_all/include", 262 ], 263 arch: { 264 arm64: { 265 generated_headers: ["libberberis_intrinsics_gen_public_headers_riscv64_to_arm64"], 266 export_generated_headers: ["libberberis_intrinsics_gen_public_headers_riscv64_to_arm64"], 267 export_include_dirs: [ 268 "riscv64_to_arm64/include", 269 ], 270 }, 271 x86_64: { 272 generated_headers: [ 273 "libberberis_intrinsics_gen_inline_headers_riscv64_to_x86_64", 274 "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64", 275 ], 276 export_generated_headers: [ 277 "libberberis_intrinsics_gen_inline_headers_riscv64_to_x86_64", 278 "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64", 279 ], 280 export_include_dirs: [ 281 "riscv64_to_x86_64/include", 282 ], 283 }, 284 }, 285} 286 287cc_library_headers { 288 name: "libberberis_intrinsics_headers", 289 defaults: ["berberis_all_hosts_defaults"], 290 host_supported: true, 291 native_bridge_supported: true, 292 export_include_dirs: ["include"], 293 header_libs: ["libberberis_base_headers"], 294 export_header_lib_headers: ["libberberis_base_headers"], 295 arch: { 296 x86: { 297 export_include_dirs: [ 298 "all_to_x86_32_or_x86_64/include", 299 ], 300 }, 301 x86_64: { 302 export_include_dirs: [ 303 "all_to_x86_32_or_x86_64/include", 304 ], 305 }, 306 riscv64: { 307 export_include_dirs: [ 308 "all_to_riscv64/include", 309 ], 310 }, 311 }, 312} 313 314cc_library_static { 315 name: "libberberis_intrinsics", 316 defaults: ["berberis_defaults"], 317 host_supported: true, 318 header_libs: ["libberberis_intrinsics_riscv64_headers"], 319 static_libs: ["libberberis_base"], 320 export_header_lib_headers: ["libberberis_intrinsics_riscv64_headers"], 321} 322 323cc_library_headers { 324 name: "libberberis_macro_assembler_headers_all_to_riscv64", 325 defaults: ["berberis_defaults_64"], 326 host_supported: true, 327 export_include_dirs: [ 328 "all_to_riscv64/include", 329 "include", 330 ], 331 header_libs: [ 332 "libberberis_base_headers", 333 "libberberis_intrinsics_headers", 334 ], 335 export_header_lib_headers: [ 336 "libberberis_base_headers", 337 "libberberis_intrinsics_headers", 338 ], 339} 340 341cc_library_headers { 342 name: "libberberis_macro_assembler_headers_all_to_x86_64", 343 defaults: ["berberis_defaults_64"], 344 host_supported: true, 345 export_include_dirs: [ 346 "all_to_x86_32_or_x86_64/include", 347 "include", 348 ], 349 header_libs: [ 350 "libberberis_base_headers", 351 "libberberis_intrinsics_headers", 352 ], 353 export_header_lib_headers: [ 354 "libberberis_base_headers", 355 "libberberis_intrinsics_headers", 356 ], 357} 358 359cc_library_headers { 360 name: "libberberis_macro_assembler_headers_riscv64_to_x86_64", 361 defaults: ["berberis_defaults_64"], 362 host_supported: true, 363 export_include_dirs: [ 364 "riscv64_to_all/include", 365 "riscv64_to_x86_64/include", 366 "include", 367 ], 368 header_libs: [ 369 "libberberis_base_headers", 370 "libberberis_intrinsics_headers", 371 "libberberis_macro_assembler_headers_all_to_x86_64", 372 ], 373 export_header_lib_headers: [ 374 "libberberis_base_headers", 375 "libberberis_intrinsics_headers", 376 ], 377 generated_headers: ["libberberis_macro_assembler_gen_headers_riscv64_to_x86_64"], 378 export_generated_headers: ["libberberis_macro_assembler_gen_headers_riscv64_to_x86_64"], 379} 380 381cc_library_static { 382 name: "libberberis_macro_assembler_riscv64_to_x86_64", 383 defaults: ["berberis_defaults_64"], 384 host_supported: true, 385 srcs: ["riscv64_to_x86_64/macro_assembler.cc"], 386 header_libs: ["libberberis_macro_assembler_headers_riscv64_to_x86_64"], 387} 388 389cc_library_static { 390 name: "libberberis_intrinsics_riscv64", 391 defaults: ["berberis_all_hosts_defaults_64"], 392 host_supported: true, 393 srcs: [ 394 "riscv64_to_all/intrinsics.cc", 395 "riscv64_to_all/vector_intrinsics.cc", 396 ], 397 header_libs: [ 398 "libberberis_base_headers", 399 "libberberis_intrinsics_riscv64_headers", 400 ], 401 export_header_lib_headers: [ 402 "libberberis_base_headers", 403 "libberberis_intrinsics_riscv64_headers", 404 ], 405} 406 407cc_test_library { 408 name: "libberberis_intrinsics_unit_tests", 409 defaults: ["berberis_defaults"], 410 host_supported: true, 411 srcs: ["simd_register_test.cc"], 412 arch: { 413 x86: { 414 srcs: [ 415 "all_to_x86_32_or_x86_64/intrinsics_float_test.cc", 416 ], 417 }, 418 x86_64: { 419 cflags: ["-mssse3"], 420 srcs: [ 421 "all_to_x86_32_or_x86_64/intrinsics_float_test.cc", 422 "all_to_x86_64/tuple_test.cc", 423 // Note that these two tests technically should work on any platform that supports 424 // risv64 to something translation, but currently that's only x86-64. 425 "riscv64_to_all/intrinsics_test.cc", 426 "riscv64_to_all/vector_intrinsics_test.cc", 427 ], 428 }, 429 }, 430 static_libs: [ 431 "libberberis_base", 432 "libberberis_intrinsics", 433 ], 434 shared: { 435 enabled: false, 436 }, 437} 438