1 typedef __INT_LEAST8_TYPE__ int8_t; 2 typedef __UINT_LEAST32_TYPE__ uint32_t; 3 typedef int ssize_t; 4 typedef struct { int8_t v1; int8_t v2; int8_t v3; int8_t v4; } neon_s8; 5 6 uint32_t helper_neon_rshl_s8 (uint32_t arg1, uint32_t arg2); 7 8 uint32_t helper_neon_rshl_s8(uint32_t arg1,uint32_t arg2)9helper_neon_rshl_s8 (uint32_t arg1, uint32_t arg2) 10 { 11 uint32_t res; 12 neon_s8 vsrc1; 13 neon_s8 vsrc2; 14 neon_s8 vdest; 15 do 16 { 17 union 18 { 19 neon_s8 v; 20 uint32_t i; 21 } conv_u; 22 conv_u.i = (arg1); 23 vsrc1 = conv_u.v; 24 } 25 while (0); 26 do 27 { 28 union 29 { 30 neon_s8 v; 31 uint32_t i; 32 } conv_u; 33 conv_u.i = (arg2); 34 vsrc2 = conv_u.v; 35 } 36 while (0); 37 do 38 { 39 int8_t tmp; 40 tmp = (int8_t) vsrc2.v1; 41 if (tmp >= (ssize_t) sizeof (vsrc1.v1) * 8) 42 { 43 vdest.v1 = 0; 44 } 45 else if (tmp < -(ssize_t) sizeof (vsrc1.v1) * 8) 46 { 47 vdest.v1 = vsrc1.v1 >> (sizeof (vsrc1.v1) * 8 - 1); 48 } 49 else if (tmp == -(ssize_t) sizeof (vsrc1.v1) * 8) 50 { 51 vdest.v1 = vsrc1.v1 >> (tmp - 1); 52 vdest.v1++; 53 vdest.v1 >>= 1; 54 } 55 else if (tmp < 0) 56 { 57 vdest.v1 = (vsrc1.v1 + (1 << (-1 - tmp))) >> -tmp; 58 } 59 else 60 { 61 vdest.v1 = vsrc1.v1 << tmp; 62 } 63 } 64 while (0); 65 do 66 { 67 int8_t tmp; 68 tmp = (int8_t) vsrc2.v2; 69 if (tmp >= (ssize_t) sizeof (vsrc1.v2) * 8) 70 { 71 vdest.v2 = 0; 72 } 73 else if (tmp < -(ssize_t) sizeof (vsrc1.v2) * 8) 74 { 75 vdest.v2 = vsrc1.v2 >> (sizeof (vsrc1.v2) * 8 - 1); 76 } 77 else if (tmp == -(ssize_t) sizeof (vsrc1.v2) * 8) 78 { 79 vdest.v2 = vsrc1.v2 >> (tmp - 1); 80 vdest.v2++; 81 vdest.v2 >>= 1; 82 } 83 else if (tmp < 0) 84 { 85 vdest.v2 = (vsrc1.v2 + (1 << (-1 - tmp))) >> -tmp; 86 } 87 else 88 { 89 vdest.v2 = vsrc1.v2 << tmp; 90 } 91 } 92 while (0); 93 do 94 { 95 int8_t tmp; 96 tmp = (int8_t) vsrc2.v3; 97 if (tmp >= (ssize_t) sizeof (vsrc1.v3) * 8) 98 { 99 vdest.v3 = 0; 100 } 101 else if (tmp < -(ssize_t) sizeof (vsrc1.v3) * 8) 102 { 103 vdest.v3 = vsrc1.v3 >> (sizeof (vsrc1.v3) * 8 - 1); 104 } 105 else if (tmp == -(ssize_t) sizeof (vsrc1.v3) * 8) 106 { 107 vdest.v3 = vsrc1.v3 >> (tmp - 1); 108 vdest.v3++; 109 vdest.v3 >>= 1; 110 } 111 else if (tmp < 0) 112 { 113 vdest.v3 = (vsrc1.v3 + (1 << (-1 - tmp))) >> -tmp; 114 } 115 else 116 { 117 vdest.v3 = vsrc1.v3 << tmp; 118 } 119 } 120 while (0); 121 do 122 { 123 int8_t tmp; 124 tmp = (int8_t) vsrc2.v4; 125 if (tmp >= (ssize_t) sizeof (vsrc1.v4) * 8) 126 { 127 vdest.v4 = 0; 128 } 129 else if (tmp < -(ssize_t) sizeof (vsrc1.v4) * 8) 130 { 131 vdest.v4 = vsrc1.v4 >> (sizeof (vsrc1.v4) * 8 - 1); 132 } 133 else if (tmp == -(ssize_t) sizeof (vsrc1.v4) * 8) 134 { 135 vdest.v4 = vsrc1.v4 >> (tmp - 1); 136 vdest.v4++; 137 vdest.v4 >>= 1; 138 } 139 else if (tmp < 0) 140 { 141 vdest.v4 = (vsrc1.v4 + (1 << (-1 - tmp))) >> -tmp; 142 } 143 else 144 { 145 vdest.v4 = vsrc1.v4 << tmp; 146 } 147 } 148 while (0);; 149 do 150 { 151 union 152 { 153 neon_s8 v; 154 uint32_t i; 155 } conv_u; 156 conv_u.v = (vdest); 157 res = conv_u.i; 158 } 159 while (0); 160 return res; 161 } 162 163 extern void abort(void); 164 main()165int main() 166 { 167 uint32_t r = helper_neon_rshl_s8 (0x05050505, 0x01010101); 168 if (r != 0x0a0a0a0a) 169 abort (); 170 return 0; 171 } 172