1 ; RUN: llc < %s -march=cellspu > %t1.s 2 ; RUN: grep and %t1.s | count 234 3 ; RUN: grep andc %t1.s | count 85 4 ; RUN: grep andi %t1.s | count 37 5 ; RUN: grep andhi %t1.s | count 30 6 ; RUN: grep andbi %t1.s | count 4 7 8 ; CellSPU legalization is over-sensitive to Legalize's traversal order. 9 ; XFAIL: * 10 11 target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" 12 target triple = "spu" 13 14 ; AND instruction generation: 15 define <4 x i32> @and_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { 16 %A = and <4 x i32> %arg1, %arg2 17 ret <4 x i32> %A 18 } 19 20 define <4 x i32> @and_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { 21 %A = and <4 x i32> %arg2, %arg1 22 ret <4 x i32> %A 23 } 24 25 define <8 x i16> @and_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { 26 %A = and <8 x i16> %arg1, %arg2 27 ret <8 x i16> %A 28 } 29 30 define <8 x i16> @and_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { 31 %A = and <8 x i16> %arg2, %arg1 32 ret <8 x i16> %A 33 } 34 35 define <16 x i8> @and_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { 36 %A = and <16 x i8> %arg2, %arg1 37 ret <16 x i8> %A 38 } 39 40 define <16 x i8> @and_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { 41 %A = and <16 x i8> %arg1, %arg2 42 ret <16 x i8> %A 43 } 44 45 define i32 @and_i32_1(i32 %arg1, i32 %arg2) { 46 %A = and i32 %arg2, %arg1 47 ret i32 %A 48 } 49 50 define i32 @and_i32_2(i32 %arg1, i32 %arg2) { 51 %A = and i32 %arg1, %arg2 52 ret i32 %A 53 } 54 55 define i16 @and_i16_1(i16 %arg1, i16 %arg2) { 56 %A = and i16 %arg2, %arg1 57 ret i16 %A 58 } 59 60 define i16 @and_i16_2(i16 %arg1, i16 %arg2) { 61 %A = and i16 %arg1, %arg2 62 ret i16 %A 63 } 64 65 define i8 @and_i8_1(i8 %arg1, i8 %arg2) { 66 %A = and i8 %arg2, %arg1 67 ret i8 %A 68 } 69 70 define i8 @and_i8_2(i8 %arg1, i8 %arg2) { 71 %A = and i8 %arg1, %arg2 72 ret i8 %A 73 } 74 75 ; ANDC instruction generation: 76 define <4 x i32> @andc_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { 77 %A = xor <4 x i32> %arg2, < i32 -1, i32 -1, i32 -1, i32 -1 > 78 %B = and <4 x i32> %arg1, %A 79 ret <4 x i32> %B 80 } 81 82 define <4 x i32> @andc_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { 83 %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > 84 %B = and <4 x i32> %arg2, %A 85 ret <4 x i32> %B 86 } 87 88 define <4 x i32> @andc_v4i32_3(<4 x i32> %arg1, <4 x i32> %arg2) { 89 %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > 90 %B = and <4 x i32> %A, %arg2 91 ret <4 x i32> %B 92 } 93 94 define <8 x i16> @andc_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { 95 %A = xor <8 x i16> %arg2, < i16 -1, i16 -1, i16 -1, i16 -1, 96 i16 -1, i16 -1, i16 -1, i16 -1 > 97 %B = and <8 x i16> %arg1, %A 98 ret <8 x i16> %B 99 } 100 101 define <8 x i16> @andc_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { 102 %A = xor <8 x i16> %arg1, < i16 -1, i16 -1, i16 -1, i16 -1, 103 i16 -1, i16 -1, i16 -1, i16 -1 > 104 %B = and <8 x i16> %arg2, %A 105 ret <8 x i16> %B 106 } 107 108 define <16 x i8> @andc_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { 109 %A = xor <16 x i8> %arg1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 110 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 111 i8 -1, i8 -1, i8 -1, i8 -1 > 112 %B = and <16 x i8> %arg2, %A 113 ret <16 x i8> %B 114 } 115 116 define <16 x i8> @andc_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { 117 %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 118 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 119 i8 -1, i8 -1, i8 -1, i8 -1 > 120 %B = and <16 x i8> %arg1, %A 121 ret <16 x i8> %B 122 } 123 124 define <16 x i8> @andc_v16i8_3(<16 x i8> %arg1, <16 x i8> %arg2) { 125 %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 126 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 127 i8 -1, i8 -1, i8 -1, i8 -1 > 128 %B = and <16 x i8> %A, %arg1 129 ret <16 x i8> %B 130 } 131 132 define i32 @andc_i32_1(i32 %arg1, i32 %arg2) { 133 %A = xor i32 %arg2, -1 134 %B = and i32 %A, %arg1 135 ret i32 %B 136 } 137 138 define i32 @andc_i32_2(i32 %arg1, i32 %arg2) { 139 %A = xor i32 %arg1, -1 140 %B = and i32 %A, %arg2 141 ret i32 %B 142 } 143 144 define i32 @andc_i32_3(i32 %arg1, i32 %arg2) { 145 %A = xor i32 %arg2, -1 146 %B = and i32 %arg1, %A 147 ret i32 %B 148 } 149 150 define i16 @andc_i16_1(i16 %arg1, i16 %arg2) { 151 %A = xor i16 %arg2, -1 152 %B = and i16 %A, %arg1 153 ret i16 %B 154 } 155 156 define i16 @andc_i16_2(i16 %arg1, i16 %arg2) { 157 %A = xor i16 %arg1, -1 158 %B = and i16 %A, %arg2 159 ret i16 %B 160 } 161 162 define i16 @andc_i16_3(i16 %arg1, i16 %arg2) { 163 %A = xor i16 %arg2, -1 164 %B = and i16 %arg1, %A 165 ret i16 %B 166 } 167 168 define i8 @andc_i8_1(i8 %arg1, i8 %arg2) { 169 %A = xor i8 %arg2, -1 170 %B = and i8 %A, %arg1 171 ret i8 %B 172 } 173 174 define i8 @andc_i8_2(i8 %arg1, i8 %arg2) { 175 %A = xor i8 %arg1, -1 176 %B = and i8 %A, %arg2 177 ret i8 %B 178 } 179 180 define i8 @andc_i8_3(i8 %arg1, i8 %arg2) { 181 %A = xor i8 %arg2, -1 182 %B = and i8 %arg1, %A 183 ret i8 %B 184 } 185 186 ; ANDI instruction generation (i32 data type): 187 define <4 x i32> @andi_v4i32_1(<4 x i32> %in) { 188 %tmp2 = and <4 x i32> %in, < i32 511, i32 511, i32 511, i32 511 > 189 ret <4 x i32> %tmp2 190 } 191 192 define <4 x i32> @andi_v4i32_2(<4 x i32> %in) { 193 %tmp2 = and <4 x i32> %in, < i32 510, i32 510, i32 510, i32 510 > 194 ret <4 x i32> %tmp2 195 } 196 197 define <4 x i32> @andi_v4i32_3(<4 x i32> %in) { 198 %tmp2 = and <4 x i32> %in, < i32 -1, i32 -1, i32 -1, i32 -1 > 199 ret <4 x i32> %tmp2 200 } 201 202 define <4 x i32> @andi_v4i32_4(<4 x i32> %in) { 203 %tmp2 = and <4 x i32> %in, < i32 -512, i32 -512, i32 -512, i32 -512 > 204 ret <4 x i32> %tmp2 205 } 206 207 define zeroext i32 @andi_u32(i32 zeroext %in) { 208 %tmp37 = and i32 %in, 37 209 ret i32 %tmp37 210 } 211 212 define signext i32 @andi_i32(i32 signext %in) { 213 %tmp38 = and i32 %in, 37 214 ret i32 %tmp38 215 } 216 217 define i32 @andi_i32_1(i32 %in) { 218 %tmp37 = and i32 %in, 37 219 ret i32 %tmp37 220 } 221 222 ; ANDHI instruction generation (i16 data type): 223 define <8 x i16> @andhi_v8i16_1(<8 x i16> %in) { 224 %tmp2 = and <8 x i16> %in, < i16 511, i16 511, i16 511, i16 511, 225 i16 511, i16 511, i16 511, i16 511 > 226 ret <8 x i16> %tmp2 227 } 228 229 define <8 x i16> @andhi_v8i16_2(<8 x i16> %in) { 230 %tmp2 = and <8 x i16> %in, < i16 510, i16 510, i16 510, i16 510, 231 i16 510, i16 510, i16 510, i16 510 > 232 ret <8 x i16> %tmp2 233 } 234 235 define <8 x i16> @andhi_v8i16_3(<8 x i16> %in) { 236 %tmp2 = and <8 x i16> %in, < i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, 237 i16 -1, i16 -1, i16 -1 > 238 ret <8 x i16> %tmp2 239 } 240 241 define <8 x i16> @andhi_v8i16_4(<8 x i16> %in) { 242 %tmp2 = and <8 x i16> %in, < i16 -512, i16 -512, i16 -512, i16 -512, 243 i16 -512, i16 -512, i16 -512, i16 -512 > 244 ret <8 x i16> %tmp2 245 } 246 247 define zeroext i16 @andhi_u16(i16 zeroext %in) { 248 %tmp37 = and i16 %in, 37 ; <i16> [#uses=1] 249 ret i16 %tmp37 250 } 251 252 define signext i16 @andhi_i16(i16 signext %in) { 253 %tmp38 = and i16 %in, 37 ; <i16> [#uses=1] 254 ret i16 %tmp38 255 } 256 257 ; i8 data type (s/b ANDBI if 8-bit registers were supported): 258 define <16 x i8> @and_v16i8(<16 x i8> %in) { 259 ; ANDBI generated for vector types 260 %tmp2 = and <16 x i8> %in, < i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, 261 i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, 262 i8 42, i8 42, i8 42, i8 42 > 263 ret <16 x i8> %tmp2 264 } 265 266 define zeroext i8 @and_u8(i8 zeroext %in) { 267 ; ANDBI generated: 268 %tmp37 = and i8 %in, 37 269 ret i8 %tmp37 270 } 271 272 define signext i8 @and_sext8(i8 signext %in) { 273 ; ANDBI generated 274 %tmp38 = and i8 %in, 37 275 ret i8 %tmp38 276 } 277 278 define i8 @and_i8(i8 %in) { 279 ; ANDBI generated 280 %tmp38 = and i8 %in, 205 281 ret i8 %tmp38 282 } 283