1. AIX has "millicode" routines, which are functions loaded at boot time into fixed addresses in kernel memory. This allows them to be customized for the processor. The __strcmp routine is a millicode implementation; we use millicode for the strcmp function instead of a library call to improve performance.
368 lines
14 KiB
LLVM
368 lines
14 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-asm-full-reg-names -mtriple=powerpc-ibm-aix < %s | \
|
|
; RUN: FileCheck %s --check-prefix=CHECK-AIX-32-P9
|
|
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr9 -ppc-asm-full-reg-names -mtriple=powerpc-unknown-linux-gnu < %s | \
|
|
; RUN: FileCheck %s --check-prefix=CHECK-LINUX32-P9
|
|
|
|
define i32 @memcmp_test(ptr nocapture noundef readonly %ptr1, ptr nocapture noundef readonly %ptr2, i32 noundef %num) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: memcmp_test:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .___memcmp[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: memcmp_test:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl memcmp
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%call = tail call i32 @memcmp(ptr noundef %ptr1, ptr noundef %ptr2, i32 noundef %num)
|
|
ret i32 %call
|
|
}
|
|
|
|
declare i32 @memcmp(ptr noundef captures(none), ptr noundef captures(none), i32 noundef) nounwind
|
|
|
|
define i32 @strlen_test(ptr noundef %str) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: strlen_test:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r3, 60(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .___strlen[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: strlen_test:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r3, 12(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl strlen
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%str.addr = alloca ptr, align 4
|
|
store ptr %str, ptr %str.addr, align 4
|
|
%0 = load ptr, ptr %str.addr, align 4
|
|
%call = call i32 @strlen(ptr noundef %0)
|
|
ret i32 %call
|
|
}
|
|
|
|
define i32 @strlen_test_fp_strict(ptr noundef %str) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: strlen_test_fp_strict:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r3, 60(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .___strlen[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: strlen_test_fp_strict:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r3, 12(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl strlen
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%str.addr = alloca ptr, align 4
|
|
store ptr %str, ptr %str.addr, align 4
|
|
%0 = load ptr, ptr %str.addr, align 4
|
|
%call = call i32 @strlen(ptr noundef %0) #0
|
|
ret i32 %call
|
|
}
|
|
|
|
declare i32 @strlen(ptr noundef) nounwind
|
|
attributes #0 = { strictfp }
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define ptr @test_memmove(ptr noundef %dst, ptr noundef %src, i32 noundef %n) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: test_memmove:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r31, 60(r1) # 4-byte Folded Spill
|
|
; CHECK-AIX-32-P9-NEXT: mr r31, r3
|
|
; CHECK-AIX-32-P9-NEXT: bl .___memmove[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: mr r3, r31
|
|
; CHECK-AIX-32-P9-NEXT: lwz r31, 60(r1) # 4-byte Folded Reload
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: test_memmove:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r30, 8(r1) # 4-byte Folded Spill
|
|
; CHECK-LINUX32-P9-NEXT: mr r30, r3
|
|
; CHECK-LINUX32-P9-NEXT: bl memmove
|
|
; CHECK-LINUX32-P9-NEXT: mr r3, r30
|
|
; CHECK-LINUX32-P9-NEXT: lwz r30, 8(r1) # 4-byte Folded Reload
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
call void @llvm.memmove.p0.p0.i32(ptr align 1 %dst, ptr align 1 %src, i32 %n, i1 false)
|
|
ret ptr %dst
|
|
}
|
|
declare void @llvm.memmove.p0.p0.i32(ptr writeonly captures(none), ptr readonly captures(none), i32, i1 immarg)
|
|
|
|
define ptr @strcpy_test(ptr noundef %dest, ptr noundef %src) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: strcpy_test:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .___strcpy[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: strcpy_test:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl strcpy
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%call = call ptr @strcpy(ptr noundef %dest, ptr noundef %src)
|
|
ret ptr %call
|
|
}
|
|
|
|
declare ptr @strcpy(ptr noundef, ptr noundef)
|
|
|
|
define ptr @stpcpy_test(ptr noundef %dest, ptr noundef %src) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: stpcpy_test:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .stpcpy[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: stpcpy_test:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl stpcpy
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%call = call ptr @stpcpy(ptr noundef %dest, ptr noundef %src)
|
|
ret ptr %call
|
|
}
|
|
|
|
declare ptr @stpcpy(ptr noundef, ptr noundef)
|
|
|
|
define ptr @test_memcpy(ptr noundef %dst, ptr noundef %src, i32 noundef %n) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: test_memcpy:
|
|
; CHECK-AIX-32-P9: # %bb.0:
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r31, 60(r1) # 4-byte Folded Spill
|
|
; CHECK-AIX-32-P9-NEXT: mr r31, r3
|
|
; CHECK-AIX-32-P9-NEXT: bl .___memmove[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: mr r3, r31
|
|
; CHECK-AIX-32-P9-NEXT: lwz r31, 60(r1) # 4-byte Folded Reload
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: test_memcpy:
|
|
; CHECK-LINUX32-P9: # %bb.0:
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r30, 8(r1) # 4-byte Folded Spill
|
|
; CHECK-LINUX32-P9-NEXT: mr r30, r3
|
|
; CHECK-LINUX32-P9-NEXT: bl memcpy
|
|
; CHECK-LINUX32-P9-NEXT: mr r3, r30
|
|
; CHECK-LINUX32-P9-NEXT: lwz r30, 8(r1) # 4-byte Folded Reload
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
call void @llvm.memcpy.p0.p0.i32(ptr align 1 %dst, ptr align 1 %src, i32 %n, i1 false)
|
|
ret ptr %dst
|
|
}
|
|
|
|
declare void @llvm.memcpy.p0.p0.i32(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i32, i1 immarg)
|
|
|
|
define ptr @test_memset(ptr noundef %dst, i32 noundef signext %value, i32 noundef %num) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: test_memset:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r31, 60(r1) # 4-byte Folded Spill
|
|
; CHECK-AIX-32-P9-NEXT: mr r31, r3
|
|
; CHECK-AIX-32-P9-NEXT: bl .___memset[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: mr r3, r31
|
|
; CHECK-AIX-32-P9-NEXT: lwz r31, 60(r1) # 4-byte Folded Reload
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: test_memset:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r30, 8(r1) # 4-byte Folded Spill
|
|
; CHECK-LINUX32-P9-NEXT: mr r30, r3
|
|
; CHECK-LINUX32-P9-NEXT: bl memset
|
|
; CHECK-LINUX32-P9-NEXT: mr r3, r30
|
|
; CHECK-LINUX32-P9-NEXT: lwz r30, 8(r1) # 4-byte Folded Reload
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%0 = trunc i32 %value to i8
|
|
call void @llvm.memset.p0.i32(ptr align 1 %dst, i8 %0, i32 %num, i1 false)
|
|
ret ptr %dst
|
|
}
|
|
|
|
define ptr @test_strstr(ptr noundef %s1, ptr noundef %s2) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: test_strstr:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .___strstr[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: test_strstr:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl strstr
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%call = call ptr @strstr(ptr noundef %s1, ptr noundef %s2)
|
|
ret ptr %call
|
|
}
|
|
|
|
declare ptr @strstr(ptr noundef, ptr noundef)
|
|
|
|
define ptr @test_memccpy(ptr noalias noundef %dst, ptr noalias noundef %src, i32 noundef signext %c, i32 noundef %n) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: test_memccpy:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .memccpy[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: test_memccpy:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl memccpy
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%call = call ptr @memccpy(ptr noundef %dst, ptr noundef %src, i32 noundef signext %c, i32 noundef %n)
|
|
ret ptr %call
|
|
}
|
|
|
|
declare ptr @memccpy(ptr noundef, ptr noundef, i32 noundef signext, i32 noundef)
|
|
|
|
define signext i32 @test_strcmp(ptr noundef %s1, ptr noundef %s2) nounwind {
|
|
; CHECK-AIX-32-P9-LABEL: test_strcmp:
|
|
; CHECK-AIX-32-P9: # %bb.0: # %entry
|
|
; CHECK-AIX-32-P9-NEXT: mflr r0
|
|
; CHECK-AIX-32-P9-NEXT: stwu r1, -64(r1)
|
|
; CHECK-AIX-32-P9-NEXT: stw r0, 72(r1)
|
|
; CHECK-AIX-32-P9-NEXT: bl .___strcmp[PR]
|
|
; CHECK-AIX-32-P9-NEXT: nop
|
|
; CHECK-AIX-32-P9-NEXT: addi r1, r1, 64
|
|
; CHECK-AIX-32-P9-NEXT: lwz r0, 8(r1)
|
|
; CHECK-AIX-32-P9-NEXT: mtlr r0
|
|
; CHECK-AIX-32-P9-NEXT: blr
|
|
;
|
|
; CHECK-LINUX32-P9-LABEL: test_strcmp:
|
|
; CHECK-LINUX32-P9: # %bb.0: # %entry
|
|
; CHECK-LINUX32-P9-NEXT: mflr r0
|
|
; CHECK-LINUX32-P9-NEXT: stwu r1, -16(r1)
|
|
; CHECK-LINUX32-P9-NEXT: stw r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: bl strcmp
|
|
; CHECK-LINUX32-P9-NEXT: lwz r0, 20(r1)
|
|
; CHECK-LINUX32-P9-NEXT: addi r1, r1, 16
|
|
; CHECK-LINUX32-P9-NEXT: mtlr r0
|
|
; CHECK-LINUX32-P9-NEXT: blr
|
|
entry:
|
|
%call = call signext i32 @strcmp(ptr noundef %s1, ptr noundef %s2)
|
|
ret i32 %call
|
|
}
|
|
|
|
declare signext i32 @strcmp(ptr noundef, ptr noundef)
|