1*522f34cfSLei Huang; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2*522f34cfSLei Huang; RUN: llc -O0 -verify-machineinstrs < %s -mtriple=powerpc-unknown-linux-gnu 2>&1 | FileCheck %s 3*522f34cfSLei Huang; RUN: llc -O0 -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu 2>&1 | FileCheck %s --check-prefix=CHECK64 4*522f34cfSLei Huang 5*522f34cfSLei Huang@mVal = dso_local global i32 15, align 4 6*522f34cfSLei Huang@myGVal = dso_local global i32 0, align 4 7*522f34cfSLei Huang 8*522f34cfSLei Huangdefine dso_local void @testSetIntReg(i32 noundef signext %xx) { 9*522f34cfSLei Huang; CHECK-LABEL: testSetIntReg: 10*522f34cfSLei Huang; CHECK: # %bb.0: # %entry 11*522f34cfSLei Huang; CHECK-NEXT: mr 5, 3 12*522f34cfSLei Huang; CHECK-NEXT: blr 13*522f34cfSLei Huang; 14*522f34cfSLei Huang; CHECK64-LABEL: testSetIntReg: 15*522f34cfSLei Huang; CHECK64: # %bb.0: # %entry 16*522f34cfSLei Huang; CHECK64-NEXT: mr 5, 3 17*522f34cfSLei Huang; CHECK64-NEXT: blr 18*522f34cfSLei Huangentry: 19*522f34cfSLei Huang tail call void @llvm.write_register.i32(metadata !0, i32 %xx) 20*522f34cfSLei Huang ret void 21*522f34cfSLei Huang} 22*522f34cfSLei Huang 23*522f34cfSLei Huangdeclare void @llvm.write_register.i32(metadata, i32) 24*522f34cfSLei Huang 25*522f34cfSLei Huangdefine dso_local signext range(i32 0, 2) i32 @testCmpReg() { 26*522f34cfSLei Huang; CHECK-LABEL: testCmpReg: 27*522f34cfSLei Huang; CHECK: # %bb.0: # %entry 28*522f34cfSLei Huang; CHECK-NEXT: lis 3, mVal@ha 29*522f34cfSLei Huang; CHECK-NEXT: lwz 3, mVal@l(3) 30*522f34cfSLei Huang; CHECK-NEXT: xori 3, 3, 15 31*522f34cfSLei Huang; CHECK-NEXT: cntlzw 3, 3 32*522f34cfSLei Huang; CHECK-NEXT: srwi 3, 3, 5 33*522f34cfSLei Huang; CHECK-NEXT: blr 34*522f34cfSLei Huang; 35*522f34cfSLei Huang; CHECK64-LABEL: testCmpReg: 36*522f34cfSLei Huang; CHECK64: # %bb.0: # %entry 37*522f34cfSLei Huang; CHECK64-NEXT: addis 3, 2, mVal@toc@ha 38*522f34cfSLei Huang; CHECK64-NEXT: addi 3, 3, mVal@toc@l 39*522f34cfSLei Huang; CHECK64-NEXT: lwz 3, 0(3) 40*522f34cfSLei Huang; CHECK64-NEXT: xori 3, 3, 15 41*522f34cfSLei Huang; CHECK64-NEXT: cntlzw 3, 3 42*522f34cfSLei Huang; CHECK64-NEXT: srwi 3, 3, 5 43*522f34cfSLei Huang; CHECK64-NEXT: extsw 3, 3 44*522f34cfSLei Huang; CHECK64-NEXT: blr 45*522f34cfSLei Huangentry: 46*522f34cfSLei Huang tail call void @llvm.write_register.i32(metadata !0, i32 15) 47*522f34cfSLei Huang %0 = load i32, ptr @mVal, align 4 48*522f34cfSLei Huang %1 = tail call i32 @llvm.read_register.i32(metadata !0) 49*522f34cfSLei Huang %cmp = icmp eq i32 %0, %1 50*522f34cfSLei Huang %conv = zext i1 %cmp to i32 51*522f34cfSLei Huang ret i32 %conv 52*522f34cfSLei Huang} 53*522f34cfSLei Huang 54*522f34cfSLei Huangdeclare i32 @llvm.read_register.i32(metadata) 55*522f34cfSLei Huang 56*522f34cfSLei Huangdefine dso_local void @testSetIntReg2(i32 noundef signext %xx) { 57*522f34cfSLei Huang; CHECK-LABEL: testSetIntReg2: 58*522f34cfSLei Huang; CHECK: # %bb.0: # %entry 59*522f34cfSLei Huang; CHECK-NEXT: stwu 1, -48(1) 60*522f34cfSLei Huang; CHECK-NEXT: .cfi_def_cfa_offset 48 61*522f34cfSLei Huang; CHECK-NEXT: .cfi_offset r23, -36 62*522f34cfSLei Huang; CHECK-NEXT: stw 23, 12(1) # 4-byte Folded Spill 63*522f34cfSLei Huang; CHECK-NEXT: mr 23, 3 64*522f34cfSLei Huang; CHECK-NEXT: lwz 23, 12(1) # 4-byte Folded Reload 65*522f34cfSLei Huang; CHECK-NEXT: addi 1, 1, 48 66*522f34cfSLei Huang; CHECK-NEXT: blr 67*522f34cfSLei Huang; 68*522f34cfSLei Huang; CHECK64-LABEL: testSetIntReg2: 69*522f34cfSLei Huang; CHECK64: # %bb.0: # %entry 70*522f34cfSLei Huang; CHECK64-NEXT: std 23, -72(1) # 8-byte Folded Spill 71*522f34cfSLei Huang; CHECK64-NEXT: mr 23, 3 72*522f34cfSLei Huang; CHECK64-NEXT: ld 23, -72(1) # 8-byte Folded Reload 73*522f34cfSLei Huang; CHECK64-NEXT: blr 74*522f34cfSLei Huangentry: 75*522f34cfSLei Huang tail call void @llvm.write_register.i32(metadata !1, i32 %xx) 76*522f34cfSLei Huang ret void 77*522f34cfSLei Huang} 78*522f34cfSLei Huang 79*522f34cfSLei Huangdefine dso_local signext i32 @testReturnReg() { 80*522f34cfSLei Huang; CHECK-LABEL: testReturnReg: 81*522f34cfSLei Huang; CHECK: # %bb.0: # %entry 82*522f34cfSLei Huang; CHECK-NEXT: stwu 1, -48(1) 83*522f34cfSLei Huang; CHECK-NEXT: .cfi_def_cfa_offset 48 84*522f34cfSLei Huang; CHECK-NEXT: .cfi_offset r23, -36 85*522f34cfSLei Huang; CHECK-NEXT: stw 23, 12(1) # 4-byte Folded Spill 86*522f34cfSLei Huang; CHECK-NEXT: li 23, 125 87*522f34cfSLei Huang; CHECK-NEXT: mr 3, 23 88*522f34cfSLei Huang; CHECK-NEXT: lwz 23, 12(1) # 4-byte Folded Reload 89*522f34cfSLei Huang; CHECK-NEXT: addi 1, 1, 48 90*522f34cfSLei Huang; CHECK-NEXT: blr 91*522f34cfSLei Huang; 92*522f34cfSLei Huang; CHECK64-LABEL: testReturnReg: 93*522f34cfSLei Huang; CHECK64: # %bb.0: # %entry 94*522f34cfSLei Huang; CHECK64-NEXT: std 23, -72(1) # 8-byte Folded Spill 95*522f34cfSLei Huang; CHECK64-NEXT: li 23, 125 96*522f34cfSLei Huang; CHECK64-NEXT: extsw 3, 23 97*522f34cfSLei Huang; CHECK64-NEXT: ld 23, -72(1) # 8-byte Folded Reload 98*522f34cfSLei Huang; CHECK64-NEXT: blr 99*522f34cfSLei Huangentry: 100*522f34cfSLei Huang tail call void @llvm.write_register.i32(metadata !1, i32 125) 101*522f34cfSLei Huang %0 = tail call i32 @llvm.read_register.i32(metadata !1) 102*522f34cfSLei Huang ret i32 %0 103*522f34cfSLei Huang} 104*522f34cfSLei Huang 105*522f34cfSLei Huangdefine dso_local void @testViaASM(i32 noundef signext %xx) { 106*522f34cfSLei Huang; CHECK-LABEL: testViaASM: 107*522f34cfSLei Huang; CHECK: # %bb.0: # %entry 108*522f34cfSLei Huang; CHECK-NEXT: stwu 1, -64(1) 109*522f34cfSLei Huang; CHECK-NEXT: .cfi_def_cfa_offset 64 110*522f34cfSLei Huang; CHECK-NEXT: .cfi_offset r20, -48 111*522f34cfSLei Huang; CHECK-NEXT: stw 20, 16(1) # 4-byte Folded Spill 112*522f34cfSLei Huang; CHECK-NEXT: mr 20, 3 113*522f34cfSLei Huang; CHECK-NEXT: #APP 114*522f34cfSLei Huang; CHECK-NEXT: addi 3, 1, 1 115*522f34cfSLei Huang; CHECK-NEXT: #NO_APP 116*522f34cfSLei Huang; CHECK-NEXT: lis 4, myGVal@ha 117*522f34cfSLei Huang; CHECK-NEXT: stw 3, myGVal@l(4) 118*522f34cfSLei Huang; CHECK-NEXT: lwz 20, 16(1) # 4-byte Folded Reload 119*522f34cfSLei Huang; CHECK-NEXT: addi 1, 1, 64 120*522f34cfSLei Huang; CHECK-NEXT: blr 121*522f34cfSLei Huang; 122*522f34cfSLei Huang; CHECK64-LABEL: testViaASM: 123*522f34cfSLei Huang; CHECK64: # %bb.0: # %entry 124*522f34cfSLei Huang; CHECK64-NEXT: std 20, -96(1) # 8-byte Folded Spill 125*522f34cfSLei Huang; CHECK64-NEXT: mr 20, 3 126*522f34cfSLei Huang; CHECK64-NEXT: #APP 127*522f34cfSLei Huang; CHECK64-NEXT: addi 3, 1, 1 128*522f34cfSLei Huang; CHECK64-NEXT: #NO_APP 129*522f34cfSLei Huang; CHECK64-NEXT: addis 4, 2, myGVal@toc@ha 130*522f34cfSLei Huang; CHECK64-NEXT: addi 4, 4, myGVal@toc@l 131*522f34cfSLei Huang; CHECK64-NEXT: stw 3, 0(4) 132*522f34cfSLei Huang; CHECK64-NEXT: ld 20, -96(1) # 8-byte Folded Reload 133*522f34cfSLei Huang; CHECK64-NEXT: blr 134*522f34cfSLei Huangentry: 135*522f34cfSLei Huang tail call void @llvm.write_register.i32(metadata !2, i32 %xx) 136*522f34cfSLei Huang %0 = tail call i32 @llvm.read_register.i32(metadata !2) 137*522f34cfSLei Huang %1 = tail call i32 asm "addi $0, $2, $2", "=r,{r20},K"(i32 %0, i32 1) 138*522f34cfSLei Huang store i32 %1, ptr @myGVal, align 4 139*522f34cfSLei Huang ret void 140*522f34cfSLei Huang} 141*522f34cfSLei Huang 142*522f34cfSLei Huang!0 = !{!"r5"} 143*522f34cfSLei Huang!1 = !{!"r23"} 144*522f34cfSLei Huang!2 = !{!"r20"} 145