| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 | |
| ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GFX678,GFX6,GFX678-SDAG,GFX6-SDAG %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GFX678,GFX6,GFX678-GISEL,GFX6-GISEL %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX7,GFX678-SDAG,GFX7-SDAG %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX7,GFX678-GISEL,GFX7-GISEL %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX678-SDAG,GFX8-SDAG %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX678-GISEL,GFX8-GISEL %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck -check-prefixes=GFX1011,GFX10,GFX10-SDAG %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck -check-prefixes=GFX1011,GFX10,GFX10-GISEL %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX1011,GFX11,GFX11-SDAG %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX1011,GFX11,GFX11-GISEL %s | |
| declare void @llvm.set.rounding(i32) | |
| declare i32 @llvm.get.rounding() | |
| define amdgpu_gfx void @s_set_rounding(i32 inreg %rounding) { | |
| ; GFX678-LABEL: s_set_rounding: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX678-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX678-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX678-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX678-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX678-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX678-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX9-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX9-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s36, s4, s34 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s36, s36, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_add_i32 s0, s4, -4 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s4, s0 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_add_i32 s0, s4, -4 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s4, s0 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_kernel void @s_set_rounding_kernel(i32 inreg %rounding) { | |
| ; GFX6-LABEL: s_set_rounding_kernel: | |
| ; GFX6: ; %bb.0: | |
| ; GFX6-NEXT: s_load_dword s2, s[4:5], 0x9 | |
| ; GFX6-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX6-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX6-NEXT: ;;#ASMSTART | |
| ; GFX6-NEXT: ;;#ASMEND | |
| ; GFX6-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX6-NEXT: s_add_i32 s3, s2, -4 | |
| ; GFX6-NEXT: s_min_u32 s2, s2, s3 | |
| ; GFX6-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX6-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX6-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX6-NEXT: s_endpgm | |
| ; | |
| ; GFX7-LABEL: s_set_rounding_kernel: | |
| ; GFX7: ; %bb.0: | |
| ; GFX7-NEXT: s_load_dword s2, s[4:5], 0x9 | |
| ; GFX7-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX7-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX7-NEXT: ;;#ASMSTART | |
| ; GFX7-NEXT: ;;#ASMEND | |
| ; GFX7-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX7-NEXT: s_add_i32 s3, s2, -4 | |
| ; GFX7-NEXT: s_min_u32 s2, s2, s3 | |
| ; GFX7-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX7-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX7-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX7-NEXT: s_endpgm | |
| ; | |
| ; GFX8-SDAG-LABEL: s_set_rounding_kernel: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_load_dword s2, s[4:5], 0x24 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX8-SDAG-NEXT: ;;#ASMSTART | |
| ; GFX8-SDAG-NEXT: ;;#ASMEND | |
| ; GFX8-SDAG-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX8-SDAG-NEXT: s_add_i32 s3, s2, -4 | |
| ; GFX8-SDAG-NEXT: s_min_u32 s2, s2, s3 | |
| ; GFX8-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX8-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX8-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX8-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX8-GISEL-LABEL: s_set_rounding_kernel: | |
| ; GFX8-GISEL: ; %bb.0: | |
| ; GFX8-GISEL-NEXT: s_load_dword s2, s[4:5], 0x24 | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX8-GISEL-NEXT: ;;#ASMSTART | |
| ; GFX8-GISEL-NEXT: ;;#ASMEND | |
| ; GFX8-GISEL-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX8-GISEL-NEXT: s_add_i32 s3, s2, -4 | |
| ; GFX8-GISEL-NEXT: s_min_u32 s2, s2, s3 | |
| ; GFX8-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX8-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX8-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX8-GISEL-NEXT: s_endpgm | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_kernel: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_load_dword s2, s[4:5], 0x24 | |
| ; GFX9-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX9-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX9-NEXT: ;;#ASMSTART | |
| ; GFX9-NEXT: ;;#ASMEND | |
| ; GFX9-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX9-NEXT: s_add_i32 s3, s2, -4 | |
| ; GFX9-NEXT: s_min_u32 s2, s2, s3 | |
| ; GFX9-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX9-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX9-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX9-NEXT: s_endpgm | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_kernel: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_load_dword s2, s[4:5], 0x24 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: ;;#ASMSTART | |
| ; GFX10-SDAG-NEXT: ;;#ASMEND | |
| ; GFX10-SDAG-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_add_i32 s3, s2, -4 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s2, s2, s3 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX10-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_kernel: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_load_dword s0, s[4:5], 0x24 | |
| ; GFX10-GISEL-NEXT: ;;#ASMSTART | |
| ; GFX10-GISEL-NEXT: ;;#ASMEND | |
| ; GFX10-GISEL-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX10-GISEL-NEXT: s_endpgm | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_kernel: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_load_b32 s2, s[4:5], 0x24 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: ;;#ASMSTART | |
| ; GFX11-SDAG-NEXT: ;;#ASMEND | |
| ; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_add_i32 s3, s2, -4 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s2, s3 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_kernel: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_load_b32 s0, s[4:5], 0x24 | |
| ; GFX11-GISEL-NEXT: ;;#ASMSTART | |
| ; GFX11-GISEL-NEXT: ;;#ASMEND | |
| ; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_endpgm | |
| call void @llvm.set.rounding(i32 %rounding) | |
| call void asm sideeffect "",""() | |
| ret void | |
| } | |
| define void @v_set_rounding(i32 %rounding) { | |
| ; GFX6-SDAG-LABEL: v_set_rounding: | |
| ; GFX6-SDAG: ; %bb.0: | |
| ; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX6-SDAG-NEXT: v_add_i32_e32 v1, vcc, -4, v0 | |
| ; GFX6-SDAG-NEXT: v_min_u32_e32 v0, v0, v1 | |
| ; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX6-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX6-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX6-SDAG-NEXT: v_lshr_b64 v[0:1], s[4:5], v0 | |
| ; GFX6-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX6-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: v_set_rounding: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX678-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX678-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX7-SDAG-LABEL: v_set_rounding: | |
| ; GFX7-SDAG: ; %bb.0: | |
| ; GFX7-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX7-SDAG-NEXT: v_add_i32_e32 v1, vcc, -4, v0 | |
| ; GFX7-SDAG-NEXT: v_min_u32_e32 v0, v0, v1 | |
| ; GFX7-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX7-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX7-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX7-SDAG-NEXT: v_lshr_b64 v[0:1], s[4:5], v0 | |
| ; GFX7-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX7-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX7-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-SDAG-LABEL: v_set_rounding: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-SDAG-NEXT: v_add_u32_e32 v1, vcc, -4, v0 | |
| ; GFX8-SDAG-NEXT: v_min_u32_e32 v0, v0, v1 | |
| ; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX8-SDAG-NEXT: v_lshrrev_b64 v[0:1], v0, s[4:5] | |
| ; GFX8-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX8-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: v_set_rounding: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: v_add_u32_e32 v1, -4, v0 | |
| ; GFX9-SDAG-NEXT: v_min_u32_e32 v0, v0, v1 | |
| ; GFX9-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX9-SDAG-NEXT: v_lshrrev_b64 v[0:1], v0, s[4:5] | |
| ; GFX9-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: v_set_rounding: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: v_set_rounding: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: v_add_nc_u32_e32 v1, -4, v0 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: v_min_u32_e32 v0, v0, v1 | |
| ; GFX10-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX10-SDAG-NEXT: v_lshrrev_b64 v[0:1], v0, s[4:5] | |
| ; GFX10-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: v_set_rounding: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: v_set_rounding: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: v_add_nc_u32_e32 v1, -4, v0 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: v_min_u32_e32 v0, v0, v1 | |
| ; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX11-SDAG-NEXT: v_lshrrev_b64 v[0:1], v0, s[0:1] | |
| ; GFX11-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: v_set_rounding: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define void @set_rounding_get_rounding() { | |
| ; GFX678-SDAG-LABEL: set_rounding_get_rounding: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX678-SDAG-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX678-SDAG-NEXT: s_mov_b32 s4, 0xeb24da71 | |
| ; GFX678-SDAG-NEXT: s_mov_b32 s5, 0xc96f385 | |
| ; GFX678-SDAG-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX678-SDAG-NEXT: s_and_b32 s4, s4, 15 | |
| ; GFX678-SDAG-NEXT: s_add_i32 s5, s4, 4 | |
| ; GFX678-SDAG-NEXT: s_cmp_lt_u32 s4, 4 | |
| ; GFX678-SDAG-NEXT: s_cselect_b32 s4, s4, s5 | |
| ; GFX678-SDAG-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX678-SDAG-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX678-SDAG-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX678-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX678-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX678-SDAG-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: set_rounding_get_rounding: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_getreg_b32 s6, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s4, 0xeb24da71 | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s5, 0xc96f385 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s6, s6, 2 | |
| ; GFX678-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX678-GISEL-NEXT: s_and_b32 s4, s4, 15 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s5, s4, 4 | |
| ; GFX678-GISEL-NEXT: s_cmp_lt_u32 s4, 4 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s4, s4, s5 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX678-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX678-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: set_rounding_get_rounding: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_getreg_b32 s4, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s4, 0xeb24da71 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s5, 0xc96f385 | |
| ; GFX9-SDAG-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX9-SDAG-NEXT: s_and_b32 s4, s4, 15 | |
| ; GFX9-SDAG-NEXT: s_add_i32 s5, s4, 4 | |
| ; GFX9-SDAG-NEXT: s_cmp_lt_u32 s4, 4 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s4, s4, s5 | |
| ; GFX9-SDAG-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX9-SDAG-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX9-SDAG-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: set_rounding_get_rounding: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_getreg_b32 s6, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s4, 0xeb24da71 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s5, 0xc96f385 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s6, s6, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX9-GISEL-NEXT: s_and_b32 s4, s4, 15 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s5, s4, 4 | |
| ; GFX9-GISEL-NEXT: s_cmp_lt_u32 s4, 4 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s4, s4, s5 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: set_rounding_get_rounding: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_getreg_b32 s6, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s4, 0xeb24da71 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s5, 0xc96f385 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s6, s6, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX10-SDAG-NEXT: s_and_b32 s4, s4, 15 | |
| ; GFX10-SDAG-NEXT: s_add_i32 s5, s4, 4 | |
| ; GFX10-SDAG-NEXT: s_cmp_lt_u32 s4, 4 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s4, s4, s5 | |
| ; GFX10-SDAG-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s6, s4, s5 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s6, s6, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: set_rounding_get_rounding: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_getreg_b32 s6, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s4, 0xeb24da71 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s5, 0xc96f385 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s6, s6, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX10-GISEL-NEXT: s_and_b32 s4, s4, 15 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s5, s4, 4 | |
| ; GFX10-GISEL-NEXT: s_cmp_lt_u32 s4, 4 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s4, s4, s5 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: set_rounding_get_rounding: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX11-SDAG-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX11-SDAG-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX11-SDAG-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: set_rounding_get_rounding: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX11-GISEL-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %rounding = call i32 @llvm.get.rounding() | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define void @s_set_rounding_0() { | |
| ; GFX678-LABEL: s_set_rounding_0: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 15 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_0: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 15 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_0: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xf | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 0) | |
| ret void | |
| } | |
| define void @s_set_rounding_1() { | |
| ; GFX678-LABEL: s_set_rounding_1: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_1: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_1: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x0 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 1) | |
| ret void | |
| } | |
| define void @s_set_rounding_2() { | |
| ; GFX678-LABEL: s_set_rounding_2: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 5 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_2: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 5 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_2: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x5 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 2) | |
| ret void | |
| } | |
| define void @s_set_rounding_3() { | |
| ; GFX678-LABEL: s_set_rounding_3: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 10 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_3: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 10 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_3: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xa | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 3) | |
| ret void | |
| } | |
| ; Unsupported mode. | |
| define void @s_set_rounding_4() { | |
| ; GFX678-LABEL: s_set_rounding_4: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 15 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_4: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 15 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_4: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xf | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 4) | |
| ret void | |
| } | |
| ; undefined | |
| define void @s_set_rounding_5() { | |
| ; GFX678-LABEL: s_set_rounding_5: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_5: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_5: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x0 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 5) | |
| ret void | |
| } | |
| ; undefined | |
| define void @s_set_rounding_6() { | |
| ; GFX678-LABEL: s_set_rounding_6: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 5 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_6: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 5 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_6: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x5 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 6) | |
| ret void | |
| } | |
| ; "Dynamic" | |
| define void @s_set_rounding_7() { | |
| ; GFX678-LABEL: s_set_rounding_7: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 10 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_7: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 10 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_7: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xa | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 7) | |
| ret void | |
| } | |
| ; Invalid | |
| define void @s_set_rounding_neg1() { | |
| ; GFX678-LABEL: s_set_rounding_neg1: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_neg1: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_neg1: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xb | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 -1) | |
| ret void | |
| } | |
| ; -------------------------------------------------------------------- | |
| ; Test extended values | |
| ; -------------------------------------------------------------------- | |
| ; NearestTiesToEvenF32_TowardPositiveF64 = 8 | |
| define void @s_set_rounding_8() { | |
| ; GFX678-LABEL: s_set_rounding_8: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 4 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_8: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 4 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_8: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x4 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 8) | |
| ret void | |
| } | |
| ; NearestTiesToEvenF32_TowardNegativeF64 = 9 | |
| define void @s_set_rounding_9() { | |
| ; GFX678-LABEL: s_set_rounding_9: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 8 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_9: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 8 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_9: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x8 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 9) | |
| ret void | |
| } | |
| ; NearestTiesToEvenF32_TowardZeroF64 = 10 | |
| define void @s_set_rounding_10() { | |
| ; GFX678-LABEL: s_set_rounding_10: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 12 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_10: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 12 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_10: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xc | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 10) | |
| ret void | |
| } | |
| ; TowardPositiveF32_NearestTiesToEvenF64 = 11 | |
| define void @s_set_rounding_11() { | |
| ; GFX678-LABEL: s_set_rounding_11: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 1 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_11: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 1 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_11: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x1 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 11) | |
| ret void | |
| } | |
| ; TowardPositiveF32_TowardNegativeF64 = 12 | |
| define void @s_set_rounding_12() { | |
| ; GFX678-LABEL: s_set_rounding_12: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 9 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_12: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 9 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_12: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x9 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 12) | |
| ret void | |
| } | |
| ; TowardPositiveF32_TowardZeroF64 = 13 | |
| define void @s_set_rounding_13() { | |
| ; GFX678-LABEL: s_set_rounding_13: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 13 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_13: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 13 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_13: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xd | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 13) | |
| ret void | |
| } | |
| ; TowardNegativeF32_NearestTiesToEvenF64 = 14 | |
| define void @s_set_rounding_14() { | |
| ; GFX678-LABEL: s_set_rounding_14: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 2 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_14: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 2 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_14: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x2 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 14) | |
| ret void | |
| } | |
| ; TowardNegativeF32_TowardPositiveF64 = 15 | |
| define void @s_set_rounding_15() { | |
| ; GFX678-LABEL: s_set_rounding_15: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 6 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_15: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 6 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_15: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x6 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 15) | |
| ret void | |
| } | |
| ; TowardNegativeF32_TowardZeroF64 = 16 | |
| define void @s_set_rounding_16() { | |
| ; GFX678-LABEL: s_set_rounding_16: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 14 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_16: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 14 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_16: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xe | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 16) | |
| ret void | |
| } | |
| ; TowardZeroF32_NearestTiesToEvenF64 = 17 | |
| define void @s_set_rounding_17() { | |
| ; GFX678-LABEL: s_set_rounding_17: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 3 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_17: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 3 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_17: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x3 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 17) | |
| ret void | |
| } | |
| ; TowardZeroF32_TowardPositiveF64 = 18 | |
| define void @s_set_rounding_18() { | |
| ; GFX678-LABEL: s_set_rounding_18: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 7 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_18: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 7 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_18: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0x7 | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 18) | |
| ret void | |
| } | |
| ; TowardZeroF32_TowardNegativeF64 = 19, | |
| define void @s_set_rounding_19() { | |
| ; GFX678-LABEL: s_set_rounding_19: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_19: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_19: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xb | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 19) | |
| ret void | |
| } | |
| ; Invalid, out of bounds | |
| define void @s_set_rounding_20() { | |
| ; GFX678-LABEL: s_set_rounding_20: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_20: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_20: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xb | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 20) | |
| ret void | |
| } | |
| define void @s_set_rounding_0xffff() { | |
| ; GFX678-LABEL: s_set_rounding_0xffff: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_0xffff: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 11 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX1011-LABEL: s_set_rounding_0xffff: | |
| ; GFX1011: ; %bb.0: | |
| ; GFX1011-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX1011-NEXT: s_round_mode 0xb | |
| ; GFX1011-NEXT: s_setpc_b64 s[30:31] | |
| call void @llvm.set.rounding(i32 65535) | |
| ret void | |
| } | |
| ; -------------------------------------------------------------------- | |
| ; Test optimization knowing the value can only be in the standard | |
| ; range | |
| ; -------------------------------------------------------------------- | |
| define amdgpu_gfx void @s_set_rounding_i2_zeroext(i2 zeroext inreg %rounding) { | |
| ; GFX6-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX6: ; %bb.0: | |
| ; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX6-NEXT: s_lshl_b32 s34, s4, 2 | |
| ; GFX6-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX6-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX6-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX7-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX7: ; %bb.0: | |
| ; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX7-NEXT: s_lshl_b32 s34, s4, 2 | |
| ; GFX7-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX7-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX7-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-SDAG-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-SDAG-NEXT: s_and_b32 s34, 0xffff, s4 | |
| ; GFX8-SDAG-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX8-SDAG-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX8-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-GISEL-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX8-GISEL: ; %bb.0: | |
| ; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-GISEL-NEXT: s_and_b32 s34, s4, 3 | |
| ; GFX8-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX8-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX8-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_and_b32 s34, 0xffff, s4 | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-SDAG-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_and_b32 s34, s4, 3 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_and_b32 s34, 0xffff, s4 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_and_b32 s34, s4, 3 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_and_b32 s0, 0xffff, s4 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b32 s0, 0xa50f, s0 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_i2_zeroext: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_and_b32 s0, s4, 3 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b32 s0, 0xa50f, s0 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %zext.rounding = zext i2 %rounding to i32 | |
| call void @llvm.set.rounding(i32 %zext.rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_i2_signext(i2 signext inreg %rounding) { | |
| ; GFX6-LABEL: s_set_rounding_i2_signext: | |
| ; GFX6: ; %bb.0: | |
| ; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX6-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX6-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX6-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX6-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX6-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX6-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX6-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX6-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX7-LABEL: s_set_rounding_i2_signext: | |
| ; GFX7: ; %bb.0: | |
| ; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX7-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX7-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX7-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX7-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX7-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX7-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX7-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX7-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-SDAG-LABEL: s_set_rounding_i2_signext: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-SDAG-NEXT: s_sext_i32_i16 s34, s4 | |
| ; GFX8-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX8-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX8-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX8-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX8-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-GISEL-LABEL: s_set_rounding_i2_signext: | |
| ; GFX8-GISEL: ; %bb.0: | |
| ; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-GISEL-NEXT: s_bfe_i32 s34, s4, 0x20000 | |
| ; GFX8-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX8-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX8-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX8-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX8-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_i2_signext: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_sext_i32_i16 s34, s4 | |
| ; GFX9-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_i2_signext: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_bfe_i32 s34, s4, 0x20000 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_i2_signext: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_sext_i32_i16 s34, s4 | |
| ; GFX10-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s36, s34, s35 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s36, s36, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_i2_signext: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_bfe_i32 s34, s4, 0x20000 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_i2_signext: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_sext_i32_i16 s0, s4 | |
| ; GFX11-SDAG-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_i2_signext: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_bfe_i32 s0, s4, 0x20000 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %sext.rounding = sext i2 %rounding to i32 | |
| call void @llvm.set.rounding(i32 %sext.rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_i3_signext(i3 signext inreg %rounding) { | |
| ; GFX6-LABEL: s_set_rounding_i3_signext: | |
| ; GFX6: ; %bb.0: | |
| ; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX6-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX6-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX6-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX6-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX6-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX6-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX6-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX6-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX7-LABEL: s_set_rounding_i3_signext: | |
| ; GFX7: ; %bb.0: | |
| ; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX7-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX7-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX7-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX7-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX7-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX7-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX7-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX7-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-SDAG-LABEL: s_set_rounding_i3_signext: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-SDAG-NEXT: s_sext_i32_i16 s34, s4 | |
| ; GFX8-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX8-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX8-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX8-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX8-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-GISEL-LABEL: s_set_rounding_i3_signext: | |
| ; GFX8-GISEL: ; %bb.0: | |
| ; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-GISEL-NEXT: s_bfe_i32 s34, s4, 0x30000 | |
| ; GFX8-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX8-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX8-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX8-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX8-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_i3_signext: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_sext_i32_i16 s34, s4 | |
| ; GFX9-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_i3_signext: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_bfe_i32 s34, s4, 0x30000 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_i3_signext: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_sext_i32_i16 s34, s4 | |
| ; GFX10-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s36, s34, s35 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s36, s36, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_i3_signext: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_bfe_i32 s34, s4, 0x30000 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_i3_signext: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_sext_i32_i16 s0, s4 | |
| ; GFX11-SDAG-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_i3_signext: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_bfe_i32 s0, s4, 0x30000 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %sext.rounding = sext i3 %rounding to i32 | |
| call void @llvm.set.rounding(i32 %sext.rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_i3_zeroext(i3 zeroext inreg %rounding) { | |
| ; GFX6-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX6: ; %bb.0: | |
| ; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX6-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX6-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX6-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX6-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX6-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX6-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX6-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX6-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX7-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX7: ; %bb.0: | |
| ; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX7-NEXT: s_add_i32 s34, s4, -4 | |
| ; GFX7-NEXT: s_min_u32 s34, s4, s34 | |
| ; GFX7-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX7-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX7-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX7-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX7-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX7-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-SDAG-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-SDAG-NEXT: s_and_b32 s34, 0xffff, s4 | |
| ; GFX8-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX8-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX8-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX8-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX8-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-GISEL-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX8-GISEL: ; %bb.0: | |
| ; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-GISEL-NEXT: s_and_b32 s34, s4, 7 | |
| ; GFX8-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX8-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX8-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX8-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX8-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_and_b32 s34, 0xffff, s4 | |
| ; GFX9-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_and_b32 s34, s4, 7 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_and_b32 s34, 0xffff, s4 | |
| ; GFX10-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s36, s34, s35 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s36, s36, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_and_b32 s34, s4, 7 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_and_b32 s0, 0xffff, s4 | |
| ; GFX11-SDAG-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_i3_zeroext: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_and_b32 s0, s4, 7 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %sext.rounding = zext i3 %rounding to i32 | |
| call void @llvm.set.rounding(i32 %sext.rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_0_1(i32 inreg %cond) { | |
| ; GFX6-SDAG-LABEL: s_set_rounding_select_0_1: | |
| ; GFX6-SDAG: ; %bb.0: | |
| ; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX6-SDAG-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX6-SDAG-NEXT: s_cselect_b64 s[34:35], -1, 0 | |
| ; GFX6-SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[34:35] | |
| ; GFX6-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX6-SDAG-NEXT: v_lshr_b32_e32 v0, 0xa50f, v0 | |
| ; GFX6-SDAG-NEXT: v_readfirstlane_b32 s34, v0 | |
| ; GFX6-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: s_set_rounding_select_0_1: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX7-SDAG-LABEL: s_set_rounding_select_0_1: | |
| ; GFX7-SDAG: ; %bb.0: | |
| ; GFX7-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX7-SDAG-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX7-SDAG-NEXT: s_cselect_b64 s[34:35], -1, 0 | |
| ; GFX7-SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[34:35] | |
| ; GFX7-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX7-SDAG-NEXT: v_lshr_b32_e32 v0, 0xa50f, v0 | |
| ; GFX7-SDAG-NEXT: v_readfirstlane_b32 s34, v0 | |
| ; GFX7-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX7-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX8-SDAG-LABEL: s_set_rounding_select_0_1: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX8-SDAG-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX8-SDAG-NEXT: s_cselect_b64 s[34:35], -1, 0 | |
| ; GFX8-SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[34:35] | |
| ; GFX8-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s34, 0xa50f | |
| ; GFX8-SDAG-NEXT: v_lshrrev_b32_e64 v0, v0, s34 | |
| ; GFX8-SDAG-NEXT: v_readfirstlane_b32 s34, v0 | |
| ; GFX8-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_select_0_1: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX9-SDAG-NEXT: s_cselect_b64 s[34:35], -1, 0 | |
| ; GFX9-SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[34:35] | |
| ; GFX9-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s34, 0xa50f | |
| ; GFX9-SDAG-NEXT: v_lshrrev_b32_e64 v0, v0, s34 | |
| ; GFX9-SDAG-NEXT: v_readfirstlane_b32 s34, v0 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_select_0_1: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_0_1: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, -1, 0 | |
| ; GFX10-SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s34 | |
| ; GFX10-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX10-SDAG-NEXT: v_lshrrev_b32_e64 v0, v0, 0xa50f | |
| ; GFX10-SDAG-NEXT: v_readfirstlane_b32 s34, v0 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_0_1: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_0_1: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, -1, 0 | |
| ; GFX11-SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s0 | |
| ; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 | |
| ; GFX11-SDAG-NEXT: v_lshrrev_b32_e64 v0, v0, 0xa50f | |
| ; GFX11-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_0_1: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_lg_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b32 s0, 0xa50f, s0 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 0, i32 1 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_1_3(i32 inreg %cond) { | |
| ; GFX678-SDAG-LABEL: s_set_rounding_select_1_3: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-SDAG-NEXT: s_cselect_b32 s34, 0xa50, 10 | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: s_set_rounding_select_1_3: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s34, 1, 3 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_select_1_3: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s34, 0xa50, 10 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_select_1_3: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s34, 1, 3 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_1_3: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, 0xa50, 10 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_1_3: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, 1, 3 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_1_3: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, 0xa50, 10 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_1_3: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, 1, 3 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b32 s0, 0xa50f, s0 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 1, i32 3 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define void @v_set_rounding_select_1_3(i32 %cond) { | |
| ; GFX678-SDAG-LABEL: v_set_rounding_select_1_3: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: v_mov_b32_e32 v1, 0xa50 | |
| ; GFX678-SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0 | |
| ; GFX678-SDAG-NEXT: v_cndmask_b32_e32 v0, 10, v1, vcc | |
| ; GFX678-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: v_set_rounding_select_1_3: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0 | |
| ; GFX678-GISEL-NEXT: v_cndmask_b32_e64 v0, 3, 1, vcc | |
| ; GFX678-GISEL-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX678-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX678-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: v_set_rounding_select_1_3: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0xa50 | |
| ; GFX9-SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0 | |
| ; GFX9-SDAG-NEXT: v_cndmask_b32_e32 v0, 10, v1, vcc | |
| ; GFX9-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: v_set_rounding_select_1_3: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0 | |
| ; GFX9-GISEL-NEXT: v_cndmask_b32_e64 v0, 3, 1, vcc | |
| ; GFX9-GISEL-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: v_set_rounding_select_1_3: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: v_cmp_eq_u32_e32 vcc_lo, 0, v0 | |
| ; GFX10-SDAG-NEXT: v_cndmask_b32_e64 v0, 10, 0xa50, vcc_lo | |
| ; GFX10-SDAG-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: v_set_rounding_select_1_3: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: v_cmp_eq_u32_e32 vcc_lo, 0, v0 | |
| ; GFX10-GISEL-NEXT: v_cndmask_b32_e64 v0, 3, 1, vcc_lo | |
| ; GFX10-GISEL-NEXT: v_readfirstlane_b32 s4, v0 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s5, s4, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s4, s4, s5 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s5, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s6, s4, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s4, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[4:5], s[4:5], s6 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s4 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: v_set_rounding_select_1_3: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: v_cmp_eq_u32_e32 vcc_lo, 0, v0 | |
| ; GFX11-SDAG-NEXT: v_cndmask_b32_e64 v0, 10, 0xa50, vcc_lo | |
| ; GFX11-SDAG-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: v_set_rounding_select_1_3: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: v_cmp_eq_u32_e32 vcc_lo, 0, v0 | |
| ; GFX11-GISEL-NEXT: v_cndmask_b32_e64 v0, 3, 1, vcc_lo | |
| ; GFX11-GISEL-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 1, i32 3 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_2_0(i32 inreg %cond) { | |
| ; GFX678-SDAG-LABEL: s_set_rounding_select_2_0: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-SDAG-NEXT: s_movk_i32 s34, 0xa5 | |
| ; GFX678-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa50f | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: s_set_rounding_select_2_0: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s34, s34, 1 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_select_2_0: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-SDAG-NEXT: s_movk_i32 s34, 0xa5 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa50f | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_select_2_0: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 1 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_2_0: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_movk_i32 s34, 0xa5 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa50f | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_2_0: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 1 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_2_0: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_movk_i32 s0, 0xa5 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, s0, 0xa50f | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_2_0: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 1 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b32 s0, 0xa50f, s0 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 2, i32 0 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_2_1(i32 inreg %cond) { | |
| ; GFX678-SDAG-LABEL: s_set_rounding_select_2_1: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-SDAG-NEXT: s_movk_i32 s34, 0xa5 | |
| ; GFX678-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa50 | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: s_set_rounding_select_2_1: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s34, s34, 1 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_select_2_1: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-SDAG-NEXT: s_movk_i32 s34, 0xa5 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa50 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_select_2_1: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s34, s34, 1 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_2_1: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_movk_i32 s34, 0xa5 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa50 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_2_1: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s34, s34, 1 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_2_1: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_movk_i32 s0, 0xa5 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, s0, 0xa50 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_2_1: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s0, s0, 1 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b32 s0, 0xa50f, s0 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 2, i32 1 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_1_2(i32 inreg %cond) { | |
| ; GFX678-SDAG-LABEL: s_set_rounding_select_1_2: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-SDAG-NEXT: s_movk_i32 s34, 0xa50 | |
| ; GFX678-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa5 | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: s_set_rounding_select_1_2: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s34, -1, 0 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s34, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX678-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX678-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_select_1_2: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-SDAG-NEXT: s_movk_i32 s34, 0xa50 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa5 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_select_1_2: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s34, -1, 0 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_1_2: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_movk_i32 s34, 0xa50 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, s34, 0xa5 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_1_2: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, -1, 0 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_1_2: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_movk_i32 s0, 0xa50 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, s0, 0xa5 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_1_2: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, -1, 0 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 1, i32 2 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_3_0(i32 inreg %cond) { | |
| ; GFX678-SDAG-LABEL: s_set_rounding_select_3_0: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-SDAG-NEXT: s_cselect_b32 s34, 10, 0xa50f | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: s_set_rounding_select_3_0: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s34, 3, 0 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_select_3_0: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s34, 10, 0xa50f | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_select_3_0: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s34, 3, 0 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_3_0: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, 10, 0xa50f | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_3_0: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, 3, 0 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_lshr_b32 s34, 0xa50f, s34 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_3_0: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, 10, 0xa50f | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_3_0: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, 3, 0 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_lshr_b32 s0, 0xa50f, s0 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 3, i32 0 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_4_0(i32 inreg %cond) { | |
| ; GFX678-SDAG-LABEL: s_set_rounding_select_4_0: | |
| ; GFX678-SDAG: ; %bb.0: | |
| ; GFX678-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-SDAG-NEXT: s_cselect_b32 s34, 4, 0 | |
| ; GFX678-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX678-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX678-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX678-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX678-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX678-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX678-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX678-GISEL-LABEL: s_set_rounding_select_4_0: | |
| ; GFX678-GISEL: ; %bb.0: | |
| ; GFX678-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX678-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX678-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX678-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX678-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX678-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-SDAG-LABEL: s_set_rounding_select_4_0: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s34, 4, 0 | |
| ; GFX9-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-SDAG-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-GISEL-LABEL: s_set_rounding_select_4_0: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_4_0: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, 4, 0 | |
| ; GFX10-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s36, s34, s35 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s36, s36, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_4_0: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, 1, 0 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s34, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_4_0: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, 4, 0 | |
| ; GFX11-SDAG-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_4_0: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 4, i32 0 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_gfx void @s_set_rounding_select_3_5(i32 inreg %cond) { | |
| ; GFX678-LABEL: s_set_rounding_select_3_5: | |
| ; GFX678: ; %bb.0: | |
| ; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX678-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX678-NEXT: s_cselect_b32 s34, 3, 5 | |
| ; GFX678-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX678-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX678-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX678-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX678-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX678-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX678-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX678-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX9-LABEL: s_set_rounding_select_3_5: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX9-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX9-NEXT: s_cselect_b32 s34, 3, 5 | |
| ; GFX9-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX9-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX9-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX9-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX9-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX9-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX9-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX9-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-SDAG-LABEL: s_set_rounding_select_3_5: | |
| ; GFX10-SDAG: ; %bb.0: | |
| ; GFX10-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-SDAG-NEXT: s_cselect_b32 s34, 3, 5 | |
| ; GFX10-SDAG-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-SDAG-NEXT: s_min_u32 s36, s34, s35 | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-SDAG-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-SDAG-NEXT: s_lshl_b32 s36, s36, 2 | |
| ; GFX10-SDAG-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX10-GISEL-LABEL: s_set_rounding_select_3_5: | |
| ; GFX10-GISEL: ; %bb.0: | |
| ; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX10-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX10-GISEL-NEXT: s_cselect_b32 s34, 3, 5 | |
| ; GFX10-GISEL-NEXT: s_add_i32 s35, s34, -4 | |
| ; GFX10-GISEL-NEXT: s_min_u32 s34, s34, s35 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s35, 0xb73e62d9 | |
| ; GFX10-GISEL-NEXT: s_lshl_b32 s36, s34, 2 | |
| ; GFX10-GISEL-NEXT: s_mov_b32 s34, 0x1c84a50f | |
| ; GFX10-GISEL-NEXT: s_lshr_b64 s[34:35], s[34:35], s36 | |
| ; GFX10-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s34 | |
| ; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-SDAG-LABEL: s_set_rounding_select_3_5: | |
| ; GFX11-SDAG: ; %bb.0: | |
| ; GFX11-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-SDAG-NEXT: s_cselect_b32 s0, 3, 5 | |
| ; GFX11-SDAG-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-SDAG-NEXT: s_min_u32 s2, s0, s1 | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-SDAG-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-SDAG-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-SDAG-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-SDAG-NEXT: s_setpc_b64 s[30:31] | |
| ; | |
| ; GFX11-GISEL-LABEL: s_set_rounding_select_3_5: | |
| ; GFX11-GISEL: ; %bb.0: | |
| ; GFX11-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) | |
| ; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0 | |
| ; GFX11-GISEL-NEXT: s_cselect_b32 s0, 3, 5 | |
| ; GFX11-GISEL-NEXT: s_add_i32 s1, s0, -4 | |
| ; GFX11-GISEL-NEXT: s_min_u32 s0, s0, s1 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s1, 0xb73e62d9 | |
| ; GFX11-GISEL-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX11-GISEL-NEXT: s_mov_b32 s0, 0x1c84a50f | |
| ; GFX11-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-GISEL-NEXT: s_setreg_b32 hwreg(HW_REG_MODE, 0, 4), s0 | |
| ; GFX11-GISEL-NEXT: s_setpc_b64 s[30:31] | |
| %cmp = icmp eq i32 %cond, 0 | |
| %rounding = select i1 %cmp, i32 3, i32 5 | |
| call void @llvm.set.rounding(i32 %rounding) | |
| ret void | |
| } | |
| define amdgpu_kernel void @get_rounding_after_set_rounding_1() { | |
| ; GFX6-SDAG-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX6-SDAG: ; %bb.0: | |
| ; GFX6-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX6-SDAG-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX6-SDAG-NEXT: s_mov_b32 s3, 0xf000 | |
| ; GFX6-SDAG-NEXT: s_getreg_b32 s0, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX6-SDAG-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX6-SDAG-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX6-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX6-SDAG-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX6-SDAG-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX6-SDAG-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX6-SDAG-NEXT: s_cselect_b32 s4, s0, s1 | |
| ; GFX6-SDAG-NEXT: s_mov_b64 s[0:1], 0 | |
| ; GFX6-SDAG-NEXT: s_mov_b32 s2, -1 | |
| ; GFX6-SDAG-NEXT: v_mov_b32_e32 v0, s4 | |
| ; GFX6-SDAG-NEXT: buffer_store_dword v0, off, s[0:3], 0 | |
| ; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX6-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX6-GISEL-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX6-GISEL: ; %bb.0: | |
| ; GFX6-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX6-GISEL-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX6-GISEL-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX6-GISEL-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX6-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX6-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX6-GISEL-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX6-GISEL-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX6-GISEL-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX6-GISEL-NEXT: s_cselect_b32 s2, s0, s1 | |
| ; GFX6-GISEL-NEXT: s_mov_b64 s[0:1], 0 | |
| ; GFX6-GISEL-NEXT: v_mov_b32_e32 v0, s2 | |
| ; GFX6-GISEL-NEXT: s_mov_b32 s2, -1 | |
| ; GFX6-GISEL-NEXT: s_mov_b32 s3, 0xf000 | |
| ; GFX6-GISEL-NEXT: buffer_store_dword v0, off, s[0:3], 0 | |
| ; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX6-GISEL-NEXT: s_endpgm | |
| ; | |
| ; GFX7-SDAG-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX7-SDAG: ; %bb.0: | |
| ; GFX7-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX7-SDAG-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX7-SDAG-NEXT: s_mov_b32 s3, 0xf000 | |
| ; GFX7-SDAG-NEXT: s_getreg_b32 s0, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX7-SDAG-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX7-SDAG-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX7-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX7-SDAG-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX7-SDAG-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX7-SDAG-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX7-SDAG-NEXT: s_cselect_b32 s4, s0, s1 | |
| ; GFX7-SDAG-NEXT: s_mov_b64 s[0:1], 0 | |
| ; GFX7-SDAG-NEXT: s_mov_b32 s2, -1 | |
| ; GFX7-SDAG-NEXT: v_mov_b32_e32 v0, s4 | |
| ; GFX7-SDAG-NEXT: buffer_store_dword v0, off, s[0:3], 0 | |
| ; GFX7-SDAG-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX7-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX7-GISEL-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX7-GISEL: ; %bb.0: | |
| ; GFX7-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX7-GISEL-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX7-GISEL-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX7-GISEL-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX7-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX7-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX7-GISEL-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX7-GISEL-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX7-GISEL-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX7-GISEL-NEXT: s_cselect_b32 s2, s0, s1 | |
| ; GFX7-GISEL-NEXT: s_mov_b64 s[0:1], 0 | |
| ; GFX7-GISEL-NEXT: v_mov_b32_e32 v0, s2 | |
| ; GFX7-GISEL-NEXT: s_mov_b32 s2, -1 | |
| ; GFX7-GISEL-NEXT: s_mov_b32 s3, 0xf000 | |
| ; GFX7-GISEL-NEXT: buffer_store_dword v0, off, s[0:3], 0 | |
| ; GFX7-GISEL-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX7-GISEL-NEXT: s_endpgm | |
| ; | |
| ; GFX8-SDAG-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX8-SDAG: ; %bb.0: | |
| ; GFX8-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX8-SDAG-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX8-SDAG-NEXT: s_getreg_b32 s0, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX8-SDAG-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX8-SDAG-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX8-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX8-SDAG-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX8-SDAG-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX8-SDAG-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX8-SDAG-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX8-SDAG-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX8-SDAG-NEXT: v_mov_b32_e32 v2, s0 | |
| ; GFX8-SDAG-NEXT: flat_store_dword v[0:1], v2 | |
| ; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX8-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX8-GISEL-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX8-GISEL: ; %bb.0: | |
| ; GFX8-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX8-GISEL-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX8-GISEL-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX8-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX8-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX8-GISEL-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX8-GISEL-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX8-GISEL-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX8-GISEL-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX8-GISEL-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, s0 | |
| ; GFX8-GISEL-NEXT: flat_store_dword v[0:1], v2 | |
| ; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX8-GISEL-NEXT: s_endpgm | |
| ; | |
| ; GFX9-SDAG-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX9-SDAG: ; %bb.0: | |
| ; GFX9-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX9-SDAG-NEXT: s_getreg_b32 s0, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX9-SDAG-NEXT: s_lshl_b32 s2, s0, 2 | |
| ; GFX9-SDAG-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX9-SDAG-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX9-SDAG-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX9-SDAG-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX9-SDAG-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX9-SDAG-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX9-SDAG-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, s0 | |
| ; GFX9-SDAG-NEXT: global_store_dword v[0:1], v2, off | |
| ; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX9-SDAG-NEXT: s_endpgm | |
| ; | |
| ; GFX9-GISEL-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX9-GISEL: ; %bb.0: | |
| ; GFX9-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 0, 4), 0 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX9-GISEL-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX9-GISEL-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX9-GISEL-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX9-GISEL-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX9-GISEL-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX9-GISEL-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX9-GISEL-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX9-GISEL-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX9-GISEL-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, s0 | |
| ; GFX9-GISEL-NEXT: global_store_dword v[0:1], v2, off | |
| ; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) | |
| ; GFX9-GISEL-NEXT: s_endpgm | |
| ; | |
| ; GFX10-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX10: ; %bb.0: | |
| ; GFX10-NEXT: s_round_mode 0x0 | |
| ; GFX10-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX10-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX10-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX10-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX10-NEXT: v_mov_b32_e32 v0, 0 | |
| ; GFX10-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX10-NEXT: v_mov_b32_e32 v1, 0 | |
| ; GFX10-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX10-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX10-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX10-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX10-NEXT: v_mov_b32_e32 v2, s0 | |
| ; GFX10-NEXT: global_store_dword v[0:1], v2, off | |
| ; GFX10-NEXT: s_waitcnt_vscnt null, 0x0 | |
| ; GFX10-NEXT: s_endpgm | |
| ; | |
| ; GFX11-LABEL: get_rounding_after_set_rounding_1: | |
| ; GFX11: ; %bb.0: | |
| ; GFX11-NEXT: s_round_mode 0x0 | |
| ; GFX11-NEXT: s_mov_b32 s0, 0xeb24da71 | |
| ; GFX11-NEXT: s_getreg_b32 s2, hwreg(HW_REG_MODE, 0, 4) | |
| ; GFX11-NEXT: s_mov_b32 s1, 0xc96f385 | |
| ; GFX11-NEXT: s_lshl_b32 s2, s2, 2 | |
| ; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0 | |
| ; GFX11-NEXT: s_lshr_b64 s[0:1], s[0:1], s2 | |
| ; GFX11-NEXT: s_and_b32 s0, s0, 15 | |
| ; GFX11-NEXT: s_add_i32 s1, s0, 4 | |
| ; GFX11-NEXT: s_cmp_lt_u32 s0, 4 | |
| ; GFX11-NEXT: s_cselect_b32 s0, s0, s1 | |
| ; GFX11-NEXT: v_mov_b32_e32 v2, s0 | |
| ; GFX11-NEXT: global_store_b32 v[0:1], v2, off dlc | |
| ; GFX11-NEXT: s_waitcnt_vscnt null, 0x0 | |
| ; GFX11-NEXT: s_endpgm | |
| tail call void @llvm.set.rounding(i32 1) | |
| %set.mode = tail call i32 @llvm.get.rounding() | |
| store volatile i32 %set.mode, ptr addrspace(1) null | |
| ret void | |
| } |