1*f5c631daSSadaf Ebrahimi // Copyright 2015, VIXL authors 2*f5c631daSSadaf Ebrahimi // All rights reserved. 3*f5c631daSSadaf Ebrahimi // 4*f5c631daSSadaf Ebrahimi // Redistribution and use in source and binary forms, with or without 5*f5c631daSSadaf Ebrahimi // modification, are permitted provided that the following conditions are met: 6*f5c631daSSadaf Ebrahimi // 7*f5c631daSSadaf Ebrahimi // * Redistributions of source code must retain the above copyright notice, 8*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer. 9*f5c631daSSadaf Ebrahimi // * Redistributions in binary form must reproduce the above copyright notice, 10*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer in the documentation 11*f5c631daSSadaf Ebrahimi // and/or other materials provided with the distribution. 12*f5c631daSSadaf Ebrahimi // * Neither the name of ARM Limited nor the names of its contributors may be 13*f5c631daSSadaf Ebrahimi // used to endorse or promote products derived from this software without 14*f5c631daSSadaf Ebrahimi // specific prior written permission. 15*f5c631daSSadaf Ebrahimi // 16*f5c631daSSadaf Ebrahimi // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17*f5c631daSSadaf Ebrahimi // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18*f5c631daSSadaf Ebrahimi // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19*f5c631daSSadaf Ebrahimi // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20*f5c631daSSadaf Ebrahimi // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*f5c631daSSadaf Ebrahimi // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22*f5c631daSSadaf Ebrahimi // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23*f5c631daSSadaf Ebrahimi // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24*f5c631daSSadaf Ebrahimi // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25*f5c631daSSadaf Ebrahimi // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*f5c631daSSadaf Ebrahimi 27*f5c631daSSadaf Ebrahimi #ifndef VIXL_EXAMPLE_EXAMPLES_H_ 28*f5c631daSSadaf Ebrahimi #define VIXL_EXAMPLE_EXAMPLES_H_ 29*f5c631daSSadaf Ebrahimi 30*f5c631daSSadaf Ebrahimi #include "aarch64/macro-assembler-aarch64.h" 31*f5c631daSSadaf Ebrahimi #include "aarch64/simulator-aarch64.h" 32*f5c631daSSadaf Ebrahimi 33*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 34*f5c631daSSadaf Ebrahimi // uint64_t factorial(uint64_t n) 35*f5c631daSSadaf Ebrahimi // 36*f5c631daSSadaf Ebrahimi // It provides an iterative implementation of the factorial computation. 37*f5c631daSSadaf Ebrahimi void GenerateFactorial(vixl::aarch64::MacroAssembler* masm); 38*f5c631daSSadaf Ebrahimi 39*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 40*f5c631daSSadaf Ebrahimi // uint64_t factorial_rec(uint64_t n) 41*f5c631daSSadaf Ebrahimi // 42*f5c631daSSadaf Ebrahimi // It provides a recursive implementation of the factorial computation. 43*f5c631daSSadaf Ebrahimi void GenerateFactorialRec(vixl::aarch64::MacroAssembler* masm); 44*f5c631daSSadaf Ebrahimi 45*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 46*f5c631daSSadaf Ebrahimi // void neon_matrix_multiply(float* dst, float* mat1, float* mat2) 47*f5c631daSSadaf Ebrahimi // 48*f5c631daSSadaf Ebrahimi // It provides an implementation of a column-major 4x4 matrix multiplication. 49*f5c631daSSadaf Ebrahimi void GenerateNEONMatrixMultiply(vixl::aarch64::MacroAssembler* masm); 50*f5c631daSSadaf Ebrahimi 51*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 52*f5c631daSSadaf Ebrahimi // void add2_vectors(int8_t *vec_a, const int8_t *vec_b, unsigned size) 53*f5c631daSSadaf Ebrahimi // 54*f5c631daSSadaf Ebrahimi // Demonstrate how to add two vectors using NEON. The result is stored in vec_a. 55*f5c631daSSadaf Ebrahimi void GenerateAdd2Vectors(vixl::aarch64::MacroAssembler* masm); 56*f5c631daSSadaf Ebrahimi 57*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 58*f5c631daSSadaf Ebrahimi // double add3_double(double x, double y, double z) 59*f5c631daSSadaf Ebrahimi // 60*f5c631daSSadaf Ebrahimi // This example is intended to show the calling convention with double 61*f5c631daSSadaf Ebrahimi // floating point arguments. 62*f5c631daSSadaf Ebrahimi void GenerateAdd3Double(vixl::aarch64::MacroAssembler* masm); 63*f5c631daSSadaf Ebrahimi 64*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 65*f5c631daSSadaf Ebrahimi // double add4_double(uint64_t a, double b, uint64_t c, double d) 66*f5c631daSSadaf Ebrahimi // 67*f5c631daSSadaf Ebrahimi // The generated function pictures the calling convention for functions 68*f5c631daSSadaf Ebrahimi // mixing integer and floating point arguments. 69*f5c631daSSadaf Ebrahimi void GenerateAdd4Double(vixl::aarch64::MacroAssembler* masm); 70*f5c631daSSadaf Ebrahimi 71*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 72*f5c631daSSadaf Ebrahimi // uint32_t sum_array(uint8_t* array, uint32_t size) 73*f5c631daSSadaf Ebrahimi // 74*f5c631daSSadaf Ebrahimi // The generated function computes the sum of all the elements in 75*f5c631daSSadaf Ebrahimi // the given array. 76*f5c631daSSadaf Ebrahimi void GenerateSumArray(vixl::aarch64::MacroAssembler* masm); 77*f5c631daSSadaf Ebrahimi 78*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 79*f5c631daSSadaf Ebrahimi // int64_t abs(int64_t x) 80*f5c631daSSadaf Ebrahimi // 81*f5c631daSSadaf Ebrahimi // The generated function computes the absolute value of an integer. 82*f5c631daSSadaf Ebrahimi void GenerateAbs(vixl::aarch64::MacroAssembler* masm); 83*f5c631daSSadaf Ebrahimi 84*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 85*f5c631daSSadaf Ebrahimi // uint64_t check_bounds(uint64_t value, uint64_t low, uint64_t high) 86*f5c631daSSadaf Ebrahimi // 87*f5c631daSSadaf Ebrahimi // The goal of this example is to illustrate the use of conditional 88*f5c631daSSadaf Ebrahimi // instructions. The generated function will check that the given value is 89*f5c631daSSadaf Ebrahimi // contained within the given boundaries. It returns 1 if 'value' is between 90*f5c631daSSadaf Ebrahimi // 'low' and 'high' (ie. low <= value <= high). 91*f5c631daSSadaf Ebrahimi void GenerateCheckBounds(vixl::aarch64::MacroAssembler* masm); 92*f5c631daSSadaf Ebrahimi 93*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 94*f5c631daSSadaf Ebrahimi // uint32_t crc32(const char *msg, size_t msg_length) 95*f5c631daSSadaf Ebrahimi // 96*f5c631daSSadaf Ebrahimi // The generated function computes the CRC-32 checksum on the input msg 97*f5c631daSSadaf Ebrahimi // with specified length, and returns the result. 98*f5c631daSSadaf Ebrahimi void GenerateCrc32(vixl::aarch64::MacroAssembler* masm); 99*f5c631daSSadaf Ebrahimi 100*f5c631daSSadaf Ebrahimi // Generate a function which uses the stack to swap the content of the x0, x1, 101*f5c631daSSadaf Ebrahimi // x2 and x3 registers. 102*f5c631daSSadaf Ebrahimi void GenerateSwap4(vixl::aarch64::MacroAssembler* masm); 103*f5c631daSSadaf Ebrahimi 104*f5c631daSSadaf Ebrahimi // Generate a function which swaps the content of w0 and w1. 105*f5c631daSSadaf Ebrahimi // This example demonstrates some interesting features of VIXL's stack 106*f5c631daSSadaf Ebrahimi // operations. 107*f5c631daSSadaf Ebrahimi void GenerateSwapInt32(vixl::aarch64::MacroAssembler* masm); 108*f5c631daSSadaf Ebrahimi 109*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 110*f5c631daSSadaf Ebrahimi // uint64_t demo_function(uint64_t x) 111*f5c631daSSadaf Ebrahimi // 112*f5c631daSSadaf Ebrahimi // This is the example used in doc/getting-started-aarch64.txt 113*f5c631daSSadaf Ebrahimi void GenerateDemoFunction(vixl::aarch64::MacroAssembler* masm); 114*f5c631daSSadaf Ebrahimi 115*f5c631daSSadaf Ebrahimi // This function generates and runs code that uses literals to sum the `a` and 116*f5c631daSSadaf Ebrahimi // `b` inputs. 117*f5c631daSSadaf Ebrahimi int64_t LiteralExample(int64_t a, int64_t b); 118*f5c631daSSadaf Ebrahimi 119*f5c631daSSadaf Ebrahimi // Generate a few examples of runtime calls. 120*f5c631daSSadaf Ebrahimi void GenerateRuntimeCallExamples(vixl::aarch64::MacroAssembler* masm); 121*f5c631daSSadaf Ebrahimi 122*f5c631daSSadaf Ebrahimi // Generate a function with the following prototype: 123*f5c631daSSadaf Ebrahimi // size_t sve_strlen(const char* str); 124*f5c631daSSadaf Ebrahimi // 125*f5c631daSSadaf Ebrahimi // The function implements the standard `strlen` using SVE. 126*f5c631daSSadaf Ebrahimi void GenerateSVEStrlen(vixl::aarch64::MacroAssembler* masm); 127*f5c631daSSadaf Ebrahimi 128*f5c631daSSadaf Ebrahimi #endif // VIXL_EXAMPLE_EXAMPLES_H_ 129