Home | History | Annotate | Download | only in arch
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      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 "rs_types.rsh"
     18 
     19 #define S_CLAMP(T) \
     20 extern T __attribute__((overloadable)) clamp(T amount, T low, T high) {             \
     21     return amount < low ? low : (amount > high ? high : amount);                    \
     22 }
     23 
     24 //_CLAMP(float);  implemented in .ll
     25 S_CLAMP(double);
     26 S_CLAMP(char);
     27 S_CLAMP(uchar);
     28 S_CLAMP(short);
     29 S_CLAMP(ushort);
     30 S_CLAMP(int);
     31 S_CLAMP(uint);
     32 S_CLAMP(long);
     33 S_CLAMP(ulong);
     34 
     35 #undef S_CLAMP
     36 
     37 
     38                                                                                     \
     39 #define V_CLAMP(T) \
     40 extern T##2 __attribute__((overloadable)) clamp(T##2 amount, T##2 low, T##2 high) { \
     41     T##2 r;                                                                         \
     42     r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
     43     r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
     44     return r;                                                                       \
     45 }                                                                                   \
     46                                                                                     \
     47 extern T##3 __attribute__((overloadable)) clamp(T##3 amount, T##3 low, T##3 high) { \
     48     T##3 r;                                                                         \
     49     r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
     50     r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
     51     r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);       \
     52     return r;                                                                       \
     53 }                                                                                   \
     54                                                                                     \
     55 extern T##4 __attribute__((overloadable)) clamp(T##4 amount, T##4 low, T##4 high) { \
     56     T##4 r;                                                                         \
     57     r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);       \
     58     r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);       \
     59     r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);       \
     60     r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);       \
     61     return r;                                                                       \
     62 }                                                                                   \
     63                                                                                     \
     64 extern T##2 __attribute__((overloadable)) clamp(T##2 amount, T low, T high) {       \
     65     T##2 r;                                                                         \
     66     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
     67     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
     68     return r;                                                                       \
     69 }                                                                                   \
     70                                                                                     \
     71 extern T##3 __attribute__((overloadable)) clamp(T##3 amount, T low, T high) {       \
     72     T##3 r;                                                                         \
     73     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
     74     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
     75     r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);               \
     76     return r;                                                                       \
     77 }                                                                                   \
     78                                                                                     \
     79 extern T##4 __attribute__((overloadable)) clamp(T##4 amount, T low, T high) {       \
     80     T##4 r;                                                                         \
     81     r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);               \
     82     r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);               \
     83     r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);               \
     84     r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);               \
     85     return r;                                                                       \
     86 }
     87 
     88 //V_CLAMP(float);  implemented in .ll
     89 V_CLAMP(double);
     90 V_CLAMP(char);
     91 V_CLAMP(uchar);
     92 V_CLAMP(short);
     93 V_CLAMP(ushort);
     94 #ifndef ARCH_ARM_HAVE_NEON
     95     V_CLAMP(int);  //implemented in .ll
     96     V_CLAMP(uint);  //implemented in .ll
     97 #endif
     98 V_CLAMP(long);
     99 V_CLAMP(ulong);
    100 
    101 #undef _CLAMP
    102 
    103