qemu/target-arm/op_addsub.h
<<
>>
Prefs
   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
  23uint32_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
  34uint32_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
  47uint32_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
  58uint32_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
  71uint32_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
  82uint32_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