1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64 4; RUN: llc --mtriple=loongarch32 -mattr=+d -loongarch-check-zero-division < %s \ 5; RUN: | FileCheck %s --check-prefix=LA32-TRAP 6; RUN: llc --mtriple=loongarch64 -mattr=+d -loongarch-check-zero-division < %s \ 7; RUN: | FileCheck %s --check-prefix=LA64-TRAP 8 9;; Test the sdiv/udiv/srem/urem LLVM IR. 10 11define i1 @sdiv_i1(i1 %a, i1 %b) { 12; LA32-LABEL: sdiv_i1: 13; LA32: # %bb.0: # %entry 14; LA32-NEXT: ret 15; 16; LA64-LABEL: sdiv_i1: 17; LA64: # %bb.0: # %entry 18; LA64-NEXT: ret 19; 20; LA32-TRAP-LABEL: sdiv_i1: 21; LA32-TRAP: # %bb.0: # %entry 22; LA32-TRAP-NEXT: ret 23; 24; LA64-TRAP-LABEL: sdiv_i1: 25; LA64-TRAP: # %bb.0: # %entry 26; LA64-TRAP-NEXT: ret 27entry: 28 %r = sdiv i1 %a, %b 29 ret i1 %r 30} 31 32define i8 @sdiv_i8(i8 %a, i8 %b) { 33; LA32-LABEL: sdiv_i8: 34; LA32: # %bb.0: # %entry 35; LA32-NEXT: ext.w.b $a1, $a1 36; LA32-NEXT: ext.w.b $a0, $a0 37; LA32-NEXT: div.w $a0, $a0, $a1 38; LA32-NEXT: ret 39; 40; LA64-LABEL: sdiv_i8: 41; LA64: # %bb.0: # %entry 42; LA64-NEXT: ext.w.b $a1, $a1 43; LA64-NEXT: ext.w.b $a0, $a0 44; LA64-NEXT: div.d $a0, $a0, $a1 45; LA64-NEXT: ret 46; 47; LA32-TRAP-LABEL: sdiv_i8: 48; LA32-TRAP: # %bb.0: # %entry 49; LA32-TRAP-NEXT: ext.w.b $a1, $a1 50; LA32-TRAP-NEXT: ext.w.b $a0, $a0 51; LA32-TRAP-NEXT: div.w $a0, $a0, $a1 52; LA32-TRAP-NEXT: bnez $a1, .LBB1_2 53; LA32-TRAP-NEXT: # %bb.1: # %entry 54; LA32-TRAP-NEXT: break 7 55; LA32-TRAP-NEXT: .LBB1_2: # %entry 56; LA32-TRAP-NEXT: ret 57; 58; LA64-TRAP-LABEL: sdiv_i8: 59; LA64-TRAP: # %bb.0: # %entry 60; LA64-TRAP-NEXT: ext.w.b $a1, $a1 61; LA64-TRAP-NEXT: ext.w.b $a0, $a0 62; LA64-TRAP-NEXT: div.d $a0, $a0, $a1 63; LA64-TRAP-NEXT: bnez $a1, .LBB1_2 64; LA64-TRAP-NEXT: # %bb.1: # %entry 65; LA64-TRAP-NEXT: break 7 66; LA64-TRAP-NEXT: .LBB1_2: # %entry 67; LA64-TRAP-NEXT: ret 68entry: 69 %r = sdiv i8 %a, %b 70 ret i8 %r 71} 72 73define i16 @sdiv_i16(i16 %a, i16 %b) { 74; LA32-LABEL: sdiv_i16: 75; LA32: # %bb.0: # %entry 76; LA32-NEXT: ext.w.h $a1, $a1 77; LA32-NEXT: ext.w.h $a0, $a0 78; LA32-NEXT: div.w $a0, $a0, $a1 79; LA32-NEXT: ret 80; 81; LA64-LABEL: sdiv_i16: 82; LA64: # %bb.0: # %entry 83; LA64-NEXT: ext.w.h $a1, $a1 84; LA64-NEXT: ext.w.h $a0, $a0 85; LA64-NEXT: div.d $a0, $a0, $a1 86; LA64-NEXT: ret 87; 88; LA32-TRAP-LABEL: sdiv_i16: 89; LA32-TRAP: # %bb.0: # %entry 90; LA32-TRAP-NEXT: ext.w.h $a1, $a1 91; LA32-TRAP-NEXT: ext.w.h $a0, $a0 92; LA32-TRAP-NEXT: div.w $a0, $a0, $a1 93; LA32-TRAP-NEXT: bnez $a1, .LBB2_2 94; LA32-TRAP-NEXT: # %bb.1: # %entry 95; LA32-TRAP-NEXT: break 7 96; LA32-TRAP-NEXT: .LBB2_2: # %entry 97; LA32-TRAP-NEXT: ret 98; 99; LA64-TRAP-LABEL: sdiv_i16: 100; LA64-TRAP: # %bb.0: # %entry 101; LA64-TRAP-NEXT: ext.w.h $a1, $a1 102; LA64-TRAP-NEXT: ext.w.h $a0, $a0 103; LA64-TRAP-NEXT: div.d $a0, $a0, $a1 104; LA64-TRAP-NEXT: bnez $a1, .LBB2_2 105; LA64-TRAP-NEXT: # %bb.1: # %entry 106; LA64-TRAP-NEXT: break 7 107; LA64-TRAP-NEXT: .LBB2_2: # %entry 108; LA64-TRAP-NEXT: ret 109entry: 110 %r = sdiv i16 %a, %b 111 ret i16 %r 112} 113 114define i32 @sdiv_i32(i32 %a, i32 %b) { 115; LA32-LABEL: sdiv_i32: 116; LA32: # %bb.0: # %entry 117; LA32-NEXT: div.w $a0, $a0, $a1 118; LA32-NEXT: ret 119; 120; LA64-LABEL: sdiv_i32: 121; LA64: # %bb.0: # %entry 122; LA64-NEXT: addi.w $a1, $a1, 0 123; LA64-NEXT: addi.w $a0, $a0, 0 124; LA64-NEXT: div.w $a0, $a0, $a1 125; LA64-NEXT: ret 126; 127; LA32-TRAP-LABEL: sdiv_i32: 128; LA32-TRAP: # %bb.0: # %entry 129; LA32-TRAP-NEXT: div.w $a0, $a0, $a1 130; LA32-TRAP-NEXT: bnez $a1, .LBB3_2 131; LA32-TRAP-NEXT: # %bb.1: # %entry 132; LA32-TRAP-NEXT: break 7 133; LA32-TRAP-NEXT: .LBB3_2: # %entry 134; LA32-TRAP-NEXT: ret 135; 136; LA64-TRAP-LABEL: sdiv_i32: 137; LA64-TRAP: # %bb.0: # %entry 138; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 139; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 140; LA64-TRAP-NEXT: div.w $a0, $a0, $a1 141; LA64-TRAP-NEXT: bnez $a1, .LBB3_2 142; LA64-TRAP-NEXT: # %bb.1: # %entry 143; LA64-TRAP-NEXT: break 7 144; LA64-TRAP-NEXT: .LBB3_2: # %entry 145; LA64-TRAP-NEXT: ret 146entry: 147 %r = sdiv i32 %a, %b 148 ret i32 %r 149} 150 151define i32 @sdiv_ui32_si32_si32(i32 signext %a, i32 signext %b) { 152; LA32-LABEL: sdiv_ui32_si32_si32: 153; LA32: # %bb.0: # %entry 154; LA32-NEXT: div.w $a0, $a0, $a1 155; LA32-NEXT: ret 156; 157; LA64-LABEL: sdiv_ui32_si32_si32: 158; LA64: # %bb.0: # %entry 159; LA64-NEXT: div.w $a0, $a0, $a1 160; LA64-NEXT: ret 161; 162; LA32-TRAP-LABEL: sdiv_ui32_si32_si32: 163; LA32-TRAP: # %bb.0: # %entry 164; LA32-TRAP-NEXT: div.w $a0, $a0, $a1 165; LA32-TRAP-NEXT: bnez $a1, .LBB4_2 166; LA32-TRAP-NEXT: # %bb.1: # %entry 167; LA32-TRAP-NEXT: break 7 168; LA32-TRAP-NEXT: .LBB4_2: # %entry 169; LA32-TRAP-NEXT: ret 170; 171; LA64-TRAP-LABEL: sdiv_ui32_si32_si32: 172; LA64-TRAP: # %bb.0: # %entry 173; LA64-TRAP-NEXT: div.w $a0, $a0, $a1 174; LA64-TRAP-NEXT: bnez $a1, .LBB4_2 175; LA64-TRAP-NEXT: # %bb.1: # %entry 176; LA64-TRAP-NEXT: break 7 177; LA64-TRAP-NEXT: .LBB4_2: # %entry 178; LA64-TRAP-NEXT: ret 179entry: 180 %r = sdiv i32 %a, %b 181 ret i32 %r 182} 183 184define signext i32 @sdiv_si32_ui32_ui32(i32 %a, i32 %b) { 185; LA32-LABEL: sdiv_si32_ui32_ui32: 186; LA32: # %bb.0: # %entry 187; LA32-NEXT: div.w $a0, $a0, $a1 188; LA32-NEXT: ret 189; 190; LA64-LABEL: sdiv_si32_ui32_ui32: 191; LA64: # %bb.0: # %entry 192; LA64-NEXT: addi.w $a1, $a1, 0 193; LA64-NEXT: addi.w $a0, $a0, 0 194; LA64-NEXT: div.w $a0, $a0, $a1 195; LA64-NEXT: ret 196; 197; LA32-TRAP-LABEL: sdiv_si32_ui32_ui32: 198; LA32-TRAP: # %bb.0: # %entry 199; LA32-TRAP-NEXT: div.w $a0, $a0, $a1 200; LA32-TRAP-NEXT: bnez $a1, .LBB5_2 201; LA32-TRAP-NEXT: # %bb.1: # %entry 202; LA32-TRAP-NEXT: break 7 203; LA32-TRAP-NEXT: .LBB5_2: # %entry 204; LA32-TRAP-NEXT: ret 205; 206; LA64-TRAP-LABEL: sdiv_si32_ui32_ui32: 207; LA64-TRAP: # %bb.0: # %entry 208; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 209; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 210; LA64-TRAP-NEXT: div.w $a0, $a0, $a1 211; LA64-TRAP-NEXT: bnez $a1, .LBB5_2 212; LA64-TRAP-NEXT: # %bb.1: # %entry 213; LA64-TRAP-NEXT: break 7 214; LA64-TRAP-NEXT: .LBB5_2: # %entry 215; LA64-TRAP-NEXT: ret 216entry: 217 %r = sdiv i32 %a, %b 218 ret i32 %r 219} 220 221define signext i32 @sdiv_si32_si32_si32(i32 signext %a, i32 signext %b) { 222; LA32-LABEL: sdiv_si32_si32_si32: 223; LA32: # %bb.0: # %entry 224; LA32-NEXT: div.w $a0, $a0, $a1 225; LA32-NEXT: ret 226; 227; LA64-LABEL: sdiv_si32_si32_si32: 228; LA64: # %bb.0: # %entry 229; LA64-NEXT: div.w $a0, $a0, $a1 230; LA64-NEXT: ret 231; 232; LA32-TRAP-LABEL: sdiv_si32_si32_si32: 233; LA32-TRAP: # %bb.0: # %entry 234; LA32-TRAP-NEXT: div.w $a0, $a0, $a1 235; LA32-TRAP-NEXT: bnez $a1, .LBB6_2 236; LA32-TRAP-NEXT: # %bb.1: # %entry 237; LA32-TRAP-NEXT: break 7 238; LA32-TRAP-NEXT: .LBB6_2: # %entry 239; LA32-TRAP-NEXT: ret 240; 241; LA64-TRAP-LABEL: sdiv_si32_si32_si32: 242; LA64-TRAP: # %bb.0: # %entry 243; LA64-TRAP-NEXT: div.w $a0, $a0, $a1 244; LA64-TRAP-NEXT: bnez $a1, .LBB6_2 245; LA64-TRAP-NEXT: # %bb.1: # %entry 246; LA64-TRAP-NEXT: break 7 247; LA64-TRAP-NEXT: .LBB6_2: # %entry 248; LA64-TRAP-NEXT: ret 249entry: 250 %r = sdiv i32 %a, %b 251 ret i32 %r 252} 253 254define i64 @sdiv_i64(i64 %a, i64 %b) { 255; LA32-LABEL: sdiv_i64: 256; LA32: # %bb.0: # %entry 257; LA32-NEXT: addi.w $sp, $sp, -16 258; LA32-NEXT: .cfi_def_cfa_offset 16 259; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 260; LA32-NEXT: .cfi_offset 1, -4 261; LA32-NEXT: bl %plt(__divdi3) 262; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 263; LA32-NEXT: addi.w $sp, $sp, 16 264; LA32-NEXT: ret 265; 266; LA64-LABEL: sdiv_i64: 267; LA64: # %bb.0: # %entry 268; LA64-NEXT: div.d $a0, $a0, $a1 269; LA64-NEXT: ret 270; 271; LA32-TRAP-LABEL: sdiv_i64: 272; LA32-TRAP: # %bb.0: # %entry 273; LA32-TRAP-NEXT: addi.w $sp, $sp, -16 274; LA32-TRAP-NEXT: .cfi_def_cfa_offset 16 275; LA32-TRAP-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 276; LA32-TRAP-NEXT: .cfi_offset 1, -4 277; LA32-TRAP-NEXT: bl %plt(__divdi3) 278; LA32-TRAP-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 279; LA32-TRAP-NEXT: addi.w $sp, $sp, 16 280; LA32-TRAP-NEXT: ret 281; 282; LA64-TRAP-LABEL: sdiv_i64: 283; LA64-TRAP: # %bb.0: # %entry 284; LA64-TRAP-NEXT: div.d $a0, $a0, $a1 285; LA64-TRAP-NEXT: bnez $a1, .LBB7_2 286; LA64-TRAP-NEXT: # %bb.1: # %entry 287; LA64-TRAP-NEXT: break 7 288; LA64-TRAP-NEXT: .LBB7_2: # %entry 289; LA64-TRAP-NEXT: ret 290entry: 291 %r = sdiv i64 %a, %b 292 ret i64 %r 293} 294 295define i1 @udiv_i1(i1 %a, i1 %b) { 296; LA32-LABEL: udiv_i1: 297; LA32: # %bb.0: # %entry 298; LA32-NEXT: ret 299; 300; LA64-LABEL: udiv_i1: 301; LA64: # %bb.0: # %entry 302; LA64-NEXT: ret 303; 304; LA32-TRAP-LABEL: udiv_i1: 305; LA32-TRAP: # %bb.0: # %entry 306; LA32-TRAP-NEXT: ret 307; 308; LA64-TRAP-LABEL: udiv_i1: 309; LA64-TRAP: # %bb.0: # %entry 310; LA64-TRAP-NEXT: ret 311entry: 312 %r = udiv i1 %a, %b 313 ret i1 %r 314} 315 316define i8 @udiv_i8(i8 %a, i8 %b) { 317; LA32-LABEL: udiv_i8: 318; LA32: # %bb.0: # %entry 319; LA32-NEXT: andi $a1, $a1, 255 320; LA32-NEXT: andi $a0, $a0, 255 321; LA32-NEXT: div.wu $a0, $a0, $a1 322; LA32-NEXT: ret 323; 324; LA64-LABEL: udiv_i8: 325; LA64: # %bb.0: # %entry 326; LA64-NEXT: andi $a1, $a1, 255 327; LA64-NEXT: andi $a0, $a0, 255 328; LA64-NEXT: div.du $a0, $a0, $a1 329; LA64-NEXT: ret 330; 331; LA32-TRAP-LABEL: udiv_i8: 332; LA32-TRAP: # %bb.0: # %entry 333; LA32-TRAP-NEXT: andi $a1, $a1, 255 334; LA32-TRAP-NEXT: andi $a0, $a0, 255 335; LA32-TRAP-NEXT: div.wu $a0, $a0, $a1 336; LA32-TRAP-NEXT: bnez $a1, .LBB9_2 337; LA32-TRAP-NEXT: # %bb.1: # %entry 338; LA32-TRAP-NEXT: break 7 339; LA32-TRAP-NEXT: .LBB9_2: # %entry 340; LA32-TRAP-NEXT: ret 341; 342; LA64-TRAP-LABEL: udiv_i8: 343; LA64-TRAP: # %bb.0: # %entry 344; LA64-TRAP-NEXT: andi $a1, $a1, 255 345; LA64-TRAP-NEXT: andi $a0, $a0, 255 346; LA64-TRAP-NEXT: div.du $a0, $a0, $a1 347; LA64-TRAP-NEXT: bnez $a1, .LBB9_2 348; LA64-TRAP-NEXT: # %bb.1: # %entry 349; LA64-TRAP-NEXT: break 7 350; LA64-TRAP-NEXT: .LBB9_2: # %entry 351; LA64-TRAP-NEXT: ret 352entry: 353 %r = udiv i8 %a, %b 354 ret i8 %r 355} 356 357define i16 @udiv_i16(i16 %a, i16 %b) { 358; LA32-LABEL: udiv_i16: 359; LA32: # %bb.0: # %entry 360; LA32-NEXT: bstrpick.w $a1, $a1, 15, 0 361; LA32-NEXT: bstrpick.w $a0, $a0, 15, 0 362; LA32-NEXT: div.wu $a0, $a0, $a1 363; LA32-NEXT: ret 364; 365; LA64-LABEL: udiv_i16: 366; LA64: # %bb.0: # %entry 367; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0 368; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0 369; LA64-NEXT: div.du $a0, $a0, $a1 370; LA64-NEXT: ret 371; 372; LA32-TRAP-LABEL: udiv_i16: 373; LA32-TRAP: # %bb.0: # %entry 374; LA32-TRAP-NEXT: bstrpick.w $a1, $a1, 15, 0 375; LA32-TRAP-NEXT: bstrpick.w $a0, $a0, 15, 0 376; LA32-TRAP-NEXT: div.wu $a0, $a0, $a1 377; LA32-TRAP-NEXT: bnez $a1, .LBB10_2 378; LA32-TRAP-NEXT: # %bb.1: # %entry 379; LA32-TRAP-NEXT: break 7 380; LA32-TRAP-NEXT: .LBB10_2: # %entry 381; LA32-TRAP-NEXT: ret 382; 383; LA64-TRAP-LABEL: udiv_i16: 384; LA64-TRAP: # %bb.0: # %entry 385; LA64-TRAP-NEXT: bstrpick.d $a1, $a1, 15, 0 386; LA64-TRAP-NEXT: bstrpick.d $a0, $a0, 15, 0 387; LA64-TRAP-NEXT: div.du $a0, $a0, $a1 388; LA64-TRAP-NEXT: bnez $a1, .LBB10_2 389; LA64-TRAP-NEXT: # %bb.1: # %entry 390; LA64-TRAP-NEXT: break 7 391; LA64-TRAP-NEXT: .LBB10_2: # %entry 392; LA64-TRAP-NEXT: ret 393entry: 394 %r = udiv i16 %a, %b 395 ret i16 %r 396} 397 398define i32 @udiv_i32(i32 %a, i32 %b) { 399; LA32-LABEL: udiv_i32: 400; LA32: # %bb.0: # %entry 401; LA32-NEXT: div.wu $a0, $a0, $a1 402; LA32-NEXT: ret 403; 404; LA64-LABEL: udiv_i32: 405; LA64: # %bb.0: # %entry 406; LA64-NEXT: addi.w $a1, $a1, 0 407; LA64-NEXT: addi.w $a0, $a0, 0 408; LA64-NEXT: div.wu $a0, $a0, $a1 409; LA64-NEXT: ret 410; 411; LA32-TRAP-LABEL: udiv_i32: 412; LA32-TRAP: # %bb.0: # %entry 413; LA32-TRAP-NEXT: div.wu $a0, $a0, $a1 414; LA32-TRAP-NEXT: bnez $a1, .LBB11_2 415; LA32-TRAP-NEXT: # %bb.1: # %entry 416; LA32-TRAP-NEXT: break 7 417; LA32-TRAP-NEXT: .LBB11_2: # %entry 418; LA32-TRAP-NEXT: ret 419; 420; LA64-TRAP-LABEL: udiv_i32: 421; LA64-TRAP: # %bb.0: # %entry 422; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 423; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 424; LA64-TRAP-NEXT: div.wu $a0, $a0, $a1 425; LA64-TRAP-NEXT: bnez $a1, .LBB11_2 426; LA64-TRAP-NEXT: # %bb.1: # %entry 427; LA64-TRAP-NEXT: break 7 428; LA64-TRAP-NEXT: .LBB11_2: # %entry 429; LA64-TRAP-NEXT: ret 430entry: 431 %r = udiv i32 %a, %b 432 ret i32 %r 433} 434 435define i32 @udiv_ui32_si32_si32(i32 signext %a, i32 signext %b) { 436; LA32-LABEL: udiv_ui32_si32_si32: 437; LA32: # %bb.0: # %entry 438; LA32-NEXT: div.wu $a0, $a0, $a1 439; LA32-NEXT: ret 440; 441; LA64-LABEL: udiv_ui32_si32_si32: 442; LA64: # %bb.0: # %entry 443; LA64-NEXT: div.wu $a0, $a0, $a1 444; LA64-NEXT: ret 445; 446; LA32-TRAP-LABEL: udiv_ui32_si32_si32: 447; LA32-TRAP: # %bb.0: # %entry 448; LA32-TRAP-NEXT: div.wu $a0, $a0, $a1 449; LA32-TRAP-NEXT: bnez $a1, .LBB12_2 450; LA32-TRAP-NEXT: # %bb.1: # %entry 451; LA32-TRAP-NEXT: break 7 452; LA32-TRAP-NEXT: .LBB12_2: # %entry 453; LA32-TRAP-NEXT: ret 454; 455; LA64-TRAP-LABEL: udiv_ui32_si32_si32: 456; LA64-TRAP: # %bb.0: # %entry 457; LA64-TRAP-NEXT: div.wu $a0, $a0, $a1 458; LA64-TRAP-NEXT: bnez $a1, .LBB12_2 459; LA64-TRAP-NEXT: # %bb.1: # %entry 460; LA64-TRAP-NEXT: break 7 461; LA64-TRAP-NEXT: .LBB12_2: # %entry 462; LA64-TRAP-NEXT: ret 463entry: 464 %r = udiv i32 %a, %b 465 ret i32 %r 466} 467 468define signext i32 @udiv_si32_ui32_ui32(i32 %a, i32 %b) { 469; LA32-LABEL: udiv_si32_ui32_ui32: 470; LA32: # %bb.0: # %entry 471; LA32-NEXT: div.wu $a0, $a0, $a1 472; LA32-NEXT: ret 473; 474; LA64-LABEL: udiv_si32_ui32_ui32: 475; LA64: # %bb.0: # %entry 476; LA64-NEXT: addi.w $a1, $a1, 0 477; LA64-NEXT: addi.w $a0, $a0, 0 478; LA64-NEXT: div.wu $a0, $a0, $a1 479; LA64-NEXT: ret 480; 481; LA32-TRAP-LABEL: udiv_si32_ui32_ui32: 482; LA32-TRAP: # %bb.0: # %entry 483; LA32-TRAP-NEXT: div.wu $a0, $a0, $a1 484; LA32-TRAP-NEXT: bnez $a1, .LBB13_2 485; LA32-TRAP-NEXT: # %bb.1: # %entry 486; LA32-TRAP-NEXT: break 7 487; LA32-TRAP-NEXT: .LBB13_2: # %entry 488; LA32-TRAP-NEXT: ret 489; 490; LA64-TRAP-LABEL: udiv_si32_ui32_ui32: 491; LA64-TRAP: # %bb.0: # %entry 492; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 493; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 494; LA64-TRAP-NEXT: div.wu $a0, $a0, $a1 495; LA64-TRAP-NEXT: bnez $a1, .LBB13_2 496; LA64-TRAP-NEXT: # %bb.1: # %entry 497; LA64-TRAP-NEXT: break 7 498; LA64-TRAP-NEXT: .LBB13_2: # %entry 499; LA64-TRAP-NEXT: ret 500entry: 501 %r = udiv i32 %a, %b 502 ret i32 %r 503} 504 505define signext i32 @udiv_si32_si32_si32(i32 signext %a, i32 signext %b) { 506; LA32-LABEL: udiv_si32_si32_si32: 507; LA32: # %bb.0: # %entry 508; LA32-NEXT: div.wu $a0, $a0, $a1 509; LA32-NEXT: ret 510; 511; LA64-LABEL: udiv_si32_si32_si32: 512; LA64: # %bb.0: # %entry 513; LA64-NEXT: div.wu $a0, $a0, $a1 514; LA64-NEXT: ret 515; 516; LA32-TRAP-LABEL: udiv_si32_si32_si32: 517; LA32-TRAP: # %bb.0: # %entry 518; LA32-TRAP-NEXT: div.wu $a0, $a0, $a1 519; LA32-TRAP-NEXT: bnez $a1, .LBB14_2 520; LA32-TRAP-NEXT: # %bb.1: # %entry 521; LA32-TRAP-NEXT: break 7 522; LA32-TRAP-NEXT: .LBB14_2: # %entry 523; LA32-TRAP-NEXT: ret 524; 525; LA64-TRAP-LABEL: udiv_si32_si32_si32: 526; LA64-TRAP: # %bb.0: # %entry 527; LA64-TRAP-NEXT: div.wu $a0, $a0, $a1 528; LA64-TRAP-NEXT: bnez $a1, .LBB14_2 529; LA64-TRAP-NEXT: # %bb.1: # %entry 530; LA64-TRAP-NEXT: break 7 531; LA64-TRAP-NEXT: .LBB14_2: # %entry 532; LA64-TRAP-NEXT: ret 533entry: 534 %r = udiv i32 %a, %b 535 ret i32 %r 536} 537 538define i64 @udiv_i64(i64 %a, i64 %b) { 539; LA32-LABEL: udiv_i64: 540; LA32: # %bb.0: # %entry 541; LA32-NEXT: addi.w $sp, $sp, -16 542; LA32-NEXT: .cfi_def_cfa_offset 16 543; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 544; LA32-NEXT: .cfi_offset 1, -4 545; LA32-NEXT: bl %plt(__udivdi3) 546; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 547; LA32-NEXT: addi.w $sp, $sp, 16 548; LA32-NEXT: ret 549; 550; LA64-LABEL: udiv_i64: 551; LA64: # %bb.0: # %entry 552; LA64-NEXT: div.du $a0, $a0, $a1 553; LA64-NEXT: ret 554; 555; LA32-TRAP-LABEL: udiv_i64: 556; LA32-TRAP: # %bb.0: # %entry 557; LA32-TRAP-NEXT: addi.w $sp, $sp, -16 558; LA32-TRAP-NEXT: .cfi_def_cfa_offset 16 559; LA32-TRAP-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 560; LA32-TRAP-NEXT: .cfi_offset 1, -4 561; LA32-TRAP-NEXT: bl %plt(__udivdi3) 562; LA32-TRAP-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 563; LA32-TRAP-NEXT: addi.w $sp, $sp, 16 564; LA32-TRAP-NEXT: ret 565; 566; LA64-TRAP-LABEL: udiv_i64: 567; LA64-TRAP: # %bb.0: # %entry 568; LA64-TRAP-NEXT: div.du $a0, $a0, $a1 569; LA64-TRAP-NEXT: bnez $a1, .LBB15_2 570; LA64-TRAP-NEXT: # %bb.1: # %entry 571; LA64-TRAP-NEXT: break 7 572; LA64-TRAP-NEXT: .LBB15_2: # %entry 573; LA64-TRAP-NEXT: ret 574entry: 575 %r = udiv i64 %a, %b 576 ret i64 %r 577} 578 579define i1 @srem_i1(i1 %a, i1 %b) { 580; LA32-LABEL: srem_i1: 581; LA32: # %bb.0: # %entry 582; LA32-NEXT: move $a0, $zero 583; LA32-NEXT: ret 584; 585; LA64-LABEL: srem_i1: 586; LA64: # %bb.0: # %entry 587; LA64-NEXT: move $a0, $zero 588; LA64-NEXT: ret 589; 590; LA32-TRAP-LABEL: srem_i1: 591; LA32-TRAP: # %bb.0: # %entry 592; LA32-TRAP-NEXT: move $a0, $zero 593; LA32-TRAP-NEXT: ret 594; 595; LA64-TRAP-LABEL: srem_i1: 596; LA64-TRAP: # %bb.0: # %entry 597; LA64-TRAP-NEXT: move $a0, $zero 598; LA64-TRAP-NEXT: ret 599entry: 600 %r = srem i1 %a, %b 601 ret i1 %r 602} 603 604define i8 @srem_i8(i8 %a, i8 %b) { 605; LA32-LABEL: srem_i8: 606; LA32: # %bb.0: # %entry 607; LA32-NEXT: ext.w.b $a1, $a1 608; LA32-NEXT: ext.w.b $a0, $a0 609; LA32-NEXT: mod.w $a0, $a0, $a1 610; LA32-NEXT: ret 611; 612; LA64-LABEL: srem_i8: 613; LA64: # %bb.0: # %entry 614; LA64-NEXT: ext.w.b $a1, $a1 615; LA64-NEXT: ext.w.b $a0, $a0 616; LA64-NEXT: mod.d $a0, $a0, $a1 617; LA64-NEXT: ret 618; 619; LA32-TRAP-LABEL: srem_i8: 620; LA32-TRAP: # %bb.0: # %entry 621; LA32-TRAP-NEXT: ext.w.b $a1, $a1 622; LA32-TRAP-NEXT: ext.w.b $a0, $a0 623; LA32-TRAP-NEXT: mod.w $a0, $a0, $a1 624; LA32-TRAP-NEXT: bnez $a1, .LBB17_2 625; LA32-TRAP-NEXT: # %bb.1: # %entry 626; LA32-TRAP-NEXT: break 7 627; LA32-TRAP-NEXT: .LBB17_2: # %entry 628; LA32-TRAP-NEXT: ret 629; 630; LA64-TRAP-LABEL: srem_i8: 631; LA64-TRAP: # %bb.0: # %entry 632; LA64-TRAP-NEXT: ext.w.b $a1, $a1 633; LA64-TRAP-NEXT: ext.w.b $a0, $a0 634; LA64-TRAP-NEXT: mod.d $a0, $a0, $a1 635; LA64-TRAP-NEXT: bnez $a1, .LBB17_2 636; LA64-TRAP-NEXT: # %bb.1: # %entry 637; LA64-TRAP-NEXT: break 7 638; LA64-TRAP-NEXT: .LBB17_2: # %entry 639; LA64-TRAP-NEXT: ret 640entry: 641 %r = srem i8 %a, %b 642 ret i8 %r 643} 644 645define i16 @srem_i16(i16 %a, i16 %b) { 646; LA32-LABEL: srem_i16: 647; LA32: # %bb.0: # %entry 648; LA32-NEXT: ext.w.h $a1, $a1 649; LA32-NEXT: ext.w.h $a0, $a0 650; LA32-NEXT: mod.w $a0, $a0, $a1 651; LA32-NEXT: ret 652; 653; LA64-LABEL: srem_i16: 654; LA64: # %bb.0: # %entry 655; LA64-NEXT: ext.w.h $a1, $a1 656; LA64-NEXT: ext.w.h $a0, $a0 657; LA64-NEXT: mod.d $a0, $a0, $a1 658; LA64-NEXT: ret 659; 660; LA32-TRAP-LABEL: srem_i16: 661; LA32-TRAP: # %bb.0: # %entry 662; LA32-TRAP-NEXT: ext.w.h $a1, $a1 663; LA32-TRAP-NEXT: ext.w.h $a0, $a0 664; LA32-TRAP-NEXT: mod.w $a0, $a0, $a1 665; LA32-TRAP-NEXT: bnez $a1, .LBB18_2 666; LA32-TRAP-NEXT: # %bb.1: # %entry 667; LA32-TRAP-NEXT: break 7 668; LA32-TRAP-NEXT: .LBB18_2: # %entry 669; LA32-TRAP-NEXT: ret 670; 671; LA64-TRAP-LABEL: srem_i16: 672; LA64-TRAP: # %bb.0: # %entry 673; LA64-TRAP-NEXT: ext.w.h $a1, $a1 674; LA64-TRAP-NEXT: ext.w.h $a0, $a0 675; LA64-TRAP-NEXT: mod.d $a0, $a0, $a1 676; LA64-TRAP-NEXT: bnez $a1, .LBB18_2 677; LA64-TRAP-NEXT: # %bb.1: # %entry 678; LA64-TRAP-NEXT: break 7 679; LA64-TRAP-NEXT: .LBB18_2: # %entry 680; LA64-TRAP-NEXT: ret 681entry: 682 %r = srem i16 %a, %b 683 ret i16 %r 684} 685 686define i32 @srem_i32(i32 %a, i32 %b) { 687; LA32-LABEL: srem_i32: 688; LA32: # %bb.0: # %entry 689; LA32-NEXT: mod.w $a0, $a0, $a1 690; LA32-NEXT: ret 691; 692; LA64-LABEL: srem_i32: 693; LA64: # %bb.0: # %entry 694; LA64-NEXT: addi.w $a1, $a1, 0 695; LA64-NEXT: addi.w $a0, $a0, 0 696; LA64-NEXT: mod.w $a0, $a0, $a1 697; LA64-NEXT: ret 698; 699; LA32-TRAP-LABEL: srem_i32: 700; LA32-TRAP: # %bb.0: # %entry 701; LA32-TRAP-NEXT: mod.w $a0, $a0, $a1 702; LA32-TRAP-NEXT: bnez $a1, .LBB19_2 703; LA32-TRAP-NEXT: # %bb.1: # %entry 704; LA32-TRAP-NEXT: break 7 705; LA32-TRAP-NEXT: .LBB19_2: # %entry 706; LA32-TRAP-NEXT: ret 707; 708; LA64-TRAP-LABEL: srem_i32: 709; LA64-TRAP: # %bb.0: # %entry 710; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 711; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 712; LA64-TRAP-NEXT: mod.w $a0, $a0, $a1 713; LA64-TRAP-NEXT: bnez $a1, .LBB19_2 714; LA64-TRAP-NEXT: # %bb.1: # %entry 715; LA64-TRAP-NEXT: break 7 716; LA64-TRAP-NEXT: .LBB19_2: # %entry 717; LA64-TRAP-NEXT: ret 718entry: 719 %r = srem i32 %a, %b 720 ret i32 %r 721} 722 723define i32 @srem_ui32_si32_si32(i32 signext %a, i32 signext %b) { 724; LA32-LABEL: srem_ui32_si32_si32: 725; LA32: # %bb.0: # %entry 726; LA32-NEXT: mod.w $a0, $a0, $a1 727; LA32-NEXT: ret 728; 729; LA64-LABEL: srem_ui32_si32_si32: 730; LA64: # %bb.0: # %entry 731; LA64-NEXT: mod.w $a0, $a0, $a1 732; LA64-NEXT: ret 733; 734; LA32-TRAP-LABEL: srem_ui32_si32_si32: 735; LA32-TRAP: # %bb.0: # %entry 736; LA32-TRAP-NEXT: mod.w $a0, $a0, $a1 737; LA32-TRAP-NEXT: bnez $a1, .LBB20_2 738; LA32-TRAP-NEXT: # %bb.1: # %entry 739; LA32-TRAP-NEXT: break 7 740; LA32-TRAP-NEXT: .LBB20_2: # %entry 741; LA32-TRAP-NEXT: ret 742; 743; LA64-TRAP-LABEL: srem_ui32_si32_si32: 744; LA64-TRAP: # %bb.0: # %entry 745; LA64-TRAP-NEXT: mod.w $a0, $a0, $a1 746; LA64-TRAP-NEXT: bnez $a1, .LBB20_2 747; LA64-TRAP-NEXT: # %bb.1: # %entry 748; LA64-TRAP-NEXT: break 7 749; LA64-TRAP-NEXT: .LBB20_2: # %entry 750; LA64-TRAP-NEXT: ret 751entry: 752 %r = srem i32 %a, %b 753 ret i32 %r 754} 755 756define signext i32 @srem_si32_ui32_ui32(i32 %a, i32 %b) { 757; LA32-LABEL: srem_si32_ui32_ui32: 758; LA32: # %bb.0: # %entry 759; LA32-NEXT: mod.w $a0, $a0, $a1 760; LA32-NEXT: ret 761; 762; LA64-LABEL: srem_si32_ui32_ui32: 763; LA64: # %bb.0: # %entry 764; LA64-NEXT: addi.w $a1, $a1, 0 765; LA64-NEXT: addi.w $a0, $a0, 0 766; LA64-NEXT: mod.w $a0, $a0, $a1 767; LA64-NEXT: ret 768; 769; LA32-TRAP-LABEL: srem_si32_ui32_ui32: 770; LA32-TRAP: # %bb.0: # %entry 771; LA32-TRAP-NEXT: mod.w $a0, $a0, $a1 772; LA32-TRAP-NEXT: bnez $a1, .LBB21_2 773; LA32-TRAP-NEXT: # %bb.1: # %entry 774; LA32-TRAP-NEXT: break 7 775; LA32-TRAP-NEXT: .LBB21_2: # %entry 776; LA32-TRAP-NEXT: ret 777; 778; LA64-TRAP-LABEL: srem_si32_ui32_ui32: 779; LA64-TRAP: # %bb.0: # %entry 780; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 781; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 782; LA64-TRAP-NEXT: mod.w $a0, $a0, $a1 783; LA64-TRAP-NEXT: bnez $a1, .LBB21_2 784; LA64-TRAP-NEXT: # %bb.1: # %entry 785; LA64-TRAP-NEXT: break 7 786; LA64-TRAP-NEXT: .LBB21_2: # %entry 787; LA64-TRAP-NEXT: ret 788entry: 789 %r = srem i32 %a, %b 790 ret i32 %r 791} 792 793define signext i32 @srem_si32_si32_si32(i32 signext %a, i32 signext %b) { 794; LA32-LABEL: srem_si32_si32_si32: 795; LA32: # %bb.0: # %entry 796; LA32-NEXT: mod.w $a0, $a0, $a1 797; LA32-NEXT: ret 798; 799; LA64-LABEL: srem_si32_si32_si32: 800; LA64: # %bb.0: # %entry 801; LA64-NEXT: mod.w $a0, $a0, $a1 802; LA64-NEXT: ret 803; 804; LA32-TRAP-LABEL: srem_si32_si32_si32: 805; LA32-TRAP: # %bb.0: # %entry 806; LA32-TRAP-NEXT: mod.w $a0, $a0, $a1 807; LA32-TRAP-NEXT: bnez $a1, .LBB22_2 808; LA32-TRAP-NEXT: # %bb.1: # %entry 809; LA32-TRAP-NEXT: break 7 810; LA32-TRAP-NEXT: .LBB22_2: # %entry 811; LA32-TRAP-NEXT: ret 812; 813; LA64-TRAP-LABEL: srem_si32_si32_si32: 814; LA64-TRAP: # %bb.0: # %entry 815; LA64-TRAP-NEXT: mod.w $a0, $a0, $a1 816; LA64-TRAP-NEXT: bnez $a1, .LBB22_2 817; LA64-TRAP-NEXT: # %bb.1: # %entry 818; LA64-TRAP-NEXT: break 7 819; LA64-TRAP-NEXT: .LBB22_2: # %entry 820; LA64-TRAP-NEXT: ret 821entry: 822 %r = srem i32 %a, %b 823 ret i32 %r 824} 825 826define i64 @srem_i64(i64 %a, i64 %b) { 827; LA32-LABEL: srem_i64: 828; LA32: # %bb.0: # %entry 829; LA32-NEXT: addi.w $sp, $sp, -16 830; LA32-NEXT: .cfi_def_cfa_offset 16 831; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 832; LA32-NEXT: .cfi_offset 1, -4 833; LA32-NEXT: bl %plt(__moddi3) 834; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 835; LA32-NEXT: addi.w $sp, $sp, 16 836; LA32-NEXT: ret 837; 838; LA64-LABEL: srem_i64: 839; LA64: # %bb.0: # %entry 840; LA64-NEXT: mod.d $a0, $a0, $a1 841; LA64-NEXT: ret 842; 843; LA32-TRAP-LABEL: srem_i64: 844; LA32-TRAP: # %bb.0: # %entry 845; LA32-TRAP-NEXT: addi.w $sp, $sp, -16 846; LA32-TRAP-NEXT: .cfi_def_cfa_offset 16 847; LA32-TRAP-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 848; LA32-TRAP-NEXT: .cfi_offset 1, -4 849; LA32-TRAP-NEXT: bl %plt(__moddi3) 850; LA32-TRAP-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 851; LA32-TRAP-NEXT: addi.w $sp, $sp, 16 852; LA32-TRAP-NEXT: ret 853; 854; LA64-TRAP-LABEL: srem_i64: 855; LA64-TRAP: # %bb.0: # %entry 856; LA64-TRAP-NEXT: mod.d $a0, $a0, $a1 857; LA64-TRAP-NEXT: bnez $a1, .LBB23_2 858; LA64-TRAP-NEXT: # %bb.1: # %entry 859; LA64-TRAP-NEXT: break 7 860; LA64-TRAP-NEXT: .LBB23_2: # %entry 861; LA64-TRAP-NEXT: ret 862entry: 863 %r = srem i64 %a, %b 864 ret i64 %r 865} 866 867define i1 @urem_i1(i1 %a, i1 %b) { 868; LA32-LABEL: urem_i1: 869; LA32: # %bb.0: # %entry 870; LA32-NEXT: move $a0, $zero 871; LA32-NEXT: ret 872; 873; LA64-LABEL: urem_i1: 874; LA64: # %bb.0: # %entry 875; LA64-NEXT: move $a0, $zero 876; LA64-NEXT: ret 877; 878; LA32-TRAP-LABEL: urem_i1: 879; LA32-TRAP: # %bb.0: # %entry 880; LA32-TRAP-NEXT: move $a0, $zero 881; LA32-TRAP-NEXT: ret 882; 883; LA64-TRAP-LABEL: urem_i1: 884; LA64-TRAP: # %bb.0: # %entry 885; LA64-TRAP-NEXT: move $a0, $zero 886; LA64-TRAP-NEXT: ret 887entry: 888 %r = urem i1 %a, %b 889 ret i1 %r 890} 891 892define i8 @urem_i8(i8 %a, i8 %b) { 893; LA32-LABEL: urem_i8: 894; LA32: # %bb.0: # %entry 895; LA32-NEXT: andi $a1, $a1, 255 896; LA32-NEXT: andi $a0, $a0, 255 897; LA32-NEXT: mod.wu $a0, $a0, $a1 898; LA32-NEXT: ret 899; 900; LA64-LABEL: urem_i8: 901; LA64: # %bb.0: # %entry 902; LA64-NEXT: andi $a1, $a1, 255 903; LA64-NEXT: andi $a0, $a0, 255 904; LA64-NEXT: mod.du $a0, $a0, $a1 905; LA64-NEXT: ret 906; 907; LA32-TRAP-LABEL: urem_i8: 908; LA32-TRAP: # %bb.0: # %entry 909; LA32-TRAP-NEXT: andi $a1, $a1, 255 910; LA32-TRAP-NEXT: andi $a0, $a0, 255 911; LA32-TRAP-NEXT: mod.wu $a0, $a0, $a1 912; LA32-TRAP-NEXT: bnez $a1, .LBB25_2 913; LA32-TRAP-NEXT: # %bb.1: # %entry 914; LA32-TRAP-NEXT: break 7 915; LA32-TRAP-NEXT: .LBB25_2: # %entry 916; LA32-TRAP-NEXT: ret 917; 918; LA64-TRAP-LABEL: urem_i8: 919; LA64-TRAP: # %bb.0: # %entry 920; LA64-TRAP-NEXT: andi $a1, $a1, 255 921; LA64-TRAP-NEXT: andi $a0, $a0, 255 922; LA64-TRAP-NEXT: mod.du $a0, $a0, $a1 923; LA64-TRAP-NEXT: bnez $a1, .LBB25_2 924; LA64-TRAP-NEXT: # %bb.1: # %entry 925; LA64-TRAP-NEXT: break 7 926; LA64-TRAP-NEXT: .LBB25_2: # %entry 927; LA64-TRAP-NEXT: ret 928entry: 929 %r = urem i8 %a, %b 930 ret i8 %r 931} 932 933define i16 @urem_i16(i16 %a, i16 %b) { 934; LA32-LABEL: urem_i16: 935; LA32: # %bb.0: # %entry 936; LA32-NEXT: bstrpick.w $a1, $a1, 15, 0 937; LA32-NEXT: bstrpick.w $a0, $a0, 15, 0 938; LA32-NEXT: mod.wu $a0, $a0, $a1 939; LA32-NEXT: ret 940; 941; LA64-LABEL: urem_i16: 942; LA64: # %bb.0: # %entry 943; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0 944; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0 945; LA64-NEXT: mod.du $a0, $a0, $a1 946; LA64-NEXT: ret 947; 948; LA32-TRAP-LABEL: urem_i16: 949; LA32-TRAP: # %bb.0: # %entry 950; LA32-TRAP-NEXT: bstrpick.w $a1, $a1, 15, 0 951; LA32-TRAP-NEXT: bstrpick.w $a0, $a0, 15, 0 952; LA32-TRAP-NEXT: mod.wu $a0, $a0, $a1 953; LA32-TRAP-NEXT: bnez $a1, .LBB26_2 954; LA32-TRAP-NEXT: # %bb.1: # %entry 955; LA32-TRAP-NEXT: break 7 956; LA32-TRAP-NEXT: .LBB26_2: # %entry 957; LA32-TRAP-NEXT: ret 958; 959; LA64-TRAP-LABEL: urem_i16: 960; LA64-TRAP: # %bb.0: # %entry 961; LA64-TRAP-NEXT: bstrpick.d $a1, $a1, 15, 0 962; LA64-TRAP-NEXT: bstrpick.d $a0, $a0, 15, 0 963; LA64-TRAP-NEXT: mod.du $a0, $a0, $a1 964; LA64-TRAP-NEXT: bnez $a1, .LBB26_2 965; LA64-TRAP-NEXT: # %bb.1: # %entry 966; LA64-TRAP-NEXT: break 7 967; LA64-TRAP-NEXT: .LBB26_2: # %entry 968; LA64-TRAP-NEXT: ret 969entry: 970 %r = urem i16 %a, %b 971 ret i16 %r 972} 973 974define i32 @urem_i32(i32 %a, i32 %b) { 975; LA32-LABEL: urem_i32: 976; LA32: # %bb.0: # %entry 977; LA32-NEXT: mod.wu $a0, $a0, $a1 978; LA32-NEXT: ret 979; 980; LA64-LABEL: urem_i32: 981; LA64: # %bb.0: # %entry 982; LA64-NEXT: addi.w $a1, $a1, 0 983; LA64-NEXT: addi.w $a0, $a0, 0 984; LA64-NEXT: mod.wu $a0, $a0, $a1 985; LA64-NEXT: ret 986; 987; LA32-TRAP-LABEL: urem_i32: 988; LA32-TRAP: # %bb.0: # %entry 989; LA32-TRAP-NEXT: mod.wu $a0, $a0, $a1 990; LA32-TRAP-NEXT: bnez $a1, .LBB27_2 991; LA32-TRAP-NEXT: # %bb.1: # %entry 992; LA32-TRAP-NEXT: break 7 993; LA32-TRAP-NEXT: .LBB27_2: # %entry 994; LA32-TRAP-NEXT: ret 995; 996; LA64-TRAP-LABEL: urem_i32: 997; LA64-TRAP: # %bb.0: # %entry 998; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 999; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 1000; LA64-TRAP-NEXT: mod.wu $a0, $a0, $a1 1001; LA64-TRAP-NEXT: bnez $a1, .LBB27_2 1002; LA64-TRAP-NEXT: # %bb.1: # %entry 1003; LA64-TRAP-NEXT: break 7 1004; LA64-TRAP-NEXT: .LBB27_2: # %entry 1005; LA64-TRAP-NEXT: ret 1006entry: 1007 %r = urem i32 %a, %b 1008 ret i32 %r 1009} 1010 1011define i32 @urem_ui32_si32_si32(i32 signext %a, i32 signext %b) { 1012; LA32-LABEL: urem_ui32_si32_si32: 1013; LA32: # %bb.0: # %entry 1014; LA32-NEXT: mod.wu $a0, $a0, $a1 1015; LA32-NEXT: ret 1016; 1017; LA64-LABEL: urem_ui32_si32_si32: 1018; LA64: # %bb.0: # %entry 1019; LA64-NEXT: mod.wu $a0, $a0, $a1 1020; LA64-NEXT: ret 1021; 1022; LA32-TRAP-LABEL: urem_ui32_si32_si32: 1023; LA32-TRAP: # %bb.0: # %entry 1024; LA32-TRAP-NEXT: mod.wu $a0, $a0, $a1 1025; LA32-TRAP-NEXT: bnez $a1, .LBB28_2 1026; LA32-TRAP-NEXT: # %bb.1: # %entry 1027; LA32-TRAP-NEXT: break 7 1028; LA32-TRAP-NEXT: .LBB28_2: # %entry 1029; LA32-TRAP-NEXT: ret 1030; 1031; LA64-TRAP-LABEL: urem_ui32_si32_si32: 1032; LA64-TRAP: # %bb.0: # %entry 1033; LA64-TRAP-NEXT: mod.wu $a0, $a0, $a1 1034; LA64-TRAP-NEXT: bnez $a1, .LBB28_2 1035; LA64-TRAP-NEXT: # %bb.1: # %entry 1036; LA64-TRAP-NEXT: break 7 1037; LA64-TRAP-NEXT: .LBB28_2: # %entry 1038; LA64-TRAP-NEXT: ret 1039entry: 1040 %r = urem i32 %a, %b 1041 ret i32 %r 1042} 1043 1044define signext i32 @urem_si32_ui32_ui32(i32 %a, i32 %b) { 1045; LA32-LABEL: urem_si32_ui32_ui32: 1046; LA32: # %bb.0: # %entry 1047; LA32-NEXT: mod.wu $a0, $a0, $a1 1048; LA32-NEXT: ret 1049; 1050; LA64-LABEL: urem_si32_ui32_ui32: 1051; LA64: # %bb.0: # %entry 1052; LA64-NEXT: addi.w $a1, $a1, 0 1053; LA64-NEXT: addi.w $a0, $a0, 0 1054; LA64-NEXT: mod.wu $a0, $a0, $a1 1055; LA64-NEXT: ret 1056; 1057; LA32-TRAP-LABEL: urem_si32_ui32_ui32: 1058; LA32-TRAP: # %bb.0: # %entry 1059; LA32-TRAP-NEXT: mod.wu $a0, $a0, $a1 1060; LA32-TRAP-NEXT: bnez $a1, .LBB29_2 1061; LA32-TRAP-NEXT: # %bb.1: # %entry 1062; LA32-TRAP-NEXT: break 7 1063; LA32-TRAP-NEXT: .LBB29_2: # %entry 1064; LA32-TRAP-NEXT: ret 1065; 1066; LA64-TRAP-LABEL: urem_si32_ui32_ui32: 1067; LA64-TRAP: # %bb.0: # %entry 1068; LA64-TRAP-NEXT: addi.w $a1, $a1, 0 1069; LA64-TRAP-NEXT: addi.w $a0, $a0, 0 1070; LA64-TRAP-NEXT: mod.wu $a0, $a0, $a1 1071; LA64-TRAP-NEXT: bnez $a1, .LBB29_2 1072; LA64-TRAP-NEXT: # %bb.1: # %entry 1073; LA64-TRAP-NEXT: break 7 1074; LA64-TRAP-NEXT: .LBB29_2: # %entry 1075; LA64-TRAP-NEXT: ret 1076entry: 1077 %r = urem i32 %a, %b 1078 ret i32 %r 1079} 1080 1081define signext i32 @urem_si32_si32_si32(i32 signext %a, i32 signext %b) { 1082; LA32-LABEL: urem_si32_si32_si32: 1083; LA32: # %bb.0: # %entry 1084; LA32-NEXT: mod.wu $a0, $a0, $a1 1085; LA32-NEXT: ret 1086; 1087; LA64-LABEL: urem_si32_si32_si32: 1088; LA64: # %bb.0: # %entry 1089; LA64-NEXT: mod.wu $a0, $a0, $a1 1090; LA64-NEXT: ret 1091; 1092; LA32-TRAP-LABEL: urem_si32_si32_si32: 1093; LA32-TRAP: # %bb.0: # %entry 1094; LA32-TRAP-NEXT: mod.wu $a0, $a0, $a1 1095; LA32-TRAP-NEXT: bnez $a1, .LBB30_2 1096; LA32-TRAP-NEXT: # %bb.1: # %entry 1097; LA32-TRAP-NEXT: break 7 1098; LA32-TRAP-NEXT: .LBB30_2: # %entry 1099; LA32-TRAP-NEXT: ret 1100; 1101; LA64-TRAP-LABEL: urem_si32_si32_si32: 1102; LA64-TRAP: # %bb.0: # %entry 1103; LA64-TRAP-NEXT: mod.wu $a0, $a0, $a1 1104; LA64-TRAP-NEXT: bnez $a1, .LBB30_2 1105; LA64-TRAP-NEXT: # %bb.1: # %entry 1106; LA64-TRAP-NEXT: break 7 1107; LA64-TRAP-NEXT: .LBB30_2: # %entry 1108; LA64-TRAP-NEXT: ret 1109entry: 1110 %r = urem i32 %a, %b 1111 ret i32 %r 1112} 1113 1114define i64 @urem_i64(i64 %a, i64 %b) { 1115; LA32-LABEL: urem_i64: 1116; LA32: # %bb.0: # %entry 1117; LA32-NEXT: addi.w $sp, $sp, -16 1118; LA32-NEXT: .cfi_def_cfa_offset 16 1119; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 1120; LA32-NEXT: .cfi_offset 1, -4 1121; LA32-NEXT: bl %plt(__umoddi3) 1122; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 1123; LA32-NEXT: addi.w $sp, $sp, 16 1124; LA32-NEXT: ret 1125; 1126; LA64-LABEL: urem_i64: 1127; LA64: # %bb.0: # %entry 1128; LA64-NEXT: mod.du $a0, $a0, $a1 1129; LA64-NEXT: ret 1130; 1131; LA32-TRAP-LABEL: urem_i64: 1132; LA32-TRAP: # %bb.0: # %entry 1133; LA32-TRAP-NEXT: addi.w $sp, $sp, -16 1134; LA32-TRAP-NEXT: .cfi_def_cfa_offset 16 1135; LA32-TRAP-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 1136; LA32-TRAP-NEXT: .cfi_offset 1, -4 1137; LA32-TRAP-NEXT: bl %plt(__umoddi3) 1138; LA32-TRAP-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 1139; LA32-TRAP-NEXT: addi.w $sp, $sp, 16 1140; LA32-TRAP-NEXT: ret 1141; 1142; LA64-TRAP-LABEL: urem_i64: 1143; LA64-TRAP: # %bb.0: # %entry 1144; LA64-TRAP-NEXT: mod.du $a0, $a0, $a1 1145; LA64-TRAP-NEXT: bnez $a1, .LBB31_2 1146; LA64-TRAP-NEXT: # %bb.1: # %entry 1147; LA64-TRAP-NEXT: break 7 1148; LA64-TRAP-NEXT: .LBB31_2: # %entry 1149; LA64-TRAP-NEXT: ret 1150entry: 1151 %r = urem i64 %a, %b 1152 ret i64 %r 1153} 1154 1155define signext i32 @pr107414(i32 signext %x) { 1156; LA32-LABEL: pr107414: 1157; LA32: # %bb.0: # %entry 1158; LA32-NEXT: addi.w $sp, $sp, -16 1159; LA32-NEXT: .cfi_def_cfa_offset 16 1160; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 1161; LA32-NEXT: .cfi_offset 1, -4 1162; LA32-NEXT: move $a2, $a0 1163; LA32-NEXT: srai.w $a3, $a0, 31 1164; LA32-NEXT: lu12i.w $a0, -266831 1165; LA32-NEXT: ori $a0, $a0, 3337 1166; LA32-NEXT: move $a1, $zero 1167; LA32-NEXT: bl %plt(__divdi3) 1168; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 1169; LA32-NEXT: addi.w $sp, $sp, 16 1170; LA32-NEXT: ret 1171; 1172; LA64-LABEL: pr107414: 1173; LA64: # %bb.0: # %entry 1174; LA64-NEXT: lu12i.w $a1, -266831 1175; LA64-NEXT: ori $a1, $a1, 3337 1176; LA64-NEXT: lu32i.d $a1, 0 1177; LA64-NEXT: div.d $a0, $a1, $a0 1178; LA64-NEXT: addi.w $a0, $a0, 0 1179; LA64-NEXT: ret 1180; 1181; LA32-TRAP-LABEL: pr107414: 1182; LA32-TRAP: # %bb.0: # %entry 1183; LA32-TRAP-NEXT: addi.w $sp, $sp, -16 1184; LA32-TRAP-NEXT: .cfi_def_cfa_offset 16 1185; LA32-TRAP-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 1186; LA32-TRAP-NEXT: .cfi_offset 1, -4 1187; LA32-TRAP-NEXT: move $a2, $a0 1188; LA32-TRAP-NEXT: srai.w $a3, $a0, 31 1189; LA32-TRAP-NEXT: lu12i.w $a0, -266831 1190; LA32-TRAP-NEXT: ori $a0, $a0, 3337 1191; LA32-TRAP-NEXT: move $a1, $zero 1192; LA32-TRAP-NEXT: bl %plt(__divdi3) 1193; LA32-TRAP-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 1194; LA32-TRAP-NEXT: addi.w $sp, $sp, 16 1195; LA32-TRAP-NEXT: ret 1196; 1197; LA64-TRAP-LABEL: pr107414: 1198; LA64-TRAP: # %bb.0: # %entry 1199; LA64-TRAP-NEXT: lu12i.w $a1, -266831 1200; LA64-TRAP-NEXT: ori $a1, $a1, 3337 1201; LA64-TRAP-NEXT: lu32i.d $a1, 0 1202; LA64-TRAP-NEXT: div.d $a1, $a1, $a0 1203; LA64-TRAP-NEXT: bnez $a0, .LBB32_2 1204; LA64-TRAP-NEXT: # %bb.1: # %entry 1205; LA64-TRAP-NEXT: break 7 1206; LA64-TRAP-NEXT: .LBB32_2: # %entry 1207; LA64-TRAP-NEXT: addi.w $a0, $a1, 0 1208; LA64-TRAP-NEXT: ret 1209entry: 1210 %conv = sext i32 %x to i64 1211 %div = sdiv i64 3202030857, %conv 1212 %conv1 = trunc i64 %div to i32 1213 ret i32 %conv1 1214} 1215