| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: sed 's/iGRLen/i32/g' %s | llc --mtriple=loongarch32 --mattr=+ual \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,LA32,LA32-UAL |
| ; RUN: sed 's/iGRLen/i64/g' %s | llc --mtriple=loongarch64 --mattr=+ual \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,LA64,LA64-UAL |
| ; RUN: sed 's/iGRLen/i32/g' %s | llc --mtriple=loongarch32 --mattr=-ual \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,LA32,LA32-NUAL |
| ; RUN: sed 's/iGRLen/i64/g' %s | llc --mtriple=loongarch64 --mattr=-ual \ |
| ; RUN: | FileCheck %s --check-prefixes=CHECK,LA64,LA64-NUAL |
| |
| declare signext i32 @bcmp(ptr, ptr, iGRLen) nounwind readonly |
| declare signext i32 @memcmp(ptr, ptr, iGRLen) nounwind readonly |
| |
| define signext i32 @bcmp_size_0(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: bcmp_size_0: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: move $a2, $zero |
| ; LA32-NEXT: bl bcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-LABEL: bcmp_size_0: |
| ; LA64: # %bb.0: # %entry |
| ; LA64-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NEXT: move $a2, $zero |
| ; LA64-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 0) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_1(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_1: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.bu $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.bu $a1, $a1, 0 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_1: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.bu $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.bu $a1, $a1, 0 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_1: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 1 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_1: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 1 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 1) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_2(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_2: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.hu $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.hu $a1, $a1, 0 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_2: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.hu $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.hu $a1, $a1, 0 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_2: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 2 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_2: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 2 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 2) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_3(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_3: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.hu $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.hu $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.bu $a0, $a0, 2 |
| ; LA32-UAL-NEXT: ld.bu $a1, $a1, 2 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_3: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.hu $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.hu $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.bu $a0, $a0, 2 |
| ; LA64-UAL-NEXT: ld.bu $a1, $a1, 2 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_3: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 3 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_3: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 3 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 3) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_4(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_4: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_4: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_4: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_4: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 4) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_5(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_5: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.bu $a0, $a0, 4 |
| ; LA32-UAL-NEXT: ld.bu $a1, $a1, 4 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_5: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.bu $a0, $a0, 4 |
| ; LA64-UAL-NEXT: ld.bu $a1, $a1, 4 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_5: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 5 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_5: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 5 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 5) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_6(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_6: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.hu $a0, $a0, 4 |
| ; LA32-UAL-NEXT: ld.hu $a1, $a1, 4 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_6: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.hu $a0, $a0, 4 |
| ; LA64-UAL-NEXT: ld.hu $a1, $a1, 4 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_6: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 6 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_6: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 6 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 6) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_7(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_7: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 3 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 3 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_7: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 3 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 3 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_7: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 7 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_7: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 7 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 7) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_8(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_8: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 4 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_8: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 0 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_8: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 8 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_8: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 8 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 8) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_15(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_15: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a5, $a1, 4 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 8 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 11 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 11 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA32-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA32-UAL-NEXT: or $a0, $a4, $a0 |
| ; LA32-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_15: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 7 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 7 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_15: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 15 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_15: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 15 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 15) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_16(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_16: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a5, $a1, 4 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 8 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 12 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA32-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA32-UAL-NEXT: or $a0, $a4, $a0 |
| ; LA32-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_16: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 8 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_16: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_16: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 16) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_31(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_31: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a5, $a1, 4 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 8 |
| ; LA32-UAL-NEXT: ld.w $t0, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $t1, $a1, 12 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA32-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a5, $t0, $t1 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 16 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 16 |
| ; LA32-UAL-NEXT: ld.w $t0, $a0, 20 |
| ; LA32-UAL-NEXT: ld.w $t1, $a1, 20 |
| ; LA32-UAL-NEXT: ld.w $t2, $a0, 24 |
| ; LA32-UAL-NEXT: ld.w $t3, $a1, 24 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 27 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 27 |
| ; LA32-UAL-NEXT: xor $a6, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a7, $t0, $t1 |
| ; LA32-UAL-NEXT: xor $t0, $t2, $t3 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA32-UAL-NEXT: or $a2, $a4, $a5 |
| ; LA32-UAL-NEXT: or $a3, $a6, $a7 |
| ; LA32-UAL-NEXT: or $a0, $t0, $a0 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a0, $a3, $a0 |
| ; LA32-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_31: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a4, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a5, $a1, 8 |
| ; LA64-UAL-NEXT: ld.d $a6, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a7, $a1, 16 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 23 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 23 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA64-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA64-UAL-NEXT: or $a0, $a4, $a0 |
| ; LA64-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_31: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 31 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_31: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 31 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 31) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_32(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_size_32: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a5, $a1, 4 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 8 |
| ; LA32-UAL-NEXT: ld.w $t0, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $t1, $a1, 12 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA32-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a5, $t0, $t1 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 16 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 16 |
| ; LA32-UAL-NEXT: ld.w $t0, $a0, 20 |
| ; LA32-UAL-NEXT: ld.w $t1, $a1, 20 |
| ; LA32-UAL-NEXT: ld.w $t2, $a0, 24 |
| ; LA32-UAL-NEXT: ld.w $t3, $a1, 24 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 28 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 28 |
| ; LA32-UAL-NEXT: xor $a6, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a7, $t0, $t1 |
| ; LA32-UAL-NEXT: xor $t0, $t2, $t3 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA32-UAL-NEXT: or $a2, $a4, $a5 |
| ; LA32-UAL-NEXT: or $a3, $a6, $a7 |
| ; LA32-UAL-NEXT: or $a0, $t0, $a0 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a0, $a3, $a0 |
| ; LA32-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_32: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a4, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a5, $a1, 8 |
| ; LA64-UAL-NEXT: ld.d $a6, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a7, $a1, 16 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 24 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 24 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA64-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA64-UAL-NEXT: or $a0, $a4, $a0 |
| ; LA64-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_size_32: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 32 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_32: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 32 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 32) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_63(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: bcmp_size_63: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 63 |
| ; LA32-NEXT: bl bcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_63: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a4, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a5, $a1, 8 |
| ; LA64-UAL-NEXT: ld.d $a6, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a7, $a1, 16 |
| ; LA64-UAL-NEXT: ld.d $t0, $a0, 24 |
| ; LA64-UAL-NEXT: ld.d $t1, $a1, 24 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA64-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA64-UAL-NEXT: xor $a5, $t0, $t1 |
| ; LA64-UAL-NEXT: ld.d $a6, $a0, 32 |
| ; LA64-UAL-NEXT: ld.d $a7, $a1, 32 |
| ; LA64-UAL-NEXT: ld.d $t0, $a0, 40 |
| ; LA64-UAL-NEXT: ld.d $t1, $a1, 40 |
| ; LA64-UAL-NEXT: ld.d $t2, $a0, 48 |
| ; LA64-UAL-NEXT: ld.d $t3, $a1, 48 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 55 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 55 |
| ; LA64-UAL-NEXT: xor $a6, $a6, $a7 |
| ; LA64-UAL-NEXT: xor $a7, $t0, $t1 |
| ; LA64-UAL-NEXT: xor $t0, $t2, $t3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA64-UAL-NEXT: or $a2, $a4, $a5 |
| ; LA64-UAL-NEXT: or $a3, $a6, $a7 |
| ; LA64-UAL-NEXT: or $a0, $t0, $a0 |
| ; LA64-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA64-UAL-NEXT: or $a0, $a3, $a0 |
| ; LA64-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_63: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 63 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 63) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_64(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: bcmp_size_64: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 64 |
| ; LA32-NEXT: bl bcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_size_64: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a4, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a5, $a1, 8 |
| ; LA64-UAL-NEXT: ld.d $a6, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a7, $a1, 16 |
| ; LA64-UAL-NEXT: ld.d $t0, $a0, 24 |
| ; LA64-UAL-NEXT: ld.d $t1, $a1, 24 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA64-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA64-UAL-NEXT: xor $a5, $t0, $t1 |
| ; LA64-UAL-NEXT: ld.d $a6, $a0, 32 |
| ; LA64-UAL-NEXT: ld.d $a7, $a1, 32 |
| ; LA64-UAL-NEXT: ld.d $t0, $a0, 40 |
| ; LA64-UAL-NEXT: ld.d $t1, $a1, 40 |
| ; LA64-UAL-NEXT: ld.d $t2, $a0, 48 |
| ; LA64-UAL-NEXT: ld.d $t3, $a1, 48 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 56 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 56 |
| ; LA64-UAL-NEXT: xor $a6, $a6, $a7 |
| ; LA64-UAL-NEXT: xor $a7, $t0, $t1 |
| ; LA64-UAL-NEXT: xor $t0, $t2, $t3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA64-UAL-NEXT: or $a2, $a4, $a5 |
| ; LA64-UAL-NEXT: or $a3, $a6, $a7 |
| ; LA64-UAL-NEXT: or $a0, $t0, $a0 |
| ; LA64-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA64-UAL-NEXT: or $a0, $a3, $a0 |
| ; LA64-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_size_64: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 64 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 64) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_127(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: bcmp_size_127: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 127 |
| ; LA32-NEXT: bl bcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-LABEL: bcmp_size_127: |
| ; LA64: # %bb.0: # %entry |
| ; LA64-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NEXT: ori $a2, $zero, 127 |
| ; LA64-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 127) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_128(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: bcmp_size_128: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 128 |
| ; LA32-NEXT: bl bcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-LABEL: bcmp_size_128: |
| ; LA64: # %bb.0: # %entry |
| ; LA64-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NEXT: ori $a2, $zero, 128 |
| ; LA64-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 128) |
| ret i32 %bcmp |
| } |
| |
| define signext i32 @bcmp_size_runtime(ptr %s1, ptr %s2, iGRLen %len) nounwind { |
| ; LA32-LABEL: bcmp_size_runtime: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: bl bcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-LABEL: bcmp_size_runtime: |
| ; LA64: # %bb.0: # %entry |
| ; LA64-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen %len) |
| ret i32 %bcmp |
| } |
| |
| define i1 @bcmp_eq_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_eq_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a5, $a1, 4 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 8 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 12 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA32-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA32-UAL-NEXT: or $a0, $a4, $a0 |
| ; LA32-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sltui $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_eq_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 8 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltui $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_eq_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: sltui $a0, $a0, 1 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_eq_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: sltui $a0, $a0, 1 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 16) |
| %ret = icmp eq i32 %bcmp, 0 |
| ret i1 %ret |
| } |
| |
| define i1 @bcmp_lt_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_lt_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_lt_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_lt_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: srli.w $a0, $a0, 31 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_lt_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: slti $a0, $a0, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp slt i32 %bcmp, 0 |
| ret i1 %ret |
| } |
| |
| define i1 @bcmp_gt_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_gt_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_gt_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_gt_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: slt $a0, $zero, $a0 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_gt_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: slt $a0, $zero, $a0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp sgt i32 %bcmp, 0 |
| ret i1 %ret |
| } |
| |
| define i1 @bcmp_le_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_le_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: slti $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_le_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: slti $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_le_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: slti $a0, $a0, 1 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_le_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: slti $a0, $a0, 1 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp slt i32 %bcmp, 1 |
| ret i1 %ret |
| } |
| |
| define i1 @bcmp_ge_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: bcmp_ge_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ori $a0, $zero, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: bcmp_ge_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ori $a0, $zero, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: bcmp_ge_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl bcmp |
| ; LA32-NUAL-NEXT: addi.w $a1, $zero, -1 |
| ; LA32-NUAL-NEXT: slt $a0, $a1, $a0 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: bcmp_ge_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(bcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: addi.w $a1, $zero, -1 |
| ; LA64-NUAL-NEXT: slt $a0, $a1, $a0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %bcmp = call signext i32 @bcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp sgt i32 %bcmp, -1 |
| ret i1 %ret |
| } |
| |
| define signext i32 @memcmp_size_0(ptr %s1, ptr %s2) nounwind { |
| ; CHECK-LABEL: memcmp_size_0: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: move $a0, $zero |
| ; CHECK-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 0) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_1(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_1: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.bu $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.bu $a1, $a1, 0 |
| ; LA32-UAL-NEXT: sub.w $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_1: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.bu $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.bu $a1, $a1, 0 |
| ; LA64-UAL-NEXT: sub.d $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_1: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 1 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_1: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 1 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 1) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_2(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_2: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.hu $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.hu $a1, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a2, $a0, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 8 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a2, $a1, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 8 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 4095 |
| ; LA32-UAL-NEXT: and $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: and $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: sub.w $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_2: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.h $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.h $a1, $a1, 0 |
| ; LA64-UAL-NEXT: revb.2h $a0, $a0 |
| ; LA64-UAL-NEXT: revb.2h $a1, $a1 |
| ; LA64-UAL-NEXT: bstrpick.d $a0, $a0, 15, 0 |
| ; LA64-UAL-NEXT: bstrpick.d $a1, $a1, 15, 0 |
| ; LA64-UAL-NEXT: sub.d $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_2: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 2 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_2: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 2 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 2) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_3(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_3: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.bu $a2, $a0, 2 |
| ; LA32-UAL-NEXT: ld.hu $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.bu $a3, $a1, 2 |
| ; LA32-UAL-NEXT: ld.hu $a1, $a1, 0 |
| ; LA32-UAL-NEXT: lu12i.w $a4, 15 |
| ; LA32-UAL-NEXT: ori $a4, $a4, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a2, $a5, $a2 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA32-UAL-NEXT: and $a2, $a1, $a4 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a2, $a1 |
| ; LA32-UAL-NEXT: sltu $a2, $a0, $a1 |
| ; LA32-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sub.w $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_3: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.bu $a2, $a0, 2 |
| ; LA64-UAL-NEXT: ld.hu $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.bu $a3, $a1, 2 |
| ; LA64-UAL-NEXT: ld.hu $a1, $a1, 0 |
| ; LA64-UAL-NEXT: slli.d $a2, $a2, 16 |
| ; LA64-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: slli.d $a2, $a3, 16 |
| ; LA64-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA64-UAL-NEXT: revb.2w $a0, $a0 |
| ; LA64-UAL-NEXT: addi.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: revb.2w $a1, $a1 |
| ; LA64-UAL-NEXT: addi.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: sltu $a2, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sub.d $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_3: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 3 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_3: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 3 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 3) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_4(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_4: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a2, $a0, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a3, 15 |
| ; LA32-UAL-NEXT: ori $a3, $a3, 3840 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a3 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a2, $a1, 8 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a3, $a1, $a3 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a3 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: sltu $a2, $a0, $a1 |
| ; LA32-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sub.w $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_4: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: revb.2w $a0, $a0 |
| ; LA64-UAL-NEXT: addi.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: revb.2w $a1, $a1 |
| ; LA64-UAL-NEXT: addi.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: sltu $a2, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sub.d $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_4: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_4: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 4) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_5: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a4, $a2, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a5, 15 |
| ; LA32-UAL-NEXT: ori $a5, $a5, 3840 |
| ; LA32-UAL-NEXT: and $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: srli.w $a6, $a2, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a2, $a5 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a6 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: srli.w $a4, $a3, 8 |
| ; LA32-UAL-NEXT: and $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: and $a5, $a3, $a5 |
| ; LA32-UAL-NEXT: slli.w $a5, $a5, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a4 |
| ; LA32-UAL-NEXT: bne $a2, $a3, .LBB28_2 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.bu $a0, $a0, 4 |
| ; LA32-UAL-NEXT: ld.bu $a1, $a1, 4 |
| ; LA32-UAL-NEXT: sub.w $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB28_2: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a2, $a3 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_5: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.bu $a2, $a0, 4 |
| ; LA64-UAL-NEXT: ld.wu $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.bu $a3, $a1, 4 |
| ; LA64-UAL-NEXT: ld.wu $a1, $a1, 0 |
| ; LA64-UAL-NEXT: slli.d $a2, $a2, 32 |
| ; LA64-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: slli.d $a2, $a3, 32 |
| ; LA64-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA64-UAL-NEXT: revb.d $a0, $a0 |
| ; LA64-UAL-NEXT: revb.d $a1, $a1 |
| ; LA64-UAL-NEXT: sltu $a2, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sub.d $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_5: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 5 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_5: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 5 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 5) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_6: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a6, $a2, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: srli.w $a7, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a7 |
| ; LA32-UAL-NEXT: and $a7, $a3, $a6 |
| ; LA32-UAL-NEXT: slli.w $a7, $a7, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a7 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: srli.w $a7, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a7 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a6 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB29_3 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.hu $a0, $a0, 4 |
| ; LA32-UAL-NEXT: ld.hu $a1, $a1, 4 |
| ; LA32-UAL-NEXT: srli.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 8 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a3 |
| ; LA32-UAL-NEXT: srli.w $a3, $a1, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 8 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a3 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 4095 |
| ; LA32-UAL-NEXT: and $a3, $a0, $a2 |
| ; LA32-UAL-NEXT: and $a4, $a1, $a2 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB29_3 |
| ; LA32-UAL-NEXT: # %bb.2: |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB29_3: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a3, $a4 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_6: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.hu $a2, $a0, 4 |
| ; LA64-UAL-NEXT: ld.wu $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.hu $a3, $a1, 4 |
| ; LA64-UAL-NEXT: ld.wu $a1, $a1, 0 |
| ; LA64-UAL-NEXT: slli.d $a2, $a2, 32 |
| ; LA64-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: slli.d $a2, $a3, 32 |
| ; LA64-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA64-UAL-NEXT: revb.d $a0, $a0 |
| ; LA64-UAL-NEXT: revb.d $a1, $a1 |
| ; LA64-UAL-NEXT: sltu $a2, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sub.d $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_6: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 6 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_6: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 6 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 6) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_7(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_7: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB30_3 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 3 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 3 |
| ; LA32-UAL-NEXT: srli.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: and $a3, $a3, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a2 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a3, $a0, $a3 |
| ; LA32-UAL-NEXT: srli.w $a0, $a1, 8 |
| ; LA32-UAL-NEXT: and $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: and $a2, $a1, $a2 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a4, $a1, $a0 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB30_3 |
| ; LA32-UAL-NEXT: # %bb.2: |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB30_3: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a3, $a4 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_7: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA64-UAL-NEXT: revb.2w $a2, $a2 |
| ; LA64-UAL-NEXT: addi.w $a4, $a2, 0 |
| ; LA64-UAL-NEXT: revb.2w $a3, $a3 |
| ; LA64-UAL-NEXT: addi.w $a5, $a3, 0 |
| ; LA64-UAL-NEXT: bne $a4, $a5, .LBB30_3 |
| ; LA64-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 3 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 3 |
| ; LA64-UAL-NEXT: revb.2w $a2, $a0 |
| ; LA64-UAL-NEXT: addi.w $a0, $a2, 0 |
| ; LA64-UAL-NEXT: revb.2w $a3, $a1 |
| ; LA64-UAL-NEXT: addi.w $a1, $a3, 0 |
| ; LA64-UAL-NEXT: bne $a0, $a1, .LBB30_3 |
| ; LA64-UAL-NEXT: # %bb.2: |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; LA64-UAL-NEXT: .LBB30_3: # %res_block |
| ; LA64-UAL-NEXT: addi.w $a0, $a3, 0 |
| ; LA64-UAL-NEXT: addi.w $a1, $a2, 0 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sub.d $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_7: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 7 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_7: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 7 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 7) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_8(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_8: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB31_3 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 4 |
| ; LA32-UAL-NEXT: srli.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: and $a3, $a3, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a2 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a3, $a0, $a3 |
| ; LA32-UAL-NEXT: srli.w $a0, $a1, 8 |
| ; LA32-UAL-NEXT: and $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: and $a2, $a1, $a2 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a4, $a1, $a0 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB31_3 |
| ; LA32-UAL-NEXT: # %bb.2: |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB31_3: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a3, $a4 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_8: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 0 |
| ; LA64-UAL-NEXT: revb.d $a0, $a0 |
| ; LA64-UAL-NEXT: revb.d $a1, $a1 |
| ; LA64-UAL-NEXT: sltu $a2, $a0, $a1 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: sub.d $a0, $a0, $a2 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_8: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 8 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_8: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 8 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 8) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_15(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_15: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB32_5 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 4 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB32_5 |
| ; LA32-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 8 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB32_5 |
| ; LA32-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 11 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 11 |
| ; LA32-UAL-NEXT: srli.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: and $a3, $a3, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a2 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a3, $a0, $a3 |
| ; LA32-UAL-NEXT: srli.w $a0, $a1, 8 |
| ; LA32-UAL-NEXT: and $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: and $a2, $a1, $a2 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a4, $a1, $a0 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB32_5 |
| ; LA32-UAL-NEXT: # %bb.4: |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB32_5: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a3, $a4 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_15: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB32_3 |
| ; LA64-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 7 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 7 |
| ; LA64-UAL-NEXT: revb.d $a2, $a0 |
| ; LA64-UAL-NEXT: revb.d $a3, $a1 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB32_3 |
| ; LA64-UAL-NEXT: # %bb.2: |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; LA64-UAL-NEXT: .LBB32_3: # %res_block |
| ; LA64-UAL-NEXT: sltu $a0, $a2, $a3 |
| ; LA64-UAL-NEXT: sub.d $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_15: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 15 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_15: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 15 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 15) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_16(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_16: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB33_5 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 4 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB33_5 |
| ; LA32-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 8 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB33_5 |
| ; LA32-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 12 |
| ; LA32-UAL-NEXT: srli.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: and $a3, $a3, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a2 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a3, $a0, $a3 |
| ; LA32-UAL-NEXT: srli.w $a0, $a1, 8 |
| ; LA32-UAL-NEXT: and $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: and $a2, $a1, $a2 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a4, $a1, $a0 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB33_5 |
| ; LA32-UAL-NEXT: # %bb.4: |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB33_5: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a3, $a4 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_16: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB33_3 |
| ; LA64-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 8 |
| ; LA64-UAL-NEXT: revb.d $a2, $a0 |
| ; LA64-UAL-NEXT: revb.d $a3, $a1 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB33_3 |
| ; LA64-UAL-NEXT: # %bb.2: |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; LA64-UAL-NEXT: .LBB33_3: # %res_block |
| ; LA64-UAL-NEXT: sltu $a0, $a2, $a3 |
| ; LA64-UAL-NEXT: sub.d $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_16: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_16: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 16) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_31(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_31: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 4 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 8 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 12 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.4: # %loadbb4 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 16 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 16 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.5: # %loadbb5 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 20 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 20 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.6: # %loadbb6 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 24 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.7: # %loadbb7 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 27 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 27 |
| ; LA32-UAL-NEXT: srli.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: and $a3, $a3, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a2 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a3, $a0, $a3 |
| ; LA32-UAL-NEXT: srli.w $a0, $a1, 8 |
| ; LA32-UAL-NEXT: and $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: and $a2, $a1, $a2 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a4, $a1, $a0 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB34_9 |
| ; LA32-UAL-NEXT: # %bb.8: |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB34_9: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a3, $a4 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_31: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB34_5 |
| ; LA64-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 8 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB34_5 |
| ; LA64-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 16 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB34_5 |
| ; LA64-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 23 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 23 |
| ; LA64-UAL-NEXT: revb.d $a2, $a0 |
| ; LA64-UAL-NEXT: revb.d $a3, $a1 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB34_5 |
| ; LA64-UAL-NEXT: # %bb.4: |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; LA64-UAL-NEXT: .LBB34_5: # %res_block |
| ; LA64-UAL-NEXT: sltu $a0, $a2, $a3 |
| ; LA64-UAL-NEXT: sub.d $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_31: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 31 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_31: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 31 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 31) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_32(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_size_32: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a2, 15 |
| ; LA32-UAL-NEXT: ori $a2, $a2, 3840 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 4 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 8 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 12 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.4: # %loadbb4 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 16 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 16 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.5: # %loadbb5 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 20 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 20 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.6: # %loadbb6 |
| ; LA32-UAL-NEXT: ld.w $a3, $a0, 24 |
| ; LA32-UAL-NEXT: ld.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: srli.w $a5, $a3, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a3, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a3, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a6 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a5 |
| ; LA32-UAL-NEXT: srli.w $a5, $a4, 8 |
| ; LA32-UAL-NEXT: and $a5, $a5, $a2 |
| ; LA32-UAL-NEXT: srli.w $a6, $a4, 24 |
| ; LA32-UAL-NEXT: or $a5, $a5, $a6 |
| ; LA32-UAL-NEXT: and $a6, $a4, $a2 |
| ; LA32-UAL-NEXT: slli.w $a6, $a6, 8 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 24 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a6 |
| ; LA32-UAL-NEXT: or $a4, $a4, $a5 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.7: # %loadbb7 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 28 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 28 |
| ; LA32-UAL-NEXT: srli.w $a3, $a0, 8 |
| ; LA32-UAL-NEXT: and $a3, $a3, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a3, $a3, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a2 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a3, $a0, $a3 |
| ; LA32-UAL-NEXT: srli.w $a0, $a1, 8 |
| ; LA32-UAL-NEXT: and $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: and $a2, $a1, $a2 |
| ; LA32-UAL-NEXT: slli.w $a2, $a2, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: or $a4, $a1, $a0 |
| ; LA32-UAL-NEXT: bne $a3, $a4, .LBB35_9 |
| ; LA32-UAL-NEXT: # %bb.8: |
| ; LA32-UAL-NEXT: move $a0, $zero |
| ; LA32-UAL-NEXT: ret |
| ; LA32-UAL-NEXT: .LBB35_9: # %res_block |
| ; LA32-UAL-NEXT: sltu $a0, $a3, $a4 |
| ; LA32-UAL-NEXT: sub.w $a0, $zero, $a0 |
| ; LA32-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_32: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB35_5 |
| ; LA64-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 8 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB35_5 |
| ; LA64-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 16 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB35_5 |
| ; LA64-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 24 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 24 |
| ; LA64-UAL-NEXT: revb.d $a2, $a0 |
| ; LA64-UAL-NEXT: revb.d $a3, $a1 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB35_5 |
| ; LA64-UAL-NEXT: # %bb.4: |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; LA64-UAL-NEXT: .LBB35_5: # %res_block |
| ; LA64-UAL-NEXT: sltu $a0, $a2, $a3 |
| ; LA64-UAL-NEXT: sub.d $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_size_32: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 32 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_32: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 32 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 32) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_63(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: memcmp_size_63: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 63 |
| ; LA32-NEXT: bl memcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_63: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 8 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 16 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 24 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 24 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.4: # %loadbb4 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 32 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 32 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.5: # %loadbb5 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 40 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 40 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.6: # %loadbb6 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 48 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 48 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.7: # %loadbb7 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 55 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 55 |
| ; LA64-UAL-NEXT: revb.d $a2, $a0 |
| ; LA64-UAL-NEXT: revb.d $a3, $a1 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB36_9 |
| ; LA64-UAL-NEXT: # %bb.8: |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; LA64-UAL-NEXT: .LBB36_9: # %res_block |
| ; LA64-UAL-NEXT: sltu $a0, $a2, $a3 |
| ; LA64-UAL-NEXT: sub.d $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_63: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 63 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 63) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_64(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: memcmp_size_64: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 64 |
| ; LA32-NEXT: bl memcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_size_64: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.1: # %loadbb1 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 8 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.2: # %loadbb2 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 16 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 16 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.3: # %loadbb3 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 24 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 24 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.4: # %loadbb4 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 32 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 32 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.5: # %loadbb5 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 40 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 40 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.6: # %loadbb6 |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 48 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 48 |
| ; LA64-UAL-NEXT: revb.d $a2, $a2 |
| ; LA64-UAL-NEXT: revb.d $a3, $a3 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.7: # %loadbb7 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 56 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 56 |
| ; LA64-UAL-NEXT: revb.d $a2, $a0 |
| ; LA64-UAL-NEXT: revb.d $a3, $a1 |
| ; LA64-UAL-NEXT: bne $a2, $a3, .LBB37_9 |
| ; LA64-UAL-NEXT: # %bb.8: |
| ; LA64-UAL-NEXT: move $a0, $zero |
| ; LA64-UAL-NEXT: ret |
| ; LA64-UAL-NEXT: .LBB37_9: # %res_block |
| ; LA64-UAL-NEXT: sltu $a0, $a2, $a3 |
| ; LA64-UAL-NEXT: sub.d $a0, $zero, $a0 |
| ; LA64-UAL-NEXT: ori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_size_64: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 64 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 64) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_127(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: memcmp_size_127: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 127 |
| ; LA32-NEXT: bl memcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-LABEL: memcmp_size_127: |
| ; LA64: # %bb.0: # %entry |
| ; LA64-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NEXT: ori $a2, $zero, 127 |
| ; LA64-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 127) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_128(ptr %s1, ptr %s2) nounwind { |
| ; LA32-LABEL: memcmp_size_128: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: ori $a2, $zero, 128 |
| ; LA32-NEXT: bl memcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-LABEL: memcmp_size_128: |
| ; LA64: # %bb.0: # %entry |
| ; LA64-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NEXT: ori $a2, $zero, 128 |
| ; LA64-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 128) |
| ret i32 %memcmp |
| } |
| |
| define signext i32 @memcmp_size_runtime(ptr %s1, ptr %s2, iGRLen %len) nounwind { |
| ; LA32-LABEL: memcmp_size_runtime: |
| ; LA32: # %bb.0: # %entry |
| ; LA32-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NEXT: bl memcmp |
| ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NEXT: ret |
| ; |
| ; LA64-LABEL: memcmp_size_runtime: |
| ; LA64: # %bb.0: # %entry |
| ; LA64-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen %len) |
| ret i32 %memcmp |
| } |
| |
| define i1 @memcmp_eq_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_eq_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a2, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a3, $a1, 0 |
| ; LA32-UAL-NEXT: ld.w $a4, $a0, 4 |
| ; LA32-UAL-NEXT: ld.w $a5, $a1, 4 |
| ; LA32-UAL-NEXT: ld.w $a6, $a0, 8 |
| ; LA32-UAL-NEXT: ld.w $a7, $a1, 8 |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 12 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 12 |
| ; LA32-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: xor $a3, $a4, $a5 |
| ; LA32-UAL-NEXT: xor $a4, $a6, $a7 |
| ; LA32-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: or $a1, $a2, $a3 |
| ; LA32-UAL-NEXT: or $a0, $a4, $a0 |
| ; LA32-UAL-NEXT: or $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: sltui $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_eq_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.d $a2, $a0, 0 |
| ; LA64-UAL-NEXT: ld.d $a3, $a1, 0 |
| ; LA64-UAL-NEXT: ld.d $a0, $a0, 8 |
| ; LA64-UAL-NEXT: ld.d $a1, $a1, 8 |
| ; LA64-UAL-NEXT: xor $a2, $a2, $a3 |
| ; LA64-UAL-NEXT: xor $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: or $a0, $a2, $a0 |
| ; LA64-UAL-NEXT: sltui $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_eq_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: sltui $a0, $a0, 1 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_eq_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 16 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: sltui $a0, $a0, 1 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 16) |
| %ret = icmp eq i32 %memcmp, 0 |
| ret i1 %ret |
| } |
| |
| define i1 @memcmp_lt_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_lt_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a2, $a0, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a3, 15 |
| ; LA32-UAL-NEXT: ori $a3, $a3, 3840 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a3 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a2, $a1, 8 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a3, $a1, $a3 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a3 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: sltu $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_lt_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: revb.2w $a0, $a0 |
| ; LA64-UAL-NEXT: addi.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: revb.2w $a1, $a1 |
| ; LA64-UAL-NEXT: addi.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: sltu $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_lt_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: srli.w $a0, $a0, 31 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_lt_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: slti $a0, $a0, 0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp slt i32 %memcmp, 0 |
| ret i1 %ret |
| } |
| |
| define i1 @memcmp_gt_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_gt_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a2, $a0, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a3, 15 |
| ; LA32-UAL-NEXT: ori $a3, $a3, 3840 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a3 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a2, $a1, 8 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a3, $a1, $a3 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a3 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_gt_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: revb.2w $a0, $a0 |
| ; LA64-UAL-NEXT: addi.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: revb.2w $a1, $a1 |
| ; LA64-UAL-NEXT: addi.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_gt_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: slt $a0, $zero, $a0 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_gt_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: slt $a0, $zero, $a0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp sgt i32 %memcmp, 0 |
| ret i1 %ret |
| } |
| |
| define i1 @memcmp_le_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_le_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a2, $a0, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a3, 15 |
| ; LA32-UAL-NEXT: ori $a3, $a3, 3840 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a3 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a2, $a1, 8 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a3, $a1, $a3 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a3 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA32-UAL-NEXT: xori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_le_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: revb.2w $a0, $a0 |
| ; LA64-UAL-NEXT: addi.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: revb.2w $a1, $a1 |
| ; LA64-UAL-NEXT: addi.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: sltu $a0, $a1, $a0 |
| ; LA64-UAL-NEXT: xori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_le_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: slti $a0, $a0, 1 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_le_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: slti $a0, $a0, 1 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp slt i32 %memcmp, 1 |
| ret i1 %ret |
| } |
| |
| define i1 @memcmp_ge_zero(ptr %s1, ptr %s2) nounwind { |
| ; LA32-UAL-LABEL: memcmp_ge_zero: |
| ; LA32-UAL: # %bb.0: # %entry |
| ; LA32-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA32-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA32-UAL-NEXT: srli.w $a2, $a0, 8 |
| ; LA32-UAL-NEXT: lu12i.w $a3, 15 |
| ; LA32-UAL-NEXT: ori $a3, $a3, 3840 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a0, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a4, $a0, $a3 |
| ; LA32-UAL-NEXT: slli.w $a4, $a4, 8 |
| ; LA32-UAL-NEXT: slli.w $a0, $a0, 24 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a4 |
| ; LA32-UAL-NEXT: or $a0, $a0, $a2 |
| ; LA32-UAL-NEXT: srli.w $a2, $a1, 8 |
| ; LA32-UAL-NEXT: and $a2, $a2, $a3 |
| ; LA32-UAL-NEXT: srli.w $a4, $a1, 24 |
| ; LA32-UAL-NEXT: or $a2, $a2, $a4 |
| ; LA32-UAL-NEXT: and $a3, $a1, $a3 |
| ; LA32-UAL-NEXT: slli.w $a3, $a3, 8 |
| ; LA32-UAL-NEXT: slli.w $a1, $a1, 24 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a3 |
| ; LA32-UAL-NEXT: or $a1, $a1, $a2 |
| ; LA32-UAL-NEXT: sltu $a0, $a0, $a1 |
| ; LA32-UAL-NEXT: xori $a0, $a0, 1 |
| ; LA32-UAL-NEXT: ret |
| ; |
| ; LA64-UAL-LABEL: memcmp_ge_zero: |
| ; LA64-UAL: # %bb.0: # %entry |
| ; LA64-UAL-NEXT: ld.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: ld.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: revb.2w $a0, $a0 |
| ; LA64-UAL-NEXT: addi.w $a0, $a0, 0 |
| ; LA64-UAL-NEXT: revb.2w $a1, $a1 |
| ; LA64-UAL-NEXT: addi.w $a1, $a1, 0 |
| ; LA64-UAL-NEXT: sltu $a0, $a0, $a1 |
| ; LA64-UAL-NEXT: xori $a0, $a0, 1 |
| ; LA64-UAL-NEXT: ret |
| ; |
| ; LA32-NUAL-LABEL: memcmp_ge_zero: |
| ; LA32-NUAL: # %bb.0: # %entry |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, -16 |
| ; LA32-NUAL-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill |
| ; LA32-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA32-NUAL-NEXT: bl memcmp |
| ; LA32-NUAL-NEXT: addi.w $a1, $zero, -1 |
| ; LA32-NUAL-NEXT: slt $a0, $a1, $a0 |
| ; LA32-NUAL-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload |
| ; LA32-NUAL-NEXT: addi.w $sp, $sp, 16 |
| ; LA32-NUAL-NEXT: ret |
| ; |
| ; LA64-NUAL-LABEL: memcmp_ge_zero: |
| ; LA64-NUAL: # %bb.0: # %entry |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, -16 |
| ; LA64-NUAL-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill |
| ; LA64-NUAL-NEXT: ori $a2, $zero, 4 |
| ; LA64-NUAL-NEXT: pcaddu18i $ra, %call36(memcmp) |
| ; LA64-NUAL-NEXT: jirl $ra, $ra, 0 |
| ; LA64-NUAL-NEXT: addi.w $a1, $zero, -1 |
| ; LA64-NUAL-NEXT: slt $a0, $a1, $a0 |
| ; LA64-NUAL-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload |
| ; LA64-NUAL-NEXT: addi.d $sp, $sp, 16 |
| ; LA64-NUAL-NEXT: ret |
| entry: |
| %memcmp = call signext i32 @memcmp(ptr %s1, ptr %s2, iGRLen 4) |
| %ret = icmp sgt i32 %memcmp, -1 |
| ret i1 %ret |
| } |