1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=NOZBB,RV32I 3; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=NOZBB,RV64I 4; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV32ZBB 5; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV64ZBB 6 7; 8; trunc(nabs(sub(zext(a),zext(b)))) -> nabds(a,b) 9; 10 11define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind { 12; RV32I-LABEL: abd_ext_i8: 13; RV32I: # %bb.0: 14; RV32I-NEXT: andi a1, a1, 255 15; RV32I-NEXT: andi a0, a0, 255 16; RV32I-NEXT: sub a0, a0, a1 17; RV32I-NEXT: srai a1, a0, 31 18; RV32I-NEXT: xor a0, a0, a1 19; RV32I-NEXT: sub a0, a1, a0 20; RV32I-NEXT: ret 21; 22; RV64I-LABEL: abd_ext_i8: 23; RV64I: # %bb.0: 24; RV64I-NEXT: andi a0, a0, 255 25; RV64I-NEXT: andi a1, a1, 255 26; RV64I-NEXT: sub a0, a0, a1 27; RV64I-NEXT: srai a1, a0, 63 28; RV64I-NEXT: xor a0, a0, a1 29; RV64I-NEXT: sub a0, a1, a0 30; RV64I-NEXT: ret 31; 32; RV32ZBB-LABEL: abd_ext_i8: 33; RV32ZBB: # %bb.0: 34; RV32ZBB-NEXT: andi a1, a1, 255 35; RV32ZBB-NEXT: andi a0, a0, 255 36; RV32ZBB-NEXT: maxu a2, a0, a1 37; RV32ZBB-NEXT: minu a0, a0, a1 38; RV32ZBB-NEXT: sub a0, a0, a2 39; RV32ZBB-NEXT: ret 40; 41; RV64ZBB-LABEL: abd_ext_i8: 42; RV64ZBB: # %bb.0: 43; RV64ZBB-NEXT: andi a0, a0, 255 44; RV64ZBB-NEXT: andi a1, a1, 255 45; RV64ZBB-NEXT: sub a0, a0, a1 46; RV64ZBB-NEXT: neg a1, a0 47; RV64ZBB-NEXT: min a0, a0, a1 48; RV64ZBB-NEXT: ret 49 %aext = zext i8 %a to i64 50 %bext = zext i8 %b to i64 51 %sub = sub i64 %aext, %bext 52 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false) 53 %nabs = sub i64 0, %abs 54 %trunc = trunc i64 %nabs to i8 55 ret i8 %trunc 56} 57 58define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind { 59; RV32I-LABEL: abd_ext_i8_i16: 60; RV32I: # %bb.0: 61; RV32I-NEXT: slli a1, a1, 16 62; RV32I-NEXT: srli a1, a1, 16 63; RV32I-NEXT: andi a0, a0, 255 64; RV32I-NEXT: sub a0, a0, a1 65; RV32I-NEXT: srai a1, a0, 31 66; RV32I-NEXT: xor a0, a0, a1 67; RV32I-NEXT: sub a0, a1, a0 68; RV32I-NEXT: ret 69; 70; RV64I-LABEL: abd_ext_i8_i16: 71; RV64I: # %bb.0: 72; RV64I-NEXT: andi a0, a0, 255 73; RV64I-NEXT: slli a1, a1, 48 74; RV64I-NEXT: srli a1, a1, 48 75; RV64I-NEXT: sub a0, a0, a1 76; RV64I-NEXT: srai a1, a0, 63 77; RV64I-NEXT: xor a0, a0, a1 78; RV64I-NEXT: sub a0, a1, a0 79; RV64I-NEXT: ret 80; 81; RV32ZBB-LABEL: abd_ext_i8_i16: 82; RV32ZBB: # %bb.0: 83; RV32ZBB-NEXT: zext.h a1, a1 84; RV32ZBB-NEXT: andi a0, a0, 255 85; RV32ZBB-NEXT: maxu a2, a0, a1 86; RV32ZBB-NEXT: minu a0, a0, a1 87; RV32ZBB-NEXT: sub a0, a0, a2 88; RV32ZBB-NEXT: ret 89; 90; RV64ZBB-LABEL: abd_ext_i8_i16: 91; RV64ZBB: # %bb.0: 92; RV64ZBB-NEXT: andi a0, a0, 255 93; RV64ZBB-NEXT: zext.h a1, a1 94; RV64ZBB-NEXT: sub a0, a0, a1 95; RV64ZBB-NEXT: neg a1, a0 96; RV64ZBB-NEXT: min a0, a0, a1 97; RV64ZBB-NEXT: ret 98 %aext = zext i8 %a to i64 99 %bext = zext i16 %b to i64 100 %sub = sub i64 %aext, %bext 101 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false) 102 %nabs = sub i64 0, %abs 103 %trunc = trunc i64 %nabs to i8 104 ret i8 %trunc 105} 106 107define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind { 108; RV32I-LABEL: abd_ext_i8_undef: 109; RV32I: # %bb.0: 110; RV32I-NEXT: andi a1, a1, 255 111; RV32I-NEXT: andi a0, a0, 255 112; RV32I-NEXT: sub a0, a0, a1 113; RV32I-NEXT: srai a1, a0, 31 114; RV32I-NEXT: xor a0, a0, a1 115; RV32I-NEXT: sub a0, a1, a0 116; RV32I-NEXT: ret 117; 118; RV64I-LABEL: abd_ext_i8_undef: 119; RV64I: # %bb.0: 120; RV64I-NEXT: andi a0, a0, 255 121; RV64I-NEXT: andi a1, a1, 255 122; RV64I-NEXT: sub a0, a0, a1 123; RV64I-NEXT: srai a1, a0, 63 124; RV64I-NEXT: xor a0, a0, a1 125; RV64I-NEXT: sub a0, a1, a0 126; RV64I-NEXT: ret 127; 128; RV32ZBB-LABEL: abd_ext_i8_undef: 129; RV32ZBB: # %bb.0: 130; RV32ZBB-NEXT: andi a1, a1, 255 131; RV32ZBB-NEXT: andi a0, a0, 255 132; RV32ZBB-NEXT: maxu a2, a0, a1 133; RV32ZBB-NEXT: minu a0, a0, a1 134; RV32ZBB-NEXT: sub a0, a0, a2 135; RV32ZBB-NEXT: ret 136; 137; RV64ZBB-LABEL: abd_ext_i8_undef: 138; RV64ZBB: # %bb.0: 139; RV64ZBB-NEXT: andi a0, a0, 255 140; RV64ZBB-NEXT: andi a1, a1, 255 141; RV64ZBB-NEXT: sub a0, a0, a1 142; RV64ZBB-NEXT: neg a1, a0 143; RV64ZBB-NEXT: min a0, a0, a1 144; RV64ZBB-NEXT: ret 145 %aext = zext i8 %a to i64 146 %bext = zext i8 %b to i64 147 %sub = sub i64 %aext, %bext 148 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true) 149 %nabs = sub i64 0, %abs 150 %trunc = trunc i64 %nabs to i8 151 ret i8 %trunc 152} 153 154define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind { 155; RV32I-LABEL: abd_ext_i16: 156; RV32I: # %bb.0: 157; RV32I-NEXT: lui a2, 16 158; RV32I-NEXT: addi a2, a2, -1 159; RV32I-NEXT: and a1, a1, a2 160; RV32I-NEXT: and a0, a0, a2 161; RV32I-NEXT: sub a0, a0, a1 162; RV32I-NEXT: srai a1, a0, 31 163; RV32I-NEXT: xor a0, a0, a1 164; RV32I-NEXT: sub a0, a1, a0 165; RV32I-NEXT: ret 166; 167; RV64I-LABEL: abd_ext_i16: 168; RV64I: # %bb.0: 169; RV64I-NEXT: lui a2, 16 170; RV64I-NEXT: addiw a2, a2, -1 171; RV64I-NEXT: and a0, a0, a2 172; RV64I-NEXT: and a1, a1, a2 173; RV64I-NEXT: sub a0, a0, a1 174; RV64I-NEXT: srai a1, a0, 63 175; RV64I-NEXT: xor a0, a0, a1 176; RV64I-NEXT: sub a0, a1, a0 177; RV64I-NEXT: ret 178; 179; RV32ZBB-LABEL: abd_ext_i16: 180; RV32ZBB: # %bb.0: 181; RV32ZBB-NEXT: zext.h a1, a1 182; RV32ZBB-NEXT: zext.h a0, a0 183; RV32ZBB-NEXT: maxu a2, a0, a1 184; RV32ZBB-NEXT: minu a0, a0, a1 185; RV32ZBB-NEXT: sub a0, a0, a2 186; RV32ZBB-NEXT: ret 187; 188; RV64ZBB-LABEL: abd_ext_i16: 189; RV64ZBB: # %bb.0: 190; RV64ZBB-NEXT: zext.h a0, a0 191; RV64ZBB-NEXT: zext.h a1, a1 192; RV64ZBB-NEXT: sub a0, a0, a1 193; RV64ZBB-NEXT: neg a1, a0 194; RV64ZBB-NEXT: min a0, a0, a1 195; RV64ZBB-NEXT: ret 196 %aext = zext i16 %a to i64 197 %bext = zext i16 %b to i64 198 %sub = sub i64 %aext, %bext 199 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false) 200 %nabs = sub i64 0, %abs 201 %trunc = trunc i64 %nabs to i16 202 ret i16 %trunc 203} 204 205define i16 @abd_ext_i16_i32(i16 %a, i32 %b) nounwind { 206; RV32I-LABEL: abd_ext_i16_i32: 207; RV32I: # %bb.0: 208; RV32I-NEXT: slli a0, a0, 16 209; RV32I-NEXT: srli a0, a0, 16 210; RV32I-NEXT: bltu a1, a0, .LBB4_2 211; RV32I-NEXT: # %bb.1: 212; RV32I-NEXT: sub a0, a1, a0 213; RV32I-NEXT: neg a0, a0 214; RV32I-NEXT: ret 215; RV32I-NEXT: .LBB4_2: 216; RV32I-NEXT: sub a0, a0, a1 217; RV32I-NEXT: neg a0, a0 218; RV32I-NEXT: ret 219; 220; RV64I-LABEL: abd_ext_i16_i32: 221; RV64I: # %bb.0: 222; RV64I-NEXT: slli a0, a0, 48 223; RV64I-NEXT: slli a1, a1, 32 224; RV64I-NEXT: srli a0, a0, 48 225; RV64I-NEXT: srli a1, a1, 32 226; RV64I-NEXT: sub a0, a0, a1 227; RV64I-NEXT: srai a1, a0, 63 228; RV64I-NEXT: xor a0, a0, a1 229; RV64I-NEXT: sub a0, a1, a0 230; RV64I-NEXT: ret 231; 232; RV32ZBB-LABEL: abd_ext_i16_i32: 233; RV32ZBB: # %bb.0: 234; RV32ZBB-NEXT: zext.h a0, a0 235; RV32ZBB-NEXT: maxu a2, a0, a1 236; RV32ZBB-NEXT: minu a0, a0, a1 237; RV32ZBB-NEXT: sub a0, a0, a2 238; RV32ZBB-NEXT: ret 239; 240; RV64ZBB-LABEL: abd_ext_i16_i32: 241; RV64ZBB: # %bb.0: 242; RV64ZBB-NEXT: zext.h a0, a0 243; RV64ZBB-NEXT: slli a1, a1, 32 244; RV64ZBB-NEXT: srli a1, a1, 32 245; RV64ZBB-NEXT: sub a0, a0, a1 246; RV64ZBB-NEXT: neg a1, a0 247; RV64ZBB-NEXT: min a0, a0, a1 248; RV64ZBB-NEXT: ret 249 %aext = zext i16 %a to i64 250 %bext = zext i32 %b to i64 251 %sub = sub i64 %aext, %bext 252 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false) 253 %nabs = sub i64 0, %abs 254 %trunc = trunc i64 %nabs to i16 255 ret i16 %trunc 256} 257 258define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind { 259; RV32I-LABEL: abd_ext_i16_undef: 260; RV32I: # %bb.0: 261; RV32I-NEXT: lui a2, 16 262; RV32I-NEXT: addi a2, a2, -1 263; RV32I-NEXT: and a1, a1, a2 264; RV32I-NEXT: and a0, a0, a2 265; RV32I-NEXT: sub a0, a0, a1 266; RV32I-NEXT: srai a1, a0, 31 267; RV32I-NEXT: xor a0, a0, a1 268; RV32I-NEXT: sub a0, a1, a0 269; RV32I-NEXT: ret 270; 271; RV64I-LABEL: abd_ext_i16_undef: 272; RV64I: # %bb.0: 273; RV64I-NEXT: lui a2, 16 274; RV64I-NEXT: addiw a2, a2, -1 275; RV64I-NEXT: and a0, a0, a2 276; RV64I-NEXT: and a1, a1, a2 277; RV64I-NEXT: sub a0, a0, a1 278; RV64I-NEXT: srai a1, a0, 63 279; RV64I-NEXT: xor a0, a0, a1 280; RV64I-NEXT: sub a0, a1, a0 281; RV64I-NEXT: ret 282; 283; RV32ZBB-LABEL: abd_ext_i16_undef: 284; RV32ZBB: # %bb.0: 285; RV32ZBB-NEXT: zext.h a1, a1 286; RV32ZBB-NEXT: zext.h a0, a0 287; RV32ZBB-NEXT: maxu a2, a0, a1 288; RV32ZBB-NEXT: minu a0, a0, a1 289; RV32ZBB-NEXT: sub a0, a0, a2 290; RV32ZBB-NEXT: ret 291; 292; RV64ZBB-LABEL: abd_ext_i16_undef: 293; RV64ZBB: # %bb.0: 294; RV64ZBB-NEXT: zext.h a0, a0 295; RV64ZBB-NEXT: zext.h a1, a1 296; RV64ZBB-NEXT: sub a0, a0, a1 297; RV64ZBB-NEXT: neg a1, a0 298; RV64ZBB-NEXT: min a0, a0, a1 299; RV64ZBB-NEXT: ret 300 %aext = zext i16 %a to i64 301 %bext = zext i16 %b to i64 302 %sub = sub i64 %aext, %bext 303 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true) 304 %nabs = sub i64 0, %abs 305 %trunc = trunc i64 %nabs to i16 306 ret i16 %trunc 307} 308 309define i32 @abd_ext_i32(i32 %a, i32 %b) nounwind { 310; RV32I-LABEL: abd_ext_i32: 311; RV32I: # %bb.0: 312; RV32I-NEXT: bltu a1, a0, .LBB6_2 313; RV32I-NEXT: # %bb.1: 314; RV32I-NEXT: sub a0, a1, a0 315; RV32I-NEXT: neg a0, a0 316; RV32I-NEXT: ret 317; RV32I-NEXT: .LBB6_2: 318; RV32I-NEXT: sub a0, a0, a1 319; RV32I-NEXT: neg a0, a0 320; RV32I-NEXT: ret 321; 322; RV64I-LABEL: abd_ext_i32: 323; RV64I: # %bb.0: 324; RV64I-NEXT: slli a0, a0, 32 325; RV64I-NEXT: slli a1, a1, 32 326; RV64I-NEXT: srli a0, a0, 32 327; RV64I-NEXT: srli a1, a1, 32 328; RV64I-NEXT: sub a0, a0, a1 329; RV64I-NEXT: srai a1, a0, 63 330; RV64I-NEXT: xor a0, a0, a1 331; RV64I-NEXT: sub a0, a1, a0 332; RV64I-NEXT: ret 333; 334; RV32ZBB-LABEL: abd_ext_i32: 335; RV32ZBB: # %bb.0: 336; RV32ZBB-NEXT: maxu a2, a0, a1 337; RV32ZBB-NEXT: minu a0, a0, a1 338; RV32ZBB-NEXT: sub a0, a0, a2 339; RV32ZBB-NEXT: ret 340; 341; RV64ZBB-LABEL: abd_ext_i32: 342; RV64ZBB: # %bb.0: 343; RV64ZBB-NEXT: slli a0, a0, 32 344; RV64ZBB-NEXT: slli a1, a1, 32 345; RV64ZBB-NEXT: srli a0, a0, 32 346; RV64ZBB-NEXT: srli a1, a1, 32 347; RV64ZBB-NEXT: sub a0, a0, a1 348; RV64ZBB-NEXT: neg a1, a0 349; RV64ZBB-NEXT: min a0, a0, a1 350; RV64ZBB-NEXT: ret 351 %aext = zext i32 %a to i64 352 %bext = zext i32 %b to i64 353 %sub = sub i64 %aext, %bext 354 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false) 355 %nabs = sub i64 0, %abs 356 %trunc = trunc i64 %nabs to i32 357 ret i32 %trunc 358} 359 360define i32 @abd_ext_i32_i16(i32 %a, i16 %b) nounwind { 361; RV32I-LABEL: abd_ext_i32_i16: 362; RV32I: # %bb.0: 363; RV32I-NEXT: slli a1, a1, 16 364; RV32I-NEXT: srli a1, a1, 16 365; RV32I-NEXT: bltu a1, a0, .LBB7_2 366; RV32I-NEXT: # %bb.1: 367; RV32I-NEXT: sub a0, a1, a0 368; RV32I-NEXT: neg a0, a0 369; RV32I-NEXT: ret 370; RV32I-NEXT: .LBB7_2: 371; RV32I-NEXT: sub a0, a0, a1 372; RV32I-NEXT: neg a0, a0 373; RV32I-NEXT: ret 374; 375; RV64I-LABEL: abd_ext_i32_i16: 376; RV64I: # %bb.0: 377; RV64I-NEXT: slli a0, a0, 32 378; RV64I-NEXT: slli a1, a1, 48 379; RV64I-NEXT: srli a0, a0, 32 380; RV64I-NEXT: srli a1, a1, 48 381; RV64I-NEXT: sub a0, a0, a1 382; RV64I-NEXT: srai a1, a0, 63 383; RV64I-NEXT: xor a0, a0, a1 384; RV64I-NEXT: sub a0, a1, a0 385; RV64I-NEXT: ret 386; 387; RV32ZBB-LABEL: abd_ext_i32_i16: 388; RV32ZBB: # %bb.0: 389; RV32ZBB-NEXT: zext.h a1, a1 390; RV32ZBB-NEXT: maxu a2, a0, a1 391; RV32ZBB-NEXT: minu a0, a0, a1 392; RV32ZBB-NEXT: sub a0, a0, a2 393; RV32ZBB-NEXT: ret 394; 395; RV64ZBB-LABEL: abd_ext_i32_i16: 396; RV64ZBB: # %bb.0: 397; RV64ZBB-NEXT: slli a0, a0, 32 398; RV64ZBB-NEXT: srli a0, a0, 32 399; RV64ZBB-NEXT: zext.h a1, a1 400; RV64ZBB-NEXT: sub a0, a0, a1 401; RV64ZBB-NEXT: neg a1, a0 402; RV64ZBB-NEXT: min a0, a0, a1 403; RV64ZBB-NEXT: ret 404 %aext = zext i32 %a to i64 405 %bext = zext i16 %b to i64 406 %sub = sub i64 %aext, %bext 407 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false) 408 %nabs = sub i64 0, %abs 409 %trunc = trunc i64 %nabs to i32 410 ret i32 %trunc 411} 412 413define i32 @abd_ext_i32_undef(i32 %a, i32 %b) nounwind { 414; RV32I-LABEL: abd_ext_i32_undef: 415; RV32I: # %bb.0: 416; RV32I-NEXT: bltu a1, a0, .LBB8_2 417; RV32I-NEXT: # %bb.1: 418; RV32I-NEXT: sub a0, a1, a0 419; RV32I-NEXT: neg a0, a0 420; RV32I-NEXT: ret 421; RV32I-NEXT: .LBB8_2: 422; RV32I-NEXT: sub a0, a0, a1 423; RV32I-NEXT: neg a0, a0 424; RV32I-NEXT: ret 425; 426; RV64I-LABEL: abd_ext_i32_undef: 427; RV64I: # %bb.0: 428; RV64I-NEXT: slli a0, a0, 32 429; RV64I-NEXT: slli a1, a1, 32 430; RV64I-NEXT: srli a0, a0, 32 431; RV64I-NEXT: srli a1, a1, 32 432; RV64I-NEXT: sub a0, a0, a1 433; RV64I-NEXT: srai a1, a0, 63 434; RV64I-NEXT: xor a0, a0, a1 435; RV64I-NEXT: sub a0, a1, a0 436; RV64I-NEXT: ret 437; 438; RV32ZBB-LABEL: abd_ext_i32_undef: 439; RV32ZBB: # %bb.0: 440; RV32ZBB-NEXT: maxu a2, a0, a1 441; RV32ZBB-NEXT: minu a0, a0, a1 442; RV32ZBB-NEXT: sub a0, a0, a2 443; RV32ZBB-NEXT: ret 444; 445; RV64ZBB-LABEL: abd_ext_i32_undef: 446; RV64ZBB: # %bb.0: 447; RV64ZBB-NEXT: slli a0, a0, 32 448; RV64ZBB-NEXT: slli a1, a1, 32 449; RV64ZBB-NEXT: srli a0, a0, 32 450; RV64ZBB-NEXT: srli a1, a1, 32 451; RV64ZBB-NEXT: sub a0, a0, a1 452; RV64ZBB-NEXT: neg a1, a0 453; RV64ZBB-NEXT: min a0, a0, a1 454; RV64ZBB-NEXT: ret 455 %aext = zext i32 %a to i64 456 %bext = zext i32 %b to i64 457 %sub = sub i64 %aext, %bext 458 %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true) 459 %nabs = sub i64 0, %abs 460 %trunc = trunc i64 %nabs to i32 461 ret i32 %trunc 462} 463 464define i64 @abd_ext_i64(i64 %a, i64 %b) nounwind { 465; RV32I-LABEL: abd_ext_i64: 466; RV32I: # %bb.0: 467; RV32I-NEXT: sltu a4, a0, a2 468; RV32I-NEXT: sub a3, a1, a3 469; RV32I-NEXT: sub a3, a3, a4 470; RV32I-NEXT: sub a2, a0, a2 471; RV32I-NEXT: beq a3, a1, .LBB9_2 472; RV32I-NEXT: # %bb.1: 473; RV32I-NEXT: sltu a0, a1, a3 474; RV32I-NEXT: j .LBB9_3 475; RV32I-NEXT: .LBB9_2: 476; RV32I-NEXT: sltu a0, a0, a2 477; RV32I-NEXT: .LBB9_3: 478; RV32I-NEXT: neg a1, a0 479; RV32I-NEXT: xor a2, a2, a1 480; RV32I-NEXT: xor a3, a3, a1 481; RV32I-NEXT: sltu a1, a2, a1 482; RV32I-NEXT: add a3, a3, a0 483; RV32I-NEXT: add a0, a2, a0 484; RV32I-NEXT: sub a3, a3, a1 485; RV32I-NEXT: snez a1, a0 486; RV32I-NEXT: add a1, a3, a1 487; RV32I-NEXT: neg a1, a1 488; RV32I-NEXT: neg a0, a0 489; RV32I-NEXT: ret 490; 491; RV64I-LABEL: abd_ext_i64: 492; RV64I: # %bb.0: 493; RV64I-NEXT: bltu a1, a0, .LBB9_2 494; RV64I-NEXT: # %bb.1: 495; RV64I-NEXT: sub a0, a1, a0 496; RV64I-NEXT: neg a0, a0 497; RV64I-NEXT: ret 498; RV64I-NEXT: .LBB9_2: 499; RV64I-NEXT: sub a0, a0, a1 500; RV64I-NEXT: neg a0, a0 501; RV64I-NEXT: ret 502; 503; RV32ZBB-LABEL: abd_ext_i64: 504; RV32ZBB: # %bb.0: 505; RV32ZBB-NEXT: sltu a4, a0, a2 506; RV32ZBB-NEXT: sub a3, a1, a3 507; RV32ZBB-NEXT: sub a3, a3, a4 508; RV32ZBB-NEXT: sub a2, a0, a2 509; RV32ZBB-NEXT: beq a3, a1, .LBB9_2 510; RV32ZBB-NEXT: # %bb.1: 511; RV32ZBB-NEXT: sltu a0, a1, a3 512; RV32ZBB-NEXT: j .LBB9_3 513; RV32ZBB-NEXT: .LBB9_2: 514; RV32ZBB-NEXT: sltu a0, a0, a2 515; RV32ZBB-NEXT: .LBB9_3: 516; RV32ZBB-NEXT: neg a1, a0 517; RV32ZBB-NEXT: xor a2, a2, a1 518; RV32ZBB-NEXT: xor a3, a3, a1 519; RV32ZBB-NEXT: sltu a1, a2, a1 520; RV32ZBB-NEXT: add a3, a3, a0 521; RV32ZBB-NEXT: add a0, a2, a0 522; RV32ZBB-NEXT: sub a3, a3, a1 523; RV32ZBB-NEXT: snez a1, a0 524; RV32ZBB-NEXT: add a1, a3, a1 525; RV32ZBB-NEXT: neg a1, a1 526; RV32ZBB-NEXT: neg a0, a0 527; RV32ZBB-NEXT: ret 528; 529; RV64ZBB-LABEL: abd_ext_i64: 530; RV64ZBB: # %bb.0: 531; RV64ZBB-NEXT: maxu a2, a0, a1 532; RV64ZBB-NEXT: minu a0, a0, a1 533; RV64ZBB-NEXT: sub a0, a0, a2 534; RV64ZBB-NEXT: ret 535 %aext = zext i64 %a to i128 536 %bext = zext i64 %b to i128 537 %sub = sub i128 %aext, %bext 538 %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false) 539 %nabs = sub i128 0, %abs 540 %trunc = trunc i128 %nabs to i64 541 ret i64 %trunc 542} 543 544define i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind { 545; RV32I-LABEL: abd_ext_i64_undef: 546; RV32I: # %bb.0: 547; RV32I-NEXT: sltu a4, a0, a2 548; RV32I-NEXT: sub a3, a1, a3 549; RV32I-NEXT: sub a3, a3, a4 550; RV32I-NEXT: sub a2, a0, a2 551; RV32I-NEXT: beq a3, a1, .LBB10_2 552; RV32I-NEXT: # %bb.1: 553; RV32I-NEXT: sltu a0, a1, a3 554; RV32I-NEXT: j .LBB10_3 555; RV32I-NEXT: .LBB10_2: 556; RV32I-NEXT: sltu a0, a0, a2 557; RV32I-NEXT: .LBB10_3: 558; RV32I-NEXT: neg a1, a0 559; RV32I-NEXT: xor a2, a2, a1 560; RV32I-NEXT: xor a3, a3, a1 561; RV32I-NEXT: sltu a1, a2, a1 562; RV32I-NEXT: add a3, a3, a0 563; RV32I-NEXT: add a0, a2, a0 564; RV32I-NEXT: sub a3, a3, a1 565; RV32I-NEXT: snez a1, a0 566; RV32I-NEXT: add a1, a3, a1 567; RV32I-NEXT: neg a1, a1 568; RV32I-NEXT: neg a0, a0 569; RV32I-NEXT: ret 570; 571; RV64I-LABEL: abd_ext_i64_undef: 572; RV64I: # %bb.0: 573; RV64I-NEXT: bltu a1, a0, .LBB10_2 574; RV64I-NEXT: # %bb.1: 575; RV64I-NEXT: sub a0, a1, a0 576; RV64I-NEXT: neg a0, a0 577; RV64I-NEXT: ret 578; RV64I-NEXT: .LBB10_2: 579; RV64I-NEXT: sub a0, a0, a1 580; RV64I-NEXT: neg a0, a0 581; RV64I-NEXT: ret 582; 583; RV32ZBB-LABEL: abd_ext_i64_undef: 584; RV32ZBB: # %bb.0: 585; RV32ZBB-NEXT: sltu a4, a0, a2 586; RV32ZBB-NEXT: sub a3, a1, a3 587; RV32ZBB-NEXT: sub a3, a3, a4 588; RV32ZBB-NEXT: sub a2, a0, a2 589; RV32ZBB-NEXT: beq a3, a1, .LBB10_2 590; RV32ZBB-NEXT: # %bb.1: 591; RV32ZBB-NEXT: sltu a0, a1, a3 592; RV32ZBB-NEXT: j .LBB10_3 593; RV32ZBB-NEXT: .LBB10_2: 594; RV32ZBB-NEXT: sltu a0, a0, a2 595; RV32ZBB-NEXT: .LBB10_3: 596; RV32ZBB-NEXT: neg a1, a0 597; RV32ZBB-NEXT: xor a2, a2, a1 598; RV32ZBB-NEXT: xor a3, a3, a1 599; RV32ZBB-NEXT: sltu a1, a2, a1 600; RV32ZBB-NEXT: add a3, a3, a0 601; RV32ZBB-NEXT: add a0, a2, a0 602; RV32ZBB-NEXT: sub a3, a3, a1 603; RV32ZBB-NEXT: snez a1, a0 604; RV32ZBB-NEXT: add a1, a3, a1 605; RV32ZBB-NEXT: neg a1, a1 606; RV32ZBB-NEXT: neg a0, a0 607; RV32ZBB-NEXT: ret 608; 609; RV64ZBB-LABEL: abd_ext_i64_undef: 610; RV64ZBB: # %bb.0: 611; RV64ZBB-NEXT: maxu a2, a0, a1 612; RV64ZBB-NEXT: minu a0, a0, a1 613; RV64ZBB-NEXT: sub a0, a0, a2 614; RV64ZBB-NEXT: ret 615 %aext = zext i64 %a to i128 616 %bext = zext i64 %b to i128 617 %sub = sub i128 %aext, %bext 618 %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true) 619 %nabs = sub i128 0, %abs 620 %trunc = trunc i128 %nabs to i64 621 ret i64 %trunc 622} 623 624define i128 @abd_ext_i128(i128 %a, i128 %b) nounwind { 625; RV32I-LABEL: abd_ext_i128: 626; RV32I: # %bb.0: 627; RV32I-NEXT: lw a5, 0(a2) 628; RV32I-NEXT: lw a7, 4(a2) 629; RV32I-NEXT: lw a3, 8(a2) 630; RV32I-NEXT: lw t1, 12(a2) 631; RV32I-NEXT: lw a4, 8(a1) 632; RV32I-NEXT: lw a6, 12(a1) 633; RV32I-NEXT: lw a2, 0(a1) 634; RV32I-NEXT: lw t0, 4(a1) 635; RV32I-NEXT: sltu a1, a4, a3 636; RV32I-NEXT: sub t1, a6, t1 637; RV32I-NEXT: sltu t2, a2, a5 638; RV32I-NEXT: sub a1, t1, a1 639; RV32I-NEXT: mv t1, t2 640; RV32I-NEXT: beq t0, a7, .LBB11_2 641; RV32I-NEXT: # %bb.1: 642; RV32I-NEXT: sltu t1, t0, a7 643; RV32I-NEXT: .LBB11_2: 644; RV32I-NEXT: sub a3, a4, a3 645; RV32I-NEXT: sltu t3, a3, t1 646; RV32I-NEXT: sub a1, a1, t3 647; RV32I-NEXT: sub a3, a3, t1 648; RV32I-NEXT: beq a1, a6, .LBB11_4 649; RV32I-NEXT: # %bb.3: 650; RV32I-NEXT: sltu t1, a6, a1 651; RV32I-NEXT: j .LBB11_5 652; RV32I-NEXT: .LBB11_4: 653; RV32I-NEXT: sltu t1, a4, a3 654; RV32I-NEXT: .LBB11_5: 655; RV32I-NEXT: sub a7, t0, a7 656; RV32I-NEXT: sub a7, a7, t2 657; RV32I-NEXT: sub a5, a2, a5 658; RV32I-NEXT: beq a7, t0, .LBB11_7 659; RV32I-NEXT: # %bb.6: 660; RV32I-NEXT: sltu a2, t0, a7 661; RV32I-NEXT: j .LBB11_8 662; RV32I-NEXT: .LBB11_7: 663; RV32I-NEXT: sltu a2, a2, a5 664; RV32I-NEXT: .LBB11_8: 665; RV32I-NEXT: xor a6, a1, a6 666; RV32I-NEXT: xor a4, a3, a4 667; RV32I-NEXT: or a4, a4, a6 668; RV32I-NEXT: beqz a4, .LBB11_10 669; RV32I-NEXT: # %bb.9: 670; RV32I-NEXT: mv a2, t1 671; RV32I-NEXT: .LBB11_10: 672; RV32I-NEXT: neg a4, a2 673; RV32I-NEXT: xor t0, a5, a4 674; RV32I-NEXT: xor t3, a7, a4 675; RV32I-NEXT: sltu a5, t0, a4 676; RV32I-NEXT: add a6, t3, a2 677; RV32I-NEXT: add t0, t0, a2 678; RV32I-NEXT: sub t1, a6, a5 679; RV32I-NEXT: snez a6, t1 680; RV32I-NEXT: snez t2, t0 681; RV32I-NEXT: or a6, t2, a6 682; RV32I-NEXT: beqz a7, .LBB11_12 683; RV32I-NEXT: # %bb.11: 684; RV32I-NEXT: sltu a5, t3, a4 685; RV32I-NEXT: .LBB11_12: 686; RV32I-NEXT: xor a3, a3, a4 687; RV32I-NEXT: xor a1, a1, a4 688; RV32I-NEXT: add t1, t1, t2 689; RV32I-NEXT: neg a7, t0 690; RV32I-NEXT: add t0, a3, a2 691; RV32I-NEXT: sltu a3, a3, a4 692; RV32I-NEXT: add a1, a1, a2 693; RV32I-NEXT: neg a2, t1 694; RV32I-NEXT: sub a4, t0, a5 695; RV32I-NEXT: sub a1, a1, a3 696; RV32I-NEXT: sltu a3, t0, a5 697; RV32I-NEXT: neg a5, a4 698; RV32I-NEXT: sub a1, a1, a3 699; RV32I-NEXT: snez a3, a4 700; RV32I-NEXT: sltu a4, a5, a6 701; RV32I-NEXT: add a1, a1, a3 702; RV32I-NEXT: sub a3, a5, a6 703; RV32I-NEXT: neg a1, a1 704; RV32I-NEXT: sub a1, a1, a4 705; RV32I-NEXT: sw a7, 0(a0) 706; RV32I-NEXT: sw a2, 4(a0) 707; RV32I-NEXT: sw a3, 8(a0) 708; RV32I-NEXT: sw a1, 12(a0) 709; RV32I-NEXT: ret 710; 711; RV64I-LABEL: abd_ext_i128: 712; RV64I: # %bb.0: 713; RV64I-NEXT: sltu a4, a0, a2 714; RV64I-NEXT: sub a3, a1, a3 715; RV64I-NEXT: sub a3, a3, a4 716; RV64I-NEXT: sub a2, a0, a2 717; RV64I-NEXT: beq a3, a1, .LBB11_2 718; RV64I-NEXT: # %bb.1: 719; RV64I-NEXT: sltu a0, a1, a3 720; RV64I-NEXT: j .LBB11_3 721; RV64I-NEXT: .LBB11_2: 722; RV64I-NEXT: sltu a0, a0, a2 723; RV64I-NEXT: .LBB11_3: 724; RV64I-NEXT: neg a1, a0 725; RV64I-NEXT: xor a2, a2, a1 726; RV64I-NEXT: xor a3, a3, a1 727; RV64I-NEXT: sltu a1, a2, a1 728; RV64I-NEXT: add a3, a3, a0 729; RV64I-NEXT: add a0, a2, a0 730; RV64I-NEXT: sub a3, a3, a1 731; RV64I-NEXT: snez a1, a0 732; RV64I-NEXT: add a1, a3, a1 733; RV64I-NEXT: neg a1, a1 734; RV64I-NEXT: neg a0, a0 735; RV64I-NEXT: ret 736; 737; RV32ZBB-LABEL: abd_ext_i128: 738; RV32ZBB: # %bb.0: 739; RV32ZBB-NEXT: lw a5, 0(a2) 740; RV32ZBB-NEXT: lw a7, 4(a2) 741; RV32ZBB-NEXT: lw a3, 8(a2) 742; RV32ZBB-NEXT: lw t1, 12(a2) 743; RV32ZBB-NEXT: lw a4, 8(a1) 744; RV32ZBB-NEXT: lw a6, 12(a1) 745; RV32ZBB-NEXT: lw a2, 0(a1) 746; RV32ZBB-NEXT: lw t0, 4(a1) 747; RV32ZBB-NEXT: sltu a1, a4, a3 748; RV32ZBB-NEXT: sub t1, a6, t1 749; RV32ZBB-NEXT: sltu t2, a2, a5 750; RV32ZBB-NEXT: sub a1, t1, a1 751; RV32ZBB-NEXT: mv t1, t2 752; RV32ZBB-NEXT: beq t0, a7, .LBB11_2 753; RV32ZBB-NEXT: # %bb.1: 754; RV32ZBB-NEXT: sltu t1, t0, a7 755; RV32ZBB-NEXT: .LBB11_2: 756; RV32ZBB-NEXT: sub a3, a4, a3 757; RV32ZBB-NEXT: sltu t3, a3, t1 758; RV32ZBB-NEXT: sub a1, a1, t3 759; RV32ZBB-NEXT: sub a3, a3, t1 760; RV32ZBB-NEXT: beq a1, a6, .LBB11_4 761; RV32ZBB-NEXT: # %bb.3: 762; RV32ZBB-NEXT: sltu t1, a6, a1 763; RV32ZBB-NEXT: j .LBB11_5 764; RV32ZBB-NEXT: .LBB11_4: 765; RV32ZBB-NEXT: sltu t1, a4, a3 766; RV32ZBB-NEXT: .LBB11_5: 767; RV32ZBB-NEXT: sub a7, t0, a7 768; RV32ZBB-NEXT: sub a7, a7, t2 769; RV32ZBB-NEXT: sub a5, a2, a5 770; RV32ZBB-NEXT: beq a7, t0, .LBB11_7 771; RV32ZBB-NEXT: # %bb.6: 772; RV32ZBB-NEXT: sltu a2, t0, a7 773; RV32ZBB-NEXT: j .LBB11_8 774; RV32ZBB-NEXT: .LBB11_7: 775; RV32ZBB-NEXT: sltu a2, a2, a5 776; RV32ZBB-NEXT: .LBB11_8: 777; RV32ZBB-NEXT: xor a6, a1, a6 778; RV32ZBB-NEXT: xor a4, a3, a4 779; RV32ZBB-NEXT: or a4, a4, a6 780; RV32ZBB-NEXT: beqz a4, .LBB11_10 781; RV32ZBB-NEXT: # %bb.9: 782; RV32ZBB-NEXT: mv a2, t1 783; RV32ZBB-NEXT: .LBB11_10: 784; RV32ZBB-NEXT: neg a4, a2 785; RV32ZBB-NEXT: xor t0, a5, a4 786; RV32ZBB-NEXT: xor t3, a7, a4 787; RV32ZBB-NEXT: sltu a5, t0, a4 788; RV32ZBB-NEXT: add a6, t3, a2 789; RV32ZBB-NEXT: add t0, t0, a2 790; RV32ZBB-NEXT: sub t1, a6, a5 791; RV32ZBB-NEXT: snez a6, t1 792; RV32ZBB-NEXT: snez t2, t0 793; RV32ZBB-NEXT: or a6, t2, a6 794; RV32ZBB-NEXT: beqz a7, .LBB11_12 795; RV32ZBB-NEXT: # %bb.11: 796; RV32ZBB-NEXT: sltu a5, t3, a4 797; RV32ZBB-NEXT: .LBB11_12: 798; RV32ZBB-NEXT: xor a3, a3, a4 799; RV32ZBB-NEXT: xor a1, a1, a4 800; RV32ZBB-NEXT: add t1, t1, t2 801; RV32ZBB-NEXT: neg a7, t0 802; RV32ZBB-NEXT: add t0, a3, a2 803; RV32ZBB-NEXT: sltu a3, a3, a4 804; RV32ZBB-NEXT: add a1, a1, a2 805; RV32ZBB-NEXT: neg a2, t1 806; RV32ZBB-NEXT: sub a4, t0, a5 807; RV32ZBB-NEXT: sub a1, a1, a3 808; RV32ZBB-NEXT: sltu a3, t0, a5 809; RV32ZBB-NEXT: neg a5, a4 810; RV32ZBB-NEXT: sub a1, a1, a3 811; RV32ZBB-NEXT: snez a3, a4 812; RV32ZBB-NEXT: sltu a4, a5, a6 813; RV32ZBB-NEXT: add a1, a1, a3 814; RV32ZBB-NEXT: sub a3, a5, a6 815; RV32ZBB-NEXT: neg a1, a1 816; RV32ZBB-NEXT: sub a1, a1, a4 817; RV32ZBB-NEXT: sw a7, 0(a0) 818; RV32ZBB-NEXT: sw a2, 4(a0) 819; RV32ZBB-NEXT: sw a3, 8(a0) 820; RV32ZBB-NEXT: sw a1, 12(a0) 821; RV32ZBB-NEXT: ret 822; 823; RV64ZBB-LABEL: abd_ext_i128: 824; RV64ZBB: # %bb.0: 825; RV64ZBB-NEXT: sltu a4, a0, a2 826; RV64ZBB-NEXT: sub a3, a1, a3 827; RV64ZBB-NEXT: sub a3, a3, a4 828; RV64ZBB-NEXT: sub a2, a0, a2 829; RV64ZBB-NEXT: beq a3, a1, .LBB11_2 830; RV64ZBB-NEXT: # %bb.1: 831; RV64ZBB-NEXT: sltu a0, a1, a3 832; RV64ZBB-NEXT: j .LBB11_3 833; RV64ZBB-NEXT: .LBB11_2: 834; RV64ZBB-NEXT: sltu a0, a0, a2 835; RV64ZBB-NEXT: .LBB11_3: 836; RV64ZBB-NEXT: neg a1, a0 837; RV64ZBB-NEXT: xor a2, a2, a1 838; RV64ZBB-NEXT: xor a3, a3, a1 839; RV64ZBB-NEXT: sltu a1, a2, a1 840; RV64ZBB-NEXT: add a3, a3, a0 841; RV64ZBB-NEXT: add a0, a2, a0 842; RV64ZBB-NEXT: sub a3, a3, a1 843; RV64ZBB-NEXT: snez a1, a0 844; RV64ZBB-NEXT: add a1, a3, a1 845; RV64ZBB-NEXT: neg a1, a1 846; RV64ZBB-NEXT: neg a0, a0 847; RV64ZBB-NEXT: ret 848 %aext = zext i128 %a to i256 849 %bext = zext i128 %b to i256 850 %sub = sub i256 %aext, %bext 851 %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false) 852 %nabs = sub i256 0, %abs 853 %trunc = trunc i256 %nabs to i128 854 ret i128 %trunc 855} 856 857define i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind { 858; RV32I-LABEL: abd_ext_i128_undef: 859; RV32I: # %bb.0: 860; RV32I-NEXT: lw a5, 0(a2) 861; RV32I-NEXT: lw a7, 4(a2) 862; RV32I-NEXT: lw a3, 8(a2) 863; RV32I-NEXT: lw t1, 12(a2) 864; RV32I-NEXT: lw a4, 8(a1) 865; RV32I-NEXT: lw a6, 12(a1) 866; RV32I-NEXT: lw a2, 0(a1) 867; RV32I-NEXT: lw t0, 4(a1) 868; RV32I-NEXT: sltu a1, a4, a3 869; RV32I-NEXT: sub t1, a6, t1 870; RV32I-NEXT: sltu t2, a2, a5 871; RV32I-NEXT: sub a1, t1, a1 872; RV32I-NEXT: mv t1, t2 873; RV32I-NEXT: beq t0, a7, .LBB12_2 874; RV32I-NEXT: # %bb.1: 875; RV32I-NEXT: sltu t1, t0, a7 876; RV32I-NEXT: .LBB12_2: 877; RV32I-NEXT: sub a3, a4, a3 878; RV32I-NEXT: sltu t3, a3, t1 879; RV32I-NEXT: sub a1, a1, t3 880; RV32I-NEXT: sub a3, a3, t1 881; RV32I-NEXT: beq a1, a6, .LBB12_4 882; RV32I-NEXT: # %bb.3: 883; RV32I-NEXT: sltu t1, a6, a1 884; RV32I-NEXT: j .LBB12_5 885; RV32I-NEXT: .LBB12_4: 886; RV32I-NEXT: sltu t1, a4, a3 887; RV32I-NEXT: .LBB12_5: 888; RV32I-NEXT: sub a7, t0, a7 889; RV32I-NEXT: sub a7, a7, t2 890; RV32I-NEXT: sub a5, a2, a5 891; RV32I-NEXT: beq a7, t0, .LBB12_7 892; RV32I-NEXT: # %bb.6: 893; RV32I-NEXT: sltu a2, t0, a7 894; RV32I-NEXT: j .LBB12_8 895; RV32I-NEXT: .LBB12_7: 896; RV32I-NEXT: sltu a2, a2, a5 897; RV32I-NEXT: .LBB12_8: 898; RV32I-NEXT: xor a6, a1, a6 899; RV32I-NEXT: xor a4, a3, a4 900; RV32I-NEXT: or a4, a4, a6 901; RV32I-NEXT: beqz a4, .LBB12_10 902; RV32I-NEXT: # %bb.9: 903; RV32I-NEXT: mv a2, t1 904; RV32I-NEXT: .LBB12_10: 905; RV32I-NEXT: neg a4, a2 906; RV32I-NEXT: xor t0, a5, a4 907; RV32I-NEXT: xor t3, a7, a4 908; RV32I-NEXT: sltu a5, t0, a4 909; RV32I-NEXT: add a6, t3, a2 910; RV32I-NEXT: add t0, t0, a2 911; RV32I-NEXT: sub t1, a6, a5 912; RV32I-NEXT: snez a6, t1 913; RV32I-NEXT: snez t2, t0 914; RV32I-NEXT: or a6, t2, a6 915; RV32I-NEXT: beqz a7, .LBB12_12 916; RV32I-NEXT: # %bb.11: 917; RV32I-NEXT: sltu a5, t3, a4 918; RV32I-NEXT: .LBB12_12: 919; RV32I-NEXT: xor a3, a3, a4 920; RV32I-NEXT: xor a1, a1, a4 921; RV32I-NEXT: add t1, t1, t2 922; RV32I-NEXT: neg a7, t0 923; RV32I-NEXT: add t0, a3, a2 924; RV32I-NEXT: sltu a3, a3, a4 925; RV32I-NEXT: add a1, a1, a2 926; RV32I-NEXT: neg a2, t1 927; RV32I-NEXT: sub a4, t0, a5 928; RV32I-NEXT: sub a1, a1, a3 929; RV32I-NEXT: sltu a3, t0, a5 930; RV32I-NEXT: neg a5, a4 931; RV32I-NEXT: sub a1, a1, a3 932; RV32I-NEXT: snez a3, a4 933; RV32I-NEXT: sltu a4, a5, a6 934; RV32I-NEXT: add a1, a1, a3 935; RV32I-NEXT: sub a3, a5, a6 936; RV32I-NEXT: neg a1, a1 937; RV32I-NEXT: sub a1, a1, a4 938; RV32I-NEXT: sw a7, 0(a0) 939; RV32I-NEXT: sw a2, 4(a0) 940; RV32I-NEXT: sw a3, 8(a0) 941; RV32I-NEXT: sw a1, 12(a0) 942; RV32I-NEXT: ret 943; 944; RV64I-LABEL: abd_ext_i128_undef: 945; RV64I: # %bb.0: 946; RV64I-NEXT: sltu a4, a0, a2 947; RV64I-NEXT: sub a3, a1, a3 948; RV64I-NEXT: sub a3, a3, a4 949; RV64I-NEXT: sub a2, a0, a2 950; RV64I-NEXT: beq a3, a1, .LBB12_2 951; RV64I-NEXT: # %bb.1: 952; RV64I-NEXT: sltu a0, a1, a3 953; RV64I-NEXT: j .LBB12_3 954; RV64I-NEXT: .LBB12_2: 955; RV64I-NEXT: sltu a0, a0, a2 956; RV64I-NEXT: .LBB12_3: 957; RV64I-NEXT: neg a1, a0 958; RV64I-NEXT: xor a2, a2, a1 959; RV64I-NEXT: xor a3, a3, a1 960; RV64I-NEXT: sltu a1, a2, a1 961; RV64I-NEXT: add a3, a3, a0 962; RV64I-NEXT: add a0, a2, a0 963; RV64I-NEXT: sub a3, a3, a1 964; RV64I-NEXT: snez a1, a0 965; RV64I-NEXT: add a1, a3, a1 966; RV64I-NEXT: neg a1, a1 967; RV64I-NEXT: neg a0, a0 968; RV64I-NEXT: ret 969; 970; RV32ZBB-LABEL: abd_ext_i128_undef: 971; RV32ZBB: # %bb.0: 972; RV32ZBB-NEXT: lw a5, 0(a2) 973; RV32ZBB-NEXT: lw a7, 4(a2) 974; RV32ZBB-NEXT: lw a3, 8(a2) 975; RV32ZBB-NEXT: lw t1, 12(a2) 976; RV32ZBB-NEXT: lw a4, 8(a1) 977; RV32ZBB-NEXT: lw a6, 12(a1) 978; RV32ZBB-NEXT: lw a2, 0(a1) 979; RV32ZBB-NEXT: lw t0, 4(a1) 980; RV32ZBB-NEXT: sltu a1, a4, a3 981; RV32ZBB-NEXT: sub t1, a6, t1 982; RV32ZBB-NEXT: sltu t2, a2, a5 983; RV32ZBB-NEXT: sub a1, t1, a1 984; RV32ZBB-NEXT: mv t1, t2 985; RV32ZBB-NEXT: beq t0, a7, .LBB12_2 986; RV32ZBB-NEXT: # %bb.1: 987; RV32ZBB-NEXT: sltu t1, t0, a7 988; RV32ZBB-NEXT: .LBB12_2: 989; RV32ZBB-NEXT: sub a3, a4, a3 990; RV32ZBB-NEXT: sltu t3, a3, t1 991; RV32ZBB-NEXT: sub a1, a1, t3 992; RV32ZBB-NEXT: sub a3, a3, t1 993; RV32ZBB-NEXT: beq a1, a6, .LBB12_4 994; RV32ZBB-NEXT: # %bb.3: 995; RV32ZBB-NEXT: sltu t1, a6, a1 996; RV32ZBB-NEXT: j .LBB12_5 997; RV32ZBB-NEXT: .LBB12_4: 998; RV32ZBB-NEXT: sltu t1, a4, a3 999; RV32ZBB-NEXT: .LBB12_5: 1000; RV32ZBB-NEXT: sub a7, t0, a7 1001; RV32ZBB-NEXT: sub a7, a7, t2 1002; RV32ZBB-NEXT: sub a5, a2, a5 1003; RV32ZBB-NEXT: beq a7, t0, .LBB12_7 1004; RV32ZBB-NEXT: # %bb.6: 1005; RV32ZBB-NEXT: sltu a2, t0, a7 1006; RV32ZBB-NEXT: j .LBB12_8 1007; RV32ZBB-NEXT: .LBB12_7: 1008; RV32ZBB-NEXT: sltu a2, a2, a5 1009; RV32ZBB-NEXT: .LBB12_8: 1010; RV32ZBB-NEXT: xor a6, a1, a6 1011; RV32ZBB-NEXT: xor a4, a3, a4 1012; RV32ZBB-NEXT: or a4, a4, a6 1013; RV32ZBB-NEXT: beqz a4, .LBB12_10 1014; RV32ZBB-NEXT: # %bb.9: 1015; RV32ZBB-NEXT: mv a2, t1 1016; RV32ZBB-NEXT: .LBB12_10: 1017; RV32ZBB-NEXT: neg a4, a2 1018; RV32ZBB-NEXT: xor t0, a5, a4 1019; RV32ZBB-NEXT: xor t3, a7, a4 1020; RV32ZBB-NEXT: sltu a5, t0, a4 1021; RV32ZBB-NEXT: add a6, t3, a2 1022; RV32ZBB-NEXT: add t0, t0, a2 1023; RV32ZBB-NEXT: sub t1, a6, a5 1024; RV32ZBB-NEXT: snez a6, t1 1025; RV32ZBB-NEXT: snez t2, t0 1026; RV32ZBB-NEXT: or a6, t2, a6 1027; RV32ZBB-NEXT: beqz a7, .LBB12_12 1028; RV32ZBB-NEXT: # %bb.11: 1029; RV32ZBB-NEXT: sltu a5, t3, a4 1030; RV32ZBB-NEXT: .LBB12_12: 1031; RV32ZBB-NEXT: xor a3, a3, a4 1032; RV32ZBB-NEXT: xor a1, a1, a4 1033; RV32ZBB-NEXT: add t1, t1, t2 1034; RV32ZBB-NEXT: neg a7, t0 1035; RV32ZBB-NEXT: add t0, a3, a2 1036; RV32ZBB-NEXT: sltu a3, a3, a4 1037; RV32ZBB-NEXT: add a1, a1, a2 1038; RV32ZBB-NEXT: neg a2, t1 1039; RV32ZBB-NEXT: sub a4, t0, a5 1040; RV32ZBB-NEXT: sub a1, a1, a3 1041; RV32ZBB-NEXT: sltu a3, t0, a5 1042; RV32ZBB-NEXT: neg a5, a4 1043; RV32ZBB-NEXT: sub a1, a1, a3 1044; RV32ZBB-NEXT: snez a3, a4 1045; RV32ZBB-NEXT: sltu a4, a5, a6 1046; RV32ZBB-NEXT: add a1, a1, a3 1047; RV32ZBB-NEXT: sub a3, a5, a6 1048; RV32ZBB-NEXT: neg a1, a1 1049; RV32ZBB-NEXT: sub a1, a1, a4 1050; RV32ZBB-NEXT: sw a7, 0(a0) 1051; RV32ZBB-NEXT: sw a2, 4(a0) 1052; RV32ZBB-NEXT: sw a3, 8(a0) 1053; RV32ZBB-NEXT: sw a1, 12(a0) 1054; RV32ZBB-NEXT: ret 1055; 1056; RV64ZBB-LABEL: abd_ext_i128_undef: 1057; RV64ZBB: # %bb.0: 1058; RV64ZBB-NEXT: sltu a4, a0, a2 1059; RV64ZBB-NEXT: sub a3, a1, a3 1060; RV64ZBB-NEXT: sub a3, a3, a4 1061; RV64ZBB-NEXT: sub a2, a0, a2 1062; RV64ZBB-NEXT: beq a3, a1, .LBB12_2 1063; RV64ZBB-NEXT: # %bb.1: 1064; RV64ZBB-NEXT: sltu a0, a1, a3 1065; RV64ZBB-NEXT: j .LBB12_3 1066; RV64ZBB-NEXT: .LBB12_2: 1067; RV64ZBB-NEXT: sltu a0, a0, a2 1068; RV64ZBB-NEXT: .LBB12_3: 1069; RV64ZBB-NEXT: neg a1, a0 1070; RV64ZBB-NEXT: xor a2, a2, a1 1071; RV64ZBB-NEXT: xor a3, a3, a1 1072; RV64ZBB-NEXT: sltu a1, a2, a1 1073; RV64ZBB-NEXT: add a3, a3, a0 1074; RV64ZBB-NEXT: add a0, a2, a0 1075; RV64ZBB-NEXT: sub a3, a3, a1 1076; RV64ZBB-NEXT: snez a1, a0 1077; RV64ZBB-NEXT: add a1, a3, a1 1078; RV64ZBB-NEXT: neg a1, a1 1079; RV64ZBB-NEXT: neg a0, a0 1080; RV64ZBB-NEXT: ret 1081 %aext = zext i128 %a to i256 1082 %bext = zext i128 %b to i256 1083 %sub = sub i256 %aext, %bext 1084 %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true) 1085 %nabs = sub i256 0, %abs 1086 %trunc = trunc i256 %nabs to i128 1087 ret i128 %trunc 1088} 1089 1090; 1091; sub(umin(a,b),umax(a,b)) -> nabds(a,b) 1092; 1093 1094define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind { 1095; NOZBB-LABEL: abd_minmax_i8: 1096; NOZBB: # %bb.0: 1097; NOZBB-NEXT: andi a1, a1, 255 1098; NOZBB-NEXT: andi a0, a0, 255 1099; NOZBB-NEXT: mv a2, a0 1100; NOZBB-NEXT: bgeu a0, a1, .LBB13_3 1101; NOZBB-NEXT: # %bb.1: 1102; NOZBB-NEXT: bgeu a1, a0, .LBB13_4 1103; NOZBB-NEXT: .LBB13_2: 1104; NOZBB-NEXT: sub a0, a2, a0 1105; NOZBB-NEXT: ret 1106; NOZBB-NEXT: .LBB13_3: 1107; NOZBB-NEXT: mv a2, a1 1108; NOZBB-NEXT: bltu a1, a0, .LBB13_2 1109; NOZBB-NEXT: .LBB13_4: 1110; NOZBB-NEXT: sub a0, a2, a1 1111; NOZBB-NEXT: ret 1112; 1113; ZBB-LABEL: abd_minmax_i8: 1114; ZBB: # %bb.0: 1115; ZBB-NEXT: andi a1, a1, 255 1116; ZBB-NEXT: andi a0, a0, 255 1117; ZBB-NEXT: minu a2, a0, a1 1118; ZBB-NEXT: maxu a0, a0, a1 1119; ZBB-NEXT: sub a0, a2, a0 1120; ZBB-NEXT: ret 1121 %min = call i8 @llvm.umin.i8(i8 %a, i8 %b) 1122 %max = call i8 @llvm.umax.i8(i8 %a, i8 %b) 1123 %sub = sub i8 %min, %max 1124 ret i8 %sub 1125} 1126 1127define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind { 1128; RV32I-LABEL: abd_minmax_i16: 1129; RV32I: # %bb.0: 1130; RV32I-NEXT: lui a2, 16 1131; RV32I-NEXT: addi a2, a2, -1 1132; RV32I-NEXT: and a1, a1, a2 1133; RV32I-NEXT: and a0, a0, a2 1134; RV32I-NEXT: mv a2, a0 1135; RV32I-NEXT: bgeu a0, a1, .LBB14_3 1136; RV32I-NEXT: # %bb.1: 1137; RV32I-NEXT: bgeu a1, a0, .LBB14_4 1138; RV32I-NEXT: .LBB14_2: 1139; RV32I-NEXT: sub a0, a2, a0 1140; RV32I-NEXT: ret 1141; RV32I-NEXT: .LBB14_3: 1142; RV32I-NEXT: mv a2, a1 1143; RV32I-NEXT: bltu a1, a0, .LBB14_2 1144; RV32I-NEXT: .LBB14_4: 1145; RV32I-NEXT: sub a0, a2, a1 1146; RV32I-NEXT: ret 1147; 1148; RV64I-LABEL: abd_minmax_i16: 1149; RV64I: # %bb.0: 1150; RV64I-NEXT: lui a2, 16 1151; RV64I-NEXT: addiw a2, a2, -1 1152; RV64I-NEXT: and a1, a1, a2 1153; RV64I-NEXT: and a0, a0, a2 1154; RV64I-NEXT: mv a2, a0 1155; RV64I-NEXT: bgeu a0, a1, .LBB14_3 1156; RV64I-NEXT: # %bb.1: 1157; RV64I-NEXT: bgeu a1, a0, .LBB14_4 1158; RV64I-NEXT: .LBB14_2: 1159; RV64I-NEXT: sub a0, a2, a0 1160; RV64I-NEXT: ret 1161; RV64I-NEXT: .LBB14_3: 1162; RV64I-NEXT: mv a2, a1 1163; RV64I-NEXT: bltu a1, a0, .LBB14_2 1164; RV64I-NEXT: .LBB14_4: 1165; RV64I-NEXT: sub a0, a2, a1 1166; RV64I-NEXT: ret 1167; 1168; ZBB-LABEL: abd_minmax_i16: 1169; ZBB: # %bb.0: 1170; ZBB-NEXT: zext.h a1, a1 1171; ZBB-NEXT: zext.h a0, a0 1172; ZBB-NEXT: minu a2, a0, a1 1173; ZBB-NEXT: maxu a0, a0, a1 1174; ZBB-NEXT: sub a0, a2, a0 1175; ZBB-NEXT: ret 1176 %min = call i16 @llvm.umin.i16(i16 %a, i16 %b) 1177 %max = call i16 @llvm.umax.i16(i16 %a, i16 %b) 1178 %sub = sub i16 %min, %max 1179 ret i16 %sub 1180} 1181 1182define i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind { 1183; RV32I-LABEL: abd_minmax_i32: 1184; RV32I: # %bb.0: 1185; RV32I-NEXT: mv a2, a0 1186; RV32I-NEXT: bgeu a0, a1, .LBB15_3 1187; RV32I-NEXT: # %bb.1: 1188; RV32I-NEXT: bgeu a1, a0, .LBB15_4 1189; RV32I-NEXT: .LBB15_2: 1190; RV32I-NEXT: sub a0, a2, a0 1191; RV32I-NEXT: ret 1192; RV32I-NEXT: .LBB15_3: 1193; RV32I-NEXT: mv a2, a1 1194; RV32I-NEXT: bltu a1, a0, .LBB15_2 1195; RV32I-NEXT: .LBB15_4: 1196; RV32I-NEXT: sub a0, a2, a1 1197; RV32I-NEXT: ret 1198; 1199; RV64I-LABEL: abd_minmax_i32: 1200; RV64I: # %bb.0: 1201; RV64I-NEXT: sext.w a1, a1 1202; RV64I-NEXT: sext.w a0, a0 1203; RV64I-NEXT: mv a2, a0 1204; RV64I-NEXT: bgeu a0, a1, .LBB15_3 1205; RV64I-NEXT: # %bb.1: 1206; RV64I-NEXT: bgeu a1, a0, .LBB15_4 1207; RV64I-NEXT: .LBB15_2: 1208; RV64I-NEXT: subw a0, a2, a0 1209; RV64I-NEXT: ret 1210; RV64I-NEXT: .LBB15_3: 1211; RV64I-NEXT: mv a2, a1 1212; RV64I-NEXT: bltu a1, a0, .LBB15_2 1213; RV64I-NEXT: .LBB15_4: 1214; RV64I-NEXT: subw a0, a2, a1 1215; RV64I-NEXT: ret 1216; 1217; RV32ZBB-LABEL: abd_minmax_i32: 1218; RV32ZBB: # %bb.0: 1219; RV32ZBB-NEXT: minu a2, a0, a1 1220; RV32ZBB-NEXT: maxu a0, a0, a1 1221; RV32ZBB-NEXT: sub a0, a2, a0 1222; RV32ZBB-NEXT: ret 1223; 1224; RV64ZBB-LABEL: abd_minmax_i32: 1225; RV64ZBB: # %bb.0: 1226; RV64ZBB-NEXT: sext.w a1, a1 1227; RV64ZBB-NEXT: sext.w a0, a0 1228; RV64ZBB-NEXT: minu a2, a0, a1 1229; RV64ZBB-NEXT: maxu a0, a0, a1 1230; RV64ZBB-NEXT: subw a0, a2, a0 1231; RV64ZBB-NEXT: ret 1232 %min = call i32 @llvm.umin.i32(i32 %a, i32 %b) 1233 %max = call i32 @llvm.umax.i32(i32 %a, i32 %b) 1234 %sub = sub i32 %min, %max 1235 ret i32 %sub 1236} 1237 1238define i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind { 1239; RV32I-LABEL: abd_minmax_i64: 1240; RV32I: # %bb.0: 1241; RV32I-NEXT: beq a1, a3, .LBB16_2 1242; RV32I-NEXT: # %bb.1: 1243; RV32I-NEXT: sltu a6, a1, a3 1244; RV32I-NEXT: j .LBB16_3 1245; RV32I-NEXT: .LBB16_2: 1246; RV32I-NEXT: sltu a6, a0, a2 1247; RV32I-NEXT: .LBB16_3: 1248; RV32I-NEXT: mv a4, a1 1249; RV32I-NEXT: mv a5, a0 1250; RV32I-NEXT: bnez a6, .LBB16_5 1251; RV32I-NEXT: # %bb.4: 1252; RV32I-NEXT: mv a4, a3 1253; RV32I-NEXT: mv a5, a2 1254; RV32I-NEXT: .LBB16_5: 1255; RV32I-NEXT: beq a1, a3, .LBB16_7 1256; RV32I-NEXT: # %bb.6: 1257; RV32I-NEXT: sltu a6, a3, a1 1258; RV32I-NEXT: beqz a6, .LBB16_8 1259; RV32I-NEXT: j .LBB16_9 1260; RV32I-NEXT: .LBB16_7: 1261; RV32I-NEXT: sltu a6, a2, a0 1262; RV32I-NEXT: bnez a6, .LBB16_9 1263; RV32I-NEXT: .LBB16_8: 1264; RV32I-NEXT: mv a1, a3 1265; RV32I-NEXT: mv a0, a2 1266; RV32I-NEXT: .LBB16_9: 1267; RV32I-NEXT: sltu a2, a5, a0 1268; RV32I-NEXT: sub a1, a4, a1 1269; RV32I-NEXT: sub a1, a1, a2 1270; RV32I-NEXT: sub a0, a5, a0 1271; RV32I-NEXT: ret 1272; 1273; RV64I-LABEL: abd_minmax_i64: 1274; RV64I: # %bb.0: 1275; RV64I-NEXT: mv a2, a0 1276; RV64I-NEXT: bgeu a0, a1, .LBB16_3 1277; RV64I-NEXT: # %bb.1: 1278; RV64I-NEXT: bgeu a1, a0, .LBB16_4 1279; RV64I-NEXT: .LBB16_2: 1280; RV64I-NEXT: sub a0, a2, a0 1281; RV64I-NEXT: ret 1282; RV64I-NEXT: .LBB16_3: 1283; RV64I-NEXT: mv a2, a1 1284; RV64I-NEXT: bltu a1, a0, .LBB16_2 1285; RV64I-NEXT: .LBB16_4: 1286; RV64I-NEXT: sub a0, a2, a1 1287; RV64I-NEXT: ret 1288; 1289; RV32ZBB-LABEL: abd_minmax_i64: 1290; RV32ZBB: # %bb.0: 1291; RV32ZBB-NEXT: beq a1, a3, .LBB16_2 1292; RV32ZBB-NEXT: # %bb.1: 1293; RV32ZBB-NEXT: sltu a6, a1, a3 1294; RV32ZBB-NEXT: j .LBB16_3 1295; RV32ZBB-NEXT: .LBB16_2: 1296; RV32ZBB-NEXT: sltu a6, a0, a2 1297; RV32ZBB-NEXT: .LBB16_3: 1298; RV32ZBB-NEXT: mv a4, a1 1299; RV32ZBB-NEXT: mv a5, a0 1300; RV32ZBB-NEXT: bnez a6, .LBB16_5 1301; RV32ZBB-NEXT: # %bb.4: 1302; RV32ZBB-NEXT: mv a4, a3 1303; RV32ZBB-NEXT: mv a5, a2 1304; RV32ZBB-NEXT: .LBB16_5: 1305; RV32ZBB-NEXT: beq a1, a3, .LBB16_7 1306; RV32ZBB-NEXT: # %bb.6: 1307; RV32ZBB-NEXT: sltu a6, a3, a1 1308; RV32ZBB-NEXT: beqz a6, .LBB16_8 1309; RV32ZBB-NEXT: j .LBB16_9 1310; RV32ZBB-NEXT: .LBB16_7: 1311; RV32ZBB-NEXT: sltu a6, a2, a0 1312; RV32ZBB-NEXT: bnez a6, .LBB16_9 1313; RV32ZBB-NEXT: .LBB16_8: 1314; RV32ZBB-NEXT: mv a1, a3 1315; RV32ZBB-NEXT: mv a0, a2 1316; RV32ZBB-NEXT: .LBB16_9: 1317; RV32ZBB-NEXT: sltu a2, a5, a0 1318; RV32ZBB-NEXT: sub a1, a4, a1 1319; RV32ZBB-NEXT: sub a1, a1, a2 1320; RV32ZBB-NEXT: sub a0, a5, a0 1321; RV32ZBB-NEXT: ret 1322; 1323; RV64ZBB-LABEL: abd_minmax_i64: 1324; RV64ZBB: # %bb.0: 1325; RV64ZBB-NEXT: minu a2, a0, a1 1326; RV64ZBB-NEXT: maxu a0, a0, a1 1327; RV64ZBB-NEXT: sub a0, a2, a0 1328; RV64ZBB-NEXT: ret 1329 %min = call i64 @llvm.umin.i64(i64 %a, i64 %b) 1330 %max = call i64 @llvm.umax.i64(i64 %a, i64 %b) 1331 %sub = sub i64 %min, %max 1332 ret i64 %sub 1333} 1334 1335define i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind { 1336; RV32I-LABEL: abd_minmax_i128: 1337; RV32I: # %bb.0: 1338; RV32I-NEXT: lw a6, 4(a2) 1339; RV32I-NEXT: lw a7, 8(a2) 1340; RV32I-NEXT: lw t0, 12(a2) 1341; RV32I-NEXT: lw a5, 12(a1) 1342; RV32I-NEXT: lw a3, 4(a1) 1343; RV32I-NEXT: lw a4, 8(a1) 1344; RV32I-NEXT: beq a5, t0, .LBB17_2 1345; RV32I-NEXT: # %bb.1: 1346; RV32I-NEXT: sltu t1, a5, t0 1347; RV32I-NEXT: j .LBB17_3 1348; RV32I-NEXT: .LBB17_2: 1349; RV32I-NEXT: sltu t1, a4, a7 1350; RV32I-NEXT: .LBB17_3: 1351; RV32I-NEXT: lw t2, 0(a2) 1352; RV32I-NEXT: lw a1, 0(a1) 1353; RV32I-NEXT: beq a3, a6, .LBB17_5 1354; RV32I-NEXT: # %bb.4: 1355; RV32I-NEXT: sltu t6, a3, a6 1356; RV32I-NEXT: j .LBB17_6 1357; RV32I-NEXT: .LBB17_5: 1358; RV32I-NEXT: sltu t6, a1, t2 1359; RV32I-NEXT: .LBB17_6: 1360; RV32I-NEXT: xor a2, a5, t0 1361; RV32I-NEXT: xor t3, a4, a7 1362; RV32I-NEXT: or t5, t3, a2 1363; RV32I-NEXT: beqz t5, .LBB17_8 1364; RV32I-NEXT: # %bb.7: 1365; RV32I-NEXT: mv t6, t1 1366; RV32I-NEXT: .LBB17_8: 1367; RV32I-NEXT: mv a2, a1 1368; RV32I-NEXT: mv t1, a3 1369; RV32I-NEXT: mv t4, a5 1370; RV32I-NEXT: mv t3, a4 1371; RV32I-NEXT: bnez t6, .LBB17_10 1372; RV32I-NEXT: # %bb.9: 1373; RV32I-NEXT: mv a2, t2 1374; RV32I-NEXT: mv t1, a6 1375; RV32I-NEXT: mv t4, t0 1376; RV32I-NEXT: mv t3, a7 1377; RV32I-NEXT: .LBB17_10: 1378; RV32I-NEXT: beq a5, t0, .LBB17_12 1379; RV32I-NEXT: # %bb.11: 1380; RV32I-NEXT: sltu t6, t0, a5 1381; RV32I-NEXT: j .LBB17_13 1382; RV32I-NEXT: .LBB17_12: 1383; RV32I-NEXT: sltu t6, a7, a4 1384; RV32I-NEXT: .LBB17_13: 1385; RV32I-NEXT: addi sp, sp, -16 1386; RV32I-NEXT: sw s0, 12(sp) # 4-byte Folded Spill 1387; RV32I-NEXT: beq a3, a6, .LBB17_15 1388; RV32I-NEXT: # %bb.14: 1389; RV32I-NEXT: sltu s0, a6, a3 1390; RV32I-NEXT: bnez t5, .LBB17_16 1391; RV32I-NEXT: j .LBB17_17 1392; RV32I-NEXT: .LBB17_15: 1393; RV32I-NEXT: sltu s0, t2, a1 1394; RV32I-NEXT: beqz t5, .LBB17_17 1395; RV32I-NEXT: .LBB17_16: 1396; RV32I-NEXT: mv s0, t6 1397; RV32I-NEXT: .LBB17_17: 1398; RV32I-NEXT: bnez s0, .LBB17_19 1399; RV32I-NEXT: # %bb.18: 1400; RV32I-NEXT: mv a1, t2 1401; RV32I-NEXT: mv a3, a6 1402; RV32I-NEXT: mv a5, t0 1403; RV32I-NEXT: mv a4, a7 1404; RV32I-NEXT: .LBB17_19: 1405; RV32I-NEXT: sltu a7, t3, a4 1406; RV32I-NEXT: sub a5, t4, a5 1407; RV32I-NEXT: sltu a6, a2, a1 1408; RV32I-NEXT: sub a5, a5, a7 1409; RV32I-NEXT: mv a7, a6 1410; RV32I-NEXT: beq t1, a3, .LBB17_21 1411; RV32I-NEXT: # %bb.20: 1412; RV32I-NEXT: sltu a7, t1, a3 1413; RV32I-NEXT: .LBB17_21: 1414; RV32I-NEXT: sub a4, t3, a4 1415; RV32I-NEXT: sub a3, t1, a3 1416; RV32I-NEXT: sub a2, a2, a1 1417; RV32I-NEXT: sltu a1, a4, a7 1418; RV32I-NEXT: sub a4, a4, a7 1419; RV32I-NEXT: sub a3, a3, a6 1420; RV32I-NEXT: sub a5, a5, a1 1421; RV32I-NEXT: sw a2, 0(a0) 1422; RV32I-NEXT: sw a3, 4(a0) 1423; RV32I-NEXT: sw a4, 8(a0) 1424; RV32I-NEXT: sw a5, 12(a0) 1425; RV32I-NEXT: lw s0, 12(sp) # 4-byte Folded Reload 1426; RV32I-NEXT: addi sp, sp, 16 1427; RV32I-NEXT: ret 1428; 1429; RV64I-LABEL: abd_minmax_i128: 1430; RV64I: # %bb.0: 1431; RV64I-NEXT: beq a1, a3, .LBB17_2 1432; RV64I-NEXT: # %bb.1: 1433; RV64I-NEXT: sltu a6, a1, a3 1434; RV64I-NEXT: j .LBB17_3 1435; RV64I-NEXT: .LBB17_2: 1436; RV64I-NEXT: sltu a6, a0, a2 1437; RV64I-NEXT: .LBB17_3: 1438; RV64I-NEXT: mv a4, a1 1439; RV64I-NEXT: mv a5, a0 1440; RV64I-NEXT: bnez a6, .LBB17_5 1441; RV64I-NEXT: # %bb.4: 1442; RV64I-NEXT: mv a4, a3 1443; RV64I-NEXT: mv a5, a2 1444; RV64I-NEXT: .LBB17_5: 1445; RV64I-NEXT: beq a1, a3, .LBB17_7 1446; RV64I-NEXT: # %bb.6: 1447; RV64I-NEXT: sltu a6, a3, a1 1448; RV64I-NEXT: beqz a6, .LBB17_8 1449; RV64I-NEXT: j .LBB17_9 1450; RV64I-NEXT: .LBB17_7: 1451; RV64I-NEXT: sltu a6, a2, a0 1452; RV64I-NEXT: bnez a6, .LBB17_9 1453; RV64I-NEXT: .LBB17_8: 1454; RV64I-NEXT: mv a1, a3 1455; RV64I-NEXT: mv a0, a2 1456; RV64I-NEXT: .LBB17_9: 1457; RV64I-NEXT: sltu a2, a5, a0 1458; RV64I-NEXT: sub a1, a4, a1 1459; RV64I-NEXT: sub a1, a1, a2 1460; RV64I-NEXT: sub a0, a5, a0 1461; RV64I-NEXT: ret 1462; 1463; RV32ZBB-LABEL: abd_minmax_i128: 1464; RV32ZBB: # %bb.0: 1465; RV32ZBB-NEXT: lw a6, 4(a2) 1466; RV32ZBB-NEXT: lw a7, 8(a2) 1467; RV32ZBB-NEXT: lw t0, 12(a2) 1468; RV32ZBB-NEXT: lw a5, 12(a1) 1469; RV32ZBB-NEXT: lw a3, 4(a1) 1470; RV32ZBB-NEXT: lw a4, 8(a1) 1471; RV32ZBB-NEXT: beq a5, t0, .LBB17_2 1472; RV32ZBB-NEXT: # %bb.1: 1473; RV32ZBB-NEXT: sltu t1, a5, t0 1474; RV32ZBB-NEXT: j .LBB17_3 1475; RV32ZBB-NEXT: .LBB17_2: 1476; RV32ZBB-NEXT: sltu t1, a4, a7 1477; RV32ZBB-NEXT: .LBB17_3: 1478; RV32ZBB-NEXT: lw t2, 0(a2) 1479; RV32ZBB-NEXT: lw a1, 0(a1) 1480; RV32ZBB-NEXT: beq a3, a6, .LBB17_5 1481; RV32ZBB-NEXT: # %bb.4: 1482; RV32ZBB-NEXT: sltu t6, a3, a6 1483; RV32ZBB-NEXT: j .LBB17_6 1484; RV32ZBB-NEXT: .LBB17_5: 1485; RV32ZBB-NEXT: sltu t6, a1, t2 1486; RV32ZBB-NEXT: .LBB17_6: 1487; RV32ZBB-NEXT: xor a2, a5, t0 1488; RV32ZBB-NEXT: xor t3, a4, a7 1489; RV32ZBB-NEXT: or t5, t3, a2 1490; RV32ZBB-NEXT: beqz t5, .LBB17_8 1491; RV32ZBB-NEXT: # %bb.7: 1492; RV32ZBB-NEXT: mv t6, t1 1493; RV32ZBB-NEXT: .LBB17_8: 1494; RV32ZBB-NEXT: mv a2, a1 1495; RV32ZBB-NEXT: mv t1, a3 1496; RV32ZBB-NEXT: mv t4, a5 1497; RV32ZBB-NEXT: mv t3, a4 1498; RV32ZBB-NEXT: bnez t6, .LBB17_10 1499; RV32ZBB-NEXT: # %bb.9: 1500; RV32ZBB-NEXT: mv a2, t2 1501; RV32ZBB-NEXT: mv t1, a6 1502; RV32ZBB-NEXT: mv t4, t0 1503; RV32ZBB-NEXT: mv t3, a7 1504; RV32ZBB-NEXT: .LBB17_10: 1505; RV32ZBB-NEXT: beq a5, t0, .LBB17_12 1506; RV32ZBB-NEXT: # %bb.11: 1507; RV32ZBB-NEXT: sltu t6, t0, a5 1508; RV32ZBB-NEXT: j .LBB17_13 1509; RV32ZBB-NEXT: .LBB17_12: 1510; RV32ZBB-NEXT: sltu t6, a7, a4 1511; RV32ZBB-NEXT: .LBB17_13: 1512; RV32ZBB-NEXT: addi sp, sp, -16 1513; RV32ZBB-NEXT: sw s0, 12(sp) # 4-byte Folded Spill 1514; RV32ZBB-NEXT: beq a3, a6, .LBB17_15 1515; RV32ZBB-NEXT: # %bb.14: 1516; RV32ZBB-NEXT: sltu s0, a6, a3 1517; RV32ZBB-NEXT: bnez t5, .LBB17_16 1518; RV32ZBB-NEXT: j .LBB17_17 1519; RV32ZBB-NEXT: .LBB17_15: 1520; RV32ZBB-NEXT: sltu s0, t2, a1 1521; RV32ZBB-NEXT: beqz t5, .LBB17_17 1522; RV32ZBB-NEXT: .LBB17_16: 1523; RV32ZBB-NEXT: mv s0, t6 1524; RV32ZBB-NEXT: .LBB17_17: 1525; RV32ZBB-NEXT: bnez s0, .LBB17_19 1526; RV32ZBB-NEXT: # %bb.18: 1527; RV32ZBB-NEXT: mv a1, t2 1528; RV32ZBB-NEXT: mv a3, a6 1529; RV32ZBB-NEXT: mv a5, t0 1530; RV32ZBB-NEXT: mv a4, a7 1531; RV32ZBB-NEXT: .LBB17_19: 1532; RV32ZBB-NEXT: sltu a7, t3, a4 1533; RV32ZBB-NEXT: sub a5, t4, a5 1534; RV32ZBB-NEXT: sltu a6, a2, a1 1535; RV32ZBB-NEXT: sub a5, a5, a7 1536; RV32ZBB-NEXT: mv a7, a6 1537; RV32ZBB-NEXT: beq t1, a3, .LBB17_21 1538; RV32ZBB-NEXT: # %bb.20: 1539; RV32ZBB-NEXT: sltu a7, t1, a3 1540; RV32ZBB-NEXT: .LBB17_21: 1541; RV32ZBB-NEXT: sub a4, t3, a4 1542; RV32ZBB-NEXT: sub a3, t1, a3 1543; RV32ZBB-NEXT: sub a2, a2, a1 1544; RV32ZBB-NEXT: sltu a1, a4, a7 1545; RV32ZBB-NEXT: sub a4, a4, a7 1546; RV32ZBB-NEXT: sub a3, a3, a6 1547; RV32ZBB-NEXT: sub a5, a5, a1 1548; RV32ZBB-NEXT: sw a2, 0(a0) 1549; RV32ZBB-NEXT: sw a3, 4(a0) 1550; RV32ZBB-NEXT: sw a4, 8(a0) 1551; RV32ZBB-NEXT: sw a5, 12(a0) 1552; RV32ZBB-NEXT: lw s0, 12(sp) # 4-byte Folded Reload 1553; RV32ZBB-NEXT: addi sp, sp, 16 1554; RV32ZBB-NEXT: ret 1555; 1556; RV64ZBB-LABEL: abd_minmax_i128: 1557; RV64ZBB: # %bb.0: 1558; RV64ZBB-NEXT: beq a1, a3, .LBB17_2 1559; RV64ZBB-NEXT: # %bb.1: 1560; RV64ZBB-NEXT: sltu a6, a1, a3 1561; RV64ZBB-NEXT: j .LBB17_3 1562; RV64ZBB-NEXT: .LBB17_2: 1563; RV64ZBB-NEXT: sltu a6, a0, a2 1564; RV64ZBB-NEXT: .LBB17_3: 1565; RV64ZBB-NEXT: mv a4, a1 1566; RV64ZBB-NEXT: mv a5, a0 1567; RV64ZBB-NEXT: bnez a6, .LBB17_5 1568; RV64ZBB-NEXT: # %bb.4: 1569; RV64ZBB-NEXT: mv a4, a3 1570; RV64ZBB-NEXT: mv a5, a2 1571; RV64ZBB-NEXT: .LBB17_5: 1572; RV64ZBB-NEXT: beq a1, a3, .LBB17_7 1573; RV64ZBB-NEXT: # %bb.6: 1574; RV64ZBB-NEXT: sltu a6, a3, a1 1575; RV64ZBB-NEXT: beqz a6, .LBB17_8 1576; RV64ZBB-NEXT: j .LBB17_9 1577; RV64ZBB-NEXT: .LBB17_7: 1578; RV64ZBB-NEXT: sltu a6, a2, a0 1579; RV64ZBB-NEXT: bnez a6, .LBB17_9 1580; RV64ZBB-NEXT: .LBB17_8: 1581; RV64ZBB-NEXT: mv a1, a3 1582; RV64ZBB-NEXT: mv a0, a2 1583; RV64ZBB-NEXT: .LBB17_9: 1584; RV64ZBB-NEXT: sltu a2, a5, a0 1585; RV64ZBB-NEXT: sub a1, a4, a1 1586; RV64ZBB-NEXT: sub a1, a1, a2 1587; RV64ZBB-NEXT: sub a0, a5, a0 1588; RV64ZBB-NEXT: ret 1589 %min = call i128 @llvm.umin.i128(i128 %a, i128 %b) 1590 %max = call i128 @llvm.umax.i128(i128 %a, i128 %b) 1591 %sub = sub i128 %min, %max 1592 ret i128 %sub 1593} 1594 1595; 1596; select(icmp(a,b),sub(a,b),sub(b,a)) -> nabds(a,b) 1597; 1598 1599define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind { 1600; NOZBB-LABEL: abd_cmp_i8: 1601; NOZBB: # %bb.0: 1602; NOZBB-NEXT: andi a2, a0, 255 1603; NOZBB-NEXT: andi a3, a1, 255 1604; NOZBB-NEXT: bgeu a3, a2, .LBB18_2 1605; NOZBB-NEXT: # %bb.1: 1606; NOZBB-NEXT: sub a0, a1, a0 1607; NOZBB-NEXT: ret 1608; NOZBB-NEXT: .LBB18_2: 1609; NOZBB-NEXT: sub a0, a0, a1 1610; NOZBB-NEXT: ret 1611; 1612; ZBB-LABEL: abd_cmp_i8: 1613; ZBB: # %bb.0: 1614; ZBB-NEXT: andi a2, a0, 255 1615; ZBB-NEXT: andi a3, a1, 255 1616; ZBB-NEXT: bgeu a3, a2, .LBB18_2 1617; ZBB-NEXT: # %bb.1: 1618; ZBB-NEXT: sub a0, a1, a0 1619; ZBB-NEXT: ret 1620; ZBB-NEXT: .LBB18_2: 1621; ZBB-NEXT: sub a0, a0, a1 1622; ZBB-NEXT: ret 1623 %cmp = icmp ule i8 %a, %b 1624 %ab = sub i8 %a, %b 1625 %ba = sub i8 %b, %a 1626 %sel = select i1 %cmp, i8 %ab, i8 %ba 1627 ret i8 %sel 1628} 1629 1630define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind { 1631; RV32I-LABEL: abd_cmp_i16: 1632; RV32I: # %bb.0: 1633; RV32I-NEXT: lui a2, 16 1634; RV32I-NEXT: addi a2, a2, -1 1635; RV32I-NEXT: and a3, a1, a2 1636; RV32I-NEXT: and a2, a0, a2 1637; RV32I-NEXT: bltu a2, a3, .LBB19_2 1638; RV32I-NEXT: # %bb.1: 1639; RV32I-NEXT: sub a0, a1, a0 1640; RV32I-NEXT: ret 1641; RV32I-NEXT: .LBB19_2: 1642; RV32I-NEXT: sub a0, a0, a1 1643; RV32I-NEXT: ret 1644; 1645; RV64I-LABEL: abd_cmp_i16: 1646; RV64I: # %bb.0: 1647; RV64I-NEXT: lui a2, 16 1648; RV64I-NEXT: addiw a2, a2, -1 1649; RV64I-NEXT: and a3, a1, a2 1650; RV64I-NEXT: and a2, a0, a2 1651; RV64I-NEXT: bltu a2, a3, .LBB19_2 1652; RV64I-NEXT: # %bb.1: 1653; RV64I-NEXT: sub a0, a1, a0 1654; RV64I-NEXT: ret 1655; RV64I-NEXT: .LBB19_2: 1656; RV64I-NEXT: sub a0, a0, a1 1657; RV64I-NEXT: ret 1658; 1659; ZBB-LABEL: abd_cmp_i16: 1660; ZBB: # %bb.0: 1661; ZBB-NEXT: zext.h a2, a1 1662; ZBB-NEXT: zext.h a3, a0 1663; ZBB-NEXT: bltu a3, a2, .LBB19_2 1664; ZBB-NEXT: # %bb.1: 1665; ZBB-NEXT: sub a0, a1, a0 1666; ZBB-NEXT: ret 1667; ZBB-NEXT: .LBB19_2: 1668; ZBB-NEXT: sub a0, a0, a1 1669; ZBB-NEXT: ret 1670 %cmp = icmp ult i16 %a, %b 1671 %ab = sub i16 %a, %b 1672 %ba = sub i16 %b, %a 1673 %sel = select i1 %cmp, i16 %ab, i16 %ba 1674 ret i16 %sel 1675} 1676 1677define i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind { 1678; RV32I-LABEL: abd_cmp_i32: 1679; RV32I: # %bb.0: 1680; RV32I-NEXT: bgeu a0, a1, .LBB20_2 1681; RV32I-NEXT: # %bb.1: 1682; RV32I-NEXT: sub a0, a0, a1 1683; RV32I-NEXT: ret 1684; RV32I-NEXT: .LBB20_2: 1685; RV32I-NEXT: sub a0, a1, a0 1686; RV32I-NEXT: ret 1687; 1688; RV64I-LABEL: abd_cmp_i32: 1689; RV64I: # %bb.0: 1690; RV64I-NEXT: sext.w a2, a1 1691; RV64I-NEXT: sext.w a3, a0 1692; RV64I-NEXT: bgeu a3, a2, .LBB20_2 1693; RV64I-NEXT: # %bb.1: 1694; RV64I-NEXT: subw a0, a0, a1 1695; RV64I-NEXT: ret 1696; RV64I-NEXT: .LBB20_2: 1697; RV64I-NEXT: subw a0, a1, a0 1698; RV64I-NEXT: ret 1699; 1700; RV32ZBB-LABEL: abd_cmp_i32: 1701; RV32ZBB: # %bb.0: 1702; RV32ZBB-NEXT: bgeu a0, a1, .LBB20_2 1703; RV32ZBB-NEXT: # %bb.1: 1704; RV32ZBB-NEXT: sub a0, a0, a1 1705; RV32ZBB-NEXT: ret 1706; RV32ZBB-NEXT: .LBB20_2: 1707; RV32ZBB-NEXT: sub a0, a1, a0 1708; RV32ZBB-NEXT: ret 1709; 1710; RV64ZBB-LABEL: abd_cmp_i32: 1711; RV64ZBB: # %bb.0: 1712; RV64ZBB-NEXT: sext.w a2, a1 1713; RV64ZBB-NEXT: sext.w a3, a0 1714; RV64ZBB-NEXT: bgeu a3, a2, .LBB20_2 1715; RV64ZBB-NEXT: # %bb.1: 1716; RV64ZBB-NEXT: subw a0, a0, a1 1717; RV64ZBB-NEXT: ret 1718; RV64ZBB-NEXT: .LBB20_2: 1719; RV64ZBB-NEXT: subw a0, a1, a0 1720; RV64ZBB-NEXT: ret 1721 %cmp = icmp uge i32 %a, %b 1722 %ab = sub i32 %a, %b 1723 %ba = sub i32 %b, %a 1724 %sel = select i1 %cmp, i32 %ba, i32 %ab 1725 ret i32 %sel 1726} 1727 1728define i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind { 1729; RV32I-LABEL: abd_cmp_i64: 1730; RV32I: # %bb.0: 1731; RV32I-NEXT: sltu a4, a0, a2 1732; RV32I-NEXT: mv a5, a4 1733; RV32I-NEXT: beq a1, a3, .LBB21_2 1734; RV32I-NEXT: # %bb.1: 1735; RV32I-NEXT: sltu a5, a1, a3 1736; RV32I-NEXT: .LBB21_2: 1737; RV32I-NEXT: bnez a5, .LBB21_4 1738; RV32I-NEXT: # %bb.3: 1739; RV32I-NEXT: sltu a4, a2, a0 1740; RV32I-NEXT: sub a1, a3, a1 1741; RV32I-NEXT: sub a1, a1, a4 1742; RV32I-NEXT: sub a0, a2, a0 1743; RV32I-NEXT: ret 1744; RV32I-NEXT: .LBB21_4: 1745; RV32I-NEXT: sub a1, a1, a3 1746; RV32I-NEXT: sub a1, a1, a4 1747; RV32I-NEXT: sub a0, a0, a2 1748; RV32I-NEXT: ret 1749; 1750; RV64I-LABEL: abd_cmp_i64: 1751; RV64I: # %bb.0: 1752; RV64I-NEXT: bltu a0, a1, .LBB21_2 1753; RV64I-NEXT: # %bb.1: 1754; RV64I-NEXT: sub a0, a1, a0 1755; RV64I-NEXT: ret 1756; RV64I-NEXT: .LBB21_2: 1757; RV64I-NEXT: sub a0, a0, a1 1758; RV64I-NEXT: ret 1759; 1760; RV32ZBB-LABEL: abd_cmp_i64: 1761; RV32ZBB: # %bb.0: 1762; RV32ZBB-NEXT: sltu a4, a0, a2 1763; RV32ZBB-NEXT: mv a5, a4 1764; RV32ZBB-NEXT: beq a1, a3, .LBB21_2 1765; RV32ZBB-NEXT: # %bb.1: 1766; RV32ZBB-NEXT: sltu a5, a1, a3 1767; RV32ZBB-NEXT: .LBB21_2: 1768; RV32ZBB-NEXT: bnez a5, .LBB21_4 1769; RV32ZBB-NEXT: # %bb.3: 1770; RV32ZBB-NEXT: sltu a4, a2, a0 1771; RV32ZBB-NEXT: sub a1, a3, a1 1772; RV32ZBB-NEXT: sub a1, a1, a4 1773; RV32ZBB-NEXT: sub a0, a2, a0 1774; RV32ZBB-NEXT: ret 1775; RV32ZBB-NEXT: .LBB21_4: 1776; RV32ZBB-NEXT: sub a1, a1, a3 1777; RV32ZBB-NEXT: sub a1, a1, a4 1778; RV32ZBB-NEXT: sub a0, a0, a2 1779; RV32ZBB-NEXT: ret 1780; 1781; RV64ZBB-LABEL: abd_cmp_i64: 1782; RV64ZBB: # %bb.0: 1783; RV64ZBB-NEXT: bltu a0, a1, .LBB21_2 1784; RV64ZBB-NEXT: # %bb.1: 1785; RV64ZBB-NEXT: sub a0, a1, a0 1786; RV64ZBB-NEXT: ret 1787; RV64ZBB-NEXT: .LBB21_2: 1788; RV64ZBB-NEXT: sub a0, a0, a1 1789; RV64ZBB-NEXT: ret 1790 %cmp = icmp ult i64 %a, %b 1791 %ab = sub i64 %a, %b 1792 %ba = sub i64 %b, %a 1793 %sel = select i1 %cmp, i64 %ab, i64 %ba 1794 ret i64 %sel 1795} 1796 1797define i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind { 1798; RV32I-LABEL: abd_cmp_i128: 1799; RV32I: # %bb.0: 1800; RV32I-NEXT: lw a3, 0(a2) 1801; RV32I-NEXT: lw a4, 4(a2) 1802; RV32I-NEXT: lw a5, 8(a2) 1803; RV32I-NEXT: lw a7, 12(a2) 1804; RV32I-NEXT: lw a6, 8(a1) 1805; RV32I-NEXT: lw t0, 12(a1) 1806; RV32I-NEXT: lw a2, 0(a1) 1807; RV32I-NEXT: lw a1, 4(a1) 1808; RV32I-NEXT: sltu t1, a6, a5 1809; RV32I-NEXT: mv t4, t1 1810; RV32I-NEXT: beq t0, a7, .LBB22_2 1811; RV32I-NEXT: # %bb.1: 1812; RV32I-NEXT: sltu t4, t0, a7 1813; RV32I-NEXT: .LBB22_2: 1814; RV32I-NEXT: sltu t2, a2, a3 1815; RV32I-NEXT: mv t3, t2 1816; RV32I-NEXT: beq a1, a4, .LBB22_4 1817; RV32I-NEXT: # %bb.3: 1818; RV32I-NEXT: sltu t3, a1, a4 1819; RV32I-NEXT: .LBB22_4: 1820; RV32I-NEXT: xor t5, t0, a7 1821; RV32I-NEXT: xor t6, a6, a5 1822; RV32I-NEXT: or t5, t6, t5 1823; RV32I-NEXT: mv t6, t3 1824; RV32I-NEXT: beqz t5, .LBB22_6 1825; RV32I-NEXT: # %bb.5: 1826; RV32I-NEXT: mv t6, t4 1827; RV32I-NEXT: .LBB22_6: 1828; RV32I-NEXT: sltu t4, a3, a2 1829; RV32I-NEXT: mv t5, t4 1830; RV32I-NEXT: beq a1, a4, .LBB22_8 1831; RV32I-NEXT: # %bb.7: 1832; RV32I-NEXT: sltu t5, a4, a1 1833; RV32I-NEXT: .LBB22_8: 1834; RV32I-NEXT: bnez t6, .LBB22_10 1835; RV32I-NEXT: # %bb.9: 1836; RV32I-NEXT: sltu t1, a5, a6 1837; RV32I-NEXT: sub a7, a7, t0 1838; RV32I-NEXT: sub a5, a5, a6 1839; RV32I-NEXT: sub a4, a4, a1 1840; RV32I-NEXT: sub a6, a7, t1 1841; RV32I-NEXT: sltu a7, a5, t5 1842; RV32I-NEXT: sub a1, a5, t5 1843; RV32I-NEXT: sub a5, a4, t4 1844; RV32I-NEXT: sub a4, a6, a7 1845; RV32I-NEXT: sub a2, a3, a2 1846; RV32I-NEXT: j .LBB22_11 1847; RV32I-NEXT: .LBB22_10: 1848; RV32I-NEXT: sub a7, t0, a7 1849; RV32I-NEXT: sub a5, a6, a5 1850; RV32I-NEXT: sub a4, a1, a4 1851; RV32I-NEXT: sub a6, a7, t1 1852; RV32I-NEXT: sltu a7, a5, t3 1853; RV32I-NEXT: sub a1, a5, t3 1854; RV32I-NEXT: sub a5, a4, t2 1855; RV32I-NEXT: sub a4, a6, a7 1856; RV32I-NEXT: sub a2, a2, a3 1857; RV32I-NEXT: .LBB22_11: 1858; RV32I-NEXT: sw a2, 0(a0) 1859; RV32I-NEXT: sw a5, 4(a0) 1860; RV32I-NEXT: sw a1, 8(a0) 1861; RV32I-NEXT: sw a4, 12(a0) 1862; RV32I-NEXT: ret 1863; 1864; RV64I-LABEL: abd_cmp_i128: 1865; RV64I: # %bb.0: 1866; RV64I-NEXT: sltu a4, a0, a2 1867; RV64I-NEXT: mv a5, a4 1868; RV64I-NEXT: beq a1, a3, .LBB22_2 1869; RV64I-NEXT: # %bb.1: 1870; RV64I-NEXT: sltu a5, a1, a3 1871; RV64I-NEXT: .LBB22_2: 1872; RV64I-NEXT: bnez a5, .LBB22_4 1873; RV64I-NEXT: # %bb.3: 1874; RV64I-NEXT: sltu a4, a2, a0 1875; RV64I-NEXT: sub a1, a3, a1 1876; RV64I-NEXT: sub a1, a1, a4 1877; RV64I-NEXT: sub a0, a2, a0 1878; RV64I-NEXT: ret 1879; RV64I-NEXT: .LBB22_4: 1880; RV64I-NEXT: sub a1, a1, a3 1881; RV64I-NEXT: sub a1, a1, a4 1882; RV64I-NEXT: sub a0, a0, a2 1883; RV64I-NEXT: ret 1884; 1885; RV32ZBB-LABEL: abd_cmp_i128: 1886; RV32ZBB: # %bb.0: 1887; RV32ZBB-NEXT: lw a3, 0(a2) 1888; RV32ZBB-NEXT: lw a4, 4(a2) 1889; RV32ZBB-NEXT: lw a5, 8(a2) 1890; RV32ZBB-NEXT: lw a7, 12(a2) 1891; RV32ZBB-NEXT: lw a6, 8(a1) 1892; RV32ZBB-NEXT: lw t0, 12(a1) 1893; RV32ZBB-NEXT: lw a2, 0(a1) 1894; RV32ZBB-NEXT: lw a1, 4(a1) 1895; RV32ZBB-NEXT: sltu t1, a6, a5 1896; RV32ZBB-NEXT: mv t4, t1 1897; RV32ZBB-NEXT: beq t0, a7, .LBB22_2 1898; RV32ZBB-NEXT: # %bb.1: 1899; RV32ZBB-NEXT: sltu t4, t0, a7 1900; RV32ZBB-NEXT: .LBB22_2: 1901; RV32ZBB-NEXT: sltu t2, a2, a3 1902; RV32ZBB-NEXT: mv t3, t2 1903; RV32ZBB-NEXT: beq a1, a4, .LBB22_4 1904; RV32ZBB-NEXT: # %bb.3: 1905; RV32ZBB-NEXT: sltu t3, a1, a4 1906; RV32ZBB-NEXT: .LBB22_4: 1907; RV32ZBB-NEXT: xor t5, t0, a7 1908; RV32ZBB-NEXT: xor t6, a6, a5 1909; RV32ZBB-NEXT: or t5, t6, t5 1910; RV32ZBB-NEXT: mv t6, t3 1911; RV32ZBB-NEXT: beqz t5, .LBB22_6 1912; RV32ZBB-NEXT: # %bb.5: 1913; RV32ZBB-NEXT: mv t6, t4 1914; RV32ZBB-NEXT: .LBB22_6: 1915; RV32ZBB-NEXT: sltu t4, a3, a2 1916; RV32ZBB-NEXT: mv t5, t4 1917; RV32ZBB-NEXT: beq a1, a4, .LBB22_8 1918; RV32ZBB-NEXT: # %bb.7: 1919; RV32ZBB-NEXT: sltu t5, a4, a1 1920; RV32ZBB-NEXT: .LBB22_8: 1921; RV32ZBB-NEXT: bnez t6, .LBB22_10 1922; RV32ZBB-NEXT: # %bb.9: 1923; RV32ZBB-NEXT: sltu t1, a5, a6 1924; RV32ZBB-NEXT: sub a7, a7, t0 1925; RV32ZBB-NEXT: sub a5, a5, a6 1926; RV32ZBB-NEXT: sub a4, a4, a1 1927; RV32ZBB-NEXT: sub a6, a7, t1 1928; RV32ZBB-NEXT: sltu a7, a5, t5 1929; RV32ZBB-NEXT: sub a1, a5, t5 1930; RV32ZBB-NEXT: sub a5, a4, t4 1931; RV32ZBB-NEXT: sub a4, a6, a7 1932; RV32ZBB-NEXT: sub a2, a3, a2 1933; RV32ZBB-NEXT: j .LBB22_11 1934; RV32ZBB-NEXT: .LBB22_10: 1935; RV32ZBB-NEXT: sub a7, t0, a7 1936; RV32ZBB-NEXT: sub a5, a6, a5 1937; RV32ZBB-NEXT: sub a4, a1, a4 1938; RV32ZBB-NEXT: sub a6, a7, t1 1939; RV32ZBB-NEXT: sltu a7, a5, t3 1940; RV32ZBB-NEXT: sub a1, a5, t3 1941; RV32ZBB-NEXT: sub a5, a4, t2 1942; RV32ZBB-NEXT: sub a4, a6, a7 1943; RV32ZBB-NEXT: sub a2, a2, a3 1944; RV32ZBB-NEXT: .LBB22_11: 1945; RV32ZBB-NEXT: sw a2, 0(a0) 1946; RV32ZBB-NEXT: sw a5, 4(a0) 1947; RV32ZBB-NEXT: sw a1, 8(a0) 1948; RV32ZBB-NEXT: sw a4, 12(a0) 1949; RV32ZBB-NEXT: ret 1950; 1951; RV64ZBB-LABEL: abd_cmp_i128: 1952; RV64ZBB: # %bb.0: 1953; RV64ZBB-NEXT: sltu a4, a0, a2 1954; RV64ZBB-NEXT: mv a5, a4 1955; RV64ZBB-NEXT: beq a1, a3, .LBB22_2 1956; RV64ZBB-NEXT: # %bb.1: 1957; RV64ZBB-NEXT: sltu a5, a1, a3 1958; RV64ZBB-NEXT: .LBB22_2: 1959; RV64ZBB-NEXT: bnez a5, .LBB22_4 1960; RV64ZBB-NEXT: # %bb.3: 1961; RV64ZBB-NEXT: sltu a4, a2, a0 1962; RV64ZBB-NEXT: sub a1, a3, a1 1963; RV64ZBB-NEXT: sub a1, a1, a4 1964; RV64ZBB-NEXT: sub a0, a2, a0 1965; RV64ZBB-NEXT: ret 1966; RV64ZBB-NEXT: .LBB22_4: 1967; RV64ZBB-NEXT: sub a1, a1, a3 1968; RV64ZBB-NEXT: sub a1, a1, a4 1969; RV64ZBB-NEXT: sub a0, a0, a2 1970; RV64ZBB-NEXT: ret 1971 %cmp = icmp ult i128 %a, %b 1972 %ab = sub i128 %a, %b 1973 %ba = sub i128 %b, %a 1974 %sel = select i1 %cmp, i128 %ab, i128 %ba 1975 ret i128 %sel 1976} 1977 1978declare i8 @llvm.abs.i8(i8, i1) 1979declare i16 @llvm.abs.i16(i16, i1) 1980declare i32 @llvm.abs.i32(i32, i1) 1981declare i64 @llvm.abs.i64(i64, i1) 1982declare i128 @llvm.abs.i128(i128, i1) 1983 1984declare i8 @llvm.umax.i8(i8, i8) 1985declare i16 @llvm.umax.i16(i16, i16) 1986declare i32 @llvm.umax.i32(i32, i32) 1987declare i64 @llvm.umax.i64(i64, i64) 1988 1989declare i8 @llvm.umin.i8(i8, i8) 1990declare i16 @llvm.umin.i16(i16, i16) 1991declare i32 @llvm.umin.i32(i32, i32) 1992declare i64 @llvm.umin.i64(i64, i64) 1993