1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+e2 -mattr=+2e3 < %s -mtriple=csky | FileCheck %s 3; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+btst16 < %s -mtriple=csky | FileCheck %s --check-prefix=GENERIC 4 5define i32 @addRR(i32 %x, i32 %y) { 6; CHECK-LABEL: addRR: 7; CHECK: # %bb.0: # %entry 8; CHECK-NEXT: addu16 a0, a1 9; CHECK-NEXT: rts16 10; 11; GENERIC-LABEL: addRR: 12; GENERIC: # %bb.0: # %entry 13; GENERIC-NEXT: .cfi_def_cfa_offset 0 14; GENERIC-NEXT: subi16 sp, sp, 4 15; GENERIC-NEXT: .cfi_def_cfa_offset 4 16; GENERIC-NEXT: addu16 a0, a1, a0 17; GENERIC-NEXT: addi16 sp, sp, 4 18; GENERIC-NEXT: rts16 19entry: 20 %add = add nsw i32 %y, %x 21 ret i32 %add 22} 23 24define i32 @addRI(i32 %x) { 25; CHECK-LABEL: addRI: 26; CHECK: # %bb.0: # %entry 27; CHECK-NEXT: addi16 a0, 10 28; CHECK-NEXT: rts16 29; 30; GENERIC-LABEL: addRI: 31; GENERIC: # %bb.0: # %entry 32; GENERIC-NEXT: .cfi_def_cfa_offset 0 33; GENERIC-NEXT: subi16 sp, sp, 4 34; GENERIC-NEXT: .cfi_def_cfa_offset 4 35; GENERIC-NEXT: addi16 a0, 10 36; GENERIC-NEXT: addi16 sp, sp, 4 37; GENERIC-NEXT: rts16 38entry: 39 %add = add nsw i32 %x, 10 40 ret i32 %add 41} 42 43define i32 @addRI_X(i32 %x) { 44; CHECK-LABEL: addRI_X: 45; CHECK: # %bb.0: # %entry 46; CHECK-NEXT: movi32 a1, 4097 47; CHECK-NEXT: addu16 a0, a1 48; CHECK-NEXT: rts16 49; 50; GENERIC-LABEL: addRI_X: 51; GENERIC: # %bb.0: # %entry 52; GENERIC-NEXT: .cfi_def_cfa_offset 0 53; GENERIC-NEXT: subi16 sp, sp, 4 54; GENERIC-NEXT: .cfi_def_cfa_offset 4 55; GENERIC-NEXT: movi16 a1, 0 56; GENERIC-NEXT: lsli16 a2, a1, 24 57; GENERIC-NEXT: lsli16 a1, a1, 16 58; GENERIC-NEXT: or16 a1, a2 59; GENERIC-NEXT: movi16 a2, 16 60; GENERIC-NEXT: lsli16 a2, a2, 8 61; GENERIC-NEXT: or16 a2, a1 62; GENERIC-NEXT: movi16 a1, 1 63; GENERIC-NEXT: or16 a1, a2 64; GENERIC-NEXT: addu16 a0, a0, a1 65; GENERIC-NEXT: addi16 sp, sp, 4 66; GENERIC-NEXT: rts16 67entry: 68 %add = add nsw i32 %x, 4097 69 ret i32 %add 70} 71 72define i64 @ADD_LONG(i64 %x, i64 %y) { 73; CHECK-LABEL: ADD_LONG: 74; CHECK: # %bb.0: # %entry 75; CHECK-NEXT: clrc32 76; CHECK-NEXT: addc32 a0, a2, a0 77; CHECK-NEXT: addc32 a1, a3, a1 78; CHECK-NEXT: rts16 79; 80; GENERIC-LABEL: ADD_LONG: 81; GENERIC: # %bb.0: # %entry 82; GENERIC-NEXT: .cfi_def_cfa_offset 0 83; GENERIC-NEXT: subi16 sp, sp, 4 84; GENERIC-NEXT: .cfi_def_cfa_offset 4 85; GENERIC-NEXT: clrc16 86; GENERIC-NEXT: addc16 a0, a2 87; GENERIC-NEXT: addc16 a1, a3 88; GENERIC-NEXT: addi16 sp, sp, 4 89; GENERIC-NEXT: rts16 90entry: 91 %add = add nsw i64 %y, %x 92 ret i64 %add 93} 94 95define i64 @ADD_LONG_I(i64 %x) { 96; CHECK-LABEL: ADD_LONG_I: 97; CHECK: # %bb.0: # %entry 98; CHECK-NEXT: clrc32 99; CHECK-NEXT: movi16 a2, 1 100; CHECK-NEXT: addc16 a0, a2 101; CHECK-NEXT: movi16 a2, 0 102; CHECK-NEXT: addc16 a1, a2 103; CHECK-NEXT: rts16 104; 105; GENERIC-LABEL: ADD_LONG_I: 106; GENERIC: # %bb.0: # %entry 107; GENERIC-NEXT: .cfi_def_cfa_offset 0 108; GENERIC-NEXT: subi16 sp, sp, 4 109; GENERIC-NEXT: .cfi_def_cfa_offset 4 110; GENERIC-NEXT: clrc16 111; GENERIC-NEXT: movi16 a2, 1 112; GENERIC-NEXT: addc16 a0, a2 113; GENERIC-NEXT: movi16 a2, 0 114; GENERIC-NEXT: addc16 a1, a2 115; GENERIC-NEXT: addi16 sp, sp, 4 116; GENERIC-NEXT: rts16 117entry: 118 %add = add nsw i64 %x, 1 119 ret i64 %add 120} 121 122define i16 @ADD_SHORT(i16 %x, i16 %y) { 123; CHECK-LABEL: ADD_SHORT: 124; CHECK: # %bb.0: # %entry 125; CHECK-NEXT: addu16 a0, a1 126; CHECK-NEXT: rts16 127; 128; GENERIC-LABEL: ADD_SHORT: 129; GENERIC: # %bb.0: # %entry 130; GENERIC-NEXT: .cfi_def_cfa_offset 0 131; GENERIC-NEXT: subi16 sp, sp, 4 132; GENERIC-NEXT: .cfi_def_cfa_offset 4 133; GENERIC-NEXT: addu16 a0, a1, a0 134; GENERIC-NEXT: addi16 sp, sp, 4 135; GENERIC-NEXT: rts16 136entry: 137 %add = add nsw i16 %y, %x 138 ret i16 %add 139} 140 141define i16 @ADD_SHORT_I(i16 %x) { 142; CHECK-LABEL: ADD_SHORT_I: 143; CHECK: # %bb.0: # %entry 144; CHECK-NEXT: addi16 a0, a0, 1 145; CHECK-NEXT: rts16 146; 147; GENERIC-LABEL: ADD_SHORT_I: 148; GENERIC: # %bb.0: # %entry 149; GENERIC-NEXT: .cfi_def_cfa_offset 0 150; GENERIC-NEXT: subi16 sp, sp, 4 151; GENERIC-NEXT: .cfi_def_cfa_offset 4 152; GENERIC-NEXT: addi16 a0, 1 153; GENERIC-NEXT: addi16 sp, sp, 4 154; GENERIC-NEXT: rts16 155entry: 156 %add = add nsw i16 %x, 1 157 ret i16 %add 158} 159 160define i8 @ADD_CHAR(i8 %x, i8 %y) { 161; CHECK-LABEL: ADD_CHAR: 162; CHECK: # %bb.0: # %entry 163; CHECK-NEXT: addu16 a0, a1 164; CHECK-NEXT: rts16 165; 166; GENERIC-LABEL: ADD_CHAR: 167; GENERIC: # %bb.0: # %entry 168; GENERIC-NEXT: .cfi_def_cfa_offset 0 169; GENERIC-NEXT: subi16 sp, sp, 4 170; GENERIC-NEXT: .cfi_def_cfa_offset 4 171; GENERIC-NEXT: addu16 a0, a1, a0 172; GENERIC-NEXT: addi16 sp, sp, 4 173; GENERIC-NEXT: rts16 174entry: 175 %add = add nsw i8 %y, %x 176 ret i8 %add 177} 178 179define i8 @ADD_CHAR_I(i8 %x) { 180; CHECK-LABEL: ADD_CHAR_I: 181; CHECK: # %bb.0: # %entry 182; CHECK-NEXT: addi16 a0, a0, 1 183; CHECK-NEXT: rts16 184; 185; GENERIC-LABEL: ADD_CHAR_I: 186; GENERIC: # %bb.0: # %entry 187; GENERIC-NEXT: .cfi_def_cfa_offset 0 188; GENERIC-NEXT: subi16 sp, sp, 4 189; GENERIC-NEXT: .cfi_def_cfa_offset 4 190; GENERIC-NEXT: addi16 a0, 1 191; GENERIC-NEXT: addi16 sp, sp, 4 192; GENERIC-NEXT: rts16 193entry: 194 %add = add nsw i8 %x, 1 195 ret i8 %add 196} 197 198 199define i32 @subRR(i32 %x, i32 %y) { 200; CHECK-LABEL: subRR: 201; CHECK: # %bb.0: # %entry 202; CHECK-NEXT: subu16 a0, a1, a0 203; CHECK-NEXT: rts16 204; 205; GENERIC-LABEL: subRR: 206; GENERIC: # %bb.0: # %entry 207; GENERIC-NEXT: .cfi_def_cfa_offset 0 208; GENERIC-NEXT: subi16 sp, sp, 4 209; GENERIC-NEXT: .cfi_def_cfa_offset 4 210; GENERIC-NEXT: subu16 a0, a1, a0 211; GENERIC-NEXT: addi16 sp, sp, 4 212; GENERIC-NEXT: rts16 213entry: 214 %sub = sub nsw i32 %y, %x 215 ret i32 %sub 216} 217 218define i32 @subRI(i32 %x) { 219; CHECK-LABEL: subRI: 220; CHECK: # %bb.0: # %entry 221; CHECK-NEXT: movih32 a1, 65535 222; CHECK-NEXT: ori32 a1, a1, 65526 223; CHECK-NEXT: addu16 a0, a1 224; CHECK-NEXT: rts16 225; 226; GENERIC-LABEL: subRI: 227; GENERIC: # %bb.0: # %entry 228; GENERIC-NEXT: .cfi_def_cfa_offset 0 229; GENERIC-NEXT: subi16 sp, sp, 4 230; GENERIC-NEXT: .cfi_def_cfa_offset 4 231; GENERIC-NEXT: movi16 a1, 255 232; GENERIC-NEXT: lsli16 a2, a1, 24 233; GENERIC-NEXT: lsli16 a3, a1, 16 234; GENERIC-NEXT: or16 a3, a2 235; GENERIC-NEXT: lsli16 a1, a1, 8 236; GENERIC-NEXT: or16 a1, a3 237; GENERIC-NEXT: movi16 a2, 246 238; GENERIC-NEXT: or16 a2, a1 239; GENERIC-NEXT: addu16 a0, a0, a2 240; GENERIC-NEXT: addi16 sp, sp, 4 241; GENERIC-NEXT: rts16 242entry: 243 %sub = sub nsw i32 %x, 10 244 ret i32 %sub 245} 246 247define i32 @subRI_X(i32 %x) { 248; CHECK-LABEL: subRI_X: 249; CHECK: # %bb.0: # %entry 250; CHECK-NEXT: movih32 a1, 65535 251; CHECK-NEXT: ori32 a1, a1, 61439 252; CHECK-NEXT: addu16 a0, a1 253; CHECK-NEXT: rts16 254; 255; GENERIC-LABEL: subRI_X: 256; GENERIC: # %bb.0: # %entry 257; GENERIC-NEXT: .cfi_def_cfa_offset 0 258; GENERIC-NEXT: subi16 sp, sp, 4 259; GENERIC-NEXT: .cfi_def_cfa_offset 4 260; GENERIC-NEXT: movi16 a1, 255 261; GENERIC-NEXT: lsli16 a2, a1, 24 262; GENERIC-NEXT: lsli16 a3, a1, 16 263; GENERIC-NEXT: or16 a3, a2 264; GENERIC-NEXT: movi16 a2, 239 265; GENERIC-NEXT: lsli16 a2, a2, 8 266; GENERIC-NEXT: or16 a2, a3 267; GENERIC-NEXT: or16 a2, a1 268; GENERIC-NEXT: addu16 a0, a0, a2 269; GENERIC-NEXT: addi16 sp, sp, 4 270; GENERIC-NEXT: rts16 271entry: 272 %sub = sub nsw i32 %x, 4097 273 ret i32 %sub 274} 275 276define i64 @SUB_LONG(i64 %x, i64 %y) { 277; CHECK-LABEL: SUB_LONG: 278; CHECK: # %bb.0: # %entry 279; CHECK-NEXT: setc32 280; CHECK-NEXT: subc32 a0, a2, a0 281; CHECK-NEXT: mvcv16 a2 282; CHECK-NEXT: btsti32 a2, 0 283; CHECK-NEXT: mvcv16 a2 284; CHECK-NEXT: btsti32 a2, 0 285; CHECK-NEXT: subc32 a1, a3, a1 286; CHECK-NEXT: rts16 287; 288; GENERIC-LABEL: SUB_LONG: 289; GENERIC: # %bb.0: # %entry 290; GENERIC-NEXT: .cfi_def_cfa_offset 0 291; GENERIC-NEXT: subi16 sp, sp, 4 292; GENERIC-NEXT: .cfi_def_cfa_offset 4 293; GENERIC-NEXT: setc16 294; GENERIC-NEXT: subc16 a2, a0 295; GENERIC-NEXT: mvcv16 a0 296; GENERIC-NEXT: btsti16 a0, 0 297; GENERIC-NEXT: mvcv16 a0 298; GENERIC-NEXT: btsti16 a0, 0 299; GENERIC-NEXT: subc16 a3, a1 300; GENERIC-NEXT: mov16 a0, a2 301; GENERIC-NEXT: mov16 a1, a3 302; GENERIC-NEXT: addi16 sp, sp, 4 303; GENERIC-NEXT: rts16 304entry: 305 %sub = sub nsw i64 %y, %x 306 ret i64 %sub 307} 308 309define i64 @SUB_LONG_I(i64 %x) { 310; CHECK-LABEL: SUB_LONG_I: 311; CHECK: # %bb.0: # %entry 312; CHECK-NEXT: clrc32 313; CHECK-NEXT: movih32 a2, 65535 314; CHECK-NEXT: ori32 a2, a2, 65535 315; CHECK-NEXT: addc16 a0, a2 316; CHECK-NEXT: addc16 a1, a2 317; CHECK-NEXT: rts16 318; 319; GENERIC-LABEL: SUB_LONG_I: 320; GENERIC: # %bb.0: # %entry 321; GENERIC-NEXT: subi16 sp, sp, 4 322; GENERIC-NEXT: .cfi_def_cfa_offset 4 323; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill 324; GENERIC-NEXT: .cfi_offset l0, -4 325; GENERIC-NEXT: subi16 sp, sp, 4 326; GENERIC-NEXT: .cfi_def_cfa_offset 8 327; GENERIC-NEXT: clrc16 328; GENERIC-NEXT: movi16 a2, 255 329; GENERIC-NEXT: lsli16 a3, a2, 24 330; GENERIC-NEXT: lsli16 l0, a2, 16 331; GENERIC-NEXT: or16 l0, a3 332; GENERIC-NEXT: lsli16 a3, a2, 8 333; GENERIC-NEXT: or16 a3, l0 334; GENERIC-NEXT: or16 a3, a2 335; GENERIC-NEXT: addc16 a0, a3 336; GENERIC-NEXT: addc16 a1, a3 337; GENERIC-NEXT: addi16 sp, sp, 4 338; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload 339; GENERIC-NEXT: addi16 sp, sp, 4 340; GENERIC-NEXT: rts16 341entry: 342 %sub = sub nsw i64 %x, 1 343 ret i64 %sub 344} 345 346define i16 @SUB_SHORT(i16 %x, i16 %y) { 347; CHECK-LABEL: SUB_SHORT: 348; CHECK: # %bb.0: # %entry 349; CHECK-NEXT: subu16 a0, a1, a0 350; CHECK-NEXT: rts16 351; 352; GENERIC-LABEL: SUB_SHORT: 353; GENERIC: # %bb.0: # %entry 354; GENERIC-NEXT: .cfi_def_cfa_offset 0 355; GENERIC-NEXT: subi16 sp, sp, 4 356; GENERIC-NEXT: .cfi_def_cfa_offset 4 357; GENERIC-NEXT: subu16 a0, a1, a0 358; GENERIC-NEXT: addi16 sp, sp, 4 359; GENERIC-NEXT: rts16 360entry: 361 %sub = sub nsw i16 %y, %x 362 ret i16 %sub 363} 364 365define i16 @SUB_SHORT_I(i16 %x) { 366; CHECK-LABEL: SUB_SHORT_I: 367; CHECK: # %bb.0: # %entry 368; CHECK-NEXT: movih32 a1, 65535 369; CHECK-NEXT: ori32 a1, a1, 65535 370; CHECK-NEXT: addu16 a0, a1 371; CHECK-NEXT: rts16 372; 373; GENERIC-LABEL: SUB_SHORT_I: 374; GENERIC: # %bb.0: # %entry 375; GENERIC-NEXT: .cfi_def_cfa_offset 0 376; GENERIC-NEXT: subi16 sp, sp, 4 377; GENERIC-NEXT: .cfi_def_cfa_offset 4 378; GENERIC-NEXT: movi16 a1, 255 379; GENERIC-NEXT: lsli16 a2, a1, 24 380; GENERIC-NEXT: lsli16 a3, a1, 16 381; GENERIC-NEXT: or16 a3, a2 382; GENERIC-NEXT: lsli16 a2, a1, 8 383; GENERIC-NEXT: or16 a2, a3 384; GENERIC-NEXT: or16 a2, a1 385; GENERIC-NEXT: addu16 a0, a0, a2 386; GENERIC-NEXT: addi16 sp, sp, 4 387; GENERIC-NEXT: rts16 388entry: 389 %sub = sub nsw i16 %x, 1 390 ret i16 %sub 391} 392 393define i8 @SUB_CHAR(i8 %x, i8 %y) { 394; CHECK-LABEL: SUB_CHAR: 395; CHECK: # %bb.0: # %entry 396; CHECK-NEXT: subu16 a0, a1, a0 397; CHECK-NEXT: rts16 398; 399; GENERIC-LABEL: SUB_CHAR: 400; GENERIC: # %bb.0: # %entry 401; GENERIC-NEXT: .cfi_def_cfa_offset 0 402; GENERIC-NEXT: subi16 sp, sp, 4 403; GENERIC-NEXT: .cfi_def_cfa_offset 4 404; GENERIC-NEXT: subu16 a0, a1, a0 405; GENERIC-NEXT: addi16 sp, sp, 4 406; GENERIC-NEXT: rts16 407entry: 408 %sub = sub nsw i8 %y, %x 409 ret i8 %sub 410} 411 412define i8 @SUB_CHAR_I(i8 %x) { 413; CHECK-LABEL: SUB_CHAR_I: 414; CHECK: # %bb.0: # %entry 415; CHECK-NEXT: movih32 a1, 65535 416; CHECK-NEXT: ori32 a1, a1, 65535 417; CHECK-NEXT: addu16 a0, a1 418; CHECK-NEXT: rts16 419; 420; GENERIC-LABEL: SUB_CHAR_I: 421; GENERIC: # %bb.0: # %entry 422; GENERIC-NEXT: .cfi_def_cfa_offset 0 423; GENERIC-NEXT: subi16 sp, sp, 4 424; GENERIC-NEXT: .cfi_def_cfa_offset 4 425; GENERIC-NEXT: movi16 a1, 255 426; GENERIC-NEXT: lsli16 a2, a1, 24 427; GENERIC-NEXT: lsli16 a3, a1, 16 428; GENERIC-NEXT: or16 a3, a2 429; GENERIC-NEXT: lsli16 a2, a1, 8 430; GENERIC-NEXT: or16 a2, a3 431; GENERIC-NEXT: or16 a2, a1 432; GENERIC-NEXT: addu16 a0, a0, a2 433; GENERIC-NEXT: addi16 sp, sp, 4 434; GENERIC-NEXT: rts16 435entry: 436 %sub = sub nsw i8 %x, 1 437 ret i8 %sub 438} 439 440define i32 @mulRR(i32 %x, i32 %y) { 441; CHECK-LABEL: mulRR: 442; CHECK: # %bb.0: # %entry 443; CHECK-NEXT: mult16 a0, a1 444; CHECK-NEXT: rts16 445; 446; GENERIC-LABEL: mulRR: 447; GENERIC: # %bb.0: # %entry 448; GENERIC-NEXT: .cfi_def_cfa_offset 0 449; GENERIC-NEXT: subi16 sp, sp, 4 450; GENERIC-NEXT: .cfi_def_cfa_offset 4 451; GENERIC-NEXT: mult16 a0, a1 452; GENERIC-NEXT: addi16 sp, sp, 4 453; GENERIC-NEXT: rts16 454entry: 455 %mul = mul nsw i32 %y, %x 456 ret i32 %mul 457} 458 459define i32 @mulRI(i32 %x) { 460; CHECK-LABEL: mulRI: 461; CHECK: # %bb.0: # %entry 462; CHECK-NEXT: movi16 a1, 10 463; CHECK-NEXT: mult16 a0, a1 464; CHECK-NEXT: rts16 465; 466; GENERIC-LABEL: mulRI: 467; GENERIC: # %bb.0: # %entry 468; GENERIC-NEXT: .cfi_def_cfa_offset 0 469; GENERIC-NEXT: subi16 sp, sp, 4 470; GENERIC-NEXT: .cfi_def_cfa_offset 4 471; GENERIC-NEXT: movi16 a1, 10 472; GENERIC-NEXT: mult16 a0, a1 473; GENERIC-NEXT: addi16 sp, sp, 4 474; GENERIC-NEXT: rts16 475entry: 476 %mul = mul nsw i32 %x, 10 477 ret i32 %mul 478} 479 480define i32 @mulRI_X(i32 %x) { 481; CHECK-LABEL: mulRI_X: 482; CHECK: # %bb.0: # %entry 483; CHECK-NEXT: movi32 a1, 4097 484; CHECK-NEXT: mult16 a0, a1 485; CHECK-NEXT: rts16 486; 487; GENERIC-LABEL: mulRI_X: 488; GENERIC: # %bb.0: # %entry 489; GENERIC-NEXT: .cfi_def_cfa_offset 0 490; GENERIC-NEXT: subi16 sp, sp, 4 491; GENERIC-NEXT: .cfi_def_cfa_offset 4 492; GENERIC-NEXT: movi16 a1, 0 493; GENERIC-NEXT: lsli16 a2, a1, 24 494; GENERIC-NEXT: lsli16 a1, a1, 16 495; GENERIC-NEXT: or16 a1, a2 496; GENERIC-NEXT: movi16 a2, 16 497; GENERIC-NEXT: lsli16 a2, a2, 8 498; GENERIC-NEXT: or16 a2, a1 499; GENERIC-NEXT: movi16 a1, 1 500; GENERIC-NEXT: or16 a1, a2 501; GENERIC-NEXT: mult16 a0, a1 502; GENERIC-NEXT: addi16 sp, sp, 4 503; GENERIC-NEXT: rts16 504entry: 505 %mul = mul nsw i32 %x, 4097 506 ret i32 %mul 507} 508 509define i16 @MUL_SHORT(i16 %x, i16 %y) { 510; CHECK-LABEL: MUL_SHORT: 511; CHECK: # %bb.0: # %entry 512; CHECK-NEXT: mult16 a0, a1 513; CHECK-NEXT: rts16 514; 515; GENERIC-LABEL: MUL_SHORT: 516; GENERIC: # %bb.0: # %entry 517; GENERIC-NEXT: .cfi_def_cfa_offset 0 518; GENERIC-NEXT: subi16 sp, sp, 4 519; GENERIC-NEXT: .cfi_def_cfa_offset 4 520; GENERIC-NEXT: mult16 a0, a1 521; GENERIC-NEXT: addi16 sp, sp, 4 522; GENERIC-NEXT: rts16 523entry: 524 %mul = mul nsw i16 %y, %x 525 ret i16 %mul 526} 527 528define i16 @MUL_SHORT_I(i16 %x) { 529; CHECK-LABEL: MUL_SHORT_I: 530; CHECK: # %bb.0: # %entry 531; CHECK-NEXT: movi16 a1, 3 532; CHECK-NEXT: mult16 a0, a1 533; CHECK-NEXT: rts16 534; 535; GENERIC-LABEL: MUL_SHORT_I: 536; GENERIC: # %bb.0: # %entry 537; GENERIC-NEXT: .cfi_def_cfa_offset 0 538; GENERIC-NEXT: subi16 sp, sp, 4 539; GENERIC-NEXT: .cfi_def_cfa_offset 4 540; GENERIC-NEXT: movi16 a1, 3 541; GENERIC-NEXT: mult16 a0, a1 542; GENERIC-NEXT: addi16 sp, sp, 4 543; GENERIC-NEXT: rts16 544entry: 545 %mul = mul nsw i16 %x, 3 546 ret i16 %mul 547} 548 549define i8 @MUL_CHAR(i8 %x, i8 %y) { 550; CHECK-LABEL: MUL_CHAR: 551; CHECK: # %bb.0: # %entry 552; CHECK-NEXT: mult16 a0, a1 553; CHECK-NEXT: rts16 554; 555; GENERIC-LABEL: MUL_CHAR: 556; GENERIC: # %bb.0: # %entry 557; GENERIC-NEXT: .cfi_def_cfa_offset 0 558; GENERIC-NEXT: subi16 sp, sp, 4 559; GENERIC-NEXT: .cfi_def_cfa_offset 4 560; GENERIC-NEXT: mult16 a0, a1 561; GENERIC-NEXT: addi16 sp, sp, 4 562; GENERIC-NEXT: rts16 563entry: 564 %mul = mul nsw i8 %y, %x 565 ret i8 %mul 566} 567 568define i8 @MUL_CHAR_I(i8 %x) { 569; CHECK-LABEL: MUL_CHAR_I: 570; CHECK: # %bb.0: # %entry 571; CHECK-NEXT: movih32 a1, 65535 572; CHECK-NEXT: ori32 a1, a1, 65533 573; CHECK-NEXT: mult16 a0, a1 574; CHECK-NEXT: rts16 575; 576; GENERIC-LABEL: MUL_CHAR_I: 577; GENERIC: # %bb.0: # %entry 578; GENERIC-NEXT: .cfi_def_cfa_offset 0 579; GENERIC-NEXT: subi16 sp, sp, 4 580; GENERIC-NEXT: .cfi_def_cfa_offset 4 581; GENERIC-NEXT: movi16 a1, 255 582; GENERIC-NEXT: lsli16 a2, a1, 24 583; GENERIC-NEXT: lsli16 a3, a1, 16 584; GENERIC-NEXT: or16 a3, a2 585; GENERIC-NEXT: lsli16 a1, a1, 8 586; GENERIC-NEXT: or16 a1, a3 587; GENERIC-NEXT: movi16 a2, 253 588; GENERIC-NEXT: or16 a2, a1 589; GENERIC-NEXT: mult16 a0, a2 590; GENERIC-NEXT: addi16 sp, sp, 4 591; GENERIC-NEXT: rts16 592entry: 593 %mul = mul nsw i8 %x, -3 594 ret i8 %mul 595} 596 597define i32 @udivRR(i32 %x, i32 %y) { 598; CHECK-LABEL: udivRR: 599; CHECK: # %bb.0: # %entry 600; CHECK-NEXT: divu32 a0, a1, a0 601; CHECK-NEXT: rts16 602; 603; GENERIC-LABEL: udivRR: 604; GENERIC: # %bb.0: # %entry 605; GENERIC-NEXT: subi16 sp, sp, 4 606; GENERIC-NEXT: .cfi_def_cfa_offset 4 607; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 608; GENERIC-NEXT: .cfi_offset lr, -4 609; GENERIC-NEXT: subi16 sp, sp, 4 610; GENERIC-NEXT: .cfi_def_cfa_offset 8 611; GENERIC-NEXT: mov16 a2, a0 612; GENERIC-NEXT: lrw32 a3, [.LCPI25_0] 613; GENERIC-NEXT: mov16 a0, a1 614; GENERIC-NEXT: mov16 a1, a2 615; GENERIC-NEXT: jsr16 a3 616; GENERIC-NEXT: addi16 sp, sp, 4 617; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 618; GENERIC-NEXT: addi16 sp, sp, 4 619; GENERIC-NEXT: rts16 620; GENERIC-NEXT: .p2align 1 621; GENERIC-NEXT: # %bb.1: 622; GENERIC-NEXT: .p2align 2 623; GENERIC-NEXT: .LCPI25_0: 624; GENERIC-NEXT: .long __udivsi3 625entry: 626 %udiv = udiv i32 %y, %x 627 ret i32 %udiv 628} 629 630define i32 @udivRI(i32 %x) { 631; CHECK-LABEL: udivRI: 632; CHECK: # %bb.0: # %entry 633; CHECK-NEXT: movi16 a1, 10 634; CHECK-NEXT: divu32 a0, a0, a1 635; CHECK-NEXT: rts16 636; 637; GENERIC-LABEL: udivRI: 638; GENERIC: # %bb.0: # %entry 639; GENERIC-NEXT: subi16 sp, sp, 4 640; GENERIC-NEXT: .cfi_def_cfa_offset 4 641; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 642; GENERIC-NEXT: .cfi_offset lr, -4 643; GENERIC-NEXT: subi16 sp, sp, 4 644; GENERIC-NEXT: .cfi_def_cfa_offset 8 645; GENERIC-NEXT: lrw32 a2, [.LCPI26_0] 646; GENERIC-NEXT: movi16 a1, 10 647; GENERIC-NEXT: jsr16 a2 648; GENERIC-NEXT: addi16 sp, sp, 4 649; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 650; GENERIC-NEXT: addi16 sp, sp, 4 651; GENERIC-NEXT: rts16 652; GENERIC-NEXT: .p2align 1 653; GENERIC-NEXT: # %bb.1: 654; GENERIC-NEXT: .p2align 2 655; GENERIC-NEXT: .LCPI26_0: 656; GENERIC-NEXT: .long __udivsi3 657entry: 658 %udiv = udiv i32 %x, 10 659 ret i32 %udiv 660} 661 662define i32 @udivRI_X(i32 %x) { 663; CHECK-LABEL: udivRI_X: 664; CHECK: # %bb.0: # %entry 665; CHECK-NEXT: movi32 a1, 4097 666; CHECK-NEXT: divu32 a0, a0, a1 667; CHECK-NEXT: rts16 668; 669; GENERIC-LABEL: udivRI_X: 670; GENERIC: # %bb.0: # %entry 671; GENERIC-NEXT: subi16 sp, sp, 4 672; GENERIC-NEXT: .cfi_def_cfa_offset 4 673; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 674; GENERIC-NEXT: .cfi_offset lr, -4 675; GENERIC-NEXT: subi16 sp, sp, 4 676; GENERIC-NEXT: .cfi_def_cfa_offset 8 677; GENERIC-NEXT: movi16 a1, 0 678; GENERIC-NEXT: lsli16 a2, a1, 24 679; GENERIC-NEXT: lsli16 a1, a1, 16 680; GENERIC-NEXT: or16 a1, a2 681; GENERIC-NEXT: movi16 a2, 16 682; GENERIC-NEXT: lsli16 a2, a2, 8 683; GENERIC-NEXT: or16 a2, a1 684; GENERIC-NEXT: movi16 a1, 1 685; GENERIC-NEXT: or16 a1, a2 686; GENERIC-NEXT: lrw32 a2, [.LCPI27_0] 687; GENERIC-NEXT: jsr16 a2 688; GENERIC-NEXT: addi16 sp, sp, 4 689; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 690; GENERIC-NEXT: addi16 sp, sp, 4 691; GENERIC-NEXT: rts16 692; GENERIC-NEXT: .p2align 1 693; GENERIC-NEXT: # %bb.1: 694; GENERIC-NEXT: .p2align 2 695; GENERIC-NEXT: .LCPI27_0: 696; GENERIC-NEXT: .long __udivsi3 697entry: 698 %udiv = udiv i32 %x, 4097 699 ret i32 %udiv 700} 701 702define i16 @UDIV_SHORT(i16 %x, i16 %y) { 703; CHECK-LABEL: UDIV_SHORT: 704; CHECK: # %bb.0: # %entry 705; CHECK-NEXT: zexth16 a0, a0 706; CHECK-NEXT: zexth16 a1, a1 707; CHECK-NEXT: divu32 a0, a1, a0 708; CHECK-NEXT: rts16 709; 710; GENERIC-LABEL: UDIV_SHORT: 711; GENERIC: # %bb.0: # %entry 712; GENERIC-NEXT: subi16 sp, sp, 8 713; GENERIC-NEXT: .cfi_def_cfa_offset 8 714; GENERIC-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill 715; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 716; GENERIC-NEXT: .cfi_offset l0, -4 717; GENERIC-NEXT: .cfi_offset lr, -8 718; GENERIC-NEXT: subi16 sp, sp, 4 719; GENERIC-NEXT: .cfi_def_cfa_offset 12 720; GENERIC-NEXT: mov16 a2, a1 721; GENERIC-NEXT: movi16 a1, 0 722; GENERIC-NEXT: lsli16 a3, a1, 24 723; GENERIC-NEXT: lsli16 l0, a1, 16 724; GENERIC-NEXT: or16 l0, a3 725; GENERIC-NEXT: movi16 a3, 255 726; GENERIC-NEXT: lsli16 a1, a3, 8 727; GENERIC-NEXT: or16 a1, l0 728; GENERIC-NEXT: or16 a1, a3 729; GENERIC-NEXT: and16 a2, a1 730; GENERIC-NEXT: and16 a1, a0 731; GENERIC-NEXT: lrw32 a3, [.LCPI28_0] 732; GENERIC-NEXT: mov16 a0, a2 733; GENERIC-NEXT: jsr16 a3 734; GENERIC-NEXT: addi16 sp, sp, 4 735; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 736; GENERIC-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload 737; GENERIC-NEXT: addi16 sp, sp, 8 738; GENERIC-NEXT: rts16 739; GENERIC-NEXT: .p2align 1 740; GENERIC-NEXT: # %bb.1: 741; GENERIC-NEXT: .p2align 2 742; GENERIC-NEXT: .LCPI28_0: 743; GENERIC-NEXT: .long __udivsi3 744entry: 745 %udiv = udiv i16 %y, %x 746 ret i16 %udiv 747} 748 749define i16 @UDIV_SHORT_I(i16 %x) { 750; CHECK-LABEL: UDIV_SHORT_I: 751; CHECK: # %bb.0: # %entry 752; CHECK-NEXT: zexth16 a0, a0 753; CHECK-NEXT: movi32 a1, 43691 754; CHECK-NEXT: mult16 a0, a1 755; CHECK-NEXT: lsri16 a0, a0, 17 756; CHECK-NEXT: rts16 757; 758; GENERIC-LABEL: UDIV_SHORT_I: 759; GENERIC: # %bb.0: # %entry 760; GENERIC-NEXT: .cfi_def_cfa_offset 0 761; GENERIC-NEXT: subi16 sp, sp, 4 762; GENERIC-NEXT: .cfi_def_cfa_offset 4 763; GENERIC-NEXT: movi16 a1, 0 764; GENERIC-NEXT: lsli16 a2, a1, 24 765; GENERIC-NEXT: lsli16 a1, a1, 16 766; GENERIC-NEXT: or16 a1, a2 767; GENERIC-NEXT: movi16 a2, 255 768; GENERIC-NEXT: lsli16 a3, a2, 8 769; GENERIC-NEXT: or16 a3, a1 770; GENERIC-NEXT: or16 a3, a2 771; GENERIC-NEXT: and16 a3, a0 772; GENERIC-NEXT: movi16 a0, 170 773; GENERIC-NEXT: lsli16 a0, a0, 8 774; GENERIC-NEXT: or16 a0, a1 775; GENERIC-NEXT: movi16 a1, 171 776; GENERIC-NEXT: or16 a1, a0 777; GENERIC-NEXT: mult16 a1, a3 778; GENERIC-NEXT: lsri16 a0, a1, 17 779; GENERIC-NEXT: addi16 sp, sp, 4 780; GENERIC-NEXT: rts16 781entry: 782 %udiv = udiv i16 %x, 3 783 ret i16 %udiv 784} 785 786define i8 @UDIV_CHAR(i8 %x, i8 %y) { 787; CHECK-LABEL: UDIV_CHAR: 788; CHECK: # %bb.0: # %entry 789; CHECK-NEXT: zextb16 a0, a0 790; CHECK-NEXT: zextb16 a1, a1 791; CHECK-NEXT: divu32 a0, a1, a0 792; CHECK-NEXT: rts16 793; 794; GENERIC-LABEL: UDIV_CHAR: 795; GENERIC: # %bb.0: # %entry 796; GENERIC-NEXT: subi16 sp, sp, 4 797; GENERIC-NEXT: .cfi_def_cfa_offset 4 798; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 799; GENERIC-NEXT: .cfi_offset lr, -4 800; GENERIC-NEXT: subi16 sp, sp, 4 801; GENERIC-NEXT: .cfi_def_cfa_offset 8 802; GENERIC-NEXT: mov16 a2, a1 803; GENERIC-NEXT: movi16 a1, 255 804; GENERIC-NEXT: and16 a2, a1 805; GENERIC-NEXT: and16 a1, a0 806; GENERIC-NEXT: lrw32 a3, [.LCPI30_0] 807; GENERIC-NEXT: mov16 a0, a2 808; GENERIC-NEXT: jsr16 a3 809; GENERIC-NEXT: addi16 sp, sp, 4 810; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 811; GENERIC-NEXT: addi16 sp, sp, 4 812; GENERIC-NEXT: rts16 813; GENERIC-NEXT: .p2align 1 814; GENERIC-NEXT: # %bb.1: 815; GENERIC-NEXT: .p2align 2 816; GENERIC-NEXT: .LCPI30_0: 817; GENERIC-NEXT: .long __udivsi3 818entry: 819 %udiv = udiv i8 %y, %x 820 ret i8 %udiv 821} 822 823define i8 @UDIV_CHAR_I(i8 %x) { 824; CHECK-LABEL: UDIV_CHAR_I: 825; CHECK: # %bb.0: # %entry 826; CHECK-NEXT: zextb16 a0, a0 827; CHECK-NEXT: movi16 a1, 171 828; CHECK-NEXT: mult16 a0, a1 829; CHECK-NEXT: lsri16 a0, a0, 9 830; CHECK-NEXT: rts16 831; 832; GENERIC-LABEL: UDIV_CHAR_I: 833; GENERIC: # %bb.0: # %entry 834; GENERIC-NEXT: .cfi_def_cfa_offset 0 835; GENERIC-NEXT: subi16 sp, sp, 4 836; GENERIC-NEXT: .cfi_def_cfa_offset 4 837; GENERIC-NEXT: movi16 a1, 255 838; GENERIC-NEXT: and16 a1, a0 839; GENERIC-NEXT: movi16 a0, 171 840; GENERIC-NEXT: mult16 a0, a1 841; GENERIC-NEXT: lsri16 a0, a0, 9 842; GENERIC-NEXT: addi16 sp, sp, 4 843; GENERIC-NEXT: rts16 844entry: 845 %udiv = udiv i8 %x, 3 846 ret i8 %udiv 847} 848 849define i32 @sdivRR(i32 %x, i32 %y) { 850; CHECK-LABEL: sdivRR: 851; CHECK: # %bb.0: # %entry 852; CHECK-NEXT: divs32 a0, a1, a0 853; CHECK-NEXT: rts16 854; 855; GENERIC-LABEL: sdivRR: 856; GENERIC: # %bb.0: # %entry 857; GENERIC-NEXT: subi16 sp, sp, 4 858; GENERIC-NEXT: .cfi_def_cfa_offset 4 859; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 860; GENERIC-NEXT: .cfi_offset lr, -4 861; GENERIC-NEXT: subi16 sp, sp, 4 862; GENERIC-NEXT: .cfi_def_cfa_offset 8 863; GENERIC-NEXT: mov16 a2, a0 864; GENERIC-NEXT: lrw32 a3, [.LCPI32_0] 865; GENERIC-NEXT: mov16 a0, a1 866; GENERIC-NEXT: mov16 a1, a2 867; GENERIC-NEXT: jsr16 a3 868; GENERIC-NEXT: addi16 sp, sp, 4 869; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 870; GENERIC-NEXT: addi16 sp, sp, 4 871; GENERIC-NEXT: rts16 872; GENERIC-NEXT: .p2align 1 873; GENERIC-NEXT: # %bb.1: 874; GENERIC-NEXT: .p2align 2 875; GENERIC-NEXT: .LCPI32_0: 876; GENERIC-NEXT: .long __divsi3 877entry: 878 %sdiv = sdiv i32 %y, %x 879 ret i32 %sdiv 880} 881 882define i32 @sdivRI(i32 %x) { 883; CHECK-LABEL: sdivRI: 884; CHECK: # %bb.0: # %entry 885; CHECK-NEXT: movi16 a1, 10 886; CHECK-NEXT: divs32 a0, a0, a1 887; CHECK-NEXT: rts16 888; 889; GENERIC-LABEL: sdivRI: 890; GENERIC: # %bb.0: # %entry 891; GENERIC-NEXT: subi16 sp, sp, 4 892; GENERIC-NEXT: .cfi_def_cfa_offset 4 893; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 894; GENERIC-NEXT: .cfi_offset lr, -4 895; GENERIC-NEXT: subi16 sp, sp, 4 896; GENERIC-NEXT: .cfi_def_cfa_offset 8 897; GENERIC-NEXT: lrw32 a2, [.LCPI33_0] 898; GENERIC-NEXT: movi16 a1, 10 899; GENERIC-NEXT: jsr16 a2 900; GENERIC-NEXT: addi16 sp, sp, 4 901; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 902; GENERIC-NEXT: addi16 sp, sp, 4 903; GENERIC-NEXT: rts16 904; GENERIC-NEXT: .p2align 1 905; GENERIC-NEXT: # %bb.1: 906; GENERIC-NEXT: .p2align 2 907; GENERIC-NEXT: .LCPI33_0: 908; GENERIC-NEXT: .long __divsi3 909entry: 910 %sdiv = sdiv i32 %x, 10 911 ret i32 %sdiv 912} 913 914define i32 @sdivRI_X(i32 %x) { 915; CHECK-LABEL: sdivRI_X: 916; CHECK: # %bb.0: # %entry 917; CHECK-NEXT: movi32 a1, 4097 918; CHECK-NEXT: divs32 a0, a0, a1 919; CHECK-NEXT: rts16 920; 921; GENERIC-LABEL: sdivRI_X: 922; GENERIC: # %bb.0: # %entry 923; GENERIC-NEXT: subi16 sp, sp, 4 924; GENERIC-NEXT: .cfi_def_cfa_offset 4 925; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 926; GENERIC-NEXT: .cfi_offset lr, -4 927; GENERIC-NEXT: subi16 sp, sp, 4 928; GENERIC-NEXT: .cfi_def_cfa_offset 8 929; GENERIC-NEXT: movi16 a1, 0 930; GENERIC-NEXT: lsli16 a2, a1, 24 931; GENERIC-NEXT: lsli16 a1, a1, 16 932; GENERIC-NEXT: or16 a1, a2 933; GENERIC-NEXT: movi16 a2, 16 934; GENERIC-NEXT: lsli16 a2, a2, 8 935; GENERIC-NEXT: or16 a2, a1 936; GENERIC-NEXT: movi16 a1, 1 937; GENERIC-NEXT: or16 a1, a2 938; GENERIC-NEXT: lrw32 a2, [.LCPI34_0] 939; GENERIC-NEXT: jsr16 a2 940; GENERIC-NEXT: addi16 sp, sp, 4 941; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 942; GENERIC-NEXT: addi16 sp, sp, 4 943; GENERIC-NEXT: rts16 944; GENERIC-NEXT: .p2align 1 945; GENERIC-NEXT: # %bb.1: 946; GENERIC-NEXT: .p2align 2 947; GENERIC-NEXT: .LCPI34_0: 948; GENERIC-NEXT: .long __divsi3 949entry: 950 %sdiv = sdiv i32 %x, 4097 951 ret i32 %sdiv 952} 953 954define i16 @SDIV_SHORT(i16 %x, i16 %y) { 955; CHECK-LABEL: SDIV_SHORT: 956; CHECK: # %bb.0: # %entry 957; CHECK-NEXT: sexth16 a0, a0 958; CHECK-NEXT: sexth16 a1, a1 959; CHECK-NEXT: divs32 a0, a1, a0 960; CHECK-NEXT: rts16 961; 962; GENERIC-LABEL: SDIV_SHORT: 963; GENERIC: # %bb.0: # %entry 964; GENERIC-NEXT: subi16 sp, sp, 4 965; GENERIC-NEXT: .cfi_def_cfa_offset 4 966; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 967; GENERIC-NEXT: .cfi_offset lr, -4 968; GENERIC-NEXT: subi16 sp, sp, 4 969; GENERIC-NEXT: .cfi_def_cfa_offset 8 970; GENERIC-NEXT: sexth16 a2, a1 971; GENERIC-NEXT: sexth16 a1, a0 972; GENERIC-NEXT: lrw32 a3, [.LCPI35_0] 973; GENERIC-NEXT: mov16 a0, a2 974; GENERIC-NEXT: jsr16 a3 975; GENERIC-NEXT: addi16 sp, sp, 4 976; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 977; GENERIC-NEXT: addi16 sp, sp, 4 978; GENERIC-NEXT: rts16 979; GENERIC-NEXT: .p2align 1 980; GENERIC-NEXT: # %bb.1: 981; GENERIC-NEXT: .p2align 2 982; GENERIC-NEXT: .LCPI35_0: 983; GENERIC-NEXT: .long __divsi3 984entry: 985 %sdiv = sdiv i16 %y, %x 986 ret i16 %sdiv 987} 988 989define i16 @SDIV_SHORT_I(i16 %x) { 990; CHECK-LABEL: SDIV_SHORT_I: 991; CHECK: # %bb.0: # %entry 992; CHECK-NEXT: sexth16 a0, a0 993; CHECK-NEXT: movi32 a1, 21846 994; CHECK-NEXT: mult16 a0, a1 995; CHECK-NEXT: lsri16 a1, a0, 31 996; CHECK-NEXT: lsri16 a0, a0, 16 997; CHECK-NEXT: addu16 a0, a1 998; CHECK-NEXT: rts16 999; 1000; GENERIC-LABEL: SDIV_SHORT_I: 1001; GENERIC: # %bb.0: # %entry 1002; GENERIC-NEXT: .cfi_def_cfa_offset 0 1003; GENERIC-NEXT: subi16 sp, sp, 4 1004; GENERIC-NEXT: .cfi_def_cfa_offset 4 1005; GENERIC-NEXT: sexth16 a0, a0 1006; GENERIC-NEXT: movi16 a1, 0 1007; GENERIC-NEXT: lsli16 a2, a1, 24 1008; GENERIC-NEXT: lsli16 a1, a1, 16 1009; GENERIC-NEXT: or16 a1, a2 1010; GENERIC-NEXT: movi16 a2, 85 1011; GENERIC-NEXT: lsli16 a2, a2, 8 1012; GENERIC-NEXT: or16 a2, a1 1013; GENERIC-NEXT: movi16 a1, 86 1014; GENERIC-NEXT: or16 a1, a2 1015; GENERIC-NEXT: mult16 a1, a0 1016; GENERIC-NEXT: lsri16 a0, a1, 31 1017; GENERIC-NEXT: lsri16 a1, a1, 16 1018; GENERIC-NEXT: addu16 a0, a1, a0 1019; GENERIC-NEXT: addi16 sp, sp, 4 1020; GENERIC-NEXT: rts16 1021entry: 1022 %sdiv = sdiv i16 %x, 3 1023 ret i16 %sdiv 1024} 1025 1026define i8 @SDIV_CHAR(i8 %x, i8 %y) { 1027; CHECK-LABEL: SDIV_CHAR: 1028; CHECK: # %bb.0: # %entry 1029; CHECK-NEXT: sextb16 a0, a0 1030; CHECK-NEXT: sextb16 a1, a1 1031; CHECK-NEXT: divs32 a0, a1, a0 1032; CHECK-NEXT: rts16 1033; 1034; GENERIC-LABEL: SDIV_CHAR: 1035; GENERIC: # %bb.0: # %entry 1036; GENERIC-NEXT: subi16 sp, sp, 4 1037; GENERIC-NEXT: .cfi_def_cfa_offset 4 1038; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 1039; GENERIC-NEXT: .cfi_offset lr, -4 1040; GENERIC-NEXT: subi16 sp, sp, 4 1041; GENERIC-NEXT: .cfi_def_cfa_offset 8 1042; GENERIC-NEXT: sextb16 a2, a1 1043; GENERIC-NEXT: sextb16 a1, a0 1044; GENERIC-NEXT: lrw32 a3, [.LCPI37_0] 1045; GENERIC-NEXT: mov16 a0, a2 1046; GENERIC-NEXT: jsr16 a3 1047; GENERIC-NEXT: addi16 sp, sp, 4 1048; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 1049; GENERIC-NEXT: addi16 sp, sp, 4 1050; GENERIC-NEXT: rts16 1051; GENERIC-NEXT: .p2align 1 1052; GENERIC-NEXT: # %bb.1: 1053; GENERIC-NEXT: .p2align 2 1054; GENERIC-NEXT: .LCPI37_0: 1055; GENERIC-NEXT: .long __divsi3 1056entry: 1057 %sdiv = sdiv i8 %y, %x 1058 ret i8 %sdiv 1059} 1060 1061define i8 @SDIV_CHAR_I(i8 %x) { 1062; CHECK-LABEL: SDIV_CHAR_I: 1063; CHECK: # %bb.0: # %entry 1064; CHECK-NEXT: sextb16 a1, a0 1065; CHECK-NEXT: movi16 a2, 85 1066; CHECK-NEXT: mult16 a1, a2 1067; CHECK-NEXT: lsri16 a1, a1, 8 1068; CHECK-NEXT: subu16 a0, a1, a0 1069; CHECK-NEXT: andi32 a1, a0, 128 1070; CHECK-NEXT: lsri16 a1, a1, 7 1071; CHECK-NEXT: sextb16 a0, a0 1072; CHECK-NEXT: asri16 a0, a0, 1 1073; CHECK-NEXT: addu16 a0, a1 1074; CHECK-NEXT: rts16 1075; 1076; GENERIC-LABEL: SDIV_CHAR_I: 1077; GENERIC: # %bb.0: # %entry 1078; GENERIC-NEXT: .cfi_def_cfa_offset 0 1079; GENERIC-NEXT: subi16 sp, sp, 4 1080; GENERIC-NEXT: .cfi_def_cfa_offset 4 1081; GENERIC-NEXT: sextb16 a1, a0 1082; GENERIC-NEXT: movi16 a2, 85 1083; GENERIC-NEXT: mult16 a2, a1 1084; GENERIC-NEXT: lsri16 a1, a2, 8 1085; GENERIC-NEXT: subu16 a0, a1, a0 1086; GENERIC-NEXT: movi16 a1, 128 1087; GENERIC-NEXT: and16 a1, a0 1088; GENERIC-NEXT: lsri16 a1, a1, 7 1089; GENERIC-NEXT: sextb16 a0, a0 1090; GENERIC-NEXT: asri16 a0, a0, 1 1091; GENERIC-NEXT: addu16 a0, a0, a1 1092; GENERIC-NEXT: addi16 sp, sp, 4 1093; GENERIC-NEXT: rts16 1094entry: 1095 %sdiv = sdiv i8 %x, -3 1096 ret i8 %sdiv 1097} 1098 1099define i32 @shlRR(i32 %x, i32 %y) { 1100; CHECK-LABEL: shlRR: 1101; CHECK: # %bb.0: # %entry 1102; CHECK-NEXT: lsl32 a0, a1, a0 1103; CHECK-NEXT: rts16 1104; 1105; GENERIC-LABEL: shlRR: 1106; GENERIC: # %bb.0: # %entry 1107; GENERIC-NEXT: .cfi_def_cfa_offset 0 1108; GENERIC-NEXT: subi16 sp, sp, 4 1109; GENERIC-NEXT: .cfi_def_cfa_offset 4 1110; GENERIC-NEXT: lsl16 a1, a0 1111; GENERIC-NEXT: mov16 a0, a1 1112; GENERIC-NEXT: addi16 sp, sp, 4 1113; GENERIC-NEXT: rts16 1114entry: 1115 %shl = shl nsw i32 %y, %x 1116 ret i32 %shl 1117} 1118 1119define i32 @shlRI(i32 %x) { 1120; CHECK-LABEL: shlRI: 1121; CHECK: # %bb.0: # %entry 1122; CHECK-NEXT: lsli16 a0, a0, 10 1123; CHECK-NEXT: rts16 1124; 1125; GENERIC-LABEL: shlRI: 1126; GENERIC: # %bb.0: # %entry 1127; GENERIC-NEXT: .cfi_def_cfa_offset 0 1128; GENERIC-NEXT: subi16 sp, sp, 4 1129; GENERIC-NEXT: .cfi_def_cfa_offset 4 1130; GENERIC-NEXT: lsli16 a0, a0, 10 1131; GENERIC-NEXT: addi16 sp, sp, 4 1132; GENERIC-NEXT: rts16 1133entry: 1134 %shl = shl nsw i32 %x, 10 1135 ret i32 %shl 1136} 1137 1138 1139define i64 @SHL_LONG_I(i64 %x) { 1140; CHECK-LABEL: SHL_LONG_I: 1141; CHECK: # %bb.0: # %entry 1142; CHECK-NEXT: lsri16 a2, a0, 25 1143; CHECK-NEXT: lsli16 a1, a1, 7 1144; CHECK-NEXT: or16 a1, a2 1145; CHECK-NEXT: lsli16 a0, a0, 7 1146; CHECK-NEXT: rts16 1147; 1148; GENERIC-LABEL: SHL_LONG_I: 1149; GENERIC: # %bb.0: # %entry 1150; GENERIC-NEXT: .cfi_def_cfa_offset 0 1151; GENERIC-NEXT: subi16 sp, sp, 4 1152; GENERIC-NEXT: .cfi_def_cfa_offset 4 1153; GENERIC-NEXT: lsri16 a2, a0, 25 1154; GENERIC-NEXT: lsli16 a1, a1, 7 1155; GENERIC-NEXT: or16 a1, a2 1156; GENERIC-NEXT: lsli16 a0, a0, 7 1157; GENERIC-NEXT: addi16 sp, sp, 4 1158; GENERIC-NEXT: rts16 1159entry: 1160 %shl = shl nsw i64 %x, 7 1161 ret i64 %shl 1162} 1163 1164define i16 @SHL_SHORT(i16 %x, i16 %y) { 1165; CHECK-LABEL: SHL_SHORT: 1166; CHECK: # %bb.0: # %entry 1167; CHECK-NEXT: zexth16 a0, a0 1168; CHECK-NEXT: lsl32 a0, a1, a0 1169; CHECK-NEXT: rts16 1170; 1171; GENERIC-LABEL: SHL_SHORT: 1172; GENERIC: # %bb.0: # %entry 1173; GENERIC-NEXT: subi16 sp, sp, 4 1174; GENERIC-NEXT: .cfi_def_cfa_offset 4 1175; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill 1176; GENERIC-NEXT: .cfi_offset l0, -4 1177; GENERIC-NEXT: subi16 sp, sp, 4 1178; GENERIC-NEXT: .cfi_def_cfa_offset 8 1179; GENERIC-NEXT: movi16 a2, 0 1180; GENERIC-NEXT: lsli16 a3, a2, 24 1181; GENERIC-NEXT: lsli16 a2, a2, 16 1182; GENERIC-NEXT: or16 a2, a3 1183; GENERIC-NEXT: movi16 a3, 255 1184; GENERIC-NEXT: lsli16 l0, a3, 8 1185; GENERIC-NEXT: or16 l0, a2 1186; GENERIC-NEXT: or16 l0, a3 1187; GENERIC-NEXT: and16 l0, a0 1188; GENERIC-NEXT: lsl16 a1, l0 1189; GENERIC-NEXT: mov16 a0, a1 1190; GENERIC-NEXT: addi16 sp, sp, 4 1191; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload 1192; GENERIC-NEXT: addi16 sp, sp, 4 1193; GENERIC-NEXT: rts16 1194entry: 1195 %shl = shl nsw i16 %y, %x 1196 ret i16 %shl 1197} 1198 1199define i16 @SHL_SHORT_I(i16 %x) { 1200; CHECK-LABEL: SHL_SHORT_I: 1201; CHECK: # %bb.0: # %entry 1202; CHECK-NEXT: lsli16 a0, a0, 1 1203; CHECK-NEXT: rts16 1204; 1205; GENERIC-LABEL: SHL_SHORT_I: 1206; GENERIC: # %bb.0: # %entry 1207; GENERIC-NEXT: .cfi_def_cfa_offset 0 1208; GENERIC-NEXT: subi16 sp, sp, 4 1209; GENERIC-NEXT: .cfi_def_cfa_offset 4 1210; GENERIC-NEXT: lsli16 a0, a0, 1 1211; GENERIC-NEXT: addi16 sp, sp, 4 1212; GENERIC-NEXT: rts16 1213entry: 1214 %shl = shl nsw i16 %x, 1 1215 ret i16 %shl 1216} 1217 1218define i8 @SHL_CHAR(i8 %x, i8 %y) { 1219; CHECK-LABEL: SHL_CHAR: 1220; CHECK: # %bb.0: # %entry 1221; CHECK-NEXT: zextb16 a0, a0 1222; CHECK-NEXT: lsl32 a0, a1, a0 1223; CHECK-NEXT: rts16 1224; 1225; GENERIC-LABEL: SHL_CHAR: 1226; GENERIC: # %bb.0: # %entry 1227; GENERIC-NEXT: .cfi_def_cfa_offset 0 1228; GENERIC-NEXT: subi16 sp, sp, 4 1229; GENERIC-NEXT: .cfi_def_cfa_offset 4 1230; GENERIC-NEXT: movi16 a2, 255 1231; GENERIC-NEXT: and16 a2, a0 1232; GENERIC-NEXT: lsl16 a1, a2 1233; GENERIC-NEXT: mov16 a0, a1 1234; GENERIC-NEXT: addi16 sp, sp, 4 1235; GENERIC-NEXT: rts16 1236entry: 1237 %shl = shl nsw i8 %y, %x 1238 ret i8 %shl 1239} 1240 1241define i8 @SHL_CHAR_I(i8 %x) { 1242; CHECK-LABEL: SHL_CHAR_I: 1243; CHECK: # %bb.0: # %entry 1244; CHECK-NEXT: lsli16 a0, a0, 1 1245; CHECK-NEXT: rts16 1246; 1247; GENERIC-LABEL: SHL_CHAR_I: 1248; GENERIC: # %bb.0: # %entry 1249; GENERIC-NEXT: .cfi_def_cfa_offset 0 1250; GENERIC-NEXT: subi16 sp, sp, 4 1251; GENERIC-NEXT: .cfi_def_cfa_offset 4 1252; GENERIC-NEXT: lsli16 a0, a0, 1 1253; GENERIC-NEXT: addi16 sp, sp, 4 1254; GENERIC-NEXT: rts16 1255entry: 1256 %shl = shl nsw i8 %x, 1 1257 ret i8 %shl 1258} 1259 1260define i32 @andRR(i32 %x, i32 %y) { 1261; CHECK-LABEL: andRR: 1262; CHECK: # %bb.0: # %entry 1263; CHECK-NEXT: and16 a0, a1 1264; CHECK-NEXT: rts16 1265; 1266; GENERIC-LABEL: andRR: 1267; GENERIC: # %bb.0: # %entry 1268; GENERIC-NEXT: .cfi_def_cfa_offset 0 1269; GENERIC-NEXT: subi16 sp, sp, 4 1270; GENERIC-NEXT: .cfi_def_cfa_offset 4 1271; GENERIC-NEXT: and16 a0, a1 1272; GENERIC-NEXT: addi16 sp, sp, 4 1273; GENERIC-NEXT: rts16 1274entry: 1275 %and = and i32 %y, %x 1276 ret i32 %and 1277} 1278 1279define i32 @andRI(i32 %x) { 1280; CHECK-LABEL: andRI: 1281; CHECK: # %bb.0: # %entry 1282; CHECK-NEXT: andi32 a0, a0, 10 1283; CHECK-NEXT: rts16 1284; 1285; GENERIC-LABEL: andRI: 1286; GENERIC: # %bb.0: # %entry 1287; GENERIC-NEXT: .cfi_def_cfa_offset 0 1288; GENERIC-NEXT: subi16 sp, sp, 4 1289; GENERIC-NEXT: .cfi_def_cfa_offset 4 1290; GENERIC-NEXT: movi16 a1, 10 1291; GENERIC-NEXT: and16 a0, a1 1292; GENERIC-NEXT: addi16 sp, sp, 4 1293; GENERIC-NEXT: rts16 1294entry: 1295 %and = and i32 %x, 10 1296 ret i32 %and 1297} 1298 1299define i32 @andRI_X(i32 %x) { 1300; CHECK-LABEL: andRI_X: 1301; CHECK: # %bb.0: # %entry 1302; CHECK-NEXT: movi32 a1, 4097 1303; CHECK-NEXT: and16 a0, a1 1304; CHECK-NEXT: rts16 1305; 1306; GENERIC-LABEL: andRI_X: 1307; GENERIC: # %bb.0: # %entry 1308; GENERIC-NEXT: .cfi_def_cfa_offset 0 1309; GENERIC-NEXT: subi16 sp, sp, 4 1310; GENERIC-NEXT: .cfi_def_cfa_offset 4 1311; GENERIC-NEXT: movi16 a1, 0 1312; GENERIC-NEXT: lsli16 a2, a1, 24 1313; GENERIC-NEXT: lsli16 a1, a1, 16 1314; GENERIC-NEXT: or16 a1, a2 1315; GENERIC-NEXT: movi16 a2, 16 1316; GENERIC-NEXT: lsli16 a2, a2, 8 1317; GENERIC-NEXT: or16 a2, a1 1318; GENERIC-NEXT: movi16 a1, 1 1319; GENERIC-NEXT: or16 a1, a2 1320; GENERIC-NEXT: and16 a0, a1 1321; GENERIC-NEXT: addi16 sp, sp, 4 1322; GENERIC-NEXT: rts16 1323entry: 1324 %and = and i32 %x, 4097 1325 ret i32 %and 1326} 1327 1328define i64 @AND_LONG(i64 %x, i64 %y) { 1329; CHECK-LABEL: AND_LONG: 1330; CHECK: # %bb.0: # %entry 1331; CHECK-NEXT: and16 a0, a2 1332; CHECK-NEXT: and16 a1, a3 1333; CHECK-NEXT: rts16 1334; 1335; GENERIC-LABEL: AND_LONG: 1336; GENERIC: # %bb.0: # %entry 1337; GENERIC-NEXT: .cfi_def_cfa_offset 0 1338; GENERIC-NEXT: subi16 sp, sp, 4 1339; GENERIC-NEXT: .cfi_def_cfa_offset 4 1340; GENERIC-NEXT: and16 a0, a2 1341; GENERIC-NEXT: and16 a1, a3 1342; GENERIC-NEXT: addi16 sp, sp, 4 1343; GENERIC-NEXT: rts16 1344entry: 1345 %and = and i64 %y, %x 1346 ret i64 %and 1347} 1348 1349define i64 @AND_LONG_I(i64 %x) { 1350; CHECK-LABEL: AND_LONG_I: 1351; CHECK: # %bb.0: # %entry 1352; CHECK-NEXT: andi32 a0, a0, 1 1353; CHECK-NEXT: movi16 a1, 0 1354; CHECK-NEXT: rts16 1355; 1356; GENERIC-LABEL: AND_LONG_I: 1357; GENERIC: # %bb.0: # %entry 1358; GENERIC-NEXT: .cfi_def_cfa_offset 0 1359; GENERIC-NEXT: subi16 sp, sp, 4 1360; GENERIC-NEXT: .cfi_def_cfa_offset 4 1361; GENERIC-NEXT: movi16 a1, 1 1362; GENERIC-NEXT: and16 a0, a1 1363; GENERIC-NEXT: movi16 a1, 0 1364; GENERIC-NEXT: addi16 sp, sp, 4 1365; GENERIC-NEXT: rts16 1366entry: 1367 %and = and i64 %x, 1 1368 ret i64 %and 1369} 1370 1371define i16 @AND_SHORT(i16 %x, i16 %y) { 1372; CHECK-LABEL: AND_SHORT: 1373; CHECK: # %bb.0: # %entry 1374; CHECK-NEXT: and16 a0, a1 1375; CHECK-NEXT: rts16 1376; 1377; GENERIC-LABEL: AND_SHORT: 1378; GENERIC: # %bb.0: # %entry 1379; GENERIC-NEXT: .cfi_def_cfa_offset 0 1380; GENERIC-NEXT: subi16 sp, sp, 4 1381; GENERIC-NEXT: .cfi_def_cfa_offset 4 1382; GENERIC-NEXT: and16 a0, a1 1383; GENERIC-NEXT: addi16 sp, sp, 4 1384; GENERIC-NEXT: rts16 1385entry: 1386 %and = and i16 %y, %x 1387 ret i16 %and 1388} 1389 1390define i16 @AND_SHORT_I(i16 %x) { 1391; CHECK-LABEL: AND_SHORT_I: 1392; CHECK: # %bb.0: # %entry 1393; CHECK-NEXT: andi32 a0, a0, 1 1394; CHECK-NEXT: rts16 1395; 1396; GENERIC-LABEL: AND_SHORT_I: 1397; GENERIC: # %bb.0: # %entry 1398; GENERIC-NEXT: .cfi_def_cfa_offset 0 1399; GENERIC-NEXT: subi16 sp, sp, 4 1400; GENERIC-NEXT: .cfi_def_cfa_offset 4 1401; GENERIC-NEXT: movi16 a1, 1 1402; GENERIC-NEXT: and16 a0, a1 1403; GENERIC-NEXT: addi16 sp, sp, 4 1404; GENERIC-NEXT: rts16 1405entry: 1406 %and = and i16 %x, 1 1407 ret i16 %and 1408} 1409 1410define i8 @AND_CHAR(i8 %x, i8 %y) { 1411; CHECK-LABEL: AND_CHAR: 1412; CHECK: # %bb.0: # %entry 1413; CHECK-NEXT: and16 a0, a1 1414; CHECK-NEXT: rts16 1415; 1416; GENERIC-LABEL: AND_CHAR: 1417; GENERIC: # %bb.0: # %entry 1418; GENERIC-NEXT: .cfi_def_cfa_offset 0 1419; GENERIC-NEXT: subi16 sp, sp, 4 1420; GENERIC-NEXT: .cfi_def_cfa_offset 4 1421; GENERIC-NEXT: and16 a0, a1 1422; GENERIC-NEXT: addi16 sp, sp, 4 1423; GENERIC-NEXT: rts16 1424entry: 1425 %and = and i8 %y, %x 1426 ret i8 %and 1427} 1428 1429define i8 @AND_CHAR_I(i8 %x) { 1430; CHECK-LABEL: AND_CHAR_I: 1431; CHECK: # %bb.0: # %entry 1432; CHECK-NEXT: andi32 a0, a0, 1 1433; CHECK-NEXT: rts16 1434; 1435; GENERIC-LABEL: AND_CHAR_I: 1436; GENERIC: # %bb.0: # %entry 1437; GENERIC-NEXT: .cfi_def_cfa_offset 0 1438; GENERIC-NEXT: subi16 sp, sp, 4 1439; GENERIC-NEXT: .cfi_def_cfa_offset 4 1440; GENERIC-NEXT: movi16 a1, 1 1441; GENERIC-NEXT: and16 a0, a1 1442; GENERIC-NEXT: addi16 sp, sp, 4 1443; GENERIC-NEXT: rts16 1444entry: 1445 %and = and i8 %x, 1 1446 ret i8 %and 1447} 1448 1449define i32 @ashrRR(i32 %x, i32 %y) { 1450; CHECK-LABEL: ashrRR: 1451; CHECK: # %bb.0: # %entry 1452; CHECK-NEXT: asr32 a0, a1, a0 1453; CHECK-NEXT: rts16 1454; 1455; GENERIC-LABEL: ashrRR: 1456; GENERIC: # %bb.0: # %entry 1457; GENERIC-NEXT: .cfi_def_cfa_offset 0 1458; GENERIC-NEXT: subi16 sp, sp, 4 1459; GENERIC-NEXT: .cfi_def_cfa_offset 4 1460; GENERIC-NEXT: asr16 a1, a0 1461; GENERIC-NEXT: mov16 a0, a1 1462; GENERIC-NEXT: addi16 sp, sp, 4 1463; GENERIC-NEXT: rts16 1464entry: 1465 %ashr = ashr i32 %y, %x 1466 ret i32 %ashr 1467} 1468 1469define i32 @ashrRI(i32 %x) { 1470; CHECK-LABEL: ashrRI: 1471; CHECK: # %bb.0: # %entry 1472; CHECK-NEXT: asri16 a0, a0, 10 1473; CHECK-NEXT: rts16 1474; 1475; GENERIC-LABEL: ashrRI: 1476; GENERIC: # %bb.0: # %entry 1477; GENERIC-NEXT: .cfi_def_cfa_offset 0 1478; GENERIC-NEXT: subi16 sp, sp, 4 1479; GENERIC-NEXT: .cfi_def_cfa_offset 4 1480; GENERIC-NEXT: asri16 a0, a0, 10 1481; GENERIC-NEXT: addi16 sp, sp, 4 1482; GENERIC-NEXT: rts16 1483entry: 1484 %ashr = ashr i32 %x, 10 1485 ret i32 %ashr 1486} 1487 1488 1489define i64 @ASHR_LONG_I(i64 %x) { 1490; CHECK-LABEL: ASHR_LONG_I: 1491; CHECK: # %bb.0: # %entry 1492; CHECK-NEXT: lsli16 a2, a1, 25 1493; CHECK-NEXT: lsri16 a0, a0, 7 1494; CHECK-NEXT: or16 a0, a2 1495; CHECK-NEXT: asri16 a1, a1, 7 1496; CHECK-NEXT: rts16 1497; 1498; GENERIC-LABEL: ASHR_LONG_I: 1499; GENERIC: # %bb.0: # %entry 1500; GENERIC-NEXT: .cfi_def_cfa_offset 0 1501; GENERIC-NEXT: subi16 sp, sp, 4 1502; GENERIC-NEXT: .cfi_def_cfa_offset 4 1503; GENERIC-NEXT: lsli16 a2, a1, 25 1504; GENERIC-NEXT: lsri16 a0, a0, 7 1505; GENERIC-NEXT: or16 a0, a2 1506; GENERIC-NEXT: asri16 a1, a1, 7 1507; GENERIC-NEXT: addi16 sp, sp, 4 1508; GENERIC-NEXT: rts16 1509entry: 1510 %ashr = ashr i64 %x, 7 1511 ret i64 %ashr 1512} 1513 1514define i16 @ASHR_SHORT(i16 %x, i16 %y) { 1515; CHECK-LABEL: ASHR_SHORT: 1516; CHECK: # %bb.0: # %entry 1517; CHECK-NEXT: sexth16 a1, a1 1518; CHECK-NEXT: zexth16 a0, a0 1519; CHECK-NEXT: asr32 a0, a1, a0 1520; CHECK-NEXT: rts16 1521; 1522; GENERIC-LABEL: ASHR_SHORT: 1523; GENERIC: # %bb.0: # %entry 1524; GENERIC-NEXT: subi16 sp, sp, 4 1525; GENERIC-NEXT: .cfi_def_cfa_offset 4 1526; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill 1527; GENERIC-NEXT: .cfi_offset l0, -4 1528; GENERIC-NEXT: subi16 sp, sp, 4 1529; GENERIC-NEXT: .cfi_def_cfa_offset 8 1530; GENERIC-NEXT: sexth16 a1, a1 1531; GENERIC-NEXT: movi16 a2, 0 1532; GENERIC-NEXT: lsli16 a3, a2, 24 1533; GENERIC-NEXT: lsli16 a2, a2, 16 1534; GENERIC-NEXT: or16 a2, a3 1535; GENERIC-NEXT: movi16 a3, 255 1536; GENERIC-NEXT: lsli16 l0, a3, 8 1537; GENERIC-NEXT: or16 l0, a2 1538; GENERIC-NEXT: or16 l0, a3 1539; GENERIC-NEXT: and16 l0, a0 1540; GENERIC-NEXT: asr16 a1, l0 1541; GENERIC-NEXT: mov16 a0, a1 1542; GENERIC-NEXT: addi16 sp, sp, 4 1543; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload 1544; GENERIC-NEXT: addi16 sp, sp, 4 1545; GENERIC-NEXT: rts16 1546entry: 1547 %ashr = ashr i16 %y, %x 1548 ret i16 %ashr 1549} 1550 1551define i16 @ASHR_SHORT_I(i16 %x) { 1552; CHECK-LABEL: ASHR_SHORT_I: 1553; CHECK: # %bb.0: # %entry 1554; CHECK-NEXT: sexth16 a0, a0 1555; CHECK-NEXT: asri16 a0, a0, 1 1556; CHECK-NEXT: rts16 1557; 1558; GENERIC-LABEL: ASHR_SHORT_I: 1559; GENERIC: # %bb.0: # %entry 1560; GENERIC-NEXT: .cfi_def_cfa_offset 0 1561; GENERIC-NEXT: subi16 sp, sp, 4 1562; GENERIC-NEXT: .cfi_def_cfa_offset 4 1563; GENERIC-NEXT: sexth16 a0, a0 1564; GENERIC-NEXT: asri16 a0, a0, 1 1565; GENERIC-NEXT: addi16 sp, sp, 4 1566; GENERIC-NEXT: rts16 1567entry: 1568 %ashr = ashr i16 %x, 1 1569 ret i16 %ashr 1570} 1571 1572define i8 @ASHR_CHAR(i8 %x, i8 %y) { 1573; CHECK-LABEL: ASHR_CHAR: 1574; CHECK: # %bb.0: # %entry 1575; CHECK-NEXT: sextb16 a1, a1 1576; CHECK-NEXT: zextb16 a0, a0 1577; CHECK-NEXT: asr32 a0, a1, a0 1578; CHECK-NEXT: rts16 1579; 1580; GENERIC-LABEL: ASHR_CHAR: 1581; GENERIC: # %bb.0: # %entry 1582; GENERIC-NEXT: .cfi_def_cfa_offset 0 1583; GENERIC-NEXT: subi16 sp, sp, 4 1584; GENERIC-NEXT: .cfi_def_cfa_offset 4 1585; GENERIC-NEXT: sextb16 a1, a1 1586; GENERIC-NEXT: movi16 a2, 255 1587; GENERIC-NEXT: and16 a2, a0 1588; GENERIC-NEXT: asr16 a1, a2 1589; GENERIC-NEXT: mov16 a0, a1 1590; GENERIC-NEXT: addi16 sp, sp, 4 1591; GENERIC-NEXT: rts16 1592entry: 1593 %ashr = ashr i8 %y, %x 1594 ret i8 %ashr 1595} 1596 1597define i8 @ASHR_CHAR_I(i8 %x) { 1598; CHECK-LABEL: ASHR_CHAR_I: 1599; CHECK: # %bb.0: # %entry 1600; CHECK-NEXT: sextb16 a0, a0 1601; CHECK-NEXT: asri16 a0, a0, 1 1602; CHECK-NEXT: rts16 1603; 1604; GENERIC-LABEL: ASHR_CHAR_I: 1605; GENERIC: # %bb.0: # %entry 1606; GENERIC-NEXT: .cfi_def_cfa_offset 0 1607; GENERIC-NEXT: subi16 sp, sp, 4 1608; GENERIC-NEXT: .cfi_def_cfa_offset 4 1609; GENERIC-NEXT: sextb16 a0, a0 1610; GENERIC-NEXT: asri16 a0, a0, 1 1611; GENERIC-NEXT: addi16 sp, sp, 4 1612; GENERIC-NEXT: rts16 1613entry: 1614 %ashr = ashr i8 %x, 1 1615 ret i8 %ashr 1616} 1617 1618 1619define i32 @lshrRR(i32 %x, i32 %y) { 1620; CHECK-LABEL: lshrRR: 1621; CHECK: # %bb.0: # %entry 1622; CHECK-NEXT: lsr32 a0, a1, a0 1623; CHECK-NEXT: rts16 1624; 1625; GENERIC-LABEL: lshrRR: 1626; GENERIC: # %bb.0: # %entry 1627; GENERIC-NEXT: .cfi_def_cfa_offset 0 1628; GENERIC-NEXT: subi16 sp, sp, 4 1629; GENERIC-NEXT: .cfi_def_cfa_offset 4 1630; GENERIC-NEXT: lsr16 a1, a0 1631; GENERIC-NEXT: mov16 a0, a1 1632; GENERIC-NEXT: addi16 sp, sp, 4 1633; GENERIC-NEXT: rts16 1634entry: 1635 %lshr = lshr i32 %y, %x 1636 ret i32 %lshr 1637} 1638 1639define i32 @lshrRI(i32 %x) { 1640; CHECK-LABEL: lshrRI: 1641; CHECK: # %bb.0: # %entry 1642; CHECK-NEXT: lsri16 a0, a0, 10 1643; CHECK-NEXT: rts16 1644; 1645; GENERIC-LABEL: lshrRI: 1646; GENERIC: # %bb.0: # %entry 1647; GENERIC-NEXT: .cfi_def_cfa_offset 0 1648; GENERIC-NEXT: subi16 sp, sp, 4 1649; GENERIC-NEXT: .cfi_def_cfa_offset 4 1650; GENERIC-NEXT: lsri16 a0, a0, 10 1651; GENERIC-NEXT: addi16 sp, sp, 4 1652; GENERIC-NEXT: rts16 1653entry: 1654 %lshr = lshr i32 %x, 10 1655 ret i32 %lshr 1656} 1657 1658define i64 @LSHR_LONG_I(i64 %x) { 1659; CHECK-LABEL: LSHR_LONG_I: 1660; CHECK: # %bb.0: # %entry 1661; CHECK-NEXT: lsli16 a2, a1, 25 1662; CHECK-NEXT: lsri16 a0, a0, 7 1663; CHECK-NEXT: or16 a0, a2 1664; CHECK-NEXT: lsri16 a1, a1, 7 1665; CHECK-NEXT: rts16 1666; 1667; GENERIC-LABEL: LSHR_LONG_I: 1668; GENERIC: # %bb.0: # %entry 1669; GENERIC-NEXT: .cfi_def_cfa_offset 0 1670; GENERIC-NEXT: subi16 sp, sp, 4 1671; GENERIC-NEXT: .cfi_def_cfa_offset 4 1672; GENERIC-NEXT: lsli16 a2, a1, 25 1673; GENERIC-NEXT: lsri16 a0, a0, 7 1674; GENERIC-NEXT: or16 a0, a2 1675; GENERIC-NEXT: lsri16 a1, a1, 7 1676; GENERIC-NEXT: addi16 sp, sp, 4 1677; GENERIC-NEXT: rts16 1678entry: 1679 %lshr = lshr i64 %x, 7 1680 ret i64 %lshr 1681} 1682 1683define i16 @LSHR_SHORT(i16 %x, i16 %y) { 1684; CHECK-LABEL: LSHR_SHORT: 1685; CHECK: # %bb.0: # %entry 1686; CHECK-NEXT: zexth16 a1, a1 1687; CHECK-NEXT: zexth16 a0, a0 1688; CHECK-NEXT: lsr32 a0, a1, a0 1689; CHECK-NEXT: rts16 1690; 1691; GENERIC-LABEL: LSHR_SHORT: 1692; GENERIC: # %bb.0: # %entry 1693; GENERIC-NEXT: subi16 sp, sp, 4 1694; GENERIC-NEXT: .cfi_def_cfa_offset 4 1695; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill 1696; GENERIC-NEXT: .cfi_offset l0, -4 1697; GENERIC-NEXT: subi16 sp, sp, 4 1698; GENERIC-NEXT: .cfi_def_cfa_offset 8 1699; GENERIC-NEXT: movi16 a2, 0 1700; GENERIC-NEXT: lsli16 a3, a2, 24 1701; GENERIC-NEXT: lsli16 a2, a2, 16 1702; GENERIC-NEXT: or16 a2, a3 1703; GENERIC-NEXT: movi16 a3, 255 1704; GENERIC-NEXT: lsli16 l0, a3, 8 1705; GENERIC-NEXT: or16 l0, a2 1706; GENERIC-NEXT: or16 l0, a3 1707; GENERIC-NEXT: and16 a1, l0 1708; GENERIC-NEXT: and16 l0, a0 1709; GENERIC-NEXT: lsr16 a1, l0 1710; GENERIC-NEXT: mov16 a0, a1 1711; GENERIC-NEXT: addi16 sp, sp, 4 1712; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload 1713; GENERIC-NEXT: addi16 sp, sp, 4 1714; GENERIC-NEXT: rts16 1715entry: 1716 %lshr = lshr i16 %y, %x 1717 ret i16 %lshr 1718} 1719 1720define i16 @LSHR_SHORT_I(i16 %x) { 1721; CHECK-LABEL: LSHR_SHORT_I: 1722; CHECK: # %bb.0: # %entry 1723; CHECK-NEXT: movi32 a1, 65534 1724; CHECK-NEXT: and16 a0, a1 1725; CHECK-NEXT: lsri16 a0, a0, 1 1726; CHECK-NEXT: rts16 1727; 1728; GENERIC-LABEL: LSHR_SHORT_I: 1729; GENERIC: # %bb.0: # %entry 1730; GENERIC-NEXT: .cfi_def_cfa_offset 0 1731; GENERIC-NEXT: subi16 sp, sp, 4 1732; GENERIC-NEXT: .cfi_def_cfa_offset 4 1733; GENERIC-NEXT: movi16 a1, 0 1734; GENERIC-NEXT: lsli16 a2, a1, 24 1735; GENERIC-NEXT: lsli16 a1, a1, 16 1736; GENERIC-NEXT: or16 a1, a2 1737; GENERIC-NEXT: movi16 a2, 255 1738; GENERIC-NEXT: lsli16 a2, a2, 8 1739; GENERIC-NEXT: or16 a2, a1 1740; GENERIC-NEXT: movi16 a1, 254 1741; GENERIC-NEXT: or16 a1, a2 1742; GENERIC-NEXT: and16 a1, a0 1743; GENERIC-NEXT: lsri16 a0, a1, 1 1744; GENERIC-NEXT: addi16 sp, sp, 4 1745; GENERIC-NEXT: rts16 1746entry: 1747 %lshr = lshr i16 %x, 1 1748 ret i16 %lshr 1749} 1750 1751define i8 @LSHR_CHAR(i8 %x, i8 %y) { 1752; CHECK-LABEL: LSHR_CHAR: 1753; CHECK: # %bb.0: # %entry 1754; CHECK-NEXT: zextb16 a1, a1 1755; CHECK-NEXT: zextb16 a0, a0 1756; CHECK-NEXT: lsr32 a0, a1, a0 1757; CHECK-NEXT: rts16 1758; 1759; GENERIC-LABEL: LSHR_CHAR: 1760; GENERIC: # %bb.0: # %entry 1761; GENERIC-NEXT: .cfi_def_cfa_offset 0 1762; GENERIC-NEXT: subi16 sp, sp, 4 1763; GENERIC-NEXT: .cfi_def_cfa_offset 4 1764; GENERIC-NEXT: movi16 a2, 255 1765; GENERIC-NEXT: and16 a1, a2 1766; GENERIC-NEXT: and16 a0, a2 1767; GENERIC-NEXT: lsr16 a1, a0 1768; GENERIC-NEXT: mov16 a0, a1 1769; GENERIC-NEXT: addi16 sp, sp, 4 1770; GENERIC-NEXT: rts16 1771entry: 1772 %lshr = lshr i8 %y, %x 1773 ret i8 %lshr 1774} 1775 1776define i8 @LSHR_CHAR_I(i8 %x) { 1777; CHECK-LABEL: LSHR_CHAR_I: 1778; CHECK: # %bb.0: # %entry 1779; CHECK-NEXT: andi32 a0, a0, 254 1780; CHECK-NEXT: lsri16 a0, a0, 1 1781; CHECK-NEXT: rts16 1782; 1783; GENERIC-LABEL: LSHR_CHAR_I: 1784; GENERIC: # %bb.0: # %entry 1785; GENERIC-NEXT: .cfi_def_cfa_offset 0 1786; GENERIC-NEXT: subi16 sp, sp, 4 1787; GENERIC-NEXT: .cfi_def_cfa_offset 4 1788; GENERIC-NEXT: movi16 a1, 254 1789; GENERIC-NEXT: and16 a1, a0 1790; GENERIC-NEXT: lsri16 a0, a1, 1 1791; GENERIC-NEXT: addi16 sp, sp, 4 1792; GENERIC-NEXT: rts16 1793entry: 1794 %lshr = lshr i8 %x, 1 1795 ret i8 %lshr 1796} 1797 1798define i1 @LSHR_BIT(i1 %x, i1 %y) { 1799; CHECK-LABEL: LSHR_BIT: 1800; CHECK: # %bb.0: # %entry 1801; CHECK-NEXT: mov16 a0, a1 1802; CHECK-NEXT: rts16 1803; 1804; GENERIC-LABEL: LSHR_BIT: 1805; GENERIC: # %bb.0: # %entry 1806; GENERIC-NEXT: .cfi_def_cfa_offset 0 1807; GENERIC-NEXT: subi16 sp, sp, 4 1808; GENERIC-NEXT: .cfi_def_cfa_offset 4 1809; GENERIC-NEXT: mov16 a0, a1 1810; GENERIC-NEXT: addi16 sp, sp, 4 1811; GENERIC-NEXT: rts16 1812entry: 1813 %lshr = lshr i1 %y, %x 1814 ret i1 %lshr 1815} 1816 1817define i1 @LSHR_BIT_I(i1 %x) { 1818; CHECK-LABEL: LSHR_BIT_I: 1819; CHECK: # %bb.0: # %entry 1820; CHECK-NEXT: rts16 1821; 1822; GENERIC-LABEL: LSHR_BIT_I: 1823; GENERIC: # %bb.0: # %entry 1824; GENERIC-NEXT: .cfi_def_cfa_offset 0 1825; GENERIC-NEXT: subi16 sp, sp, 4 1826; GENERIC-NEXT: .cfi_def_cfa_offset 4 1827; GENERIC-NEXT: addi16 sp, sp, 4 1828; GENERIC-NEXT: rts16 1829entry: 1830 %lshr = lshr i1 %x, 1 1831 ret i1 %lshr 1832} 1833 1834define i32 @orRR(i32 %x, i32 %y) { 1835; CHECK-LABEL: orRR: 1836; CHECK: # %bb.0: # %entry 1837; CHECK-NEXT: or16 a0, a1 1838; CHECK-NEXT: rts16 1839; 1840; GENERIC-LABEL: orRR: 1841; GENERIC: # %bb.0: # %entry 1842; GENERIC-NEXT: .cfi_def_cfa_offset 0 1843; GENERIC-NEXT: subi16 sp, sp, 4 1844; GENERIC-NEXT: .cfi_def_cfa_offset 4 1845; GENERIC-NEXT: or16 a0, a1 1846; GENERIC-NEXT: addi16 sp, sp, 4 1847; GENERIC-NEXT: rts16 1848entry: 1849 %or = or i32 %y, %x 1850 ret i32 %or 1851} 1852 1853define i32 @orRI(i32 %x) { 1854; CHECK-LABEL: orRI: 1855; CHECK: # %bb.0: # %entry 1856; CHECK-NEXT: ori32 a0, a0, 10 1857; CHECK-NEXT: rts16 1858; 1859; GENERIC-LABEL: orRI: 1860; GENERIC: # %bb.0: # %entry 1861; GENERIC-NEXT: .cfi_def_cfa_offset 0 1862; GENERIC-NEXT: subi16 sp, sp, 4 1863; GENERIC-NEXT: .cfi_def_cfa_offset 4 1864; GENERIC-NEXT: movi16 a1, 10 1865; GENERIC-NEXT: or16 a0, a1 1866; GENERIC-NEXT: addi16 sp, sp, 4 1867; GENERIC-NEXT: rts16 1868entry: 1869 %or = or i32 %x, 10 1870 ret i32 %or 1871} 1872 1873define i32 @orRI_X(i32 %x) { 1874; CHECK-LABEL: orRI_X: 1875; CHECK: # %bb.0: # %entry 1876; CHECK-NEXT: ori32 a0, a0, 4097 1877; CHECK-NEXT: rts16 1878; 1879; GENERIC-LABEL: orRI_X: 1880; GENERIC: # %bb.0: # %entry 1881; GENERIC-NEXT: .cfi_def_cfa_offset 0 1882; GENERIC-NEXT: subi16 sp, sp, 4 1883; GENERIC-NEXT: .cfi_def_cfa_offset 4 1884; GENERIC-NEXT: movi16 a1, 0 1885; GENERIC-NEXT: lsli16 a2, a1, 24 1886; GENERIC-NEXT: lsli16 a1, a1, 16 1887; GENERIC-NEXT: or16 a1, a2 1888; GENERIC-NEXT: movi16 a2, 16 1889; GENERIC-NEXT: lsli16 a2, a2, 8 1890; GENERIC-NEXT: or16 a2, a1 1891; GENERIC-NEXT: movi16 a1, 1 1892; GENERIC-NEXT: or16 a1, a2 1893; GENERIC-NEXT: or16 a0, a1 1894; GENERIC-NEXT: addi16 sp, sp, 4 1895; GENERIC-NEXT: rts16 1896entry: 1897 %or = or i32 %x, 4097 1898 ret i32 %or 1899} 1900 1901define i64 @OR_LONG(i64 %x, i64 %y) { 1902; CHECK-LABEL: OR_LONG: 1903; CHECK: # %bb.0: # %entry 1904; CHECK-NEXT: or16 a0, a2 1905; CHECK-NEXT: or16 a1, a3 1906; CHECK-NEXT: rts16 1907; 1908; GENERIC-LABEL: OR_LONG: 1909; GENERIC: # %bb.0: # %entry 1910; GENERIC-NEXT: .cfi_def_cfa_offset 0 1911; GENERIC-NEXT: subi16 sp, sp, 4 1912; GENERIC-NEXT: .cfi_def_cfa_offset 4 1913; GENERIC-NEXT: or16 a0, a2 1914; GENERIC-NEXT: or16 a1, a3 1915; GENERIC-NEXT: addi16 sp, sp, 4 1916; GENERIC-NEXT: rts16 1917entry: 1918 %or = or i64 %y, %x 1919 ret i64 %or 1920} 1921 1922define i64 @OR_LONG_I(i64 %x) { 1923; CHECK-LABEL: OR_LONG_I: 1924; CHECK: # %bb.0: # %entry 1925; CHECK-NEXT: ori32 a0, a0, 1 1926; CHECK-NEXT: rts16 1927; 1928; GENERIC-LABEL: OR_LONG_I: 1929; GENERIC: # %bb.0: # %entry 1930; GENERIC-NEXT: .cfi_def_cfa_offset 0 1931; GENERIC-NEXT: subi16 sp, sp, 4 1932; GENERIC-NEXT: .cfi_def_cfa_offset 4 1933; GENERIC-NEXT: movi16 a2, 1 1934; GENERIC-NEXT: or16 a0, a2 1935; GENERIC-NEXT: addi16 sp, sp, 4 1936; GENERIC-NEXT: rts16 1937entry: 1938 %or = or i64 %x, 1 1939 ret i64 %or 1940} 1941 1942define i16 @OR_SHORT(i16 %x, i16 %y) { 1943; CHECK-LABEL: OR_SHORT: 1944; CHECK: # %bb.0: # %entry 1945; CHECK-NEXT: or16 a0, a1 1946; CHECK-NEXT: rts16 1947; 1948; GENERIC-LABEL: OR_SHORT: 1949; GENERIC: # %bb.0: # %entry 1950; GENERIC-NEXT: .cfi_def_cfa_offset 0 1951; GENERIC-NEXT: subi16 sp, sp, 4 1952; GENERIC-NEXT: .cfi_def_cfa_offset 4 1953; GENERIC-NEXT: or16 a0, a1 1954; GENERIC-NEXT: addi16 sp, sp, 4 1955; GENERIC-NEXT: rts16 1956entry: 1957 %or = or i16 %y, %x 1958 ret i16 %or 1959} 1960 1961define i16 @OR_SHORT_I(i16 %x) { 1962; CHECK-LABEL: OR_SHORT_I: 1963; CHECK: # %bb.0: # %entry 1964; CHECK-NEXT: ori32 a0, a0, 1 1965; CHECK-NEXT: rts16 1966; 1967; GENERIC-LABEL: OR_SHORT_I: 1968; GENERIC: # %bb.0: # %entry 1969; GENERIC-NEXT: .cfi_def_cfa_offset 0 1970; GENERIC-NEXT: subi16 sp, sp, 4 1971; GENERIC-NEXT: .cfi_def_cfa_offset 4 1972; GENERIC-NEXT: movi16 a1, 1 1973; GENERIC-NEXT: or16 a0, a1 1974; GENERIC-NEXT: addi16 sp, sp, 4 1975; GENERIC-NEXT: rts16 1976entry: 1977 %or = or i16 %x, 1 1978 ret i16 %or 1979} 1980 1981define i8 @OR_CHAR(i8 %x, i8 %y) { 1982; CHECK-LABEL: OR_CHAR: 1983; CHECK: # %bb.0: # %entry 1984; CHECK-NEXT: or16 a0, a1 1985; CHECK-NEXT: rts16 1986; 1987; GENERIC-LABEL: OR_CHAR: 1988; GENERIC: # %bb.0: # %entry 1989; GENERIC-NEXT: .cfi_def_cfa_offset 0 1990; GENERIC-NEXT: subi16 sp, sp, 4 1991; GENERIC-NEXT: .cfi_def_cfa_offset 4 1992; GENERIC-NEXT: or16 a0, a1 1993; GENERIC-NEXT: addi16 sp, sp, 4 1994; GENERIC-NEXT: rts16 1995entry: 1996 %or = or i8 %y, %x 1997 ret i8 %or 1998} 1999 2000define i8 @OR_CHAR_I(i8 %x) { 2001; CHECK-LABEL: OR_CHAR_I: 2002; CHECK: # %bb.0: # %entry 2003; CHECK-NEXT: ori32 a0, a0, 1 2004; CHECK-NEXT: rts16 2005; 2006; GENERIC-LABEL: OR_CHAR_I: 2007; GENERIC: # %bb.0: # %entry 2008; GENERIC-NEXT: .cfi_def_cfa_offset 0 2009; GENERIC-NEXT: subi16 sp, sp, 4 2010; GENERIC-NEXT: .cfi_def_cfa_offset 4 2011; GENERIC-NEXT: movi16 a1, 1 2012; GENERIC-NEXT: or16 a0, a1 2013; GENERIC-NEXT: addi16 sp, sp, 4 2014; GENERIC-NEXT: rts16 2015entry: 2016 %or = or i8 %x, 1 2017 ret i8 %or 2018} 2019 2020 2021define i32 @xorRR(i32 %x, i32 %y) { 2022; CHECK-LABEL: xorRR: 2023; CHECK: # %bb.0: # %entry 2024; CHECK-NEXT: xor16 a0, a1 2025; CHECK-NEXT: rts16 2026; 2027; GENERIC-LABEL: xorRR: 2028; GENERIC: # %bb.0: # %entry 2029; GENERIC-NEXT: .cfi_def_cfa_offset 0 2030; GENERIC-NEXT: subi16 sp, sp, 4 2031; GENERIC-NEXT: .cfi_def_cfa_offset 4 2032; GENERIC-NEXT: xor16 a0, a1 2033; GENERIC-NEXT: addi16 sp, sp, 4 2034; GENERIC-NEXT: rts16 2035entry: 2036 %xor = xor i32 %y, %x 2037 ret i32 %xor 2038} 2039 2040define i32 @xorRI(i32 %x) { 2041; CHECK-LABEL: xorRI: 2042; CHECK: # %bb.0: # %entry 2043; CHECK-NEXT: xori32 a0, a0, 10 2044; CHECK-NEXT: rts16 2045; 2046; GENERIC-LABEL: xorRI: 2047; GENERIC: # %bb.0: # %entry 2048; GENERIC-NEXT: .cfi_def_cfa_offset 0 2049; GENERIC-NEXT: subi16 sp, sp, 4 2050; GENERIC-NEXT: .cfi_def_cfa_offset 4 2051; GENERIC-NEXT: movi16 a1, 10 2052; GENERIC-NEXT: xor16 a0, a1 2053; GENERIC-NEXT: addi16 sp, sp, 4 2054; GENERIC-NEXT: rts16 2055entry: 2056 %xor = xor i32 %x, 10 2057 ret i32 %xor 2058} 2059 2060define i32 @xorRI_X(i32 %x) { 2061; CHECK-LABEL: xorRI_X: 2062; CHECK: # %bb.0: # %entry 2063; CHECK-NEXT: movi32 a1, 4097 2064; CHECK-NEXT: xor16 a0, a1 2065; CHECK-NEXT: rts16 2066; 2067; GENERIC-LABEL: xorRI_X: 2068; GENERIC: # %bb.0: # %entry 2069; GENERIC-NEXT: .cfi_def_cfa_offset 0 2070; GENERIC-NEXT: subi16 sp, sp, 4 2071; GENERIC-NEXT: .cfi_def_cfa_offset 4 2072; GENERIC-NEXT: movi16 a1, 0 2073; GENERIC-NEXT: lsli16 a2, a1, 24 2074; GENERIC-NEXT: lsli16 a1, a1, 16 2075; GENERIC-NEXT: or16 a1, a2 2076; GENERIC-NEXT: movi16 a2, 16 2077; GENERIC-NEXT: lsli16 a2, a2, 8 2078; GENERIC-NEXT: or16 a2, a1 2079; GENERIC-NEXT: movi16 a1, 1 2080; GENERIC-NEXT: or16 a1, a2 2081; GENERIC-NEXT: xor16 a0, a1 2082; GENERIC-NEXT: addi16 sp, sp, 4 2083; GENERIC-NEXT: rts16 2084entry: 2085 %xor = xor i32 %x, 4097 2086 ret i32 %xor 2087} 2088 2089define i64 @XOR_LONG(i64 %x, i64 %y) { 2090; CHECK-LABEL: XOR_LONG: 2091; CHECK: # %bb.0: # %entry 2092; CHECK-NEXT: xor16 a0, a2 2093; CHECK-NEXT: xor16 a1, a3 2094; CHECK-NEXT: rts16 2095; 2096; GENERIC-LABEL: XOR_LONG: 2097; GENERIC: # %bb.0: # %entry 2098; GENERIC-NEXT: .cfi_def_cfa_offset 0 2099; GENERIC-NEXT: subi16 sp, sp, 4 2100; GENERIC-NEXT: .cfi_def_cfa_offset 4 2101; GENERIC-NEXT: xor16 a0, a2 2102; GENERIC-NEXT: xor16 a1, a3 2103; GENERIC-NEXT: addi16 sp, sp, 4 2104; GENERIC-NEXT: rts16 2105entry: 2106 %xor = xor i64 %y, %x 2107 ret i64 %xor 2108} 2109 2110define i64 @XOR_LONG_I(i64 %x) { 2111; CHECK-LABEL: XOR_LONG_I: 2112; CHECK: # %bb.0: # %entry 2113; CHECK-NEXT: xori32 a0, a0, 1 2114; CHECK-NEXT: rts16 2115; 2116; GENERIC-LABEL: XOR_LONG_I: 2117; GENERIC: # %bb.0: # %entry 2118; GENERIC-NEXT: .cfi_def_cfa_offset 0 2119; GENERIC-NEXT: subi16 sp, sp, 4 2120; GENERIC-NEXT: .cfi_def_cfa_offset 4 2121; GENERIC-NEXT: movi16 a2, 1 2122; GENERIC-NEXT: xor16 a0, a2 2123; GENERIC-NEXT: addi16 sp, sp, 4 2124; GENERIC-NEXT: rts16 2125entry: 2126 %xor = xor i64 %x, 1 2127 ret i64 %xor 2128} 2129 2130define i16 @XOR_SHORT(i16 %x, i16 %y) { 2131; CHECK-LABEL: XOR_SHORT: 2132; CHECK: # %bb.0: # %entry 2133; CHECK-NEXT: xor16 a0, a1 2134; CHECK-NEXT: rts16 2135; 2136; GENERIC-LABEL: XOR_SHORT: 2137; GENERIC: # %bb.0: # %entry 2138; GENERIC-NEXT: .cfi_def_cfa_offset 0 2139; GENERIC-NEXT: subi16 sp, sp, 4 2140; GENERIC-NEXT: .cfi_def_cfa_offset 4 2141; GENERIC-NEXT: xor16 a0, a1 2142; GENERIC-NEXT: addi16 sp, sp, 4 2143; GENERIC-NEXT: rts16 2144entry: 2145 %xor = xor i16 %y, %x 2146 ret i16 %xor 2147} 2148 2149define i16 @XOR_SHORT_I(i16 %x) { 2150; CHECK-LABEL: XOR_SHORT_I: 2151; CHECK: # %bb.0: # %entry 2152; CHECK-NEXT: xori32 a0, a0, 1 2153; CHECK-NEXT: rts16 2154; 2155; GENERIC-LABEL: XOR_SHORT_I: 2156; GENERIC: # %bb.0: # %entry 2157; GENERIC-NEXT: .cfi_def_cfa_offset 0 2158; GENERIC-NEXT: subi16 sp, sp, 4 2159; GENERIC-NEXT: .cfi_def_cfa_offset 4 2160; GENERIC-NEXT: movi16 a1, 1 2161; GENERIC-NEXT: xor16 a0, a1 2162; GENERIC-NEXT: addi16 sp, sp, 4 2163; GENERIC-NEXT: rts16 2164entry: 2165 %xor = xor i16 %x, 1 2166 ret i16 %xor 2167} 2168 2169define i8 @XOR_CHAR(i8 %x, i8 %y) { 2170; CHECK-LABEL: XOR_CHAR: 2171; CHECK: # %bb.0: # %entry 2172; CHECK-NEXT: xor16 a0, a1 2173; CHECK-NEXT: rts16 2174; 2175; GENERIC-LABEL: XOR_CHAR: 2176; GENERIC: # %bb.0: # %entry 2177; GENERIC-NEXT: .cfi_def_cfa_offset 0 2178; GENERIC-NEXT: subi16 sp, sp, 4 2179; GENERIC-NEXT: .cfi_def_cfa_offset 4 2180; GENERIC-NEXT: xor16 a0, a1 2181; GENERIC-NEXT: addi16 sp, sp, 4 2182; GENERIC-NEXT: rts16 2183entry: 2184 %xor = xor i8 %y, %x 2185 ret i8 %xor 2186} 2187 2188define i8 @XOR_CHAR_I(i8 %x) { 2189; CHECK-LABEL: XOR_CHAR_I: 2190; CHECK: # %bb.0: # %entry 2191; CHECK-NEXT: xori32 a0, a0, 1 2192; CHECK-NEXT: rts16 2193; 2194; GENERIC-LABEL: XOR_CHAR_I: 2195; GENERIC: # %bb.0: # %entry 2196; GENERIC-NEXT: .cfi_def_cfa_offset 0 2197; GENERIC-NEXT: subi16 sp, sp, 4 2198; GENERIC-NEXT: .cfi_def_cfa_offset 4 2199; GENERIC-NEXT: movi16 a1, 1 2200; GENERIC-NEXT: xor16 a0, a1 2201; GENERIC-NEXT: addi16 sp, sp, 4 2202; GENERIC-NEXT: rts16 2203entry: 2204 %xor = xor i8 %x, 1 2205 ret i8 %xor 2206} 2207 2208; i64 --> i32/i16/i8/i1 2209define i32 @truncR_i64_0(i64 %x) { 2210; CHECK-LABEL: truncR_i64_0: 2211; CHECK: # %bb.0: # %entry 2212; CHECK-NEXT: rts16 2213; 2214; GENERIC-LABEL: truncR_i64_0: 2215; GENERIC: # %bb.0: # %entry 2216; GENERIC-NEXT: .cfi_def_cfa_offset 0 2217; GENERIC-NEXT: subi16 sp, sp, 4 2218; GENERIC-NEXT: .cfi_def_cfa_offset 4 2219; GENERIC-NEXT: addi16 sp, sp, 4 2220; GENERIC-NEXT: rts16 2221entry: 2222 %trunc = trunc i64 %x to i32 2223 ret i32 %trunc 2224} 2225 2226define i16 @truncR_i64_1(i64 %x) { 2227; CHECK-LABEL: truncR_i64_1: 2228; CHECK: # %bb.0: # %entry 2229; CHECK-NEXT: rts16 2230; 2231; GENERIC-LABEL: truncR_i64_1: 2232; GENERIC: # %bb.0: # %entry 2233; GENERIC-NEXT: .cfi_def_cfa_offset 0 2234; GENERIC-NEXT: subi16 sp, sp, 4 2235; GENERIC-NEXT: .cfi_def_cfa_offset 4 2236; GENERIC-NEXT: addi16 sp, sp, 4 2237; GENERIC-NEXT: rts16 2238entry: 2239 %trunc = trunc i64 %x to i16 2240 ret i16 %trunc 2241} 2242 2243define i8 @truncR_i64_2(i64 %x) { 2244; CHECK-LABEL: truncR_i64_2: 2245; CHECK: # %bb.0: # %entry 2246; CHECK-NEXT: rts16 2247; 2248; GENERIC-LABEL: truncR_i64_2: 2249; GENERIC: # %bb.0: # %entry 2250; GENERIC-NEXT: .cfi_def_cfa_offset 0 2251; GENERIC-NEXT: subi16 sp, sp, 4 2252; GENERIC-NEXT: .cfi_def_cfa_offset 4 2253; GENERIC-NEXT: addi16 sp, sp, 4 2254; GENERIC-NEXT: rts16 2255entry: 2256 %trunc = trunc i64 %x to i8 2257 ret i8 %trunc 2258} 2259 2260define i1 @truncR_i64_3(i64 %x) { 2261; CHECK-LABEL: truncR_i64_3: 2262; CHECK: # %bb.0: # %entry 2263; CHECK-NEXT: rts16 2264; 2265; GENERIC-LABEL: truncR_i64_3: 2266; GENERIC: # %bb.0: # %entry 2267; GENERIC-NEXT: .cfi_def_cfa_offset 0 2268; GENERIC-NEXT: subi16 sp, sp, 4 2269; GENERIC-NEXT: .cfi_def_cfa_offset 4 2270; GENERIC-NEXT: addi16 sp, sp, 4 2271; GENERIC-NEXT: rts16 2272entry: 2273 %trunc = trunc i64 %x to i1 2274 ret i1 %trunc 2275} 2276 2277 2278; i32 --> i16/i8/i1 2279define i16 @truncR_i32_1(i32 %x) { 2280; CHECK-LABEL: truncR_i32_1: 2281; CHECK: # %bb.0: # %entry 2282; CHECK-NEXT: rts16 2283; 2284; GENERIC-LABEL: truncR_i32_1: 2285; GENERIC: # %bb.0: # %entry 2286; GENERIC-NEXT: .cfi_def_cfa_offset 0 2287; GENERIC-NEXT: subi16 sp, sp, 4 2288; GENERIC-NEXT: .cfi_def_cfa_offset 4 2289; GENERIC-NEXT: addi16 sp, sp, 4 2290; GENERIC-NEXT: rts16 2291entry: 2292 %trunc = trunc i32 %x to i16 2293 ret i16 %trunc 2294} 2295 2296define i8 @truncR_i32_2(i32 %x) { 2297; CHECK-LABEL: truncR_i32_2: 2298; CHECK: # %bb.0: # %entry 2299; CHECK-NEXT: rts16 2300; 2301; GENERIC-LABEL: truncR_i32_2: 2302; GENERIC: # %bb.0: # %entry 2303; GENERIC-NEXT: .cfi_def_cfa_offset 0 2304; GENERIC-NEXT: subi16 sp, sp, 4 2305; GENERIC-NEXT: .cfi_def_cfa_offset 4 2306; GENERIC-NEXT: addi16 sp, sp, 4 2307; GENERIC-NEXT: rts16 2308entry: 2309 %trunc = trunc i32 %x to i8 2310 ret i8 %trunc 2311} 2312 2313define i1 @truncR_i32_3(i32 %x) { 2314; CHECK-LABEL: truncR_i32_3: 2315; CHECK: # %bb.0: # %entry 2316; CHECK-NEXT: rts16 2317; 2318; GENERIC-LABEL: truncR_i32_3: 2319; GENERIC: # %bb.0: # %entry 2320; GENERIC-NEXT: .cfi_def_cfa_offset 0 2321; GENERIC-NEXT: subi16 sp, sp, 4 2322; GENERIC-NEXT: .cfi_def_cfa_offset 4 2323; GENERIC-NEXT: addi16 sp, sp, 4 2324; GENERIC-NEXT: rts16 2325entry: 2326 %trunc = trunc i32 %x to i1 2327 ret i1 %trunc 2328} 2329 2330; i16 --> i8/i1 2331define i8 @truncR_i16_2(i16 %x) { 2332; CHECK-LABEL: truncR_i16_2: 2333; CHECK: # %bb.0: # %entry 2334; CHECK-NEXT: rts16 2335; 2336; GENERIC-LABEL: truncR_i16_2: 2337; GENERIC: # %bb.0: # %entry 2338; GENERIC-NEXT: .cfi_def_cfa_offset 0 2339; GENERIC-NEXT: subi16 sp, sp, 4 2340; GENERIC-NEXT: .cfi_def_cfa_offset 4 2341; GENERIC-NEXT: addi16 sp, sp, 4 2342; GENERIC-NEXT: rts16 2343entry: 2344 %trunc = trunc i16 %x to i8 2345 ret i8 %trunc 2346} 2347 2348define i1 @truncR_i16_3(i16 %x) { 2349; CHECK-LABEL: truncR_i16_3: 2350; CHECK: # %bb.0: # %entry 2351; CHECK-NEXT: rts16 2352; 2353; GENERIC-LABEL: truncR_i16_3: 2354; GENERIC: # %bb.0: # %entry 2355; GENERIC-NEXT: .cfi_def_cfa_offset 0 2356; GENERIC-NEXT: subi16 sp, sp, 4 2357; GENERIC-NEXT: .cfi_def_cfa_offset 4 2358; GENERIC-NEXT: addi16 sp, sp, 4 2359; GENERIC-NEXT: rts16 2360entry: 2361 %trunc = trunc i16 %x to i1 2362 ret i1 %trunc 2363} 2364 2365 2366;i8 --> i1 2367define i1 @truncR_i8_3(i8 %x) { 2368; CHECK-LABEL: truncR_i8_3: 2369; CHECK: # %bb.0: # %entry 2370; CHECK-NEXT: rts16 2371; 2372; GENERIC-LABEL: truncR_i8_3: 2373; GENERIC: # %bb.0: # %entry 2374; GENERIC-NEXT: .cfi_def_cfa_offset 0 2375; GENERIC-NEXT: subi16 sp, sp, 4 2376; GENERIC-NEXT: .cfi_def_cfa_offset 4 2377; GENERIC-NEXT: addi16 sp, sp, 4 2378; GENERIC-NEXT: rts16 2379entry: 2380 %trunc = trunc i8 %x to i1 2381 ret i1 %trunc 2382} 2383