1ed078c48SWANG Xuerui; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 29d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32 39d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64 4709e4ad0SWeining Lu 5709e4ad0SWeining Lu;; Exercise the 'and' LLVM IR: https://llvm.org/docs/LangRef.html#and-instruction 6709e4ad0SWeining Lu 7709e4ad0SWeining Ludefine i1 @and_i1(i1 %a, i1 %b) { 8709e4ad0SWeining Lu; LA32-LABEL: and_i1: 9709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 10709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a1 11ed078c48SWANG Xuerui; LA32-NEXT: ret 12709e4ad0SWeining Lu; 13709e4ad0SWeining Lu; LA64-LABEL: and_i1: 14709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 15709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 16ed078c48SWANG Xuerui; LA64-NEXT: ret 17709e4ad0SWeining Luentry: 18709e4ad0SWeining Lu %r = and i1 %a, %b 19709e4ad0SWeining Lu ret i1 %r 20709e4ad0SWeining Lu} 21709e4ad0SWeining Lu 22709e4ad0SWeining Ludefine i8 @and_i8(i8 %a, i8 %b) { 23709e4ad0SWeining Lu; LA32-LABEL: and_i8: 24709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 25709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a1 26ed078c48SWANG Xuerui; LA32-NEXT: ret 27709e4ad0SWeining Lu; 28709e4ad0SWeining Lu; LA64-LABEL: and_i8: 29709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 30709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 31ed078c48SWANG Xuerui; LA64-NEXT: ret 32709e4ad0SWeining Luentry: 33709e4ad0SWeining Lu %r = and i8 %a, %b 34709e4ad0SWeining Lu ret i8 %r 35709e4ad0SWeining Lu} 36709e4ad0SWeining Lu 37709e4ad0SWeining Ludefine i16 @and_i16(i16 %a, i16 %b) { 38709e4ad0SWeining Lu; LA32-LABEL: and_i16: 39709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 40709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a1 41ed078c48SWANG Xuerui; LA32-NEXT: ret 42709e4ad0SWeining Lu; 43709e4ad0SWeining Lu; LA64-LABEL: and_i16: 44709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 45709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 46ed078c48SWANG Xuerui; LA64-NEXT: ret 47709e4ad0SWeining Luentry: 48709e4ad0SWeining Lu %r = and i16 %a, %b 49709e4ad0SWeining Lu ret i16 %r 50709e4ad0SWeining Lu} 51709e4ad0SWeining Lu 52709e4ad0SWeining Ludefine i32 @and_i32(i32 %a, i32 %b) { 53709e4ad0SWeining Lu; LA32-LABEL: and_i32: 54709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 55709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a1 56ed078c48SWANG Xuerui; LA32-NEXT: ret 57709e4ad0SWeining Lu; 58709e4ad0SWeining Lu; LA64-LABEL: and_i32: 59709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 60709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 61ed078c48SWANG Xuerui; LA64-NEXT: ret 62709e4ad0SWeining Luentry: 63709e4ad0SWeining Lu %r = and i32 %a, %b 64709e4ad0SWeining Lu ret i32 %r 65709e4ad0SWeining Lu} 66709e4ad0SWeining Lu 67709e4ad0SWeining Ludefine i64 @and_i64(i64 %a, i64 %b) { 68709e4ad0SWeining Lu; LA32-LABEL: and_i64: 69709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 70709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a2 71709e4ad0SWeining Lu; LA32-NEXT: and $a1, $a1, $a3 72ed078c48SWANG Xuerui; LA32-NEXT: ret 73709e4ad0SWeining Lu; 74709e4ad0SWeining Lu; LA64-LABEL: and_i64: 75709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 76709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 77ed078c48SWANG Xuerui; LA64-NEXT: ret 78709e4ad0SWeining Luentry: 79709e4ad0SWeining Lu %r = and i64 %a, %b 80709e4ad0SWeining Lu ret i64 %r 81709e4ad0SWeining Lu} 82709e4ad0SWeining Lu 83709e4ad0SWeining Ludefine i1 @and_i1_0(i1 %b) { 84709e4ad0SWeining Lu; LA32-LABEL: and_i1_0: 85709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 86709e4ad0SWeining Lu; LA32-NEXT: move $a0, $zero 87ed078c48SWANG Xuerui; LA32-NEXT: ret 88709e4ad0SWeining Lu; 89709e4ad0SWeining Lu; LA64-LABEL: and_i1_0: 90709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 91709e4ad0SWeining Lu; LA64-NEXT: move $a0, $zero 92ed078c48SWANG Xuerui; LA64-NEXT: ret 93709e4ad0SWeining Luentry: 94709e4ad0SWeining Lu %r = and i1 4, %b 95709e4ad0SWeining Lu ret i1 %r 96709e4ad0SWeining Lu} 97709e4ad0SWeining Lu 98709e4ad0SWeining Ludefine i1 @and_i1_5(i1 %b) { 99709e4ad0SWeining Lu; LA32-LABEL: and_i1_5: 100709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 101ed078c48SWANG Xuerui; LA32-NEXT: ret 102709e4ad0SWeining Lu; 103709e4ad0SWeining Lu; LA64-LABEL: and_i1_5: 104709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 105ed078c48SWANG Xuerui; LA64-NEXT: ret 106709e4ad0SWeining Luentry: 107709e4ad0SWeining Lu %r = and i1 5, %b 108709e4ad0SWeining Lu ret i1 %r 109709e4ad0SWeining Lu} 110709e4ad0SWeining Lu 111709e4ad0SWeining Ludefine i8 @and_i8_5(i8 %b) { 112709e4ad0SWeining Lu; LA32-LABEL: and_i8_5: 113709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 114709e4ad0SWeining Lu; LA32-NEXT: andi $a0, $a0, 5 115ed078c48SWANG Xuerui; LA32-NEXT: ret 116709e4ad0SWeining Lu; 117709e4ad0SWeining Lu; LA64-LABEL: and_i8_5: 118709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 119709e4ad0SWeining Lu; LA64-NEXT: andi $a0, $a0, 5 120ed078c48SWANG Xuerui; LA64-NEXT: ret 121709e4ad0SWeining Luentry: 122709e4ad0SWeining Lu %r = and i8 5, %b 123709e4ad0SWeining Lu ret i8 %r 124709e4ad0SWeining Lu} 125709e4ad0SWeining Lu 126709e4ad0SWeining Ludefine i8 @and_i8_257(i8 %b) { 127709e4ad0SWeining Lu; LA32-LABEL: and_i8_257: 128709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 129709e4ad0SWeining Lu; LA32-NEXT: andi $a0, $a0, 1 130ed078c48SWANG Xuerui; LA32-NEXT: ret 131709e4ad0SWeining Lu; 132709e4ad0SWeining Lu; LA64-LABEL: and_i8_257: 133709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 134709e4ad0SWeining Lu; LA64-NEXT: andi $a0, $a0, 1 135ed078c48SWANG Xuerui; LA64-NEXT: ret 136709e4ad0SWeining Luentry: 137709e4ad0SWeining Lu %r = and i8 257, %b 138709e4ad0SWeining Lu ret i8 %r 139709e4ad0SWeining Lu} 140709e4ad0SWeining Lu 141709e4ad0SWeining Ludefine i16 @and_i16_5(i16 %b) { 142709e4ad0SWeining Lu; LA32-LABEL: and_i16_5: 143709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 144709e4ad0SWeining Lu; LA32-NEXT: andi $a0, $a0, 5 145ed078c48SWANG Xuerui; LA32-NEXT: ret 146709e4ad0SWeining Lu; 147709e4ad0SWeining Lu; LA64-LABEL: and_i16_5: 148709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 149709e4ad0SWeining Lu; LA64-NEXT: andi $a0, $a0, 5 150ed078c48SWANG Xuerui; LA64-NEXT: ret 151709e4ad0SWeining Luentry: 152709e4ad0SWeining Lu %r = and i16 5, %b 153709e4ad0SWeining Lu ret i16 %r 154709e4ad0SWeining Lu} 155709e4ad0SWeining Lu 156709e4ad0SWeining Ludefine i16 @and_i16_0x1000(i16 %b) { 157709e4ad0SWeining Lu; LA32-LABEL: and_i16_0x1000: 158709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 159709e4ad0SWeining Lu; LA32-NEXT: lu12i.w $a1, 1 160709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a1 161ed078c48SWANG Xuerui; LA32-NEXT: ret 162709e4ad0SWeining Lu; 163709e4ad0SWeining Lu; LA64-LABEL: and_i16_0x1000: 164709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 165709e4ad0SWeining Lu; LA64-NEXT: lu12i.w $a1, 1 166709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 167ed078c48SWANG Xuerui; LA64-NEXT: ret 168709e4ad0SWeining Luentry: 169709e4ad0SWeining Lu %r = and i16 4096, %b 170709e4ad0SWeining Lu ret i16 %r 171709e4ad0SWeining Lu} 172709e4ad0SWeining Lu 173709e4ad0SWeining Ludefine i16 @and_i16_0x10001(i16 %b) { 174709e4ad0SWeining Lu; LA32-LABEL: and_i16_0x10001: 175709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 176709e4ad0SWeining Lu; LA32-NEXT: andi $a0, $a0, 1 177ed078c48SWANG Xuerui; LA32-NEXT: ret 178709e4ad0SWeining Lu; 179709e4ad0SWeining Lu; LA64-LABEL: and_i16_0x10001: 180709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 181709e4ad0SWeining Lu; LA64-NEXT: andi $a0, $a0, 1 182ed078c48SWANG Xuerui; LA64-NEXT: ret 183709e4ad0SWeining Luentry: 184709e4ad0SWeining Lu %r = and i16 65537, %b 185709e4ad0SWeining Lu ret i16 %r 186709e4ad0SWeining Lu} 187709e4ad0SWeining Lu 188709e4ad0SWeining Ludefine i32 @and_i32_5(i32 %b) { 189709e4ad0SWeining Lu; LA32-LABEL: and_i32_5: 190709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 191709e4ad0SWeining Lu; LA32-NEXT: andi $a0, $a0, 5 192ed078c48SWANG Xuerui; LA32-NEXT: ret 193709e4ad0SWeining Lu; 194709e4ad0SWeining Lu; LA64-LABEL: and_i32_5: 195709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 196709e4ad0SWeining Lu; LA64-NEXT: andi $a0, $a0, 5 197ed078c48SWANG Xuerui; LA64-NEXT: ret 198709e4ad0SWeining Luentry: 199709e4ad0SWeining Lu %r = and i32 5, %b 200709e4ad0SWeining Lu ret i32 %r 201709e4ad0SWeining Lu} 202709e4ad0SWeining Lu 203709e4ad0SWeining Ludefine i32 @and_i32_0x1000(i32 %b) { 204709e4ad0SWeining Lu; LA32-LABEL: and_i32_0x1000: 205709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 206709e4ad0SWeining Lu; LA32-NEXT: lu12i.w $a1, 1 207709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a1 208ed078c48SWANG Xuerui; LA32-NEXT: ret 209709e4ad0SWeining Lu; 210709e4ad0SWeining Lu; LA64-LABEL: and_i32_0x1000: 211709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 212709e4ad0SWeining Lu; LA64-NEXT: lu12i.w $a1, 1 213709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 214ed078c48SWANG Xuerui; LA64-NEXT: ret 215709e4ad0SWeining Luentry: 216709e4ad0SWeining Lu %r = and i32 4096, %b 217709e4ad0SWeining Lu ret i32 %r 218709e4ad0SWeining Lu} 219709e4ad0SWeining Lu 220709e4ad0SWeining Ludefine i32 @and_i32_0x100000001(i32 %b) { 221709e4ad0SWeining Lu; LA32-LABEL: and_i32_0x100000001: 222709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 223709e4ad0SWeining Lu; LA32-NEXT: andi $a0, $a0, 1 224ed078c48SWANG Xuerui; LA32-NEXT: ret 225709e4ad0SWeining Lu; 226709e4ad0SWeining Lu; LA64-LABEL: and_i32_0x100000001: 227709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 228709e4ad0SWeining Lu; LA64-NEXT: andi $a0, $a0, 1 229ed078c48SWANG Xuerui; LA64-NEXT: ret 230709e4ad0SWeining Luentry: 231709e4ad0SWeining Lu %r = and i32 4294967297, %b 232709e4ad0SWeining Lu ret i32 %r 233709e4ad0SWeining Lu} 234709e4ad0SWeining Lu 235709e4ad0SWeining Ludefine i64 @and_i64_5(i64 %b) { 236709e4ad0SWeining Lu; LA32-LABEL: and_i64_5: 237709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 238709e4ad0SWeining Lu; LA32-NEXT: andi $a0, $a0, 5 239709e4ad0SWeining Lu; LA32-NEXT: move $a1, $zero 240ed078c48SWANG Xuerui; LA32-NEXT: ret 241709e4ad0SWeining Lu; 242709e4ad0SWeining Lu; LA64-LABEL: and_i64_5: 243709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 244709e4ad0SWeining Lu; LA64-NEXT: andi $a0, $a0, 5 245ed078c48SWANG Xuerui; LA64-NEXT: ret 246709e4ad0SWeining Luentry: 247709e4ad0SWeining Lu %r = and i64 5, %b 248709e4ad0SWeining Lu ret i64 %r 249709e4ad0SWeining Lu} 250709e4ad0SWeining Lu 251709e4ad0SWeining Ludefine i64 @and_i64_0x1000(i64 %b) { 252709e4ad0SWeining Lu; LA32-LABEL: and_i64_0x1000: 253709e4ad0SWeining Lu; LA32: # %bb.0: # %entry 254709e4ad0SWeining Lu; LA32-NEXT: lu12i.w $a1, 1 255709e4ad0SWeining Lu; LA32-NEXT: and $a0, $a0, $a1 256709e4ad0SWeining Lu; LA32-NEXT: move $a1, $zero 257ed078c48SWANG Xuerui; LA32-NEXT: ret 258709e4ad0SWeining Lu; 259709e4ad0SWeining Lu; LA64-LABEL: and_i64_0x1000: 260709e4ad0SWeining Lu; LA64: # %bb.0: # %entry 261709e4ad0SWeining Lu; LA64-NEXT: lu12i.w $a1, 1 262709e4ad0SWeining Lu; LA64-NEXT: and $a0, $a0, $a1 263ed078c48SWANG Xuerui; LA64-NEXT: ret 264709e4ad0SWeining Luentry: 265709e4ad0SWeining Lu %r = and i64 4096, %b 266709e4ad0SWeining Lu ret i64 %r 267709e4ad0SWeining Lu} 268d726c753SBen Shi 269d726c753SBen Shidefine signext i32 @and_i32_0xfff0(i32 %a) { 270d726c753SBen Shi; LA32-LABEL: and_i32_0xfff0: 271d726c753SBen Shi; LA32: # %bb.0: 27296dcd8cbSBen Shi; LA32-NEXT: bstrpick.w $a0, $a0, 15, 4 27396dcd8cbSBen Shi; LA32-NEXT: slli.w $a0, $a0, 4 274d726c753SBen Shi; LA32-NEXT: ret 275d726c753SBen Shi; 276d726c753SBen Shi; LA64-LABEL: and_i32_0xfff0: 277d726c753SBen Shi; LA64: # %bb.0: 27896dcd8cbSBen Shi; LA64-NEXT: bstrpick.d $a0, $a0, 15, 4 27996dcd8cbSBen Shi; LA64-NEXT: slli.d $a0, $a0, 4 280d726c753SBen Shi; LA64-NEXT: ret 281d726c753SBen Shi %b = and i32 %a, 65520 282d726c753SBen Shi ret i32 %b 283d726c753SBen Shi} 284d726c753SBen Shi 285d726c753SBen Shidefine signext i32 @and_i32_0xfff0_twice(i32 %a, i32 %b) { 286d726c753SBen Shi; LA32-LABEL: and_i32_0xfff0_twice: 287d726c753SBen Shi; LA32: # %bb.0: 28896dcd8cbSBen Shi; LA32-NEXT: bstrpick.w $a0, $a0, 15, 4 28996dcd8cbSBen Shi; LA32-NEXT: slli.w $a0, $a0, 4 290a5c90e48Swanglei; LA32-NEXT: bstrpick.w $a1, $a1, 15, 4 291a5c90e48Swanglei; LA32-NEXT: slli.w $a1, $a1, 4 292d726c753SBen Shi; LA32-NEXT: sub.w $a0, $a0, $a1 293d726c753SBen Shi; LA32-NEXT: ret 294d726c753SBen Shi; 295d726c753SBen Shi; LA64-LABEL: and_i32_0xfff0_twice: 296d726c753SBen Shi; LA64: # %bb.0: 29796dcd8cbSBen Shi; LA64-NEXT: bstrpick.d $a0, $a0, 15, 4 29896dcd8cbSBen Shi; LA64-NEXT: slli.d $a0, $a0, 4 299a5c90e48Swanglei; LA64-NEXT: bstrpick.d $a1, $a1, 15, 4 300a5c90e48Swanglei; LA64-NEXT: slli.d $a1, $a1, 4 301d726c753SBen Shi; LA64-NEXT: sub.d $a0, $a0, $a1 302d726c753SBen Shi; LA64-NEXT: ret 303d726c753SBen Shi %c = and i32 %a, 65520 304d726c753SBen Shi %d = and i32 %b, 65520 305d726c753SBen Shi %e = sub i32 %c, %d 306d726c753SBen Shi ret i32 %e 307d726c753SBen Shi} 308d726c753SBen Shi 309d726c753SBen Shidefine i64 @and_i64_0xfff0(i64 %a) { 310d726c753SBen Shi; LA32-LABEL: and_i64_0xfff0: 311d726c753SBen Shi; LA32: # %bb.0: 31296dcd8cbSBen Shi; LA32-NEXT: bstrpick.w $a0, $a0, 15, 4 31396dcd8cbSBen Shi; LA32-NEXT: slli.w $a0, $a0, 4 314d726c753SBen Shi; LA32-NEXT: move $a1, $zero 315d726c753SBen Shi; LA32-NEXT: ret 316d726c753SBen Shi; 317d726c753SBen Shi; LA64-LABEL: and_i64_0xfff0: 318d726c753SBen Shi; LA64: # %bb.0: 31996dcd8cbSBen Shi; LA64-NEXT: bstrpick.d $a0, $a0, 15, 4 32096dcd8cbSBen Shi; LA64-NEXT: slli.d $a0, $a0, 4 321d726c753SBen Shi; LA64-NEXT: ret 322d726c753SBen Shi %b = and i64 %a, 65520 323d726c753SBen Shi ret i64 %b 324d726c753SBen Shi} 325d726c753SBen Shi 326d726c753SBen Shidefine i64 @and_i64_0xfff0_twice(i64 %a, i64 %b) { 327d726c753SBen Shi; LA32-LABEL: and_i64_0xfff0_twice: 328d726c753SBen Shi; LA32: # %bb.0: 32996dcd8cbSBen Shi; LA32-NEXT: bstrpick.w $a0, $a0, 15, 4 330a5c90e48Swanglei; LA32-NEXT: slli.w $a1, $a0, 4 331a5c90e48Swanglei; LA32-NEXT: bstrpick.w $a0, $a2, 15, 4 33296dcd8cbSBen Shi; LA32-NEXT: slli.w $a2, $a0, 4 333a5c90e48Swanglei; LA32-NEXT: sub.w $a0, $a1, $a2 334a5c90e48Swanglei; LA32-NEXT: sltu $a1, $a1, $a2 335d726c753SBen Shi; LA32-NEXT: sub.w $a1, $zero, $a1 336d726c753SBen Shi; LA32-NEXT: ret 337d726c753SBen Shi; 338d726c753SBen Shi; LA64-LABEL: and_i64_0xfff0_twice: 339d726c753SBen Shi; LA64: # %bb.0: 34096dcd8cbSBen Shi; LA64-NEXT: bstrpick.d $a0, $a0, 15, 4 34196dcd8cbSBen Shi; LA64-NEXT: slli.d $a0, $a0, 4 342a5c90e48Swanglei; LA64-NEXT: bstrpick.d $a1, $a1, 15, 4 343a5c90e48Swanglei; LA64-NEXT: slli.d $a1, $a1, 4 344d726c753SBen Shi; LA64-NEXT: sub.d $a0, $a0, $a1 345d726c753SBen Shi; LA64-NEXT: ret 346d726c753SBen Shi %c = and i64 %a, 65520 347d726c753SBen Shi %d = and i64 %b, 65520 348d726c753SBen Shi %e = sub i64 %c, %d 349d726c753SBen Shi ret i64 %e 350d726c753SBen Shi} 351d726c753SBen Shi 352d726c753SBen Shi;; This case is not optimized to `bstrpick + slli`, 353d726c753SBen Shi;; since the immediate 1044480 can be composed via 354d726c753SBen Shi;; a single `lu12i.w $rx, 255`. 355d726c753SBen Shidefine i64 @and_i64_0xff000(i64 %a) { 356d726c753SBen Shi; LA32-LABEL: and_i64_0xff000: 357d726c753SBen Shi; LA32: # %bb.0: 358d726c753SBen Shi; LA32-NEXT: lu12i.w $a1, 255 359d726c753SBen Shi; LA32-NEXT: and $a0, $a0, $a1 360d726c753SBen Shi; LA32-NEXT: move $a1, $zero 361d726c753SBen Shi; LA32-NEXT: ret 362d726c753SBen Shi; 363d726c753SBen Shi; LA64-LABEL: and_i64_0xff000: 364d726c753SBen Shi; LA64: # %bb.0: 365d726c753SBen Shi; LA64-NEXT: lu12i.w $a1, 255 366d726c753SBen Shi; LA64-NEXT: and $a0, $a0, $a1 367d726c753SBen Shi; LA64-NEXT: ret 368d726c753SBen Shi %b = and i64 %a, 1044480 369d726c753SBen Shi ret i64 %b 370d726c753SBen Shi} 371d726c753SBen Shi 372d726c753SBen Shidefine i64 @and_i64_minus_2048(i64 %a) { 373d726c753SBen Shi; LA32-LABEL: and_i64_minus_2048: 374d726c753SBen Shi; LA32: # %bb.0: 37526021577SWeining Lu; LA32-NEXT: bstrins.w $a0, $zero, 10, 0 376d726c753SBen Shi; LA32-NEXT: ret 377d726c753SBen Shi; 378d726c753SBen Shi; LA64-LABEL: and_i64_minus_2048: 379d726c753SBen Shi; LA64: # %bb.0: 38026021577SWeining Lu; LA64-NEXT: bstrins.d $a0, $zero, 10, 0 381d726c753SBen Shi; LA64-NEXT: ret 382d726c753SBen Shi %b = and i64 %a, -2048 383d726c753SBen Shi ret i64 %b 384d726c753SBen Shi} 385d726c753SBen Shi 386d726c753SBen Shi;; This case is not optimized to `bstrpick + slli`, 387d726c753SBen Shi;; since the immediate 0xfff0 has more than 2 uses. 388d726c753SBen Shidefine i64 @and_i64_0xfff0_multiple_times(i64 %a, i64 %b, i64 %c) { 389d726c753SBen Shi; LA32-LABEL: and_i64_0xfff0_multiple_times: 390d726c753SBen Shi; LA32: # %bb.0: 391d726c753SBen Shi; LA32-NEXT: lu12i.w $a1, 15 392d726c753SBen Shi; LA32-NEXT: ori $a1, $a1, 4080 393a5c90e48Swanglei; LA32-NEXT: and $a0, $a0, $a1 394a5c90e48Swanglei; LA32-NEXT: and $a2, $a2, $a1 395a5c90e48Swanglei; LA32-NEXT: and $a3, $a4, $a1 396a5c90e48Swanglei; LA32-NEXT: sltu $a1, $a0, $a2 397d726c753SBen Shi; LA32-NEXT: sub.w $a1, $zero, $a1 398a5c90e48Swanglei; LA32-NEXT: sub.w $a0, $a0, $a2 399a5c90e48Swanglei; LA32-NEXT: mul.w $a2, $a2, $a3 400a5c90e48Swanglei; LA32-NEXT: xor $a0, $a0, $a2 401d726c753SBen Shi; LA32-NEXT: ret 402d726c753SBen Shi; 403d726c753SBen Shi; LA64-LABEL: and_i64_0xfff0_multiple_times: 404d726c753SBen Shi; LA64: # %bb.0: 405d726c753SBen Shi; LA64-NEXT: lu12i.w $a3, 15 406d726c753SBen Shi; LA64-NEXT: ori $a3, $a3, 4080 407d726c753SBen Shi; LA64-NEXT: and $a0, $a0, $a3 408d726c753SBen Shi; LA64-NEXT: and $a1, $a1, $a3 409a5c90e48Swanglei; LA64-NEXT: and $a2, $a2, $a3 410d726c753SBen Shi; LA64-NEXT: sub.d $a0, $a0, $a1 411a5c90e48Swanglei; LA64-NEXT: mul.d $a1, $a1, $a2 412a5c90e48Swanglei; LA64-NEXT: xor $a0, $a0, $a1 413d726c753SBen Shi; LA64-NEXT: ret 414d726c753SBen Shi %d = and i64 %a, 65520 415d726c753SBen Shi %e = and i64 %b, 65520 416d726c753SBen Shi %f = and i64 %c, 65520 417d726c753SBen Shi %g = sub i64 %d, %e 418d726c753SBen Shi %h = mul i64 %e, %f 419d726c753SBen Shi %i = xor i64 %g, %h 420d726c753SBen Shi ret i64 %i 421d726c753SBen Shi} 422c100f35fSWANG Rui 42373a2eecbSWeining Ludefine i64 @and_i64_0xffffffffff00ffff(i64 %a) { 42473a2eecbSWeining Lu; LA32-LABEL: and_i64_0xffffffffff00ffff: 42573a2eecbSWeining Lu; LA32: # %bb.0: 42626021577SWeining Lu; LA32-NEXT: bstrins.w $a0, $zero, 23, 16 42773a2eecbSWeining Lu; LA32-NEXT: ret 42873a2eecbSWeining Lu; 42973a2eecbSWeining Lu; LA64-LABEL: and_i64_0xffffffffff00ffff: 43073a2eecbSWeining Lu; LA64: # %bb.0: 43126021577SWeining Lu; LA64-NEXT: bstrins.d $a0, $zero, 23, 16 43273a2eecbSWeining Lu; LA64-NEXT: ret 43373a2eecbSWeining Lu %b = and i64 %a, 18446744073692839935 43473a2eecbSWeining Lu ret i64 %b 43573a2eecbSWeining Lu} 43673a2eecbSWeining Lu 437c100f35fSWANG Ruidefine i32 @and_add_lsr(i32 %x, i32 %y) { 438c100f35fSWANG Rui; LA32-LABEL: and_add_lsr: 439c100f35fSWANG Rui; LA32: # %bb.0: 44042dccf9cSWANG Rui; LA32-NEXT: addi.w $a0, $a0, -1 441c100f35fSWANG Rui; LA32-NEXT: srli.w $a1, $a1, 20 442c100f35fSWANG Rui; LA32-NEXT: and $a0, $a1, $a0 443c100f35fSWANG Rui; LA32-NEXT: ret 444c100f35fSWANG Rui; 445c100f35fSWANG Rui; LA64-LABEL: and_add_lsr: 446c100f35fSWANG Rui; LA64: # %bb.0: 447*718331f5Shev; LA64-NEXT: addi.w $a0, $a0, -1 448c100f35fSWANG Rui; LA64-NEXT: bstrpick.d $a1, $a1, 31, 20 449c100f35fSWANG Rui; LA64-NEXT: and $a0, $a1, $a0 450c100f35fSWANG Rui; LA64-NEXT: ret 451c100f35fSWANG Rui %1 = add i32 %x, 4095 452c100f35fSWANG Rui %2 = lshr i32 %y, 20 453c100f35fSWANG Rui %r = and i32 %2, %1 454c100f35fSWANG Rui ret i32 %r 455c100f35fSWANG Rui} 456