symbian-qemu-0.9.1-12/qemu-symbian-svp/target-arm/op_addsub.h
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2  * ARMv6 integer SIMD operations.
       
     3  *
       
     4  * Copyright (c) 2007 CodeSourcery.
       
     5  * Written by Paul Brook
       
     6  *
       
     7  * This code is licenced 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, 0);
       
    77     SUB16(a >> 16, b >> 16, 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, 0);
       
    88     ADD16(a >> 16, b >> 16, 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