sl@0: /* sl@0: * LIBOIL - Library of Optimized Inner Loops sl@0: * Copyright (c) 2005 David A. Schleef sl@0: * All rights reserved. sl@0: * sl@0: * Redistribution and use in source and binary forms, with or without sl@0: * modification, are permitted provided that the following conditions sl@0: * are met: sl@0: * 1. Redistributions of source code must retain the above copyright sl@0: * notice, this list of conditions and the following disclaimer. sl@0: * 2. Redistributions in binary form must reproduce the above copyright sl@0: * notice, this list of conditions and the following disclaimer in the sl@0: * documentation and/or other materials provided with the distribution. sl@0: * sl@0: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR sl@0: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED sl@0: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE sl@0: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, sl@0: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES sl@0: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR sl@0: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) sl@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, sl@0: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING sl@0: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE sl@0: * POSSIBILITY OF SUCH DAMAGE. sl@0: */ sl@0: //Portions Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. sl@0: sl@0: #ifdef HAVE_CONFIG_H sl@0: #include "config.h" sl@0: #endif sl@0: sl@0: #include sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: /** sl@0: * SECTION:liboilfuncs-math sl@0: * @title: Simple Arithmetic sl@0: * @short_description: Aritmetic operations sl@0: * sl@0: */ sl@0: sl@0: /** sl@0: * SECTION:liboilfuncs-math8x8 sl@0: * @title: Simple Arithmetic on Blocks sl@0: * @short_description: Aritmetic operations on 8x8 blocks sl@0: * sl@0: */ sl@0: sl@0: /** sl@0: * oil_add_s16: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Adds elements in @s2 and @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (add_s16, "int16_t *d, int16_t *src1, int16_t *src2, int n"); sl@0: /** sl@0: * oil_subtract_s16: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Subtracts elements in @s2 from @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (subtract_s16, "int16_t *d, int16_t *src1, int16_t *src2, int n"); sl@0: /** sl@0: * oil_add_s16_u8: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Adds elements in @s2 and @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (add_s16_u8, "int16_t *d, int16_t *src1, uint8_t *src2, int n"); sl@0: /** sl@0: * oil_subtract_s16_u8: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Subtracts elements in @s2 from @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (subtract_s16_u8, "int16_t *d, int16_t *src1, uint8_t *src2, int n"); sl@0: sl@0: /** sl@0: * oil_add_f32: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Adds elements in @s2 and @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (add_f32, "float *d, float *s1, float *s2, int n"); sl@0: sl@0: /** sl@0: * oil_add_f64: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Adds elements in @s2 and @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (add_f64, "double *d, double *s1, double *s2, int n"); sl@0: sl@0: sl@0: sl@0: /** sl@0: * oil_subtract_f32: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Subtracts elements in @s2 from @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (subtract_f32, "float *d, float *s1, float *s2, int n"); sl@0: /** sl@0: * oil_subtract_f64: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Subtracts elements in @s2 from @s1 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (subtract_f64, "double *d, double *s1, double *s2, int n"); sl@0: /** sl@0: * oil_multiply_f32: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Multiplies elements in @s1 and @s2 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (multiply_f32, "float *d, float *s1, float *s2, int n"); sl@0: /** sl@0: * oil_multiply_f64: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Multiplies elements in @s1 and @s2 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (multiply_f64, "double *d, double *s1, double *s2, int n"); sl@0: /** sl@0: * oil_divide_f32: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Divides elements in @s1 by @s2 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (divide_f32, "float *d, float *s1, float *s2, int n"); sl@0: /** sl@0: * oil_divide_f64: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Divides elements in @s1 by @s2 and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (divide_f64, "double *d, double *s1, double *s2, int n"); sl@0: /** sl@0: * oil_minimum_f32: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Places the lesser of @s1 and @s2 in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (minimum_f32, "float *d, float *s1, float *s2, int n"); sl@0: /** sl@0: * oil_minimum_f64: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Places the lesser of @s1 and @s2 in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (minimum_f64, "float *d, float *s1, float *s2, int n"); sl@0: /** sl@0: * oil_maximum_f32: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Places the greater of @s1 and @s2 in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (maximum_f32, "float *d, float *s1, float *s2, int n"); sl@0: /** sl@0: * oil_maximum_f64: sl@0: * @d: destination sl@0: * @s1: source 1 sl@0: * @s2: source 2 sl@0: * @n: number of elements sl@0: * sl@0: * Places the greater of @s1 and @s2 in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (maximum_f64, "float *d, float *s1, float *s2, int n"); sl@0: sl@0: /** sl@0: * oil_negative_f32: sl@0: * @d: destination sl@0: * @s: source sl@0: * @n: number of elements sl@0: * sl@0: * Negates each element in @s and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (negative_f32, "float *d, float *s, int n"); sl@0: /** sl@0: * oil_inverse_f32: sl@0: * @d: destination sl@0: * @s: source sl@0: * @n: number of elements sl@0: * sl@0: * Calculates the multiplicative inverse of each element in @s and sl@0: * places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (inverse_f32, "float *d, float *s, int n"); sl@0: /** sl@0: * oil_sign_f32: sl@0: * @d: destination sl@0: * @s: source sl@0: * @n: number of elements sl@0: * sl@0: * Calculates the sign of each element in @s and sl@0: * places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (sign_f32, "float *d, float *s, int n"); sl@0: /** sl@0: * oil_floor_f32: sl@0: * @d: destination sl@0: * @s: source sl@0: * @n: number of elements sl@0: * sl@0: * Calculates the greatest integer less than or equal to each element sl@0: * in @s and places the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (floor_f32, "float *d, float *s, int n"); sl@0: sl@0: /** sl@0: * oil_scalaradd_f32_ns: sl@0: * @d: destination sl@0: * @s1: source sl@0: * @s2_1: source sl@0: * @n: number of elements sl@0: * sl@0: * Adds the constant value @s2_1 to each source element and places sl@0: * the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (scalaradd_f32_ns, "float *d, float *s1, float *s2_1, int n"); sl@0: /** sl@0: * oil_scalarmultiply_f32_ns: sl@0: * @d: destination sl@0: * @s1: source sl@0: * @s2_1: source sl@0: * @n: number of elements sl@0: * sl@0: * Multiplies the constant value @s2_1 and each source element and places sl@0: * the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (scalarmultiply_f32_ns, "float *d, float *s1, float *s2_1, int n"); sl@0: sl@0: /** sl@0: * oil_scalarmultiply_f64_ns: sl@0: * @d: destination sl@0: * @s1: source sl@0: * @s2_1: source sl@0: * @n: number of elements sl@0: * sl@0: * Multiplies the constant value @s2_1 and each source element and places sl@0: * the result in @d. sl@0: */ sl@0: OIL_DEFINE_CLASS (scalarmultiply_f64_ns, "double *d, double *s1, double *s2_1, int n"); sl@0: sl@0: static void sl@0: add_s16_ref (int16_t *d, int16_t *src1, int16_t *src2, int n) sl@0: { sl@0: int i; sl@0: for(i=0;i src2[i]) ? src1[i] : src2[i]; sl@0: } sl@0: } sl@0: OIL_DEFINE_IMPL_REF (maximum_f32_ref, maximum_f32); sl@0: sl@0: static void sl@0: minimum_f64_ref (float *dest, float *src1, float *src2, int n) sl@0: { sl@0: int i; sl@0: sl@0: for(i=0;i src2[i]) ? src1[i] : src2[i]; sl@0: } sl@0: } sl@0: OIL_DEFINE_IMPL_REF (maximum_f64_ref, maximum_f64); sl@0: sl@0: static void sl@0: negative_f32_ref (float *dest, float *src1, int n) sl@0: { sl@0: int i; sl@0: sl@0: for(i=0;ifunc; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_subtract_s16 () { sl@0: oil_function_class_ptr_subtract_s16 = __oil_function_class_subtract_s16(); sl@0: return &oil_function_class_ptr_subtract_s16->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_add_s16_u8 () { sl@0: oil_function_class_ptr_add_s16_u8 = __oil_function_class_add_s16_u8(); sl@0: return &oil_function_class_ptr_add_s16_u8->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_subtract_s16_u8 () { sl@0: oil_function_class_ptr_subtract_s16_u8 = __oil_function_class_subtract_s16_u8(); sl@0: return &oil_function_class_ptr_subtract_s16_u8->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_add_f32 () { sl@0: oil_function_class_ptr_add_f32 = __oil_function_class_add_f32(); sl@0: return &oil_function_class_ptr_add_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_add_f64 () { sl@0: oil_function_class_ptr_add_f64 = __oil_function_class_add_f64(); sl@0: return &oil_function_class_ptr_add_f64->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_subtract_f32 () { sl@0: oil_function_class_ptr_subtract_f32 = __oil_function_class_subtract_f32(); sl@0: return &oil_function_class_ptr_subtract_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_subtract_f64 () { sl@0: oil_function_class_ptr_subtract_f64 = __oil_function_class_subtract_f64(); sl@0: return &oil_function_class_ptr_subtract_f64->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_multiply_f32 () { sl@0: oil_function_class_ptr_multiply_f32 = __oil_function_class_multiply_f32(); sl@0: return &oil_function_class_ptr_multiply_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_multiply_f64 () { sl@0: oil_function_class_ptr_multiply_f64 = __oil_function_class_multiply_f64(); sl@0: return &oil_function_class_ptr_multiply_f64->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_divide_f32 () { sl@0: oil_function_class_ptr_divide_f32 = __oil_function_class_divide_f32(); sl@0: return &oil_function_class_ptr_divide_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_divide_f64 () { sl@0: oil_function_class_ptr_divide_f64 = __oil_function_class_divide_f64(); sl@0: return &oil_function_class_ptr_divide_f64->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_minimum_f32 () { sl@0: oil_function_class_ptr_minimum_f32 = __oil_function_class_minimum_f32(); sl@0: return &oil_function_class_ptr_minimum_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_minimum_f64 () { sl@0: oil_function_class_ptr_minimum_f64 = __oil_function_class_minimum_f64(); sl@0: return &oil_function_class_ptr_minimum_f64->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_maximum_f32 () { sl@0: oil_function_class_ptr_maximum_f32 = __oil_function_class_maximum_f32(); sl@0: return &oil_function_class_ptr_maximum_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_maximum_f64 () { sl@0: oil_function_class_ptr_maximum_f64 = __oil_function_class_maximum_f64(); sl@0: return &oil_function_class_ptr_maximum_f64->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_negative_f32 () { sl@0: oil_function_class_ptr_negative_f32 = __oil_function_class_negative_f32(); sl@0: return &oil_function_class_ptr_negative_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_inverse_f32 () { sl@0: oil_function_class_ptr_inverse_f32 = __oil_function_class_inverse_f32(); sl@0: return &oil_function_class_ptr_inverse_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_sign_f32 () { sl@0: oil_function_class_ptr_sign_f32 = __oil_function_class_sign_f32(); sl@0: return &oil_function_class_ptr_sign_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_floor_f32 () { sl@0: oil_function_class_ptr_floor_f32 = __oil_function_class_floor_f32(); sl@0: return &oil_function_class_ptr_floor_f32->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_scalaradd_f32_ns () { sl@0: oil_function_class_ptr_scalaradd_f32_ns = __oil_function_class_scalaradd_f32_ns(); sl@0: return &oil_function_class_ptr_scalaradd_f32_ns->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_scalarmultiply_f32_ns () { sl@0: oil_function_class_ptr_scalarmultiply_f32_ns = __oil_function_class_scalarmultiply_f32_ns(); sl@0: return &oil_function_class_ptr_scalarmultiply_f32_ns->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_scalarmultiply_f64_ns () { sl@0: oil_function_class_ptr_scalarmultiply_f64_ns = __oil_function_class_scalarmultiply_f64_ns(); sl@0: return &oil_function_class_ptr_scalarmultiply_f64_ns->func; sl@0: } sl@0: #endif sl@0: