1*538b764dSPeter Maydell/* 2*538b764dSPeter Maydell * ARMv6 integer SIMD operations. 3*538b764dSPeter Maydell * 4*538b764dSPeter Maydell * Copyright (c) 2007 CodeSourcery. 5*538b764dSPeter Maydell * Written by Paul Brook 6*538b764dSPeter Maydell * 7*538b764dSPeter Maydell * This code is licensed under the GPL. 8*538b764dSPeter Maydell */ 9*538b764dSPeter Maydell 10*538b764dSPeter Maydell#ifdef ARITH_GE 11*538b764dSPeter Maydell#define GE_ARG , void *gep 12*538b764dSPeter Maydell#define DECLARE_GE uint32_t ge = 0 13*538b764dSPeter Maydell#define SET_GE *(uint32_t *)gep = ge 14*538b764dSPeter Maydell#else 15*538b764dSPeter Maydell#define GE_ARG 16*538b764dSPeter Maydell#define DECLARE_GE do{}while(0) 17*538b764dSPeter Maydell#define SET_GE do{}while(0) 18*538b764dSPeter Maydell#endif 19*538b764dSPeter Maydell 20*538b764dSPeter Maydell#define RESULT(val, n, width) \ 21*538b764dSPeter Maydell res |= ((uint32_t)(glue(glue(uint,width),_t))(val)) << (n * width) 22*538b764dSPeter Maydell 23*538b764dSPeter Maydelluint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG) 24*538b764dSPeter Maydell{ 25*538b764dSPeter Maydell uint32_t res = 0; 26*538b764dSPeter Maydell DECLARE_GE; 27*538b764dSPeter Maydell 28*538b764dSPeter Maydell ADD16(a, b, 0); 29*538b764dSPeter Maydell ADD16(a >> 16, b >> 16, 1); 30*538b764dSPeter Maydell SET_GE; 31*538b764dSPeter Maydell return res; 32*538b764dSPeter Maydell} 33*538b764dSPeter Maydell 34*538b764dSPeter Maydelluint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG) 35*538b764dSPeter Maydell{ 36*538b764dSPeter Maydell uint32_t res = 0; 37*538b764dSPeter Maydell DECLARE_GE; 38*538b764dSPeter Maydell 39*538b764dSPeter Maydell ADD8(a, b, 0); 40*538b764dSPeter Maydell ADD8(a >> 8, b >> 8, 1); 41*538b764dSPeter Maydell ADD8(a >> 16, b >> 16, 2); 42*538b764dSPeter Maydell ADD8(a >> 24, b >> 24, 3); 43*538b764dSPeter Maydell SET_GE; 44*538b764dSPeter Maydell return res; 45*538b764dSPeter Maydell} 46*538b764dSPeter Maydell 47*538b764dSPeter Maydelluint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG) 48*538b764dSPeter Maydell{ 49*538b764dSPeter Maydell uint32_t res = 0; 50*538b764dSPeter Maydell DECLARE_GE; 51*538b764dSPeter Maydell 52*538b764dSPeter Maydell SUB16(a, b, 0); 53*538b764dSPeter Maydell SUB16(a >> 16, b >> 16, 1); 54*538b764dSPeter Maydell SET_GE; 55*538b764dSPeter Maydell return res; 56*538b764dSPeter Maydell} 57*538b764dSPeter Maydell 58*538b764dSPeter Maydelluint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG) 59*538b764dSPeter Maydell{ 60*538b764dSPeter Maydell uint32_t res = 0; 61*538b764dSPeter Maydell DECLARE_GE; 62*538b764dSPeter Maydell 63*538b764dSPeter Maydell SUB8(a, b, 0); 64*538b764dSPeter Maydell SUB8(a >> 8, b >> 8, 1); 65*538b764dSPeter Maydell SUB8(a >> 16, b >> 16, 2); 66*538b764dSPeter Maydell SUB8(a >> 24, b >> 24, 3); 67*538b764dSPeter Maydell SET_GE; 68*538b764dSPeter Maydell return res; 69*538b764dSPeter Maydell} 70*538b764dSPeter Maydell 71*538b764dSPeter Maydelluint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG) 72*538b764dSPeter Maydell{ 73*538b764dSPeter Maydell uint32_t res = 0; 74*538b764dSPeter Maydell DECLARE_GE; 75*538b764dSPeter Maydell 76*538b764dSPeter Maydell ADD16(a, b >> 16, 0); 77*538b764dSPeter Maydell SUB16(a >> 16, b, 1); 78*538b764dSPeter Maydell SET_GE; 79*538b764dSPeter Maydell return res; 80*538b764dSPeter Maydell} 81*538b764dSPeter Maydell 82*538b764dSPeter Maydelluint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG) 83*538b764dSPeter Maydell{ 84*538b764dSPeter Maydell uint32_t res = 0; 85*538b764dSPeter Maydell DECLARE_GE; 86*538b764dSPeter Maydell 87*538b764dSPeter Maydell SUB16(a, b >> 16, 0); 88*538b764dSPeter Maydell ADD16(a >> 16, b, 1); 89*538b764dSPeter Maydell SET_GE; 90*538b764dSPeter Maydell return res; 91*538b764dSPeter Maydell} 92*538b764dSPeter Maydell 93*538b764dSPeter Maydell#undef GE_ARG 94*538b764dSPeter Maydell#undef DECLARE_GE 95*538b764dSPeter Maydell#undef SET_GE 96*538b764dSPeter Maydell#undef RESULT 97*538b764dSPeter Maydell 98*538b764dSPeter Maydell#undef ARITH_GE 99*538b764dSPeter Maydell#undef PFX 100*538b764dSPeter Maydell#undef ADD16 101*538b764dSPeter Maydell#undef SUB16 102*538b764dSPeter Maydell#undef ADD8 103*538b764dSPeter Maydell#undef SUB8 104