1 ; RUN: llc < %s -march=cellspu > %t1.s 2 ; RUN: grep and %t1.s | count 2 3 ; RUN: grep orc %t1.s | count 85 4 ; RUN: grep ori %t1.s | count 34 5 ; RUN: grep orhi %t1.s | count 30 6 ; RUN: grep orbi %t1.s | count 15 7 ; RUN: FileCheck %s < %t1.s 8 9 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" 10 target triple = "spu" 11 12 ; OR instruction generation: 13 define <4 x i32> @or_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { 14 %A = or <4 x i32> %arg1, %arg2 15 ret <4 x i32> %A 16 } 17 18 define <4 x i32> @or_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { 19 %A = or <4 x i32> %arg2, %arg1 20 ret <4 x i32> %A 21 } 22 23 define <8 x i16> @or_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { 24 %A = or <8 x i16> %arg1, %arg2 25 ret <8 x i16> %A 26 } 27 28 define <8 x i16> @or_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { 29 %A = or <8 x i16> %arg2, %arg1 30 ret <8 x i16> %A 31 } 32 33 define <16 x i8> @or_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { 34 %A = or <16 x i8> %arg2, %arg1 35 ret <16 x i8> %A 36 } 37 38 define <16 x i8> @or_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { 39 %A = or <16 x i8> %arg1, %arg2 40 ret <16 x i8> %A 41 } 42 43 define i32 @or_i32_1(i32 %arg1, i32 %arg2) { 44 %A = or i32 %arg2, %arg1 45 ret i32 %A 46 } 47 48 define i32 @or_i32_2(i32 %arg1, i32 %arg2) { 49 %A = or i32 %arg1, %arg2 50 ret i32 %A 51 } 52 53 define i16 @or_i16_1(i16 %arg1, i16 %arg2) { 54 %A = or i16 %arg2, %arg1 55 ret i16 %A 56 } 57 58 define i16 @or_i16_2(i16 %arg1, i16 %arg2) { 59 %A = or i16 %arg1, %arg2 60 ret i16 %A 61 } 62 63 define i8 @or_i8_1(i8 %arg1, i8 %arg2) { 64 %A = or i8 %arg2, %arg1 65 ret i8 %A 66 } 67 68 define i8 @or_i8_2(i8 %arg1, i8 %arg2) { 69 %A = or i8 %arg1, %arg2 70 ret i8 %A 71 } 72 73 ; ORC instruction generation: 74 define <4 x i32> @orc_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) { 75 %A = xor <4 x i32> %arg2, < i32 -1, i32 -1, i32 -1, i32 -1 > 76 %B = or <4 x i32> %arg1, %A 77 ret <4 x i32> %B 78 } 79 80 define <4 x i32> @orc_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) { 81 %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > 82 %B = or <4 x i32> %arg2, %A 83 ret <4 x i32> %B 84 } 85 86 define <4 x i32> @orc_v4i32_3(<4 x i32> %arg1, <4 x i32> %arg2) { 87 %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 > 88 %B = or <4 x i32> %A, %arg2 89 ret <4 x i32> %B 90 } 91 92 define <8 x i16> @orc_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) { 93 %A = xor <8 x i16> %arg2, < i16 -1, i16 -1, i16 -1, i16 -1, 94 i16 -1, i16 -1, i16 -1, i16 -1 > 95 %B = or <8 x i16> %arg1, %A 96 ret <8 x i16> %B 97 } 98 99 define <8 x i16> @orc_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) { 100 %A = xor <8 x i16> %arg1, < i16 -1, i16 -1, i16 -1, i16 -1, 101 i16 -1, i16 -1, i16 -1, i16 -1 > 102 %B = or <8 x i16> %arg2, %A 103 ret <8 x i16> %B 104 } 105 106 define <16 x i8> @orc_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) { 107 %A = xor <16 x i8> %arg1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 108 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 109 i8 -1, i8 -1, i8 -1, i8 -1 > 110 %B = or <16 x i8> %arg2, %A 111 ret <16 x i8> %B 112 } 113 114 define <16 x i8> @orc_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) { 115 %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 116 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 117 i8 -1, i8 -1, i8 -1, i8 -1 > 118 %B = or <16 x i8> %arg1, %A 119 ret <16 x i8> %B 120 } 121 122 define <16 x i8> @orc_v16i8_3(<16 x i8> %arg1, <16 x i8> %arg2) { 123 %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 124 i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, 125 i8 -1, i8 -1, i8 -1, i8 -1 > 126 %B = or <16 x i8> %A, %arg1 127 ret <16 x i8> %B 128 } 129 130 define i32 @orc_i32_1(i32 %arg1, i32 %arg2) { 131 %A = xor i32 %arg2, -1 132 %B = or i32 %A, %arg1 133 ret i32 %B 134 } 135 136 define i32 @orc_i32_2(i32 %arg1, i32 %arg2) { 137 %A = xor i32 %arg1, -1 138 %B = or i32 %A, %arg2 139 ret i32 %B 140 } 141 142 define i32 @orc_i32_3(i32 %arg1, i32 %arg2) { 143 %A = xor i32 %arg2, -1 144 %B = or i32 %arg1, %A 145 ret i32 %B 146 } 147 148 define i16 @orc_i16_1(i16 %arg1, i16 %arg2) { 149 %A = xor i16 %arg2, -1 150 %B = or i16 %A, %arg1 151 ret i16 %B 152 } 153 154 define i16 @orc_i16_2(i16 %arg1, i16 %arg2) { 155 %A = xor i16 %arg1, -1 156 %B = or i16 %A, %arg2 157 ret i16 %B 158 } 159 160 define i16 @orc_i16_3(i16 %arg1, i16 %arg2) { 161 %A = xor i16 %arg2, -1 162 %B = or i16 %arg1, %A 163 ret i16 %B 164 } 165 166 define i8 @orc_i8_1(i8 %arg1, i8 %arg2) { 167 %A = xor i8 %arg2, -1 168 %B = or i8 %A, %arg1 169 ret i8 %B 170 } 171 172 define i8 @orc_i8_2(i8 %arg1, i8 %arg2) { 173 %A = xor i8 %arg1, -1 174 %B = or i8 %A, %arg2 175 ret i8 %B 176 } 177 178 define i8 @orc_i8_3(i8 %arg1, i8 %arg2) { 179 %A = xor i8 %arg2, -1 180 %B = or i8 %arg1, %A 181 ret i8 %B 182 } 183 184 ; ORI instruction generation (i32 data type): 185 define <4 x i32> @ori_v4i32_1(<4 x i32> %in) { 186 %tmp2 = or <4 x i32> %in, < i32 511, i32 511, i32 511, i32 511 > 187 ret <4 x i32> %tmp2 188 } 189 190 define <4 x i32> @ori_v4i32_2(<4 x i32> %in) { 191 %tmp2 = or <4 x i32> %in, < i32 510, i32 510, i32 510, i32 510 > 192 ret <4 x i32> %tmp2 193 } 194 195 define <4 x i32> @ori_v4i32_3(<4 x i32> %in) { 196 %tmp2 = or <4 x i32> %in, < i32 -1, i32 -1, i32 -1, i32 -1 > 197 ret <4 x i32> %tmp2 198 } 199 200 define <4 x i32> @ori_v4i32_4(<4 x i32> %in) { 201 %tmp2 = or <4 x i32> %in, < i32 -512, i32 -512, i32 -512, i32 -512 > 202 ret <4 x i32> %tmp2 203 } 204 205 define zeroext i32 @ori_u32(i32 zeroext %in) { 206 %tmp37 = or i32 %in, 37 ; <i32> [#uses=1] 207 ret i32 %tmp37 208 } 209 210 define signext i32 @ori_i32(i32 signext %in) { 211 %tmp38 = or i32 %in, 37 ; <i32> [#uses=1] 212 ret i32 %tmp38 213 } 214 215 define i32 @ori_i32_600(i32 %in) { 216 ;600 does not fit into 'ori' immediate field 217 ;CHECK: ori_i32_600 218 ;CHECK: il 219 ;CHECK: ori 220 %tmp = or i32 %in, 600 221 ret i32 %tmp 222 } 223 224 ; ORHI instruction generation (i16 data type): 225 define <8 x i16> @orhi_v8i16_1(<8 x i16> %in) { 226 %tmp2 = or <8 x i16> %in, < i16 511, i16 511, i16 511, i16 511, 227 i16 511, i16 511, i16 511, i16 511 > 228 ret <8 x i16> %tmp2 229 } 230 231 define <8 x i16> @orhi_v8i16_2(<8 x i16> %in) { 232 %tmp2 = or <8 x i16> %in, < i16 510, i16 510, i16 510, i16 510, 233 i16 510, i16 510, i16 510, i16 510 > 234 ret <8 x i16> %tmp2 235 } 236 237 define <8 x i16> @orhi_v8i16_3(<8 x i16> %in) { 238 %tmp2 = or <8 x i16> %in, < i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, 239 i16 -1, i16 -1, i16 -1 > 240 ret <8 x i16> %tmp2 241 } 242 243 define <8 x i16> @orhi_v8i16_4(<8 x i16> %in) { 244 %tmp2 = or <8 x i16> %in, < i16 -512, i16 -512, i16 -512, i16 -512, 245 i16 -512, i16 -512, i16 -512, i16 -512 > 246 ret <8 x i16> %tmp2 247 } 248 249 define zeroext i16 @orhi_u16(i16 zeroext %in) { 250 %tmp37 = or i16 %in, 37 ; <i16> [#uses=1] 251 ret i16 %tmp37 252 } 253 254 define signext i16 @orhi_i16(i16 signext %in) { 255 %tmp38 = or i16 %in, 37 ; <i16> [#uses=1] 256 ret i16 %tmp38 257 } 258 259 ; ORBI instruction generation (i8 data type): 260 define <16 x i8> @orbi_v16i8(<16 x i8> %in) { 261 %tmp2 = or <16 x i8> %in, < i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, 262 i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, 263 i8 42, i8 42, i8 42, i8 42 > 264 ret <16 x i8> %tmp2 265 } 266 267 define zeroext i8 @orbi_u8(i8 zeroext %in) { 268 %tmp37 = or i8 %in, 37 ; <i8> [#uses=1] 269 ret i8 %tmp37 270 } 271 272 define signext i8 @orbi_i8(i8 signext %in) { 273 %tmp38 = or i8 %in, 37 ; <i8> [#uses=1] 274 ret i8 %tmp38 275 } 276