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