|  | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 | 
|  | ; RUN: llc -global-isel=1 -mtriple=amdgcn--amdpal -mcpu=gfx1200 -mattr=+block-vgpr-csr < %s | FileCheck -check-prefixes=CHECK,GISEL %s | 
|  | ; RUN: llc -global-isel=0 -mtriple=amdgcn--amdpal -mcpu=gfx1200 -mattr=+block-vgpr-csr < %s | FileCheck -check-prefixes=CHECK,DAGISEL %s | 
|  |  | 
|  | define i32 @non_entry_func(i32 %x) { | 
|  | ; CHECK-LABEL: non_entry_func: | 
|  | ; CHECK:       ; %bb.0: | 
|  | ; CHECK-NEXT:    s_wait_loadcnt_dscnt 0x0 | 
|  | ; CHECK-NEXT:    s_wait_expcnt 0x0 | 
|  | ; CHECK-NEXT:    s_wait_samplecnt 0x0 | 
|  | ; CHECK-NEXT:    s_wait_bvhcnt 0x0 | 
|  | ; CHECK-NEXT:    s_wait_kmcnt 0x0 | 
|  | ; CHECK-NEXT:    s_xor_saveexec_b32 s0, -1 | 
|  | ; CHECK-NEXT:    scratch_store_b32 off, v2, s32 offset:100 ; 4-byte Folded Spill | 
|  | ; CHECK-NEXT:    s_wait_alu 0xfffe | 
|  | ; CHECK-NEXT:    s_mov_b32 exec_lo, s0 | 
|  | ; CHECK-NEXT:    v_writelane_b32 v2, s48, 0 | 
|  | ; CHECK-NEXT:    s_mov_b32 m0, 0x110003 | 
|  | ; CHECK-NEXT:    v_mov_b32_e32 v1, v0 | 
|  | ; CHECK-NEXT:    ; transferring at most v40 v41 v56 v60 ; 128-byte Folded Spill | 
|  | ; CHECK-NEXT:    scratch_store_block off, v[40:71], s32 offset:4 | 
|  | ; CHECK-NEXT:    s_mov_b32 m0, 1 | 
|  | ; CHECK-NEXT:    v_writelane_b32 v2, s49, 1 | 
|  | ; CHECK-NEXT:    ; transferring at most v120 ; 128-byte Folded Spill | 
|  | ; CHECK-NEXT:    scratch_store_block off, v[120:151], s32 | 
|  | ; CHECK-NEXT:    ;;#ASMSTART | 
|  | ; CHECK-NEXT:    s_nop | 
|  | ; CHECK-NEXT:    ;;#ASMEND | 
|  | ; CHECK-NEXT:    ; transferring at most v120 ; 128-byte Folded Reload | 
|  | ; CHECK-NEXT:    scratch_load_block v[120:151], off, s32 | 
|  | ; CHECK-NEXT:    s_mov_b32 m0, 0x110003 | 
|  | ; CHECK-NEXT:    scratch_store_b32 off, v1, s32 offset:88 | 
|  | ; CHECK-NEXT:    ; transferring at most v40 v41 v56 v60 ; 128-byte Folded Reload | 
|  | ; CHECK-NEXT:    scratch_load_block v[40:71], off, s32 offset:4 | 
|  | ; CHECK-NEXT:    v_mov_b32_e32 v0, v1 | 
|  | ; CHECK-NEXT:    v_readlane_b32 s49, v2, 1 | 
|  | ; CHECK-NEXT:    v_readlane_b32 s48, v2, 0 | 
|  | ; CHECK-NEXT:    s_xor_saveexec_b32 s0, -1 | 
|  | ; CHECK-NEXT:    scratch_load_b32 v2, off, s32 offset:100 ; 4-byte Folded Reload | 
|  | ; CHECK-NEXT:    s_wait_alu 0xfffe | 
|  | ; CHECK-NEXT:    s_mov_b32 exec_lo, s0 | 
|  | ; CHECK-NEXT:    s_wait_loadcnt 0x0 | 
|  | ; CHECK-NEXT:    s_setpc_b64 s[30:31] | 
|  | %local = alloca i32, i32 3, addrspace(5) | 
|  | store i32 %x, ptr addrspace(5) %local | 
|  | call void asm "s_nop", "~{v0},~{v8},~{v40},~{v41},~{v49},~{v52},~{v56},~{v60},~{v120},~{s0},~{s48},~{s49}"() | 
|  | ret i32 %x | 
|  | } | 
|  |  | 
|  | define amdgpu_kernel void @entry_func(i32 %x) { | 
|  | ; GISEL-LABEL: entry_func: | 
|  | ; GISEL:       ; %bb.0: | 
|  | ; GISEL-NEXT:    s_mov_b64 s[10:11], s[6:7] | 
|  | ; GISEL-NEXT:    s_load_b32 s6, s[4:5], 0x0 | 
|  | ; GISEL-NEXT:    v_mov_b32_e32 v31, v0 | 
|  | ; GISEL-NEXT:    s_mov_b64 s[12:13], s[0:1] | 
|  | ; GISEL-NEXT:    ;;#ASMSTART | 
|  | ; GISEL-NEXT:    s_nop | 
|  | ; GISEL-NEXT:    ;;#ASMEND | 
|  | ; GISEL-NEXT:    s_add_co_u32 s8, s4, 4 | 
|  | ; GISEL-NEXT:    s_mov_b32 s0, non_entry_func@abs32@lo | 
|  | ; GISEL-NEXT:    s_mov_b32 s1, non_entry_func@abs32@hi | 
|  | ; GISEL-NEXT:    s_add_co_ci_u32 s9, s5, 0 | 
|  | ; GISEL-NEXT:    s_mov_b64 s[4:5], s[12:13] | 
|  | ; GISEL-NEXT:    s_mov_b32 s32, 0 | 
|  | ; GISEL-NEXT:    s_wait_kmcnt 0x0 | 
|  | ; GISEL-NEXT:    v_mov_b32_e32 v0, s6 | 
|  | ; GISEL-NEXT:    s_mov_b64 s[6:7], s[2:3] | 
|  | ; GISEL-NEXT:    s_wait_alu 0xfffe | 
|  | ; GISEL-NEXT:    s_swappc_b64 s[30:31], s[0:1] | 
|  | ; GISEL-NEXT:    s_endpgm | 
|  | ; | 
|  | ; DAGISEL-LABEL: entry_func: | 
|  | ; DAGISEL:       ; %bb.0: | 
|  | ; DAGISEL-NEXT:    s_load_b32 s12, s[4:5], 0x0 | 
|  | ; DAGISEL-NEXT:    s_mov_b64 s[10:11], s[6:7] | 
|  | ; DAGISEL-NEXT:    v_mov_b32_e32 v31, v0 | 
|  | ; DAGISEL-NEXT:    s_mov_b64 s[6:7], s[0:1] | 
|  | ; DAGISEL-NEXT:    ;;#ASMSTART | 
|  | ; DAGISEL-NEXT:    s_nop | 
|  | ; DAGISEL-NEXT:    ;;#ASMEND | 
|  | ; DAGISEL-NEXT:    s_add_nc_u64 s[8:9], s[4:5], 4 | 
|  | ; DAGISEL-NEXT:    s_mov_b32 s1, non_entry_func@abs32@hi | 
|  | ; DAGISEL-NEXT:    s_mov_b32 s0, non_entry_func@abs32@lo | 
|  | ; DAGISEL-NEXT:    s_mov_b64 s[4:5], s[6:7] | 
|  | ; DAGISEL-NEXT:    s_mov_b64 s[6:7], s[2:3] | 
|  | ; DAGISEL-NEXT:    s_mov_b32 s32, 0 | 
|  | ; DAGISEL-NEXT:    s_wait_kmcnt 0x0 | 
|  | ; DAGISEL-NEXT:    v_mov_b32_e32 v0, s12 | 
|  | ; DAGISEL-NEXT:    s_swappc_b64 s[30:31], s[0:1] | 
|  | ; DAGISEL-NEXT:    s_endpgm | 
|  | call void asm "s_nop", "~{v0},~{v8},~{v40},~{v41},~{v49},~{v52},~{v56},~{v60},~{v120},~{s0},~{s48}"() | 
|  | %res = call i32 @non_entry_func(i32 %x) | 
|  | ret void | 
|  | } |