1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32 2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64 3 4;; Exercise the 'sub' LLVM IR: https://llvm.org/docs/LangRef.html#sub-instruction 5 6define i1 @sub_i1(i1 %x, i1 %y) { 7; LA32-LABEL: sub_i1: 8; LA32: # %bb.0: 9; LA32-NEXT: sub.w $a0, $a0, $a1 10; LA32-NEXT: jirl $zero, $ra, 0 11; 12; LA64-LABEL: sub_i1: 13; LA64: # %bb.0: 14; LA64-NEXT: sub.d $a0, $a0, $a1 15; LA64-NEXT: jirl $zero, $ra, 0 16 %sub = sub i1 %x, %y 17 ret i1 %sub 18} 19 20define i8 @sub_i8(i8 %x, i8 %y) { 21; LA32-LABEL: sub_i8: 22; LA32: # %bb.0: 23; LA32-NEXT: sub.w $a0, $a0, $a1 24; LA32-NEXT: jirl $zero, $ra, 0 25; 26; LA64-LABEL: sub_i8: 27; LA64: # %bb.0: 28; LA64-NEXT: sub.d $a0, $a0, $a1 29; LA64-NEXT: jirl $zero, $ra, 0 30 %sub = sub i8 %x, %y 31 ret i8 %sub 32} 33 34define i16 @sub_i16(i16 %x, i16 %y) { 35; LA32-LABEL: sub_i16: 36; LA32: # %bb.0: 37; LA32-NEXT: sub.w $a0, $a0, $a1 38; LA32-NEXT: jirl $zero, $ra, 0 39; 40; LA64-LABEL: sub_i16: 41; LA64: # %bb.0: 42; LA64-NEXT: sub.d $a0, $a0, $a1 43; LA64-NEXT: jirl $zero, $ra, 0 44 %sub = sub i16 %x, %y 45 ret i16 %sub 46} 47 48define i32 @sub_i32(i32 %x, i32 %y) { 49; LA32-LABEL: sub_i32: 50; LA32: # %bb.0: 51; LA32-NEXT: sub.w $a0, $a0, $a1 52; LA32-NEXT: jirl $zero, $ra, 0 53; 54; LA64-LABEL: sub_i32: 55; LA64: # %bb.0: 56; LA64-NEXT: sub.d $a0, $a0, $a1 57; LA64-NEXT: jirl $zero, $ra, 0 58 %sub = sub i32 %x, %y 59 ret i32 %sub 60} 61 62;; Match the pattern: 63;; def : PatGprGpr_32<sub, SUB_W>; 64define signext i32 @sub_i32_sext(i32 %x, i32 %y) { 65; LA32-LABEL: sub_i32_sext: 66; LA32: # %bb.0: 67; LA32-NEXT: sub.w $a0, $a0, $a1 68; LA32-NEXT: jirl $zero, $ra, 0 69; 70; LA64-LABEL: sub_i32_sext: 71; LA64: # %bb.0: 72; LA64-NEXT: sub.w $a0, $a0, $a1 73; LA64-NEXT: jirl $zero, $ra, 0 74 %sub = sub i32 %x, %y 75 ret i32 %sub 76} 77 78define i64 @sub_i64(i64 %x, i64 %y) { 79; LA32-LABEL: sub_i64: 80; LA32: # %bb.0: 81; LA32-NEXT: sub.w $a1, $a1, $a3 82; LA32-NEXT: sltu $a3, $a0, $a2 83; LA32-NEXT: sub.w $a1, $a1, $a3 84; LA32-NEXT: sub.w $a0, $a0, $a2 85; LA32-NEXT: jirl $zero, $ra, 0 86; 87; LA64-LABEL: sub_i64: 88; LA64: # %bb.0: 89; LA64-NEXT: sub.d $a0, $a0, $a1 90; LA64-NEXT: jirl $zero, $ra, 0 91 %sub = sub i64 %x, %y 92 ret i64 %sub 93} 94