The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 1 | /* |
| 2 | * ARMv6 integer SIMD operations. |
| 3 | * |
| 4 | * Copyright (c) 2007 CodeSourcery. |
| 5 | * Written by Paul Brook |
| 6 | * |
David 'Digit' Turner | 0b4c9e8 | 2014-04-03 00:37:18 +0200 | [diff] [blame] | 7 | * This code is licensed under the GPL. |
The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 8 | */ |
| 9 | |
| 10 | #ifdef ARITH_GE |
David 'Digit' Turner | 5d8f37a | 2009-09-14 14:32:27 -0700 | [diff] [blame] | 11 | #define GE_ARG , void *gep |
The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 12 | #define DECLARE_GE uint32_t ge = 0 |
David 'Digit' Turner | 5d8f37a | 2009-09-14 14:32:27 -0700 | [diff] [blame] | 13 | #define SET_GE *(uint32_t *)gep = ge |
The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 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 | |
David 'Digit' Turner | 5285864 | 2011-06-03 13:41:05 +0200 | [diff] [blame] | 76 | ADD16(a, b >> 16, 0); |
| 77 | SUB16(a >> 16, b, 1); |
The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 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 | |
David 'Digit' Turner | 5285864 | 2011-06-03 13:41:05 +0200 | [diff] [blame] | 87 | SUB16(a, b >> 16, 0); |
| 88 | ADD16(a >> 16, b, 1); |
The Android Open Source Project | 8b23a6c | 2009-03-03 19:30:32 -0800 | [diff] [blame] | 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 |