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 9target 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" 10target triple = "spu" 11 12; OR instruction generation: 13define <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 18define <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 23define <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 28define <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 33define <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 38define <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 43define i32 @or_i32_1(i32 %arg1, i32 %arg2) { 44 %A = or i32 %arg2, %arg1 45 ret i32 %A 46} 47 48define i32 @or_i32_2(i32 %arg1, i32 %arg2) { 49 %A = or i32 %arg1, %arg2 50 ret i32 %A 51} 52 53define i16 @or_i16_1(i16 %arg1, i16 %arg2) { 54 %A = or i16 %arg2, %arg1 55 ret i16 %A 56} 57 58define i16 @or_i16_2(i16 %arg1, i16 %arg2) { 59 %A = or i16 %arg1, %arg2 60 ret i16 %A 61} 62 63define i8 @or_i8_1(i8 %arg1, i8 %arg2) { 64 %A = or i8 %arg2, %arg1 65 ret i8 %A 66} 67 68define i8 @or_i8_2(i8 %arg1, i8 %arg2) { 69 %A = or i8 %arg1, %arg2 70 ret i8 %A 71} 72 73; ORC instruction generation: 74define <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 80define <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 86define <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 92define <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 99define <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 106define <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 114define <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 122define <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 130define 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 136define 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 142define 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 148define 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 154define 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 160define 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 166define 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 172define 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 178define 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): 185define <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 190define <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 195define <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 200define <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 205define zeroext i32 @ori_u32(i32 zeroext %in) { 206 %tmp37 = or i32 %in, 37 ; <i32> [#uses=1] 207 ret i32 %tmp37 208} 209 210define signext i32 @ori_i32(i32 signext %in) { 211 %tmp38 = or i32 %in, 37 ; <i32> [#uses=1] 212 ret i32 %tmp38 213} 214 215define 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): 225define <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 231define <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 237define <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 243define <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 249define zeroext i16 @orhi_u16(i16 zeroext %in) { 250 %tmp37 = or i16 %in, 37 ; <i16> [#uses=1] 251 ret i16 %tmp37 252} 253 254define 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): 260define <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 267define zeroext i8 @orbi_u8(i8 zeroext %in) { 268 %tmp37 = or i8 %in, 37 ; <i8> [#uses=1] 269 ret i8 %tmp37 270} 271 272define signext i8 @orbi_i8(i8 signext %in) { 273 %tmp38 = or i8 %in, 37 ; <i8> [#uses=1] 274 ret i8 %tmp38 275} 276