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 bare integers 'select' LLVM IR: https://llvm.org/docs/LangRef.html#select-instruction 5 6define i1 @bare_select_i1(i1 %a, i1 %b, i1 %c) { 7; LA32-LABEL: bare_select_i1: 8; LA32: # %bb.0: 9; LA32-NEXT: andi $a0, $a0, 1 10; LA32-NEXT: masknez $a2, $a2, $a0 11; LA32-NEXT: maskeqz $a0, $a1, $a0 12; LA32-NEXT: or $a0, $a0, $a2 13; LA32-NEXT: jirl $zero, $ra, 0 14; 15; LA64-LABEL: bare_select_i1: 16; LA64: # %bb.0: 17; LA64-NEXT: andi $a0, $a0, 1 18; LA64-NEXT: masknez $a2, $a2, $a0 19; LA64-NEXT: maskeqz $a0, $a1, $a0 20; LA64-NEXT: or $a0, $a0, $a2 21; LA64-NEXT: jirl $zero, $ra, 0 22 %res = select i1 %a, i1 %b, i1 %c 23 ret i1 %res 24} 25 26define i8 @bare_select_i8(i1 %a, i8 %b, i8 %c) { 27; LA32-LABEL: bare_select_i8: 28; LA32: # %bb.0: 29; LA32-NEXT: andi $a0, $a0, 1 30; LA32-NEXT: masknez $a2, $a2, $a0 31; LA32-NEXT: maskeqz $a0, $a1, $a0 32; LA32-NEXT: or $a0, $a0, $a2 33; LA32-NEXT: jirl $zero, $ra, 0 34; 35; LA64-LABEL: bare_select_i8: 36; LA64: # %bb.0: 37; LA64-NEXT: andi $a0, $a0, 1 38; LA64-NEXT: masknez $a2, $a2, $a0 39; LA64-NEXT: maskeqz $a0, $a1, $a0 40; LA64-NEXT: or $a0, $a0, $a2 41; LA64-NEXT: jirl $zero, $ra, 0 42 %res = select i1 %a, i8 %b, i8 %c 43 ret i8 %res 44} 45 46define i16 @bare_select_i16(i1 %a, i16 %b, i16 %c) { 47; LA32-LABEL: bare_select_i16: 48; LA32: # %bb.0: 49; LA32-NEXT: andi $a0, $a0, 1 50; LA32-NEXT: masknez $a2, $a2, $a0 51; LA32-NEXT: maskeqz $a0, $a1, $a0 52; LA32-NEXT: or $a0, $a0, $a2 53; LA32-NEXT: jirl $zero, $ra, 0 54; 55; LA64-LABEL: bare_select_i16: 56; LA64: # %bb.0: 57; LA64-NEXT: andi $a0, $a0, 1 58; LA64-NEXT: masknez $a2, $a2, $a0 59; LA64-NEXT: maskeqz $a0, $a1, $a0 60; LA64-NEXT: or $a0, $a0, $a2 61; LA64-NEXT: jirl $zero, $ra, 0 62 %res = select i1 %a, i16 %b, i16 %c 63 ret i16 %res 64} 65 66define i32 @bare_select_i32(i1 %a, i32 %b, i32 %c) { 67; LA32-LABEL: bare_select_i32: 68; LA32: # %bb.0: 69; LA32-NEXT: andi $a0, $a0, 1 70; LA32-NEXT: masknez $a2, $a2, $a0 71; LA32-NEXT: maskeqz $a0, $a1, $a0 72; LA32-NEXT: or $a0, $a0, $a2 73; LA32-NEXT: jirl $zero, $ra, 0 74; 75; LA64-LABEL: bare_select_i32: 76; LA64: # %bb.0: 77; LA64-NEXT: andi $a0, $a0, 1 78; LA64-NEXT: masknez $a2, $a2, $a0 79; LA64-NEXT: maskeqz $a0, $a1, $a0 80; LA64-NEXT: or $a0, $a0, $a2 81; LA64-NEXT: jirl $zero, $ra, 0 82 %res = select i1 %a, i32 %b, i32 %c 83 ret i32 %res 84} 85 86define i64 @bare_select_i64(i1 %a, i64 %b, i64 %c) { 87; LA32-LABEL: bare_select_i64: 88; LA32: # %bb.0: 89; LA32-NEXT: andi $a5, $a0, 1 90; LA32-NEXT: masknez $a0, $a3, $a5 91; LA32-NEXT: maskeqz $a1, $a1, $a5 92; LA32-NEXT: or $a0, $a1, $a0 93; LA32-NEXT: masknez $a1, $a4, $a5 94; LA32-NEXT: maskeqz $a2, $a2, $a5 95; LA32-NEXT: or $a1, $a2, $a1 96; LA32-NEXT: jirl $zero, $ra, 0 97; 98; LA64-LABEL: bare_select_i64: 99; LA64: # %bb.0: 100; LA64-NEXT: andi $a0, $a0, 1 101; LA64-NEXT: masknez $a2, $a2, $a0 102; LA64-NEXT: maskeqz $a0, $a1, $a0 103; LA64-NEXT: or $a0, $a0, $a2 104; LA64-NEXT: jirl $zero, $ra, 0 105 %res = select i1 %a, i64 %b, i64 %c 106 ret i64 %res 107} 108