Sound Open Firmware
Loading...
Searching...
No Matches
format_hifi3.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2024 Intel Corporation. All rights reserved.
4 *
5 * Author: Shriram Shastry <malladi.sastry@linux.intel.com>
6 */
7
8#ifndef __SOF_AUDIO_FORMAT_HIFI3_H__
9#define __SOF_AUDIO_FORMAT_HIFI3_H__
10
11#include <stdint.h>
12#include <xtensa/config/defs.h>
13#include <xtensa/tie/xt_hifi3.h>
14
15/* Saturation inline functions */
16
26static inline int32_t sat_int32(int64_t x)
27{
28 /* Shift left by 32 bits with saturation */
29 ae_f64 shifted = AE_SLAI64S(x, 32);
30
31 /* Shift right by 32 bits */
32 return (int32_t)AE_MOVINT32_FROMINT64(AE_SRAI64(shifted, 32));
33}
34
45static inline ae_int32x2 vec_sat_int32x2(int64_t x, int64_t y)
46{
47 ae_f64 d0, d1;
48
49 /* Convert 64-bit integers to ae_f64 format */
50 d0 = (ae_f64)x;
51 d1 = (ae_f64)y;
52
53 /* Round and saturate both 64-bit values to 32-bit and pack them */
54 return (ae_int32x2)AE_ROUND32X2F64SSYM(d0, d1);
55}
56
66static inline int32_t sat_int24(int32_t x)
67{
68 /* Move 32-bit value to ae_f32x2 type */
69 ae_f32x2 d0 = AE_MOVDA32(x);
70
71 /* Saturate to 24-bit */
72 return (ae_int32)AE_SAT24S(d0);
73}
74
85static inline ae_int32x2 vec_sat_int24x2(int32_t x, int32_t y)
86{
87 /* Move two 32-bit values to ae_f32x2 type */
88 ae_f32x2 d0 = AE_MOVDA32X2(x, y);
89
90 /* Saturate both values to 24-bit and pack them */
91 return (ae_int32x2)AE_SAT24S(d0);
92}
93
103static inline int16_t sat_int16(int32_t x)
104{
105 /* Move 32-bit value to ae_int32x2 type */
106 ae_int32x2 d0 = AE_MOVDA32(x);
107
108 /* Saturate both values to 16-bit and pack them */
109 ae_int16x4 result = AE_SAT16X4(d0, d0);
110
111 /* Use AE_MOVAD16_0 to extract the first 16-bit value */
112 return AE_MOVAD16_0(result);
113}
114
127static inline ae_int16x4 vec_sat_int16x4(int32_t x, int32_t y, int32_t z, int32_t q)
128{
129 /* Move four 32-bit values to ae_int32x2 type */
130 ae_int32x2 d0 = AE_MOVDA32X2(x, y);
131 ae_int32x2 d1 = AE_MOVDA32X2(z, q);
132
133 /* Saturate all values to 16-bit and pack them */
134 return AE_SAT16X4(d0, d1);
135}
136
146static inline int8_t sat_int8(int32_t x)
147{
148 /* Shift left by 24 bits */
149 ae_f32x2 a_i = AE_SLAI32S(x, 24);
150
151 /* Shift right by 24 bits to sign-extend the 8-bit value */
152 a_i = AE_SRAI32(a_i, 24);
153
154 /* Extract the lower 8 bits as an int8_t */
155 return (int8_t)AE_MOVAD32_L(a_i);
156}
157
168static inline ae_int32x2 vec_sat_int8x2(int32_t x, int32_t y)
169{
170 /* Move two 32-bit values to ae_f32x2 type */
171 ae_f32x2 d0 = AE_MOVDA32X2(x, y);
172
173 /* Shift left by 24 bits and then right by 24 bits to sign-extend and saturate */
174 return AE_F32X2_SRAI(AE_F32X2_SLAIS(d0, 24), 24);
175}
176
177#endif /* __SOF_AUDIO_FORMAT_HIFI3_H__ */
static ae_int16x4 vec_sat_int16x4(int32_t x, int32_t y, int32_t z, int32_t q)
Saturate and round four 32-bit integers to 16-bit packed into a 16x4 vector.
Definition format_hifi3.h:127
static ae_int32x2 vec_sat_int32x2(int64_t x, int64_t y)
Saturate and round two 64-bit integers to 32-bit packed into a 32x2 vector.
Definition format_hifi3.h:45
static int8_t sat_int8(int32_t x)
Saturate and round a 32-bit integer to 8-bit.
Definition format_hifi3.h:146
static int16_t sat_int16(int32_t x)
Saturate a 32-bit integer to 16-bit.
Definition format_hifi3.h:103
static int32_t sat_int24(int32_t x)
Saturate and round a 32-bit integer to 24-bit.
Definition format_hifi3.h:66
static ae_int32x2 vec_sat_int8x2(int32_t x, int32_t y)
Saturate and round two 32-bit integers to 8-bit packed into an 8x2 vector.
Definition format_hifi3.h:168
static int32_t sat_int32(int64_t x)
Saturate a 64-bit integer to 32-bit.
Definition format_hifi3.h:26
static ae_int32x2 vec_sat_int24x2(int32_t x, int32_t y)
Saturate and round two 32-bit integers to 24-bit packed into a 32x2 vector.
Definition format_hifi3.h:85