1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s 3 4; shift left 5 6define i32 @and_signbit_shl(i32 %x, ptr %dst) { 7; CHECK-LABEL: and_signbit_shl: 8; CHECK: // %bb.0: 9; CHECK-NEXT: lsl w8, w0, #8 10; CHECK-NEXT: and w0, w8, #0xff000000 11; CHECK-NEXT: str w0, [x1] 12; CHECK-NEXT: ret 13 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000 14 %r = shl i32 %t0, 8 15 store i32 %r, ptr %dst 16 ret i32 %r 17} 18define i32 @and_nosignbit_shl(i32 %x, ptr %dst) { 19; CHECK-LABEL: and_nosignbit_shl: 20; CHECK: // %bb.0: 21; CHECK-NEXT: lsl w8, w0, #8 22; CHECK-NEXT: and w0, w8, #0xff000000 23; CHECK-NEXT: str w0, [x1] 24; CHECK-NEXT: ret 25 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000 26 %r = shl i32 %t0, 8 27 store i32 %r, ptr %dst 28 ret i32 %r 29} 30 31define i32 @or_signbit_shl(i32 %x, ptr %dst) { 32; CHECK-LABEL: or_signbit_shl: 33; CHECK: // %bb.0: 34; CHECK-NEXT: lsl w8, w0, #8 35; CHECK-NEXT: orr w0, w8, #0xff000000 36; CHECK-NEXT: str w0, [x1] 37; CHECK-NEXT: ret 38 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000 39 %r = shl i32 %t0, 8 40 store i32 %r, ptr %dst 41 ret i32 %r 42} 43define i32 @or_nosignbit_shl(i32 %x, ptr %dst) { 44; CHECK-LABEL: or_nosignbit_shl: 45; CHECK: // %bb.0: 46; CHECK-NEXT: lsl w8, w0, #8 47; CHECK-NEXT: orr w0, w8, #0xff000000 48; CHECK-NEXT: str w0, [x1] 49; CHECK-NEXT: ret 50 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000 51 %r = shl i32 %t0, 8 52 store i32 %r, ptr %dst 53 ret i32 %r 54} 55 56define i32 @xor_signbit_shl(i32 %x, ptr %dst) { 57; CHECK-LABEL: xor_signbit_shl: 58; CHECK: // %bb.0: 59; CHECK-NEXT: lsl w8, w0, #8 60; CHECK-NEXT: eor w0, w8, #0xff000000 61; CHECK-NEXT: str w0, [x1] 62; CHECK-NEXT: ret 63 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000 64 %r = shl i32 %t0, 8 65 store i32 %r, ptr %dst 66 ret i32 %r 67} 68define i32 @xor_nosignbit_shl(i32 %x, ptr %dst) { 69; CHECK-LABEL: xor_nosignbit_shl: 70; CHECK: // %bb.0: 71; CHECK-NEXT: lsl w8, w0, #8 72; CHECK-NEXT: eor w0, w8, #0xff000000 73; CHECK-NEXT: str w0, [x1] 74; CHECK-NEXT: ret 75 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000 76 %r = shl i32 %t0, 8 77 store i32 %r, ptr %dst 78 ret i32 %r 79} 80 81define i32 @add_signbit_shl(i32 %x, ptr %dst) { 82; CHECK-LABEL: add_signbit_shl: 83; CHECK: // %bb.0: 84; CHECK-NEXT: mov w8, #-16777216 85; CHECK-NEXT: add w0, w8, w0, lsl #8 86; CHECK-NEXT: str w0, [x1] 87; CHECK-NEXT: ret 88 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000 89 %r = shl i32 %t0, 8 90 store i32 %r, ptr %dst 91 ret i32 %r 92} 93define i32 @add_nosignbit_shl(i32 %x, ptr %dst) { 94; CHECK-LABEL: add_nosignbit_shl: 95; CHECK: // %bb.0: 96; CHECK-NEXT: mov w8, #-16777216 97; CHECK-NEXT: add w0, w8, w0, lsl #8 98; CHECK-NEXT: str w0, [x1] 99; CHECK-NEXT: ret 100 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000 101 %r = shl i32 %t0, 8 102 store i32 %r, ptr %dst 103 ret i32 %r 104} 105 106; logical shift right 107 108define i32 @and_signbit_lshr(i32 %x, ptr %dst) { 109; CHECK-LABEL: and_signbit_lshr: 110; CHECK: // %bb.0: 111; CHECK-NEXT: lsr w8, w0, #8 112; CHECK-NEXT: and w0, w8, #0xffff00 113; CHECK-NEXT: str w0, [x1] 114; CHECK-NEXT: ret 115 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000 116 %r = lshr i32 %t0, 8 117 store i32 %r, ptr %dst 118 ret i32 %r 119} 120define i32 @and_nosignbit_lshr(i32 %x, ptr %dst) { 121; CHECK-LABEL: and_nosignbit_lshr: 122; CHECK: // %bb.0: 123; CHECK-NEXT: lsr w8, w0, #8 124; CHECK-NEXT: and w0, w8, #0x7fff00 125; CHECK-NEXT: str w0, [x1] 126; CHECK-NEXT: ret 127 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000 128 %r = lshr i32 %t0, 8 129 store i32 %r, ptr %dst 130 ret i32 %r 131} 132 133define i32 @or_signbit_lshr(i32 %x, ptr %dst) { 134; CHECK-LABEL: or_signbit_lshr: 135; CHECK: // %bb.0: 136; CHECK-NEXT: lsr w8, w0, #8 137; CHECK-NEXT: orr w0, w8, #0xffff00 138; CHECK-NEXT: str w0, [x1] 139; CHECK-NEXT: ret 140 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000 141 %r = lshr i32 %t0, 8 142 store i32 %r, ptr %dst 143 ret i32 %r 144} 145define i32 @or_nosignbit_lshr(i32 %x, ptr %dst) { 146; CHECK-LABEL: or_nosignbit_lshr: 147; CHECK: // %bb.0: 148; CHECK-NEXT: lsr w8, w0, #8 149; CHECK-NEXT: orr w0, w8, #0x7fff00 150; CHECK-NEXT: str w0, [x1] 151; CHECK-NEXT: ret 152 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000 153 %r = lshr i32 %t0, 8 154 store i32 %r, ptr %dst 155 ret i32 %r 156} 157 158define i32 @xor_signbit_lshr(i32 %x, ptr %dst) { 159; CHECK-LABEL: xor_signbit_lshr: 160; CHECK: // %bb.0: 161; CHECK-NEXT: lsr w8, w0, #8 162; CHECK-NEXT: eor w0, w8, #0xffff00 163; CHECK-NEXT: str w0, [x1] 164; CHECK-NEXT: ret 165 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000 166 %r = lshr i32 %t0, 8 167 store i32 %r, ptr %dst 168 ret i32 %r 169} 170define i32 @xor_nosignbit_lshr(i32 %x, ptr %dst) { 171; CHECK-LABEL: xor_nosignbit_lshr: 172; CHECK: // %bb.0: 173; CHECK-NEXT: lsr w8, w0, #8 174; CHECK-NEXT: eor w0, w8, #0x7fff00 175; CHECK-NEXT: str w0, [x1] 176; CHECK-NEXT: ret 177 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000 178 %r = lshr i32 %t0, 8 179 store i32 %r, ptr %dst 180 ret i32 %r 181} 182 183define i32 @add_signbit_lshr(i32 %x, ptr %dst) { 184; CHECK-LABEL: add_signbit_lshr: 185; CHECK: // %bb.0: 186; CHECK-NEXT: sub w8, w0, #16, lsl #12 // =65536 187; CHECK-NEXT: lsr w0, w8, #8 188; CHECK-NEXT: str w0, [x1] 189; CHECK-NEXT: ret 190 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000 191 %r = lshr i32 %t0, 8 192 store i32 %r, ptr %dst 193 ret i32 %r 194} 195define i32 @add_nosignbit_lshr(i32 %x, ptr %dst) { 196; CHECK-LABEL: add_nosignbit_lshr: 197; CHECK: // %bb.0: 198; CHECK-NEXT: mov w8, #2147418112 199; CHECK-NEXT: add w8, w0, w8 200; CHECK-NEXT: lsr w0, w8, #8 201; CHECK-NEXT: str w0, [x1] 202; CHECK-NEXT: ret 203 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000 204 %r = lshr i32 %t0, 8 205 store i32 %r, ptr %dst 206 ret i32 %r 207} 208 209; arithmetic shift right 210 211define i32 @and_signbit_ashr(i32 %x, ptr %dst) { 212; CHECK-LABEL: and_signbit_ashr: 213; CHECK: // %bb.0: 214; CHECK-NEXT: asr w8, w0, #8 215; CHECK-NEXT: and w0, w8, #0xffffff00 216; CHECK-NEXT: str w0, [x1] 217; CHECK-NEXT: ret 218 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000 219 %r = ashr i32 %t0, 8 220 store i32 %r, ptr %dst 221 ret i32 %r 222} 223define i32 @and_nosignbit_ashr(i32 %x, ptr %dst) { 224; CHECK-LABEL: and_nosignbit_ashr: 225; CHECK: // %bb.0: 226; CHECK-NEXT: lsr w8, w0, #8 227; CHECK-NEXT: and w0, w8, #0x7fff00 228; CHECK-NEXT: str w0, [x1] 229; CHECK-NEXT: ret 230 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000 231 %r = ashr i32 %t0, 8 232 store i32 %r, ptr %dst 233 ret i32 %r 234} 235 236define i32 @or_signbit_ashr(i32 %x, ptr %dst) { 237; CHECK-LABEL: or_signbit_ashr: 238; CHECK: // %bb.0: 239; CHECK-NEXT: lsr w8, w0, #8 240; CHECK-NEXT: orr w0, w8, #0xffffff00 241; CHECK-NEXT: str w0, [x1] 242; CHECK-NEXT: ret 243 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000 244 %r = ashr i32 %t0, 8 245 store i32 %r, ptr %dst 246 ret i32 %r 247} 248define i32 @or_nosignbit_ashr(i32 %x, ptr %dst) { 249; CHECK-LABEL: or_nosignbit_ashr: 250; CHECK: // %bb.0: 251; CHECK-NEXT: asr w8, w0, #8 252; CHECK-NEXT: orr w0, w8, #0x7fff00 253; CHECK-NEXT: str w0, [x1] 254; CHECK-NEXT: ret 255 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000 256 %r = ashr i32 %t0, 8 257 store i32 %r, ptr %dst 258 ret i32 %r 259} 260 261define i32 @xor_signbit_ashr(i32 %x, ptr %dst) { 262; CHECK-LABEL: xor_signbit_ashr: 263; CHECK: // %bb.0: 264; CHECK-NEXT: asr w8, w0, #8 265; CHECK-NEXT: eor w0, w8, #0xffffff00 266; CHECK-NEXT: str w0, [x1] 267; CHECK-NEXT: ret 268 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000 269 %r = ashr i32 %t0, 8 270 store i32 %r, ptr %dst 271 ret i32 %r 272} 273define i32 @xor_nosignbit_ashr(i32 %x, ptr %dst) { 274; CHECK-LABEL: xor_nosignbit_ashr: 275; CHECK: // %bb.0: 276; CHECK-NEXT: asr w8, w0, #8 277; CHECK-NEXT: eor w0, w8, #0x7fff00 278; CHECK-NEXT: str w0, [x1] 279; CHECK-NEXT: ret 280 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000 281 %r = ashr i32 %t0, 8 282 store i32 %r, ptr %dst 283 ret i32 %r 284} 285 286define i32 @add_signbit_ashr(i32 %x, ptr %dst) { 287; CHECK-LABEL: add_signbit_ashr: 288; CHECK: // %bb.0: 289; CHECK-NEXT: sub w8, w0, #16, lsl #12 // =65536 290; CHECK-NEXT: asr w0, w8, #8 291; CHECK-NEXT: str w0, [x1] 292; CHECK-NEXT: ret 293 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000 294 %r = ashr i32 %t0, 8 295 store i32 %r, ptr %dst 296 ret i32 %r 297} 298define i32 @add_nosignbit_ashr(i32 %x, ptr %dst) { 299; CHECK-LABEL: add_nosignbit_ashr: 300; CHECK: // %bb.0: 301; CHECK-NEXT: mov w8, #2147418112 302; CHECK-NEXT: add w8, w0, w8 303; CHECK-NEXT: asr w0, w8, #8 304; CHECK-NEXT: str w0, [x1] 305; CHECK-NEXT: ret 306 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000 307 %r = ashr i32 %t0, 8 308 store i32 %r, ptr %dst 309 ret i32 %r 310} 311