1 /**
2 * Copyright 2022 Huawei Technologies Co., Ltd
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "nnacl/base/cast_base.h"
18 #include "nnacl/cast_base_simd.h"
19
Int32ToFloat32(const int32_t * input,float * output,int number)20 void Int32ToFloat32(const int32_t *input, float *output, int number) {
21 int index = 0;
22
23 SIMD_RUN_NO_SCALAR(Int32ToFloat32, index, input, output, number);
24
25 for (; index < number; ++index) {
26 output[index] = (float)input[index];
27 }
28 }
29
Float32ToInt32(const float * input,int32_t * output,int number)30 void Float32ToInt32(const float *input, int32_t *output, int number) {
31 int index = 0;
32
33 SIMD_RUN_X86_NO_SCALAR(Float32ToInt32, index, input, output, number);
34
35 for (; index < number; ++index) {
36 output[index] = (int32_t)input[index];
37 }
38 }
39
BoolToFloat32(const bool * input,float * output,int number)40 void BoolToFloat32(const bool *input, float *output, int number) {
41 for (int i = 0; i < number; ++i) {
42 output[i] = (float)input[i];
43 }
44 }
45
Uint8ToFloat32(const uint8_t * input,float * output,int number)46 void Uint8ToFloat32(const uint8_t *input, float *output, int number) {
47 for (int i = 0; i < number; ++i) {
48 output[i] = (float)input[i];
49 }
50 }
51
52 void Int32ToFloat32(const int32_t *input, float *output, int number);
53
Int64ToFloat32(const int64_t * input,float * output,int number)54 void Int64ToFloat32(const int64_t *input, float *output, int number) {
55 for (int i = 0; i < number; ++i) {
56 output[i] = (float)input[i];
57 }
58 }
59
60 #ifdef ENABLE_FP16
Int64ToFp16(const int64_t * input,float16_t * output,int number)61 void Int64ToFp16(const int64_t *input, float16_t *output, int number) {
62 for (int i = 0; i < number; ++i) {
63 output[i] = (float16_t)input[i];
64 }
65 }
66
Int32ToFp16(const int32_t * input,float16_t * output,int number)67 void Int32ToFp16(const int32_t *input, float16_t *output, int number) {
68 for (int i = 0; i < number; ++i) {
69 output[i] = (float16_t)input[i];
70 }
71 }
72
BoolToFp16(const bool * input,float16_t * output,int number)73 void BoolToFp16(const bool *input, float16_t *output, int number) {
74 for (int i = 0; i < number; ++i) {
75 output[i] = (float16_t)input[i];
76 }
77 }
78
Uint8ToFp16(const uint8_t * input,float16_t * output,int number)79 void Uint8ToFp16(const uint8_t *input, float16_t *output, int number) {
80 for (int i = 0; i < number; ++i) {
81 output[i] = (float16_t)input[i];
82 }
83 }
84
Float32ToFp16(const float * input,float16_t * output,int number)85 void Float32ToFp16(const float *input, float16_t *output, int number) {
86 for (int i = 0; i < number; ++i) {
87 output[i] = (float16_t)(input[i]);
88 }
89 }
90
Fp16ToFloat32(const float16_t * input,float * output,int number)91 void Fp16ToFloat32(const float16_t *input, float *output, int number) {
92 for (int i = 0; i < number; ++i) {
93 output[i] = (float)(input[i]);
94 }
95 }
96 #else
Fp16ToFloat32(const uint16_t * input,float * output,int number)97 void Fp16ToFloat32(const uint16_t *input, float *output, int number) {
98 for (int i = 0; i < number; ++i) {
99 output[i] = ShortToFloat32(input[i]);
100 }
101 }
102
Float32ToFp16(const float * input,uint16_t * output,int number)103 void Float32ToFp16(const float *input, uint16_t *output, int number) {
104 for (int i = 0; i < number; ++i) {
105 output[i] = Float32ToShort(input[i]);
106 }
107 }
108 #endif
109
110 void Float32ToInt32(const float *input, int32_t *output, int number);
111
Float32ToInt64(const float * input,int64_t * output,int number)112 void Float32ToInt64(const float *input, int64_t *output, int number) {
113 for (int i = 0; i < number; ++i) {
114 output[i] = (int64_t)input[i];
115 }
116 }
117
Int32ToInt64(const int32_t * input,int64_t * output,int number)118 void Int32ToInt64(const int32_t *input, int64_t *output, int number) {
119 for (int i = 0; i < number; ++i) {
120 output[i] = (int64_t)input[i];
121 }
122 }
123
Int64ToInt32(const int64_t * input,int32_t * output,int number)124 void Int64ToInt32(const int64_t *input, int32_t *output, int number) {
125 for (int i = 0; i < number; ++i) {
126 output[i] = (int32_t)input[i];
127 }
128 }
129
Float32ToInt16(const float * input,int16_t * output,int number)130 void Float32ToInt16(const float *input, int16_t *output, int number) {
131 for (int i = 0; i < number; ++i) {
132 output[i] = (int16_t)input[i];
133 }
134 }
135
BoolToInt32(const bool * input,int32_t * output,int number)136 void BoolToInt32(const bool *input, int32_t *output, int number) {
137 for (int i = 0; i < number; ++i) {
138 if (input[i]) {
139 output[i] = 1;
140 } else {
141 output[i] = 0;
142 }
143 }
144 }
145
Float32ToBool(const float * input,bool * output,int number)146 void Float32ToBool(const float *input, bool *output, int number) {
147 for (int i = 0; i < number; ++i) {
148 output[i] = (bool)input[i];
149 }
150 }
151
Float32ToUint8(const float * input,uint8_t * output,int number)152 void Float32ToUint8(const float *input, uint8_t *output, int number) {
153 for (int i = 0; i < number; ++i) {
154 output[i] = (uint8_t)input[i];
155 }
156 }
157