1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------ 2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License. 6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at 7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software 11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied. 14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions 15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License. 16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------------------------------------------- 17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: fxp_mul32_arm_v4_gcc.h 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INCLUDE DESCRIPTION 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifndef FXP_MUL32_V4_ARM_GCC 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define FXP_MUL32_V4_ARM_GCC 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef __cplusplus 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberextern "C" 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined (_ARM_V4_GCC) /* ARM_V4 GNU COMPILER */ 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define preload_cache( a) 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 shft_lft_1(Int32 L_var1) 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 x; 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = L_var1; 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 z = INT32_MAX; 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %1, asl #1\n\t" 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "teq %1, %0, asr #1\n\t" 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "eorne %0, %2, %1, asr #31" 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(x) 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(z)); 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return(x); 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul_16_by_16bb(Int32 L_var1, Int32 L_var2) 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp2; 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %3, asl #16\n\t" 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, asr #16\n\t" 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %2, asl #16\n\t" 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %1, asr #16\n\t" 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mul %0, %1, %0" 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(tmp1), 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(tmp2) 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (tmp1); 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define fxp_mul_16_by_16(a, b) fxp_mul_16_by_16bb( a, b) 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul_16_by_16tb(Int32 L_var1, Int32 L_var2) 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp2; 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %3, asl #16\n\t" 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, asr #16\n\t" 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %2, asr #16\n\t" 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mul %0, %1, %0" 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(tmp1), 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(tmp2) 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (tmp1); 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul_16_by_16bt(Int32 L_var1, Int32 L_var2) 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp2; 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %3, asr #16\n\t" 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %2, asl #16\n\t" 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %1, asr #16\n\t" 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mul %0, %1, %0" 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(tmp1), 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(tmp2) 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (tmp1); 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul_16_by_16tt(Int32 L_var1, Int32 L_var2) 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp2; 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %3, asr #16\n\t" 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %2, asr #16\n\t" 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mul %0, %1, %0" 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(tmp1), 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(tmp2) 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (tmp1); 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mac_16_by_16(Int16 L_var1, Int16 L_var2, Int32 L_add) 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp; 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_add; 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mla %0, %1, %2, %3" 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(tmp) 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (tmp); 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mac_16_by_16_bb(Int16 L_var1, Int32 L_var2, Int32 L_add) 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp2; 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_add; 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %3, asl #16\n\t" 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, asr #16\n\t" 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mla %1, %0, %2, %4" 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(tmp1), 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(tmp2) 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (tmp2); 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mac_16_by_16_bt(Int16 L_var1, Int32 L_var2, Int32 L_add) 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp2; 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_add; 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %3, asr #16\n\t" 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mla %1, %0, %2, %4" 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(tmp1), 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(tmp2) 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (tmp2); 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 cmplx_mul32_by_16(Int32 x, Int32 y, Int32 exp_jw) 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 rTmp0; 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 iTmp0; 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)x; 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)y; 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)exp_jw; 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %5, asr #16\n\t" 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %5, asl #16\n\t" 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, asl #16\n\t" 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(rTmp0), 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(iTmp0), 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_hi) 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "smull %0, %2, %3, %0\n\t" 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "smlal %1, %2, %4, %1" 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(rTmp0), 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(iTmp0), 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_hi) 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_by_16(Int32 L_var1, Int32 L_var2) 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 rTmp0; 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %4, asl #16\n\t" 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "smull %2, %1, %0, %3" 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(rTmp0), 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_hi), 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define fxp_mul32_by_16b( a, b) fxp_mul32_by_16( a, b) 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_by_16t(Int32 L_var1, Int32 L_var2) 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 rTmp0; 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %4, asr #16\n\t" 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, asl #16\n\t" 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "smull %2, %1, %0, %3" 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(rTmp0), 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_hi), 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mac32_by_16(Int32 L_var1, Int32 L_var2, Int32 L_add) 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 rTmp0; 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)L_var1; 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)L_var2; 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_add; 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %4, asl #16\n\t" 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %1, %5\n\t" 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "smlal %2, %1, %0, %3" 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(rTmp0), 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_hi), 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2) 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sum += (int64)L_var1 * L_var2; 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (sum); 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add) 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_add; 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "add %4, %4, %0, asl #2\n\t" 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "add %0, %4, %1, lsr #30" 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mac32_Q31(Int32 L_add, const Int32 a, const Int32 b) 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_add; 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "add %0, %0, %4" 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_msu32_Q31(Int32 L_sub, const Int32 a, const Int32 b) 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_sub; 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "sub %0, %4, %0" 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q31(const Int32 a, const Int32 b) 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "smull %1, %0, %2, %3" 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b) 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #2\n\t" 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #30" 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mac32_Q29(const Int32 a, const Int32 b, Int32 L_add) 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_add; 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "add %4, %4, %0, lsl #3\n\t" 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "add %0, %4, %1, lsr #29" 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_msu32_Q29(const Int32 a, const Int32 b, Int32 L_sub) 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rc = (Int32)L_sub; 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "sub %4, %4, %0, lsl #3\n\t" 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "sub %0, %4, %1, lsr #29" 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb), 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rc)); 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b) 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #3\n\t" 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #29" 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b) 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #4\n\t" 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #28" 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b) 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #5\n\t" 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #27" 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b) 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #6\n\t" 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #26" 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q20(const Int32 a, const Int32 b) 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #12\n\t" 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #20" 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q15(const Int32 a, const Int32 b) 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #17\n\t" 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #15" 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber static inline Int32 fxp_mul32_Q14(const Int32 a, const Int32 b) 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_hi; 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 result64_lo; 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)a; 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 rb = (Int32)b; 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile("smull %1, %0, %2, %3\n\t" 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsl #18\n\t" 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "orr %0, %0, %1, lsr #14" 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(result64_hi), 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "=&r*i"(result64_lo) 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(rb)); 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (result64_hi); 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef __cplusplus 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif /* FXP_MUL32_V4_ARM_GCC */ 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 631