167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/*
21fd3346740dfb7f47be9922312b68a4227fada96buzbee * Copyright (C) 2013 The Android Open Source Project
367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Licensed under the Apache License, Version 2.0 (the "License");
567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * you may not use this file except in compliance with the License.
667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * You may obtain a copy of the License at
767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *      http://www.apache.org/licenses/LICENSE-2.0
967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee *
1067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Unless required by applicable law or agreed to in writing, software
1167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * distributed under the License is distributed on an "AS IS" BASIS,
1267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * See the License for the specific language governing permissions and
1467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * limitations under the License.
1567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */
1667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_DEX_BACKEND_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_DEX_BACKEND_H_
191fd3346740dfb7f47be9922312b68a4227fada96buzbee
201af0c0b88a956813eb0ad282664cedc391e2938fNicolas Geoffraynamespace art {
2168a5fefa90f03fdf5a238ac85c9439c6b03eae96Nicolas Geoffray
22818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffrayclass ArenaAllocator;
23818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffrayclass CompiledMethod;
24818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray
251fd3346740dfb7f47be9922312b68a4227fada96buzbeeclass Backend {
261fd3346740dfb7f47be9922312b68a4227fada96buzbee  public:
279b7085a4e7c40e7fa01932ea1647a4a33ac1c585Brian Carlstrom    virtual ~Backend() {}
281fd3346740dfb7f47be9922312b68a4227fada96buzbee    virtual void Materialize() = 0;
291fd3346740dfb7f47be9922312b68a4227fada96buzbee    virtual CompiledMethod* GetCompiledMethod() = 0;
301fd3346740dfb7f47be9922312b68a4227fada96buzbee
3160bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji    // Queries for backend support for vectors
3260bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji    /*
3360bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * Return the number of bits in a vector register.
3460bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * @return 0 if vector registers are not supported, or the
3560bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * number of bits in the vector register if supported.
3660bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     */
3760bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji    virtual int VectorRegisterSize() { return 0; }
3860bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji
3960bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji    /*
4060bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * Return the number of reservable vector registers supported
4160bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * @param fp_used  ‘true’ if floating point computations will be
4260bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * executed while vector registers are reserved.
4360bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * @return the number of vector registers that are available
4460bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * @note The backend should ensure that sufficient vector registers
4560bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * are held back to generate scalar code without exhausting vector
4660bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     * registers, if scalar code also uses the vector registers.
4760bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji     */
4860bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji    virtual int NumReservableVectorRegisters(bool fp_used) { return 0; }
4960bfe7b3e8f00f0a8ef3f5d8716adfdf86b71f43Udayan Banerji
501fd3346740dfb7f47be9922312b68a4227fada96buzbee  protected:
519b7085a4e7c40e7fa01932ea1647a4a33ac1c585Brian Carlstrom    explicit Backend(ArenaAllocator* arena) : arena_(arena) {}
526282dc12440a2072dc06a616160027ff21bd895eIan Rogers    ArenaAllocator* const arena_;
531fd3346740dfb7f47be9922312b68a4227fada96buzbee};  // Class Backend
5467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee
5511d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes}  // namespace art
5611d1b0c31ddd710d26068da8e0e4621002205b4bElliott Hughes
57fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_COMPILER_DEX_BACKEND_H_
58