pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 1 | /* |
| 2 | * ARMv6 integer SIMD operations. |
| 3 | * |
| 4 | * Copyright (c) 2007 CodeSourcery. |
| 5 | * Written by Paul Brook |
| 6 | * |
Matthew Fernandez | 8e31bf3 | 2011-06-26 12:21:35 +1000 | [diff] [blame] | 7 | * This code is licensed under the GPL. |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 8 | */ |
| 9 | |
| 10 | #ifdef ARITH_GE |
pbrook | a7812ae | 2008-11-17 14:43:54 +0000 | [diff] [blame] | 11 | #define GE_ARG , void *gep |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 12 | #define DECLARE_GE uint32_t ge = 0 |
pbrook | a7812ae | 2008-11-17 14:43:54 +0000 | [diff] [blame] | 13 | #define SET_GE *(uint32_t *)gep = ge |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 14 | #else |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 15 | #define GE_ARG |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 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 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 23 | uint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG) |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 24 | { |
| 25 | uint32_t res = 0; |
| 26 | DECLARE_GE; |
| 27 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 28 | ADD16(a, b, 0); |
| 29 | ADD16(a >> 16, b >> 16, 1); |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 30 | SET_GE; |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 31 | return res; |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 32 | } |
| 33 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 34 | uint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG) |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 35 | { |
| 36 | uint32_t res = 0; |
| 37 | DECLARE_GE; |
| 38 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 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); |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 43 | SET_GE; |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 44 | return res; |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 45 | } |
| 46 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 47 | uint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG) |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 48 | { |
| 49 | uint32_t res = 0; |
| 50 | DECLARE_GE; |
| 51 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 52 | SUB16(a, b, 0); |
| 53 | SUB16(a >> 16, b >> 16, 1); |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 54 | SET_GE; |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 55 | return res; |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 56 | } |
| 57 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 58 | uint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG) |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 59 | { |
| 60 | uint32_t res = 0; |
| 61 | DECLARE_GE; |
| 62 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 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); |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 67 | SET_GE; |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 68 | return res; |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 69 | } |
| 70 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 71 | uint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG) |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 72 | { |
| 73 | uint32_t res = 0; |
| 74 | DECLARE_GE; |
| 75 | |
Chih-Min Chao | bb42e28 | 2010-06-28 23:54:04 +0800 | [diff] [blame] | 76 | ADD16(a, b >> 16, 0); |
| 77 | SUB16(a >> 16, b, 1); |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 78 | SET_GE; |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 79 | return res; |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 80 | } |
| 81 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 82 | uint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG) |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 83 | { |
| 84 | uint32_t res = 0; |
| 85 | DECLARE_GE; |
| 86 | |
Chih-Min Chao | bb42e28 | 2010-06-28 23:54:04 +0800 | [diff] [blame] | 87 | SUB16(a, b >> 16, 0); |
| 88 | ADD16(a >> 16, b, 1); |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 89 | SET_GE; |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 90 | return res; |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 91 | } |
| 92 | |
pbrook | 6ddbc6e | 2008-03-31 03:46:33 +0000 | [diff] [blame] | 93 | #undef GE_ARG |
pbrook | 9ee6e8b | 2007-11-11 00:04:49 +0000 | [diff] [blame] | 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 |