| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu9.50-- < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX950,GFX950-SDAG %s | |
| ; RUN: llc -global-isel -mtriple=amdgpu9.50-- < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX950,GFX950-GISEL %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.50-- -mattr=-real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX1250,GFX1250-SDAG,GFX1250-SDAG-FAKE16,GFX1250-FAKE16 %s | |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.50-- -mattr=+real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX1250,GFX1250-SDAG,GFX1250-SDAG-TRUE16,GFX1250-TRUE16 %s | |
| ; RUN: llc -global-isel -mtriple=amdgpu12.50-- -mattr=-real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX1250,GFX1250-GISEL,GFX1250-GISEL-FAKE16,GFX1250-FAKE16 %s | |
| ; RUN: llc -global-isel -mtriple=amdgpu12.50-- -mattr=+real-true16 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX1250,GFX1250-GISEL,GFX1250-GISEL-TRUE16,GFX1250-TRUE16 %s | |
| ; ========= Single bit functions ========= | |
| define amdgpu_ps float @not_and_not_and_not_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: not_and_not_and_not_and: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:1 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: not_and_not_and_not_and: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:1 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %notb = xor i32 %b, -1 | |
| %notc = xor i32 %c, -1 | |
| %and1 = and i32 %nota, %notc | |
| %and2 = and i32 %and1, %notb | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @not_and_not_and_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: not_and_not_and_and: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:2 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: not_and_not_and_and: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:2 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %notb = xor i32 %b, -1 | |
| %and1 = and i32 %nota, %c | |
| %and2 = and i32 %and1, %notb | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @not_and_and_not_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: not_and_and_not_and: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:4 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: not_and_and_not_and: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:4 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %notc = xor i32 %c, -1 | |
| %and1 = and i32 %nota, %notc | |
| %and2 = and i32 %and1, %b | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @not_and_and_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-SDAG-LABEL: not_and_and_and: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:8 | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: not_and_and_and: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_bitop3_b32 v0, v0, v2, v0 bitop3:0xc | |
| ; GFX950-GISEL-NEXT: v_and_b32_e32 v0, v0, v1 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: not_and_and_and: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:8 | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: not_and_and_and: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_bitop3_b32 v0, v0, v2, v0 bitop3:0xc | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_and_b32_e32 v0, v0, v1 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %and1 = and i32 %nota, %c | |
| %and2 = and i32 %and1, %b | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @and_not_and_not_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: and_not_and_not_and: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x10 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: and_not_and_not_and: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x10 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %notb = xor i32 %b, -1 | |
| %notc = xor i32 %c, -1 | |
| %and1 = and i32 %a, %notc | |
| %and2 = and i32 %and1, %notb | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @and_not_and_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-SDAG-LABEL: and_not_and_and: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x20 | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: and_not_and_and: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_and_b32_e32 v0, v0, v2 | |
| ; GFX950-GISEL-NEXT: v_bfi_b32 v0, v1, 0, v0 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: and_not_and_and: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x20 | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: and_not_and_and: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_and_b32_e32 v0, v0, v2 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_bfi_b32 v0, v1, 0, v0 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %notb = xor i32 %b, -1 | |
| %and1 = and i32 %a, %c | |
| %and2 = and i32 %and1, %notb | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @and_and_not_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-SDAG-LABEL: and_and_not_and: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x40 | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: and_and_not_and: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_bitop3_b32 v0, v0, v2, v0 bitop3:0x30 | |
| ; GFX950-GISEL-NEXT: v_and_b32_e32 v0, v0, v1 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: and_and_not_and: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x40 | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: and_and_not_and: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_bitop3_b32 v0, v0, v2, v0 bitop3:0x30 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_and_b32_e32 v0, v0, v1 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %notc = xor i32 %c, -1 | |
| %and1 = and i32 %a, %notc | |
| %and2 = and i32 %and1, %b | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @and_and_and(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: and_and_and: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x80 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: and_and_and: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x80 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %and1 = and i32 %a, %c | |
| %and2 = and i32 %and1, %b | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| ; ========= Multi bit functions ========= | |
| define amdgpu_ps float @test_12(i32 %a, i32 %b) { | |
| ; GFX950-LABEL: test_12: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b32 v0, v0, v1, v0 bitop3:0xc | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: test_12: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_bitop3_b32 v0, v0, v1, v0 bitop3:0xc | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %and1 = and i32 %nota, %b | |
| %ret_cast = bitcast i32 %and1 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @test_63(i32 %a, i32 %b) { | |
| ; GFX950-SDAG-LABEL: test_63: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v0 bitop3:0x3f | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_63: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_not_b32_e32 v1, v1 | |
| ; GFX950-GISEL-NEXT: v_bfi_b32 v0, v0, v1, -1 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: test_63: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v0 bitop3:0x3f | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_63: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_not_b32_e32 v1, v1 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_bfi_b32 v0, v0, v1, -1 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %notb = xor i32 %b, -1 | |
| %or = or i32 %nota, %notb | |
| %ret_cast = bitcast i32 %or to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @test_59(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: test_59: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x3b | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: test_59: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0x3b | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %notb = xor i32 %b, -1 | |
| %and1 = and i32 %nota, %c | |
| %or = or i32 %and1, %notb | |
| %ret_cast = bitcast i32 %or to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @test_126(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-SDAG-LABEL: test_126: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v0, v2, v1 bitop3:0x7e | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_126: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_xor_b32_e32 v1, v0, v1 | |
| ; GFX950-GISEL-NEXT: v_xor_b32_e32 v0, v0, v2 | |
| ; GFX950-GISEL-NEXT: v_or_b32_e32 v0, v1, v0 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: test_126: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v0, v2, v1 bitop3:0x7e | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_126: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_xor_b32_e32 v1, v0, v1 | |
| ; GFX1250-GISEL-NEXT: v_xor_b32_e32 v0, v0, v2 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_or_b32_e32 v0, v1, v0 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %xor1 = xor i32 %a, %b | |
| %xor2 = xor i32 %a, %c | |
| %or = or i32 %xor1, %xor2 | |
| %ret_cast = bitcast i32 %or to float | |
| ret float %ret_cast | |
| } | |
| ; Src vector exhausted during search but recovered using 'not' lookahead. | |
| ; GlobalISel has slightly different input, so it does not happen. | |
| ; FIXME: Improve global isel code. | |
| define amdgpu_ps float @test_12_src_overflow(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-SDAG-LABEL: test_12_src_overflow: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v0 bitop3:0xc | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_12_src_overflow: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_not_b32_e32 v3, v0 | |
| ; GFX950-GISEL-NEXT: v_bitop3_b32 v0, v0, v2, v0 bitop3:0xc | |
| ; GFX950-GISEL-NEXT: v_bfi_b32 v2, v2, 0, v3 | |
| ; GFX950-GISEL-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0xc8 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: test_12_src_overflow: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v0, v1, v0 bitop3:0xc | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_12_src_overflow: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_not_b32_e32 v3, v0 | |
| ; GFX1250-GISEL-NEXT: v_bitop3_b32 v0, v0, v2, v0 bitop3:0xc | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_bfi_b32 v2, v2, 0, v3 | |
| ; GFX1250-GISEL-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:0xc8 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %notc = xor i32 %c, -1 | |
| %and1 = and i32 %nota, %c | |
| %and2 = and i32 %and1, %b | |
| %and3 = and i32 %nota, %notc | |
| %and4 = and i32 %and3, %b | |
| %or = or i32 %and2, %and4 | |
| %ret_cast = bitcast i32 %or to float | |
| ret float %ret_cast | |
| } | |
| ; This could be a single LOP3 operation with tbl = 100, but Src vector exhausted during search. | |
| define amdgpu_ps float @test_100_src_overflow(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-SDAG-LABEL: test_100_src_overflow: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v3, v1, v2, v0 bitop3:0x10 | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v4, v0, v2, v1 bitop3:0x40 | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v1, v2, v0 bitop3:0x20 | |
| ; GFX950-SDAG-NEXT: v_or3_b32 v0, v3, v4, v0 | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_100_src_overflow: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_or_b32_e32 v3, v2, v0 | |
| ; GFX950-GISEL-NEXT: v_bitop3_b32 v4, v0, v1, v0 bitop3:0x30 | |
| ; GFX950-GISEL-NEXT: v_and_b32_e32 v0, v1, v0 | |
| ; GFX950-GISEL-NEXT: v_bfi_b32 v3, v3, 0, v1 | |
| ; GFX950-GISEL-NEXT: v_and_b32_e32 v4, v4, v2 | |
| ; GFX950-GISEL-NEXT: v_bfi_b32 v0, v2, 0, v0 | |
| ; GFX950-GISEL-NEXT: v_or3_b32 v0, v3, v4, v0 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: test_100_src_overflow: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v3, v1, v2, v0 bitop3:0x10 | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v4, v0, v2, v1 bitop3:0x40 | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v1, v2, v0 bitop3:0x20 | |
| ; GFX1250-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-SDAG-NEXT: v_or3_b32 v0, v3, v4, v0 | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_100_src_overflow: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_or_b32_e32 v3, v2, v0 | |
| ; GFX1250-GISEL-NEXT: v_bitop3_b32 v4, v0, v1, v0 bitop3:0x30 | |
| ; GFX1250-GISEL-NEXT: v_and_b32_e32 v0, v1, v0 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) | |
| ; GFX1250-GISEL-NEXT: v_bfi_b32 v1, v3, 0, v1 | |
| ; GFX1250-GISEL-NEXT: v_and_b32_e32 v3, v4, v2 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_bfi_b32 v0, v2, 0, v0 | |
| ; GFX1250-GISEL-NEXT: v_or3_b32 v0, v1, v3, v0 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %or1 = or i32 %c, %a | |
| %not1 = xor i32 %or1, -1 | |
| %and1 = and i32 %b, %not1 | |
| %not2 = xor i32 %b, -1 | |
| %and2 = and i32 %a, %not2 | |
| %and3 = and i32 %and2, %c | |
| %and4 = and i32 %b, %a | |
| %not3 = xor i32 %c, -1 | |
| %and5 = and i32 %and4, %not3 | |
| %or2 = or i32 %and1, %and3 | |
| %or3 = or i32 %or2, %and5 | |
| %ret_cast = bitcast i32 %or3 to float | |
| ret float %ret_cast | |
| } | |
| ; ========= Ternary logical operations take precedence ========= | |
| define amdgpu_ps float @test_xor3(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: test_xor3: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_xor_b32_e32 v0, v0, v1 | |
| ; GFX950-NEXT: v_xor_b32_e32 v0, v0, v2 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: test_xor3: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_xor3_b32 v0, v0, v1, v2 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %xor1 = xor i32 %a, %b | |
| %xor2 = xor i32 %xor1, %c | |
| %ret_cast = bitcast i32 %xor2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @test_or3(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: test_or3: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_or3_b32 v0, v0, v1, v2 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: test_or3: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_or3_b32 v0, v0, v1, v2 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %or1 = or i32 %a, %b | |
| %or2 = or i32 %or1, %c | |
| %ret_cast = bitcast i32 %or2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @test_and_or(i32 %a, i32 %b, i32 %c) { | |
| ; GFX950-LABEL: test_and_or: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_and_or_b32 v0, v0, v1, v2 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: test_and_or: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_and_or_b32 v0, v0, v1, v2 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %and1 = and i32 %a, %b | |
| %or1 = or i32 %and1, %c | |
| %ret_cast = bitcast i32 %or1 to float | |
| ret float %ret_cast | |
| } | |
| ; ========= Uniform cases ========= | |
| define amdgpu_ps float @uniform_3_op(i32 inreg %a, i32 inreg %b, i32 inreg %c) { | |
| ; GFX950-LABEL: uniform_3_op: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: s_andn2_b32 s0, s2, s0 | |
| ; GFX950-NEXT: s_and_b32 s0, s0, s1 | |
| ; GFX950-NEXT: v_mov_b32_e32 v0, s0 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: uniform_3_op: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_and_not1_b32 s0, s2, s0 | |
| ; GFX1250-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1) | |
| ; GFX1250-NEXT: s_and_b32 s0, s0, s1 | |
| ; GFX1250-NEXT: v_mov_b32_e32 v0, s0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %and1 = and i32 %nota, %c | |
| %and2 = and i32 %and1, %b | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| define amdgpu_ps float @uniform_4_op(i32 inreg %a, i32 inreg %b, i32 inreg %c) { | |
| ; GFX950-SDAG-LABEL: uniform_4_op: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_mov_b32_e32 v0, s1 | |
| ; GFX950-SDAG-NEXT: v_mov_b32_e32 v1, s2 | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, s0, v0, v1 bitop3:2 | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: uniform_4_op: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: s_andn2_b32 s0, s2, s0 | |
| ; GFX950-GISEL-NEXT: s_andn2_b32 s0, s0, s1 | |
| ; GFX950-GISEL-NEXT: v_mov_b32_e32 v0, s0 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: uniform_4_op: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_mov_b32_e32 v0, s2 | |
| ; GFX1250-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, s0, s1, v0 bitop3:2 | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: uniform_4_op: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: s_and_not1_b32 s0, s2, s0 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1) | |
| ; GFX1250-GISEL-NEXT: s_and_not1_b32 s0, s0, s1 | |
| ; GFX1250-GISEL-NEXT: v_mov_b32_e32 v0, s0 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %nota = xor i32 %a, -1 | |
| %notb = xor i32 %b, -1 | |
| %and1 = and i32 %nota, %c | |
| %and2 = and i32 %and1, %notb | |
| %ret_cast = bitcast i32 %and2 to float | |
| ret float %ret_cast | |
| } | |
| ; ========= 16 bit tests ========= | |
| define amdgpu_ps half @not_and_not_and_not_and_b16(i16 %a, i16 %b, i16 %c) { | |
| ; GFX950-LABEL: not_and_not_and_not_and_b16: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:1 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-FAKE16-LABEL: not_and_not_and_not_and_b16: | |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop | |
| ; GFX1250-SDAG-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:1 | |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-TRUE16-LABEL: not_and_not_and_not_and_b16: | |
| ; GFX1250-SDAG-TRUE16: ; %bb.0: | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_nop | |
| ; GFX1250-SDAG-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v1.l, v2.l bitop3:1 | |
| ; GFX1250-SDAG-TRUE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-FAKE16-LABEL: not_and_not_and_not_and_b16: | |
| ; GFX1250-GISEL-FAKE16: ; %bb.0: | |
| ; GFX1250-GISEL-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-FAKE16-NEXT: v_nop | |
| ; GFX1250-GISEL-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-FAKE16-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:1 | |
| ; GFX1250-GISEL-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-TRUE16-LABEL: not_and_not_and_not_and_b16: | |
| ; GFX1250-GISEL-TRUE16: ; %bb.0: | |
| ; GFX1250-GISEL-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-TRUE16-NEXT: v_nop | |
| ; GFX1250-GISEL-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v1.l, v2.l bitop3:1 | |
| ; GFX1250-GISEL-TRUE16-NEXT: ; return to shader part epilog | |
| %nota = xor i16 %a, -1 | |
| %notb = xor i16 %b, -1 | |
| %notc = xor i16 %c, -1 | |
| %and1 = and i16 %nota, %notc | |
| %and2 = and i16 %and1, %notb | |
| %ret_cast = bitcast i16 %and2 to half | |
| ret half %ret_cast | |
| } | |
| define amdgpu_ps half @not_and_not_and_and_b16(i16 %a, i16 %b, i16 %c) { | |
| ; GFX950-LABEL: not_and_not_and_and_b16: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:2 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-FAKE16-LABEL: not_and_not_and_and_b16: | |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop | |
| ; GFX1250-SDAG-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:2 | |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-TRUE16-LABEL: not_and_not_and_and_b16: | |
| ; GFX1250-SDAG-TRUE16: ; %bb.0: | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_nop | |
| ; GFX1250-SDAG-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v1.l, v2.l bitop3:2 | |
| ; GFX1250-SDAG-TRUE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-FAKE16-LABEL: not_and_not_and_and_b16: | |
| ; GFX1250-GISEL-FAKE16: ; %bb.0: | |
| ; GFX1250-GISEL-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-FAKE16-NEXT: v_nop | |
| ; GFX1250-GISEL-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-FAKE16-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:2 | |
| ; GFX1250-GISEL-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-TRUE16-LABEL: not_and_not_and_and_b16: | |
| ; GFX1250-GISEL-TRUE16: ; %bb.0: | |
| ; GFX1250-GISEL-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-TRUE16-NEXT: v_nop | |
| ; GFX1250-GISEL-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v1.l, v2.l bitop3:2 | |
| ; GFX1250-GISEL-TRUE16-NEXT: ; return to shader part epilog | |
| %nota = xor i16 %a, -1 | |
| %notb = xor i16 %b, -1 | |
| %and1 = and i16 %nota, %c | |
| %and2 = and i16 %and1, %notb | |
| %ret_cast = bitcast i16 %and2 to half | |
| ret half %ret_cast | |
| } | |
| define amdgpu_ps half @not_and_and_not_and_b16(i16 %a, i16 %b, i16 %c) { | |
| ; GFX950-LABEL: not_and_and_not_and_b16: | |
| ; GFX950: ; %bb.0: | |
| ; GFX950-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:4 | |
| ; GFX950-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-FAKE16-LABEL: not_and_and_not_and_b16: | |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop | |
| ; GFX1250-SDAG-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:4 | |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-TRUE16-LABEL: not_and_and_not_and_b16: | |
| ; GFX1250-SDAG-TRUE16: ; %bb.0: | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_nop | |
| ; GFX1250-SDAG-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v1.l, v2.l bitop3:4 | |
| ; GFX1250-SDAG-TRUE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-FAKE16-LABEL: not_and_and_not_and_b16: | |
| ; GFX1250-GISEL-FAKE16: ; %bb.0: | |
| ; GFX1250-GISEL-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-FAKE16-NEXT: v_nop | |
| ; GFX1250-GISEL-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-FAKE16-NEXT: v_bitop3_b16 v0, v0, v1, v2 bitop3:4 | |
| ; GFX1250-GISEL-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-TRUE16-LABEL: not_and_and_not_and_b16: | |
| ; GFX1250-GISEL-TRUE16: ; %bb.0: | |
| ; GFX1250-GISEL-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-TRUE16-NEXT: v_nop | |
| ; GFX1250-GISEL-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v1.l, v2.l bitop3:4 | |
| ; GFX1250-GISEL-TRUE16-NEXT: ; return to shader part epilog | |
| %nota = xor i16 %a, -1 | |
| %notc = xor i16 %c, -1 | |
| %and1 = and i16 %nota, %notc | |
| %and2 = and i16 %and1, %b | |
| %ret_cast = bitcast i16 %and2 to half | |
| ret half %ret_cast | |
| } | |
| define amdgpu_ps half @test_xor3_b16(i16 %a, i16 %b, i16 %c) { | |
| ; GFX950-SDAG-LABEL: test_xor3_b16: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b16 v0, v0, v2, v1 bitop3:0x96 | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_xor3_b16: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_xor_b32_e32 v0, v0, v1 | |
| ; GFX950-GISEL-NEXT: v_xor_b32_e32 v0, v0, v2 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-FAKE16-LABEL: test_xor3_b16: | |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop | |
| ; GFX1250-SDAG-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_bitop3_b16 v0, v0, v2, v1 bitop3:0x96 | |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-TRUE16-LABEL: test_xor3_b16: | |
| ; GFX1250-SDAG-TRUE16: ; %bb.0: | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_nop | |
| ; GFX1250-SDAG-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v2.l, v1.l bitop3:0x96 | |
| ; GFX1250-SDAG-TRUE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_xor3_b16: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_xor3_b32 v0, v0, v1, v2 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %xor1 = xor i16 %a, %b | |
| %xor2 = xor i16 %xor1, %c | |
| %ret_cast = bitcast i16 %xor2 to half | |
| ret half %ret_cast | |
| } | |
| define amdgpu_ps half @test_or3_b16(i16 %a, i16 %b, i16 %c) { | |
| ; GFX950-SDAG-LABEL: test_or3_b16: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b16 v0, v0, v2, v1 bitop3:0xfe | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_or3_b16: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_or3_b32 v0, v0, v1, v2 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-FAKE16-LABEL: test_or3_b16: | |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop | |
| ; GFX1250-SDAG-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_bitop3_b16 v0, v0, v2, v1 bitop3:0xfe | |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-TRUE16-LABEL: test_or3_b16: | |
| ; GFX1250-SDAG-TRUE16: ; %bb.0: | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_nop | |
| ; GFX1250-SDAG-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v2.l, v1.l bitop3:0xfe | |
| ; GFX1250-SDAG-TRUE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_or3_b16: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_or3_b32 v0, v0, v1, v2 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %or1 = or i16 %a, %b | |
| %or2 = or i16 %or1, %c | |
| %ret_cast = bitcast i16 %or2 to half | |
| ret half %ret_cast | |
| } | |
| define amdgpu_ps half @test_and_or_b16(i16 %a, i16 %b, i16 %c) { | |
| ; GFX950-SDAG-LABEL: test_and_or_b16: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b16 v0, v0, v2, v1 bitop3:0xec | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_and_or_b16: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_and_or_b32 v0, v0, v1, v2 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-FAKE16-LABEL: test_and_or_b16: | |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop | |
| ; GFX1250-SDAG-FAKE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-FAKE16-NEXT: v_bitop3_b16 v0, v0, v2, v1 bitop3:0xec | |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-TRUE16-LABEL: test_and_or_b16: | |
| ; GFX1250-SDAG-TRUE16: ; %bb.0: | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_nop | |
| ; GFX1250-SDAG-TRUE16-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-TRUE16-NEXT: v_bitop3_b16 v0.l, v0.l, v2.l, v1.l bitop3:0xec | |
| ; GFX1250-SDAG-TRUE16-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_and_or_b16: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_and_or_b32 v0, v0, v1, v2 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %and1 = and i16 %a, %b | |
| %or1 = or i16 %and1, %c | |
| %ret_cast = bitcast i16 %or1 to half | |
| ret half %ret_cast | |
| } | |
| ; ========= Packed 16 bit tests ========= | |
| ; A <2 x i16> tree is 32 bits wide and must use the b32 opcode. | |
| define amdgpu_ps float @test_and_or_xor_v2i16(<2 x i16> %a, <2 x i16> %b, <2 x i16> %c) { | |
| ; GFX950-SDAG-LABEL: test_and_or_xor_v2i16: | |
| ; GFX950-SDAG: ; %bb.0: | |
| ; GFX950-SDAG-NEXT: v_bitop3_b32 v0, v0, v2, v1 bitop3:0x5c | |
| ; GFX950-SDAG-NEXT: v_and_or_b32 v0, v0, v1, v2 | |
| ; GFX950-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX950-GISEL-LABEL: test_and_or_xor_v2i16: | |
| ; GFX950-GISEL: ; %bb.0: | |
| ; GFX950-GISEL-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:8 | |
| ; GFX950-GISEL-NEXT: v_or_b32_e32 v0, v0, v2 | |
| ; GFX950-GISEL-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-SDAG-LABEL: test_and_or_xor_v2i16: | |
| ; GFX1250-SDAG: ; %bb.0: | |
| ; GFX1250-SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-SDAG-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-SDAG-NEXT: v_nop | |
| ; GFX1250-SDAG-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-SDAG-NEXT: v_bitop3_b32 v0, v0, v2, v1 bitop3:0x5c | |
| ; GFX1250-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-SDAG-NEXT: v_and_or_b32 v0, v0, v1, v2 | |
| ; GFX1250-SDAG-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-GISEL-LABEL: test_and_or_xor_v2i16: | |
| ; GFX1250-GISEL: ; %bb.0: | |
| ; GFX1250-GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-GISEL-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-GISEL-NEXT: v_nop | |
| ; GFX1250-GISEL-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-GISEL-NEXT: v_bitop3_b32 v0, v0, v1, v2 bitop3:8 | |
| ; GFX1250-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | |
| ; GFX1250-GISEL-NEXT: v_or_b32_e32 v0, v0, v2 | |
| ; GFX1250-GISEL-NEXT: ; return to shader part epilog | |
| %and1 = and <2 x i16> %a, %b | |
| %or1 = or <2 x i16> %a, %c | |
| %xor1 = xor <2 x i16> %and1, %or1 | |
| %and2 = and <2 x i16> %xor1, %b | |
| %or2 = or <2 x i16> %and2, %c | |
| %ret_cast = bitcast <2 x i16> %or2 to float | |
| ret float %ret_cast | |
| } | |
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | |
| ; GCN: {{.*}} | |
| ; GFX1250-FAKE16: {{.*}} | |
| ; GFX1250-TRUE16: {{.*}} |