1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32 3 4define i1 @and_i1(i1 %a, i1 %b) { 5; MIPS32-LABEL: and_i1: 6; MIPS32: # %bb.0: # %entry 7; MIPS32-NEXT: and $2, $5, $4 8; MIPS32-NEXT: jr $ra 9; MIPS32-NEXT: nop 10entry: 11 %and = and i1 %b, %a 12 ret i1 %and 13} 14 15define i8 @and_i8(i8 %a, i8 %b) { 16; MIPS32-LABEL: and_i8: 17; MIPS32: # %bb.0: # %entry 18; MIPS32-NEXT: and $2, $5, $4 19; MIPS32-NEXT: jr $ra 20; MIPS32-NEXT: nop 21entry: 22 %and = and i8 %b, %a 23 ret i8 %and 24} 25 26define i16 @and_i16(i16 %a, i16 %b) { 27; MIPS32-LABEL: and_i16: 28; MIPS32: # %bb.0: # %entry 29; MIPS32-NEXT: and $2, $5, $4 30; MIPS32-NEXT: jr $ra 31; MIPS32-NEXT: nop 32entry: 33 %and = and i16 %b, %a 34 ret i16 %and 35} 36 37define i32 @and_i32(i32 %a, i32 %b) { 38; MIPS32-LABEL: and_i32: 39; MIPS32: # %bb.0: # %entry 40; MIPS32-NEXT: and $2, $5, $4 41; MIPS32-NEXT: jr $ra 42; MIPS32-NEXT: nop 43entry: 44 %and = and i32 %b, %a 45 ret i32 %and 46} 47 48define i64 @and_i64(i64 %a, i64 %b) { 49; MIPS32-LABEL: and_i64: 50; MIPS32: # %bb.0: # %entry 51; MIPS32-NEXT: and $2, $6, $4 52; MIPS32-NEXT: and $3, $7, $5 53; MIPS32-NEXT: jr $ra 54; MIPS32-NEXT: nop 55entry: 56 %and = and i64 %b, %a 57 ret i64 %and 58} 59 60define i32 @and_imm(i32 %a) { 61; MIPS32-LABEL: and_imm: 62; MIPS32: # %bb.0: # %entry 63; MIPS32-NEXT: andi $2, $4, 255 64; MIPS32-NEXT: jr $ra 65; MIPS32-NEXT: nop 66entry: 67 %and = and i32 %a, 255 68 ret i32 %and 69} 70 71define i32 @and_not_imm32ZExt16(i32 %a) { 72; MIPS32-LABEL: and_not_imm32ZExt16: 73; MIPS32: # %bb.0: # %entry 74; MIPS32-NEXT: addiu $1, $zero, 65280 75; MIPS32-NEXT: and $2, $4, $1 76; MIPS32-NEXT: jr $ra 77; MIPS32-NEXT: nop 78entry: 79 %and = and i32 %a, -256 80 ret i32 %and 81} 82 83define i1 @or_i1(i1 %a, i1 %b) { 84; MIPS32-LABEL: or_i1: 85; MIPS32: # %bb.0: # %entry 86; MIPS32-NEXT: or $2, $5, $4 87; MIPS32-NEXT: jr $ra 88; MIPS32-NEXT: nop 89entry: 90 %or = or i1 %b, %a 91 ret i1 %or 92} 93 94define i8 @or_i8(i8 %a, i8 %b) { 95; MIPS32-LABEL: or_i8: 96; MIPS32: # %bb.0: # %entry 97; MIPS32-NEXT: or $2, $5, $4 98; MIPS32-NEXT: jr $ra 99; MIPS32-NEXT: nop 100entry: 101 %or = or i8 %b, %a 102 ret i8 %or 103} 104 105define i16 @or_i16(i16 %a, i16 %b) { 106; MIPS32-LABEL: or_i16: 107; MIPS32: # %bb.0: # %entry 108; MIPS32-NEXT: or $2, $5, $4 109; MIPS32-NEXT: jr $ra 110; MIPS32-NEXT: nop 111entry: 112 %or = or i16 %b, %a 113 ret i16 %or 114} 115 116define i32 @or_i32(i32 %a, i32 %b) { 117; MIPS32-LABEL: or_i32: 118; MIPS32: # %bb.0: # %entry 119; MIPS32-NEXT: or $2, $5, $4 120; MIPS32-NEXT: jr $ra 121; MIPS32-NEXT: nop 122entry: 123 %or = or i32 %b, %a 124 ret i32 %or 125} 126 127define i64 @or_i64(i64 %a, i64 %b) { 128; MIPS32-LABEL: or_i64: 129; MIPS32: # %bb.0: # %entry 130; MIPS32-NEXT: or $2, $6, $4 131; MIPS32-NEXT: or $3, $7, $5 132; MIPS32-NEXT: jr $ra 133; MIPS32-NEXT: nop 134entry: 135 %or = or i64 %b, %a 136 ret i64 %or 137} 138 139define i32 @or_imm(i32 %a) { 140; MIPS32-LABEL: or_imm: 141; MIPS32: # %bb.0: # %entry 142; MIPS32-NEXT: ori $2, $4, 65535 143; MIPS32-NEXT: jr $ra 144; MIPS32-NEXT: nop 145entry: 146 %or = or i32 %a, 65535 147 ret i32 %or 148} 149 150define i32 @or_not_imm32ZExt16(i32 %a) { 151; MIPS32-LABEL: or_not_imm32ZExt16: 152; MIPS32: # %bb.0: # %entry 153; MIPS32-NEXT: lui $1, 1 154; MIPS32-NEXT: or $2, $4, $1 155; MIPS32-NEXT: jr $ra 156; MIPS32-NEXT: nop 157entry: 158 %or = or i32 %a, 65536 159 ret i32 %or 160} 161 162define i1 @xor_i1(i1 %a, i1 %b) { 163; MIPS32-LABEL: xor_i1: 164; MIPS32: # %bb.0: # %entry 165; MIPS32-NEXT: xor $2, $5, $4 166; MIPS32-NEXT: jr $ra 167; MIPS32-NEXT: nop 168entry: 169 %xor = xor i1 %b, %a 170 ret i1 %xor 171} 172 173define i8 @xor_i8(i8 %a, i8 %b) { 174; MIPS32-LABEL: xor_i8: 175; MIPS32: # %bb.0: # %entry 176; MIPS32-NEXT: xor $2, $5, $4 177; MIPS32-NEXT: jr $ra 178; MIPS32-NEXT: nop 179entry: 180 %xor = xor i8 %b, %a 181 ret i8 %xor 182} 183 184define i16 @xor_i16(i16 %a, i16 %b) { 185; MIPS32-LABEL: xor_i16: 186; MIPS32: # %bb.0: # %entry 187; MIPS32-NEXT: xor $2, $5, $4 188; MIPS32-NEXT: jr $ra 189; MIPS32-NEXT: nop 190entry: 191 %xor = xor i16 %b, %a 192 ret i16 %xor 193} 194 195define i32 @xor_i32(i32 %a, i32 %b) { 196; MIPS32-LABEL: xor_i32: 197; MIPS32: # %bb.0: # %entry 198; MIPS32-NEXT: xor $2, $5, $4 199; MIPS32-NEXT: jr $ra 200; MIPS32-NEXT: nop 201entry: 202 %xor = xor i32 %b, %a 203 ret i32 %xor 204} 205 206define i64 @xor_i64(i64 %a, i64 %b) { 207; MIPS32-LABEL: xor_i64: 208; MIPS32: # %bb.0: # %entry 209; MIPS32-NEXT: xor $2, $6, $4 210; MIPS32-NEXT: xor $3, $7, $5 211; MIPS32-NEXT: jr $ra 212; MIPS32-NEXT: nop 213entry: 214 %xor = xor i64 %b, %a 215 ret i64 %xor 216} 217 218define i32 @xor_imm(i32 %a) { 219; MIPS32-LABEL: xor_imm: 220; MIPS32: # %bb.0: # %entry 221; MIPS32-NEXT: xori $2, $4, 1 222; MIPS32-NEXT: jr $ra 223; MIPS32-NEXT: nop 224entry: 225 %xor = xor i32 %a, 1 226 ret i32 %xor 227} 228 229define i32 @xor_not_imm32ZExt16(i32 %a) { 230; MIPS32-LABEL: xor_not_imm32ZExt16: 231; MIPS32: # %bb.0: # %entry 232; MIPS32-NEXT: not $2, $4 233; MIPS32-NEXT: jr $ra 234; MIPS32-NEXT: nop 235entry: 236 %xor = xor i32 %a, -1 237 ret i32 %xor 238} 239 240define i32 @shl(i32 %a) { 241; MIPS32-LABEL: shl: 242; MIPS32: # %bb.0: # %entry 243; MIPS32-NEXT: sll $2, $4, 1 244; MIPS32-NEXT: jr $ra 245; MIPS32-NEXT: nop 246entry: 247 %shl = shl i32 %a, 1 248 ret i32 %shl 249} 250 251define i32 @ashr(i32 %a) { 252; MIPS32-LABEL: ashr: 253; MIPS32: # %bb.0: # %entry 254; MIPS32-NEXT: sra $2, $4, 1 255; MIPS32-NEXT: jr $ra 256; MIPS32-NEXT: nop 257entry: 258 %shr = ashr i32 %a, 1 259 ret i32 %shr 260} 261 262define i32 @lshr(i32 %a) { 263; MIPS32-LABEL: lshr: 264; MIPS32: # %bb.0: # %entry 265; MIPS32-NEXT: srl $2, $4, 1 266; MIPS32-NEXT: jr $ra 267; MIPS32-NEXT: nop 268entry: 269 %shr = lshr i32 %a, 1 270 ret i32 %shr 271} 272 273define i32 @shlv(i32 %a, i32 %b) { 274; MIPS32-LABEL: shlv: 275; MIPS32: # %bb.0: # %entry 276; MIPS32-NEXT: sllv $2, $4, $5 277; MIPS32-NEXT: jr $ra 278; MIPS32-NEXT: nop 279entry: 280 %shl = shl i32 %a, %b 281 ret i32 %shl 282} 283 284define i32 @ashrv(i32 %a, i32 %b) { 285; MIPS32-LABEL: ashrv: 286; MIPS32: # %bb.0: # %entry 287; MIPS32-NEXT: srav $2, $4, $5 288; MIPS32-NEXT: jr $ra 289; MIPS32-NEXT: nop 290entry: 291 %shr = ashr i32 %a, %b 292 ret i32 %shr 293} 294 295define i32 @lshrv(i32 %a, i32 %b) { 296; MIPS32-LABEL: lshrv: 297; MIPS32: # %bb.0: # %entry 298; MIPS32-NEXT: srlv $2, $4, $5 299; MIPS32-NEXT: jr $ra 300; MIPS32-NEXT: nop 301entry: 302 %shr = lshr i32 %a, %b 303 ret i32 %shr 304} 305 306define i16 @shl_i16(i16 %a) { 307; MIPS32-LABEL: shl_i16: 308; MIPS32: # %bb.0: # %entry 309; MIPS32-NEXT: sll $2, $4, 2 310; MIPS32-NEXT: jr $ra 311; MIPS32-NEXT: nop 312entry: 313 %shl = shl i16 %a, 2 314 ret i16 %shl 315} 316 317define i8 @ashr_i8(i8 %a) { 318; MIPS32-LABEL: ashr_i8: 319; MIPS32: # %bb.0: # %entry 320; MIPS32-NEXT: sll $1, $4, 24 321; MIPS32-NEXT: sra $1, $1, 24 322; MIPS32-NEXT: sra $2, $1, 2 323; MIPS32-NEXT: jr $ra 324; MIPS32-NEXT: nop 325entry: 326 %0 = ashr i8 %a, 2 327 ret i8 %0 328} 329 330define i16 @lshr_i16(i16 %a) { 331; MIPS32-LABEL: lshr_i16: 332; MIPS32: # %bb.0: # %entry 333; MIPS32-NEXT: andi $1, $4, 65535 334; MIPS32-NEXT: srl $2, $1, 2 335; MIPS32-NEXT: jr $ra 336; MIPS32-NEXT: nop 337entry: 338 %0 = lshr i16 %a, 2 339 ret i16 %0 340} 341 342define i64 @shl_i64(i64 %a, i64 %b) { 343; MIPS32-LABEL: shl_i64: 344; MIPS32: # %bb.0: # %entry 345; MIPS32-NEXT: move $3, $4 346; MIPS32-NEXT: ori $4, $zero, 32 347; MIPS32-NEXT: subu $8, $6, $4 348; MIPS32-NEXT: subu $1, $4, $6 349; MIPS32-NEXT: ori $2, $zero, 0 350; MIPS32-NEXT: sltu $4, $6, $4 351; MIPS32-NEXT: sllv $7, $3, $6 352; MIPS32-NEXT: srlv $1, $3, $1 353; MIPS32-NEXT: sllv $9, $5, $6 354; MIPS32-NEXT: or $1, $1, $9 355; MIPS32-NEXT: sllv $3, $3, $8 356; MIPS32-NEXT: movn $2, $7, $4 357; MIPS32-NEXT: movn $3, $1, $4 358; MIPS32-NEXT: movz $3, $5, $6 359; MIPS32-NEXT: jr $ra 360; MIPS32-NEXT: nop 361entry: 362 %shl = shl i64 %a, %b 363 ret i64 %shl 364} 365 366define i64 @ashl_i64(i64 %a, i64 %b) { 367; MIPS32-LABEL: ashl_i64: 368; MIPS32: # %bb.0: # %entry 369; MIPS32-NEXT: addiu $sp, $sp, -8 370; MIPS32-NEXT: .cfi_def_cfa_offset 8 371; MIPS32-NEXT: sw $4, 4($sp) # 4-byte Folded Spill 372; MIPS32-NEXT: move $2, $5 373; MIPS32-NEXT: lw $5, 4($sp) # 4-byte Folded Reload 374; MIPS32-NEXT: ori $1, $zero, 32 375; MIPS32-NEXT: subu $8, $6, $1 376; MIPS32-NEXT: subu $7, $1, $6 377; MIPS32-NEXT: sltu $4, $6, $1 378; MIPS32-NEXT: srav $1, $2, $6 379; MIPS32-NEXT: srlv $3, $5, $6 380; MIPS32-NEXT: sllv $7, $2, $7 381; MIPS32-NEXT: or $7, $3, $7 382; MIPS32-NEXT: sra $3, $2, 31 383; MIPS32-NEXT: srav $2, $2, $8 384; MIPS32-NEXT: movn $2, $7, $4 385; MIPS32-NEXT: movz $2, $5, $6 386; MIPS32-NEXT: movn $3, $1, $4 387; MIPS32-NEXT: addiu $sp, $sp, 8 388; MIPS32-NEXT: jr $ra 389; MIPS32-NEXT: nop 390entry: 391 %shr = ashr i64 %a, %b 392 ret i64 %shr 393} 394 395define i64 @lshr_i64(i64 %a, i64 %b) { 396; MIPS32-LABEL: lshr_i64: 397; MIPS32: # %bb.0: # %entry 398; MIPS32-NEXT: addiu $sp, $sp, -8 399; MIPS32-NEXT: .cfi_def_cfa_offset 8 400; MIPS32-NEXT: sw $4, 4($sp) # 4-byte Folded Spill 401; MIPS32-NEXT: move $2, $5 402; MIPS32-NEXT: lw $5, 4($sp) # 4-byte Folded Reload 403; MIPS32-NEXT: ori $1, $zero, 32 404; MIPS32-NEXT: subu $8, $6, $1 405; MIPS32-NEXT: subu $9, $1, $6 406; MIPS32-NEXT: ori $3, $zero, 0 407; MIPS32-NEXT: sltu $4, $6, $1 408; MIPS32-NEXT: srlv $1, $2, $6 409; MIPS32-NEXT: srlv $7, $5, $6 410; MIPS32-NEXT: sllv $9, $2, $9 411; MIPS32-NEXT: or $7, $7, $9 412; MIPS32-NEXT: srlv $2, $2, $8 413; MIPS32-NEXT: movn $2, $7, $4 414; MIPS32-NEXT: movz $2, $5, $6 415; MIPS32-NEXT: movn $3, $1, $4 416; MIPS32-NEXT: addiu $sp, $sp, 8 417; MIPS32-NEXT: jr $ra 418; MIPS32-NEXT: nop 419entry: 420 %shr = lshr i64 %a, %b 421 ret i64 %shr 422} 423