Home | History | Annotate | Download | only in target-arm
      1 /*
      2  * ARMv6 integer SIMD operations.
      3  *
      4  * Copyright (c) 2007 CodeSourcery.
      5  * Written by Paul Brook
      6  *
      7  * This code is licensed under the GPL.
      8  */
      9 
     10 #ifdef ARITH_GE
     11 #define GE_ARG , void *gep
     12 #define DECLARE_GE uint32_t ge = 0
     13 #define SET_GE *(uint32_t *)gep = ge
     14 #else
     15 #define GE_ARG
     16 #define DECLARE_GE do{}while(0)
     17 #define SET_GE do{}while(0)
     18 #endif
     19 
     20 #define RESULT(val, n, width) \
     21     res |= ((uint32_t)(glue(glue(uint,width),_t))(val)) << (n * width)
     22 
     23 uint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG)
     24 {
     25     uint32_t res = 0;
     26     DECLARE_GE;
     27 
     28     ADD16(a, b, 0);
     29     ADD16(a >> 16, b >> 16, 1);
     30     SET_GE;
     31     return res;
     32 }
     33 
     34 uint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG)
     35 {
     36     uint32_t res = 0;
     37     DECLARE_GE;
     38 
     39     ADD8(a, b, 0);
     40     ADD8(a >> 8, b >> 8, 1);
     41     ADD8(a >> 16, b >> 16, 2);
     42     ADD8(a >> 24, b >> 24, 3);
     43     SET_GE;
     44     return res;
     45 }
     46 
     47 uint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG)
     48 {
     49     uint32_t res = 0;
     50     DECLARE_GE;
     51 
     52     SUB16(a, b, 0);
     53     SUB16(a >> 16, b >> 16, 1);
     54     SET_GE;
     55     return res;
     56 }
     57 
     58 uint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG)
     59 {
     60     uint32_t res = 0;
     61     DECLARE_GE;
     62 
     63     SUB8(a, b, 0);
     64     SUB8(a >> 8, b >> 8, 1);
     65     SUB8(a >> 16, b >> 16, 2);
     66     SUB8(a >> 24, b >> 24, 3);
     67     SET_GE;
     68     return res;
     69 }
     70 
     71 uint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG)
     72 {
     73     uint32_t res = 0;
     74     DECLARE_GE;
     75 
     76     ADD16(a, b >> 16, 0);
     77     SUB16(a >> 16, b, 1);
     78     SET_GE;
     79     return res;
     80 }
     81 
     82 uint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG)
     83 {
     84     uint32_t res = 0;
     85     DECLARE_GE;
     86 
     87     SUB16(a, b >> 16, 0);
     88     ADD16(a >> 16, b, 1);
     89     SET_GE;
     90     return res;
     91 }
     92 
     93 #undef GE_ARG
     94 #undef DECLARE_GE
     95 #undef SET_GE
     96 #undef RESULT
     97 
     98 #undef ARITH_GE
     99 #undef PFX
    100 #undef ADD16
    101 #undef SUB16
    102 #undef ADD8
    103 #undef SUB8
    104