llvm.org GIT mirror llvm / 430953e
DAG: Constant fold fp16_to_fp/fp16_to_fp This fixes emitting conversions of constants on targets without legal f16 that need to use these for legalization. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293499 91177308-0d34-0410-b5e6-96231b3b80d8 Matt Arsenault 3 years ago
14 changed file(s) with 166 addition(s) and 187 deletion(s). Raw diff Collapse all Expand all
32623262 case ISD::CTTZ_ZERO_UNDEF:
32633263 return getConstant(Val.countTrailingZeros(), DL, VT, C->isTargetOpcode(),
32643264 C->isOpaque());
3265 case ISD::FP16_TO_FP: {
3266 bool Ignored;
3267 APFloat FPV(APFloat::IEEEhalf(),
3268 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
3269
3270 // This can return overflow, underflow, or inexact; we don't care.
3271 // FIXME need to be more flexible about rounding mode.
3272 (void)FPV.convert(EVTToAPFloatSemantics(VT),
3273 APFloat::rmNearestTiesToEven, &Ignored);
3274 return getConstantFP(FPV, DL, VT);
3275 }
32653276 }
32663277 }
32673278
33233334 else if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
33243335 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
33253336 break;
3337 case ISD::FP_TO_FP16: {
3338 bool Ignored;
3339 // This can return overflow, underflow, or inexact; we don't care.
3340 // FIXME need to be more flexible about rounding mode.
3341 (void)V.convert(APFloat::IEEEhalf(),
3342 APFloat::rmNearestTiesToEven, &Ignored);
3343 return getConstant(V.bitcastToAPInt(), DL, VT);
3344 }
33263345 }
33273346 }
33283347
0 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
11 ; RUN: llc -march=amdgcn -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
22
3 ; GCN-LABEL: {{^}}br_cc_f16
3 ; GCN-LABEL: {{^}}br_cc_f16:
44 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
55 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
66
3939 ret void
4040 }
4141
42 ; GCN-LABEL: {{^}}br_cc_f16_imm_a
43 ; SI: v_mov_b32_e32 v[[A_F16:[0-9]+]], 0x3800{{$}}
44 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
42 ; GCN-LABEL: {{^}}br_cc_f16_imm_a:
4543 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
4644
4745 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
48 ; SI: v_cmp_ngt_f32_e32 vcc, v[[B_F32]], v[[A_F32]]
49 ; SI: s_cbranch_vccz
46 ; SI: v_cmp_nlt_f32_e32 vcc, 0.5, v[[B_F32]]
47 ; SI: s_cbranch_vccnz
5048
5149 ; VI: v_cmp_nlt_f16_e32 vcc, 0.5, v[[B_F16]]
5250 ; VI: s_cbranch_vccnz
5351
54 ; VI: one{{$}}
52 ; GCN: one{{$}}
5553 ; VI: v_mov_b32_e32 v[[A_F16:[0-9]+]], 0x380{{0|1}}{{$}}
54
55 ; SI: buffer_store_short v[[A_F16]]
56 ; SI: s_endpgm
57
5658
5759 ; GCN: two{{$}}
5860 ; SI: v_cvt_f16_f32_e32 v[[B_F16:[0-9]+]], v[[B_F32]]
59
60 ; SI: one{{$}}
61 ; SI: buffer_store_short v[[A_F16]]
62 ; SI: s_endpgm
6361
6462 define void @br_cc_f16_imm_a(
6563 half addrspace(1)* %r,
7876 ret void
7977 }
8078
81 ; GCN-LABEL: {{^}}br_cc_f16_imm_b
82 ; SI: v_mov_b32_e32 v[[B_F16:[0-9]+]], 0x3800{{$}}
83 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
79 ; GCN-LABEL: {{^}}br_cc_f16_imm_b:
8480 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
8581
8682 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
87 ; SI: v_cmp_nlt_f32_e32 vcc, v[[A_F32]], v[[B_F32]]
83 ; SI: v_cmp_ngt_f32_e32 vcc, 0.5, v[[A_F32]]
84
8885 ; VI: v_cmp_ngt_f16_e32 vcc, 0.5, v[[A_F16]]
8986 ; GCN: s_cbranch_vccnz
9087
2424
2525 ; GCN-LABEL: {{^}}fadd_f16_imm_a
2626 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
27 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x3c00{{$}}
2827 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
29 ; SI: v_add_f32_e32 v[[R_F32:[0-9]+]], v[[A_F32]], v[[B_F32]]
28 ; SI: v_add_f32_e32 v[[R_F32:[0-9]+]], 1.0, v[[B_F32]]
3029 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
3130 ; VI: v_add_f16_e32 v[[R_F16:[0-9]+]], 1.0, v[[B_F16]]
3231 ; GCN: buffer_store_short v[[R_F16]]
4342
4443 ; GCN-LABEL: {{^}}fadd_f16_imm_b
4544 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
46 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x4000{{$}}
4745 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
48 ; SI: v_add_f32_e32 v[[R_F32:[0-9]+]], v[[B_F32]], v[[A_F32]]
46 ; SI: v_add_f32_e32 v[[R_F32:[0-9]+]], 2.0, v[[A_F32]]
4947 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
5048 ; VI: v_add_f16_e32 v[[R_F16:[0-9]+]], 2.0, v[[A_F16]]
5149 ; GCN: buffer_store_short v[[R_F16]]
9492
9593 ; GCN-LABEL: {{^}}fadd_v2f16_imm_a
9694 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
97 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], 0x3c00{{$}}
98 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], 0x4000{{$}}
9995 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], v[[B_V2_F16]]
10096 ; GCN: v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
10197 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], v[[B_F16_1]]
102 ; SI: v_add_f32_e32 v[[R_F32_0:[0-9]+]], v[[A_F32_0]], v[[B_F32_0]]
98 ; SI: v_add_f32_e32 v[[R_F32_0:[0-9]+]], 1.0, v[[B_F32_0]]
10399 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
104 ; SI: v_add_f32_e32 v[[R_F32_1:[0-9]+]], v[[A_F32_1]], v[[B_F32_1]]
100 ; SI: v_add_f32_e32 v[[R_F32_1:[0-9]+]], 2.0, v[[B_F32_1]]
105101 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
102
106103 ; VI: v_add_f16_e32 v[[R_F16_0:[0-9]+]], 1.0, v[[B_V2_F16]]
107104 ; VI: v_add_f16_e32 v[[R_F16_1:[0-9]+]], 2.0, v[[B_F16_1]]
108105 ; GCN: v_and_b32_e32 v[[R_F16_LO:[0-9]+]], 0xffff, v[[R_F16_0]]
122119
123120 ; GCN-LABEL: {{^}}fadd_v2f16_imm_b
124121 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
125 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], 0x4000{{$}}
126 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], 0x3c00{{$}}
127122 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], v[[A_V2_F16]]
128123 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
129124 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], v[[A_F16_1]]
130 ; SI: v_add_f32_e32 v[[R_F32_0:[0-9]+]], v[[B_F32_0]], v[[A_F32_0]]
125 ; SI: v_add_f32_e32 v[[R_F32_0:[0-9]+]], 2.0, v[[A_F32_0]]
131126 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
132 ; SI: v_add_f32_e32 v[[R_F32_1:[0-9]+]], v[[B_F32_1]], v[[A_F32_1]]
127 ; SI: v_add_f32_e32 v[[R_F32_1:[0-9]+]], 1.0, v[[A_F32_1]]
133128 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
134129 ; VI: v_add_f16_e32 v[[R_F16_0:[0-9]+]], 2.0, v[[A_V2_F16]]
135130 ; VI: v_add_f16_e32 v[[R_F16_1:[0-9]+]], 1.0, v[[A_F16_1]]
2424
2525 ; GCN-LABEL: {{^}}fmul_f16_imm_a
2626 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
27 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x4200{{$}}
2827 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
29 ; SI: v_mul_f32_e32 v[[R_F32:[0-9]+]], v[[A_F32]], v[[B_F32]]
28 ; SI: v_mul_f32_e32 v[[R_F32:[0-9]+]], 0x40400000, v[[B_F32]]
3029 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
3130 ; VI: v_mul_f16_e32 v[[R_F16:[0-9]+]], 0x4200, v[[B_F16]]
3231 ; GCN: buffer_store_short v[[R_F16]]
4342
4443 ; GCN-LABEL: {{^}}fmul_f16_imm_b
4544 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
46 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x4400{{$}}
4745 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
48 ; SI: v_mul_f32_e32 v[[R_F32:[0-9]+]], v[[B_F32]], v[[A_F32]]
46 ; SI: v_mul_f32_e32 v[[R_F32:[0-9]+]], 4.0, v[[A_F32]]
4947 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
48
5049 ; VI: v_mul_f16_e32 v[[R_F16:[0-9]+]], 4.0, v[[A_F16]]
5150 ; GCN: buffer_store_short v[[R_F16]]
5251 ; GCN: s_endpgm
9493
9594 ; GCN-LABEL: {{^}}fmul_v2f16_imm_a
9695 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
97 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], 0x4200{{$}}
98 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], 0x4400{{$}}
9996 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], v[[B_V2_F16]]
10097 ; GCN: v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
10198 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], v[[B_F16_1]]
102 ; SI: v_mul_f32_e32 v[[R_F32_0:[0-9]+]], v[[A_F32_0]], v[[B_F32_0]]
99 ; SI: v_mul_f32_e32 v[[R_F32_0:[0-9]+]], 0x40400000, v[[B_F32_0]]
103100 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
104 ; SI: v_mul_f32_e32 v[[R_F32_1:[0-9]+]], v[[A_F32_1]], v[[B_F32_1]]
101 ; SI: v_mul_f32_e32 v[[R_F32_1:[0-9]+]], 4.0, v[[B_F32_1]]
105102 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
106103 ; VI: v_mul_f16_e32 v[[R_F16_0:[0-9]+]], 0x4200, v[[B_V2_F16]]
107104 ; VI: v_mul_f16_e32 v[[R_F16_1:[0-9]+]], 4.0, v[[B_F16_1]]
122119
123120 ; GCN-LABEL: {{^}}fmul_v2f16_imm_b
124121 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
125 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], 0x4400{{$}}
126 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], 0x4200{{$}}
127122 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], v[[A_V2_F16]]
128123 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
129124 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], v[[A_F16_1]]
130 ; SI: v_mul_f32_e32 v[[R_F32_0:[0-9]+]], v[[B_F32_0]], v[[A_F32_0]]
125 ; SI: v_mul_f32_e32 v[[R_F32_0:[0-9]+]], 4.0, v[[A_F32_0]]
131126 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
132 ; SI: v_mul_f32_e32 v[[R_F32_1:[0-9]+]], v[[B_F32_1]], v[[A_F32_1]]
127 ; SI: v_mul_f32_e32 v[[R_F32_1:[0-9]+]], 0x40400000, v[[A_F32_1]]
133128 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
134129 ; VI: v_mul_f16_e32 v[[R_F16_0:[0-9]+]], 4.0, v[[A_V2_F16]]
135130 ; VI: v_mul_f16_e32 v[[R_F16_1:[0-9]+]], 0x4200, v[[A_F16_1]]
0 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
11 ; RUN: llc -march=amdgcn -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
22
3 ; GCN-LABEL: {{^}}fsub_f16
3 ; GCN-LABEL: {{^}}fsub_f16:
44 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
55 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
66 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
2222 ret void
2323 }
2424
25 ; GCN-LABEL: {{^}}fsub_f16_imm_a
25 ; GCN-LABEL: {{^}}fsub_f16_imm_a:
2626 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
27 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x3c00{{$}}
2827 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
29 ; SI: v_subrev_f32_e32 v[[R_F32:[0-9]+]], v[[B_F32]], v[[A_F32]]
28 ; SI: v_sub_f32_e32 v[[R_F32:[0-9]+]], 1.0, v[[B_F32]]
3029 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
3130 ; VI: v_sub_f16_e32 v[[R_F16:[0-9]+]], 1.0, v[[B_F16]]
3231 ; GCN: buffer_store_short v[[R_F16]]
4140 ret void
4241 }
4342
44 ; GCN-LABEL: {{^}}fsub_f16_imm_b
43 ; GCN-LABEL: {{^}}fsub_f16_imm_b:
4544 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
46 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0xc000{{$}}
4745 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
48 ; SI: v_add_f32_e32 v[[R_F32:[0-9]+]], v[[B_F32]], v[[A_F32]]
46 ; SI: v_add_f32_e32 v[[R_F32:[0-9]+]], -2.0, v[[A_F32]]
4947 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
5048 ; VI: v_add_f16_e32 v[[R_F16:[0-9]+]], -2.0, v[[A_F16]]
5149 ; GCN: buffer_store_short v[[R_F16]]
6058 ret void
6159 }
6260
63 ; GCN-LABEL: {{^}}fsub_v2f16
61 ; GCN-LABEL: {{^}}fsub_v2f16:
6462 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
6563 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
6664 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
9290 ret void
9391 }
9492
95 ; GCN-LABEL: {{^}}fsub_v2f16_imm_a
93 ; GCN-LABEL: {{^}}fsub_v2f16_imm_a:
9694 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
97 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], 0x3c00{{$}}
98 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], 0x4000{{$}}
9995 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], v[[B_V2_F16]]
10096 ; GCN: v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
10197 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], v[[B_F16_1]]
102 ; SI: v_subrev_f32_e32 v[[R_F32_0:[0-9]+]], v[[B_F32_0]], v[[A_F32_0]]
98 ; SI: v_sub_f32_e32 v[[R_F32_0:[0-9]+]], 1.0, v[[B_F32_0]]
10399 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
104 ; SI: v_subrev_f32_e32 v[[R_F32_1:[0-9]+]], v[[B_F32_1]], v[[A_F32_1]]
100 ; SI: v_sub_f32_e32 v[[R_F32_1:[0-9]+]], 2.0, v[[B_F32_1]]
105101 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
106102 ; VI: v_sub_f16_e32 v[[R_F16_0:[0-9]+]], 1.0, v[[B_V2_F16]]
107103 ; VI: v_sub_f16_e32 v[[R_F16_1:[0-9]+]], 2.0, v[[B_F16_1]]
120116 ret void
121117 }
122118
123 ; GCN-LABEL: {{^}}fsub_v2f16_imm_b
119 ; GCN-LABEL: {{^}}fsub_v2f16_imm_b:
124120 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
125 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], 0x4000{{$}}
126 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], 0x3c00{{$}}
127121 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], v[[A_V2_F16]]
128122 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
129123 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], v[[A_F16_1]]
130 ; SI: v_subrev_f32_e32 v[[R_F32_0:[0-9]+]], v[[B_F32_0]], v[[A_F32_0]]
124 ; SI: v_add_f32_e32 v[[R_F32_0:[0-9]+]], -2.0, v[[A_F32_0]]
131125 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
132 ; SI: v_subrev_f32_e32 v[[R_F32_1:[0-9]+]], v[[B_F32_1]], v[[A_F32_1]]
126 ; SI: v_add_f32_e32 v[[R_F32_1:[0-9]+]], -1.0, v[[A_F32_1]]
133127 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
134128 ; VI: v_add_f16_e32 v[[R_F16_0:[0-9]+]], -2.0, v[[A_V2_F16]]
135129 ; VI: v_add_f16_e32 v[[R_F16_1:[0-9]+]], -1.0, v[[A_F16_1]]
3131 ; GCN-LABEL: {{^}}fma_f16_imm_a
3232 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
3333 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
34 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x4200{{$}}
34
35 ; SI: v_mov_b32_e32 v[[A_F32:[0-9]+]], 0x40400000{{$}}
3536 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
3637 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
3738 ; SI: v_fma_f32 v[[R_F32:[0-9]+]], v[[A_F32:[0-9]]], v[[B_F32:[0-9]]], v[[C_F32:[0-9]]]
5455 ; GCN-LABEL: {{^}}fma_f16_imm_b
5556 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
5657 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
57 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x4200{{$}}
58 ; SI: v_mov_b32_e32 v[[B_F32:[0-9]+]], 0x40400000{{$}}
5859 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
5960 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
6061 ; SI: v_fma_f32 v[[R_F32:[0-9]+]], v[[A_F32:[0-9]]], v[[B_F32:[0-9]]], v[[C_F32:[0-9]]]
7778 ; GCN-LABEL: {{^}}fma_f16_imm_c
7879 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
7980 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
80 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], 0x4200{{$}}
81 ; SI: v_mov_b32_e32 v[[C_F32:[0-9]+]], 0x40400000{{$}}
8182 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
8283 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
8384 ; SI: v_fma_f32 v[[R_F32:[0-9]+]], v[[A_F32:[0-9]]], v[[B_F32:[0-9]]], v[[C_F32:[0-9]]]
137138 ; GCN-LABEL: {{^}}fma_v2f16_imm_a
138139 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
139140 ; GCN: buffer_load_dword v[[C_V2_F16:[0-9]+]]
140 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x4200{{$}}
141 ; SI: v_mov_b32_e32 v[[A_F32:[0-9]+]], 0x40400000{{$}}
141142 ; VI: v_mov_b32_e32 v[[A_F16:[0-9]+]], 0x4200{{$}}
142143 ; GCN: v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
143144 ; GCN: v_lshrrev_b32_e32 v[[C_F16_1:[0-9]+]], 16, v[[C_V2_F16]]
170171 ; GCN-LABEL: {{^}}fma_v2f16_imm_b
171172 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
172173 ; GCN: buffer_load_dword v[[C_V2_F16:[0-9]+]]
173 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x4200{{$}}
174 ; SI: v_mov_b32_e32 v[[B_F32:[0-9]+]], 0x40400000{{$}}
174175 ; VI: v_mov_b32_e32 v[[B_F16:[0-9]+]], 0x4200{{$}}
175176 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
176177 ; GCN: v_lshrrev_b32_e32 v[[C_F16_1:[0-9]+]], 16, v[[C_V2_F16]]
203204 ; GCN-LABEL: {{^}}fma_v2f16_imm_c
204205 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
205206 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
206 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], 0x4200{{$}}
207 ; SI: v_mov_b32_e32 v[[C_F32:[0-9]+]], 0x40400000{{$}}
207208 ; VI: v_mov_b32_e32 v[[C_F16:[0-9]+]], 0x4200{{$}}
208209 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
209210 ; GCN: v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
3939 ; GCN-LABEL: {{^}}fmuladd_f16_imm_a
4040 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
4141 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
42 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x4200{{$}}
4342 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
4443 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
45 ; SI: v_mac_f32_e32 v[[C_F32]], v[[A_F32]], v[[B_F32]]
44 ; SI: v_mac_f32_e32 v[[C_F32]], 0x40400000, v[[B_F32]]
4645 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[C_F32]]
4746 ; SI: buffer_store_short v[[R_F16]]
4847
6867 ; GCN-LABEL: {{^}}fmuladd_f16_imm_b
6968 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
7069 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
71 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x4200{{$}}
7270 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
7371 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
74 ; SI: v_mac_f32_e32 v[[C_F32]], v[[B_F32]], v[[A_F32]]
72 ; SI: v_mac_f32_e32 v[[C_F32]], 0x40400000, v[[B_F32]]
7573 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[C_F32]]
7674 ; SI: buffer_store_short v[[R_F16]]
7775
33 declare half @llvm.maxnum.f16(half %a, half %b)
44 declare <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> %b)
55
6 ; GCN-LABEL: {{^}}maxnum_f16
6 ; GCN-LABEL: {{^}}maxnum_f16:
77 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
88 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
99 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
2525 ret void
2626 }
2727
28 ; GCN-LABEL: {{^}}maxnum_f16_imm_a
28 ; GCN-LABEL: {{^}}maxnum_f16_imm_a:
2929 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
30 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x4200{{$}}
3130 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
32 ; SI: v_max_f32_e32 v[[R_F32:[0-9]+]], v[[A_F32]], v[[B_F32]]
31 ; SI: v_max_f32_e32 v[[R_F32:[0-9]+]], 0x40400000, v[[B_F32]]
3332 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
3433 ; VI: v_max_f16_e32 v[[R_F16:[0-9]+]], 0x4200, v[[B_F16]]
3534 ; GCN: buffer_store_short v[[R_F16]]
4443 ret void
4544 }
4645
47 ; GCN-LABEL: {{^}}maxnum_f16_imm_b
46 ; GCN-LABEL: {{^}}maxnum_f16_imm_b:
4847 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
49 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x4400{{$}}
5048 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
51 ; SI: v_max_f32_e32 v[[R_F32:[0-9]+]], v[[B_F32]], v[[A_F32]]
49 ; SI: v_max_f32_e32 v[[R_F32:[0-9]+]], 4.0, v[[A_F32]]
5250 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
5351 ; VI: v_max_f16_e32 v[[R_F16:[0-9]+]], 4.0, v[[A_F16]]
5452 ; GCN: buffer_store_short v[[R_F16]]
6361 ret void
6462 }
6563
66 ; GCN-LABEL: {{^}}maxnum_v2f16
64 ; GCN-LABEL: {{^}}maxnum_v2f16:
6765 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
6866 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
6967 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
9593 ret void
9694 }
9795
98 ; GCN-LABEL: {{^}}maxnum_v2f16_imm_a
96 ; GCN-LABEL: {{^}}maxnum_v2f16_imm_a:
9997 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
100 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], 0x4200{{$}}
101 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], 0x4400{{$}}
10298 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], v[[B_V2_F16]]
10399 ; GCN: v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
104100 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], v[[B_F16_1]]
105 ; SI: v_max_f32_e32 v[[R_F32_0:[0-9]+]], v[[A_F32_0]], v[[B_F32_0]]
101 ; SI: v_max_f32_e32 v[[R_F32_0:[0-9]+]], 0x40400000, v[[B_F32_0]]
106102 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
107 ; SI: v_max_f32_e32 v[[R_F32_1:[0-9]+]], v[[A_F32_1]], v[[B_F32_1]]
103 ; SI: v_max_f32_e32 v[[R_F32_1:[0-9]+]], 4.0, v[[B_F32_1]]
108104 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
109105 ; VI: v_max_f16_e32 v[[R_F16_0:[0-9]+]], 0x4200, v[[B_V2_F16]]
110106 ; VI: v_max_f16_e32 v[[R_F16_1:[0-9]+]], 4.0, v[[B_F16_1]]
123119 ret void
124120 }
125121
126 ; GCN-LABEL: {{^}}maxnum_v2f16_imm_b
122 ; GCN-LABEL: {{^}}maxnum_v2f16_imm_b:
127123 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
128 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], 0x4400{{$}}
129 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], 0x4200{{$}}
130124 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], v[[A_V2_F16]]
131125 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
132126 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], v[[A_F16_1]]
133 ; SI: v_max_f32_e32 v[[R_F32_0:[0-9]+]], v[[B_F32_0]], v[[A_F32_0]]
127 ; SI: v_max_f32_e32 v[[R_F32_0:[0-9]+]], 4.0, v[[A_F32_0]]
134128 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
135 ; SI: v_max_f32_e32 v[[R_F32_1:[0-9]+]], v[[B_F32_1]], v[[A_F32_1]]
129 ; SI: v_max_f32_e32 v[[R_F32_1:[0-9]+]], 0x40400000, v[[A_F32_1]]
136130 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
137131 ; VI: v_max_f16_e32 v[[R_F16_0:[0-9]+]], 4.0, v[[A_V2_F16]]
138132 ; VI: v_max_f16_e32 v[[R_F16_1:[0-9]+]], 0x4200, v[[A_F16_1]]
33 declare half @llvm.minnum.f16(half %a, half %b)
44 declare <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %b)
55
6 ; GCN-LABEL: {{^}}minnum_f16
6 ; GCN-LABEL: {{^}}minnum_f16:
77 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
88 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
99 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
2525 ret void
2626 }
2727
28 ; GCN-LABEL: {{^}}minnum_f16_imm_a
28 ; GCN-LABEL: {{^}}minnum_f16_imm_a:
2929 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
30 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x4200{{$}}
3130 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
32 ; SI: v_min_f32_e32 v[[R_F32:[0-9]+]], v[[A_F32]], v[[B_F32]]
31 ; SI: v_min_f32_e32 v[[R_F32:[0-9]+]], 0x40400000, v[[B_F32]]
3332 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
3433 ; VI: v_min_f16_e32 v[[R_F16:[0-9]+]], 0x4200, v[[B_F16]]
3534 ; GCN: buffer_store_short v[[R_F16]]
4443 ret void
4544 }
4645
47 ; GCN-LABEL: {{^}}minnum_f16_imm_b
46 ; GCN-LABEL: {{^}}minnum_f16_imm_b:
4847 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
49 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x4400{{$}}
5048 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
51 ; SI: v_min_f32_e32 v[[R_F32:[0-9]+]], v[[B_F32]], v[[A_F32]]
49 ; SI: v_min_f32_e32 v[[R_F32:[0-9]+]], 4.0, v[[A_F32]]
5250 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
5351 ; VI: v_min_f16_e32 v[[R_F16:[0-9]+]], 4.0, v[[A_F16]]
5452 ; GCN: buffer_store_short v[[R_F16]]
6361 ret void
6462 }
6563
66 ; GCN-LABEL: {{^}}minnum_v2f16
64 ; GCN-LABEL: {{^}}minnum_v2f16:
6765 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
6866 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
6967 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
9593 ret void
9694 }
9795
98 ; GCN-LABEL: {{^}}minnum_v2f16_imm_a
96 ; GCN-LABEL: {{^}}minnum_v2f16_imm_a:
9997 ; GCN: buffer_load_dword v[[B_V2_F16:[0-9]+]]
100 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], 0x4200{{$}}
101 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], 0x4400{{$}}
10298 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], v[[B_V2_F16]]
10399 ; GCN: v_lshrrev_b32_e32 v[[B_F16_1:[0-9]+]], 16, v[[B_V2_F16]]
104100 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], v[[B_F16_1]]
105 ; SI: v_min_f32_e32 v[[R_F32_0:[0-9]+]], v[[A_F32_0]], v[[B_F32_0]]
101 ; SI: v_min_f32_e32 v[[R_F32_0:[0-9]+]], 0x40400000, v[[B_F32_0]]
106102 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
107 ; SI: v_min_f32_e32 v[[R_F32_1:[0-9]+]], v[[A_F32_1]], v[[B_F32_1]]
103 ; SI: v_min_f32_e32 v[[R_F32_1:[0-9]+]], 4.0, v[[B_F32_1]]
108104 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
109105 ; VI: v_min_f16_e32 v[[R_F16_0:[0-9]+]], 0x4200, v[[B_V2_F16]]
110106 ; VI: v_min_f16_e32 v[[R_F16_1:[0-9]+]], 4.0, v[[B_F16_1]]
123119 ret void
124120 }
125121
126 ; GCN-LABEL: {{^}}minnum_v2f16_imm_b
122 ; GCN-LABEL: {{^}}minnum_v2f16_imm_b:
127123 ; GCN: buffer_load_dword v[[A_V2_F16:[0-9]+]]
128 ; SI: v_cvt_f32_f16_e32 v[[B_F32_0:[0-9]+]], 0x4400{{$}}
129 ; SI: v_cvt_f32_f16_e32 v[[B_F32_1:[0-9]+]], 0x4200{{$}}
130124 ; SI: v_cvt_f32_f16_e32 v[[A_F32_0:[0-9]+]], v[[A_V2_F16]]
131125 ; GCN: v_lshrrev_b32_e32 v[[A_F16_1:[0-9]+]], 16, v[[A_V2_F16]]
132126 ; SI: v_cvt_f32_f16_e32 v[[A_F32_1:[0-9]+]], v[[A_F16_1]]
133 ; SI: v_min_f32_e32 v[[R_F32_0:[0-9]+]], v[[B_F32_0]], v[[A_F32_0]]
127 ; SI: v_min_f32_e32 v[[R_F32_0:[0-9]+]], 4.0, v[[A_F32_0]]
134128 ; SI: v_cvt_f16_f32_e32 v[[R_F16_0:[0-9]+]], v[[R_F32_0]]
135 ; SI: v_min_f32_e32 v[[R_F32_1:[0-9]+]], v[[B_F32_1]], v[[A_F32_1]]
129 ; SI: v_min_f32_e32 v[[R_F32_1:[0-9]+]], 0x40400000, v[[A_F32_1]]
136130 ; SI: v_cvt_f16_f32_e32 v[[R_F16_1:[0-9]+]], v[[R_F32_1]]
137131 ; VI: v_min_f16_e32 v[[R_F16_0:[0-9]+]], 4.0, v[[A_V2_F16]]
138132 ; VI: v_min_f16_e32 v[[R_F16_1:[0-9]+]], 0x4200, v[[A_F16_1]]
0 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
11 ; RUN: llc -march=amdgcn -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
22
3 ; GCN-LABEL: {{^}}select_f16
3 ; GCN-LABEL: {{^}}select_f16:
44 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
55 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
66 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
3333 ret void
3434 }
3535
36 ; GCN-LABEL: {{^}}select_f16_imm_a
36 ; GCN-LABEL: {{^}}select_f16_imm_a:
3737 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
3838 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
3939 ; GCN: buffer_load_ushort v[[D_F16:[0-9]+]]
40 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], 0x3800{{$}}
4140 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
42 ; SI: v_cmp_gt_f32_e32 vcc, v[[B_F32]], v[[A_F32]]
41 ; SI: v_cmp_lt_f32_e32 vcc, 0.5, v[[B_F32]]
4342 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
4443 ; SI: v_cvt_f32_f16_e32 v[[D_F32:[0-9]+]], v[[D_F16]]
4544 ; SI: v_cndmask_b32_e32 v[[R_F32:[0-9]+]], v[[D_F32]], v[[C_F32]]
6362 ret void
6463 }
6564
66 ; GCN-LABEL: {{^}}select_f16_imm_b
65 ; GCN-LABEL: {{^}}select_f16_imm_b:
6766 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
6867 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
6968 ; GCN: buffer_load_ushort v[[D_F16:[0-9]+]]
70 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], 0x3800{{$}}
7169 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
72 ; SI: v_cmp_lt_f32_e32 vcc, v[[A_F32]], v[[B_F32]]
70 ; SI: v_cmp_gt_f32_e32 vcc, 0.5, v[[A_F32]]
7371 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
7472 ; SI: v_cvt_f32_f16_e32 v[[D_F32:[0-9]+]], v[[D_F16]]
7573 ; SI: v_cndmask_b32_e32 v[[R_F32:[0-9]+]], v[[D_F32]], v[[C_F32]]
7674 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
75
7776 ; VI: v_cmp_gt_f16_e32 vcc, 0.5, v[[A_F16]]
7877 ; VI: v_cndmask_b32_e32 v[[R_F16:[0-9]+]], v[[D_F16]], v[[C_F16]], vcc
7978 ; GCN: buffer_store_short v[[R_F16]]
9392 ret void
9493 }
9594
96 ; GCN-LABEL: {{^}}select_f16_imm_c
95 ; GCN-LABEL: {{^}}select_f16_imm_c:
9796 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
9897 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
9998 ; GCN: buffer_load_ushort v[[D_F16:[0-9]+]]
100 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], 0x3800{{$}}
10199 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
102100 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
103101 ; SI: v_cvt_f32_f16_e32 v[[D_F32:[0-9]+]], v[[D_F16]]
104102 ; SI: v_cmp_nlt_f32_e32 vcc, v[[A_F32]], v[[B_F32]]
105 ; SI: v_cndmask_b32_e32 v[[R_F32:[0-9]+]], v[[C_F32]], v[[D_F32]], vcc
106 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
103 ; SI: v_cndmask_b32_e32 v[[R_F32:[0-9]+]], 0.5, v[[D_F32]], vcc
104 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
105
107106 ; VI: v_cmp_nlt_f16_e32 vcc, v[[A_F16]], v[[B_F16]]
108107 ; VI: v_mov_b32_e32 v[[C_F16:[0-9]+]], 0x3800{{$}}
109108 ; VI: v_cndmask_b32_e32 v[[R_F16:[0-9]+]], v[[C_F16]], v[[D_F16]], vcc
124123 ret void
125124 }
126125
127 ; GCN-LABEL: {{^}}select_f16_imm_d
126 ; GCN-LABEL: {{^}}select_f16_imm_d:
128127 ; GCN: buffer_load_ushort v[[A_F16:[0-9]+]]
129128 ; GCN: buffer_load_ushort v[[B_F16:[0-9]+]]
130129 ; GCN: buffer_load_ushort v[[C_F16:[0-9]+]]
131 ; SI: v_cvt_f32_f16_e32 v[[D_F32:[0-9]+]], 0x3800{{$}}
132130 ; SI: v_cvt_f32_f16_e32 v[[A_F32:[0-9]+]], v[[A_F16]]
133131 ; SI: v_cvt_f32_f16_e32 v[[B_F32:[0-9]+]], v[[B_F16]]
134132 ; SI: v_cvt_f32_f16_e32 v[[C_F32:[0-9]+]], v[[C_F16]]
135133 ; SI: v_cmp_lt_f32_e32 vcc, v[[A_F32]], v[[B_F32]]
136 ; SI: v_cndmask_b32_e32 v[[R_F32:[0-9]+]], v[[D_F32]], v[[C_F32]]
134 ; SI: v_cndmask_b32_e32 v[[R_F32:[0-9]+]], 0.5, v[[C_F32]]
137135 ; SI: v_cvt_f16_f32_e32 v[[R_F16:[0-9]+]], v[[R_F32]]
138136 ; VI: v_cmp_lt_f16_e32 vcc, v[[A_F16]], v[[B_F16]]
139137 ; VI: v_mov_b32_e32 v[[D_F16:[0-9]+]], 0x3800{{$}}
155153 ret void
156154 }
157155
158 ; GCN-LABEL: {{^}}select_v2f16
156 ; GCN-LABEL: {{^}}select_v2f16:
159157 ; SI: v_cvt_f32_f16_e32
160158 ; SI: v_cvt_f32_f16_e32
161159 ; SI: v_cvt_f32_f16_e32
186184 ret void
187185 }
188186
189 ; GCN-LABEL: {{^}}select_v2f16_imm_a
190 ; SI: v_cvt_f32_f16_e32
191 ; SI: v_cvt_f32_f16_e32
192 ; SI: v_cvt_f32_f16_e32
193 ; SI: v_cvt_f32_f16_e32
194 ; SI: v_cmp_gt_f32_e32
195 ; SI: v_cvt_f32_f16_e32
196 ; SI: v_cvt_f32_f16_e32
197 ; SI: v_cvt_f32_f16_e32
198 ; SI: v_cvt_f32_f16_e32
199 ; SI: v_cmp_gt_f32_e64
187 ; GCN-LABEL: {{^}}select_v2f16_imm_a:
188 ; SI: v_cvt_f32_f16_e32
189 ; SI: v_cvt_f32_f16_e32
190 ; SI: v_cmp_lt_f32_e32 vcc, 0.5
191 ; SI: v_cvt_f32_f16_e32
192 ; SI: v_cvt_f32_f16_e32
193 ; SI: v_cvt_f32_f16_e32
194 ; SI: v_cvt_f32_f16_e32
195 ; SI: v_cmp_lt_f32_e64
196
200197 ; VI: v_cmp_lt_f16_e32
201198 ; VI: v_cmp_lt_f16_e64
202199 ; GCN: v_cndmask_b32_e32
219216 ret void
220217 }
221218
222 ; GCN-LABEL: {{^}}select_v2f16_imm_b
223 ; SI: v_cvt_f32_f16_e32
224 ; SI: v_cvt_f32_f16_e32
225 ; SI: v_cvt_f32_f16_e32
226 ; SI: v_cvt_f32_f16_e32
227 ; SI: v_cmp_lt_f32_e32
228 ; SI: v_cvt_f32_f16_e32
229 ; SI: v_cvt_f32_f16_e32
230 ; SI: v_cvt_f32_f16_e32
231 ; SI: v_cvt_f32_f16_e32
232 ; SI: v_cmp_lt_f32_e64
219 ; GCN-LABEL: {{^}}select_v2f16_imm_b:
220 ; SI: v_cvt_f32_f16_e32
221 ; SI: v_cvt_f32_f16_e32
222 ; SI: v_cmp_gt_f32_e32 vcc, 0.5
223 ; SI: v_cvt_f32_f16_e32
224 ; SI: v_cvt_f32_f16_e32
225 ; SI: v_cvt_f32_f16_e32
226 ; SI: v_cvt_f32_f16_e32
227 ; SI: v_cmp_gt_f32_e64
228
233229 ; VI: v_cmp_gt_f16_e32
234230 ; VI: v_cmp_gt_f16_e64
235231 ; GCN: v_cndmask_b32_e32
252248 ret void
253249 }
254250
255 ; GCN-LABEL: {{^}}select_v2f16_imm_c
256 ; SI: v_cvt_f32_f16_e32
257 ; SI: v_cvt_f32_f16_e32
258 ; SI: v_cvt_f32_f16_e32
259 ; SI: v_cvt_f32_f16_e32
260 ; SI: v_cvt_f32_f16_e32
261 ; SI: v_cvt_f32_f16_e32
262 ; SI: v_cvt_f32_f16_e32
263 ; SI: v_cvt_f32_f16_e32
264
265 ; SI: v_cmp_lt_f32_e32
266 ; SI: v_cmp_lt_f32_e64
251 ; GCN-LABEL: {{^}}select_v2f16_imm_c:
252 ; SI: v_cvt_f32_f16_e32
253 ; SI: v_cvt_f32_f16_e32
254 ; SI: v_cvt_f32_f16_e32
255 ; SI: v_cvt_f32_f16_e32
256 ; SI: v_cvt_f32_f16_e32
257 ; SI: v_cvt_f32_f16_e32
258
259 ; SI: v_cmp_nlt_f32_e32
267260 ; SI: v_cndmask_b32_e32
268 ; SI: v_cndmask_b32_e64
261 ; SI: v_cmp_nlt_f32_e32
262 ; SI: v_cndmask_b32_e32
269263
270264 ; VI: v_cmp_nlt_f16_e32
271265 ; VI: v_cndmask_b32_e32
291285 ret void
292286 }
293287
294 ; GCN-LABEL: {{^}}select_v2f16_imm_d
295 ; SI: v_cvt_f32_f16_e32
296 ; SI: v_cvt_f32_f16_e32
288 ; GCN-LABEL: {{^}}select_v2f16_imm_d:
297289 ; SI: v_cvt_f32_f16_e32
298290 ; SI: v_cvt_f32_f16_e32
299291 ; SI: v_cvt_f32_f16_e32
247247 ; GCN: {{buffer|flat}}_load_ushort [[A:v[0-9]+]]
248248 ; GCN: {{buffer|flat}}_load_ushort [[B:v[0-9]+]]
249249
250 ; FIXME: How is this not folded?
251 ; SI: v_cvt_f32_f16_e32 v{{[0-9]+}}, 0x3c00
250 ; SI-DAG: v_cvt_f32_f16_e32 [[CVT_A:v[0-9]+]], [[A]]
251 ; SI-DAG: v_cvt_f32_f16_e32 [[CVT_B:v[0-9]+]], [[B]]
252
253 ; SI: v_add_f32_e32 [[TMP2:v[0-9]+]], [[CVT_A]], [[CVT_A]]
254 ; SI: v_mad_f32 v{{[0-9]+}}, [[TMP2]], -4.0, 1.0
255 ; SI: v_mac_f32_e32 v{{[0-9]+}}, 0x41000000, v{{[0-9]+}}
252256
253257 ; VI-FLUSH: v_add_f16_e32 [[TMP2:v[0-9]+]], [[A]], [[A]]
254258 ; VI-FLUSH: v_mad_f16 v{{[0-9]+}}, [[TMP2]], -4.0, 1.0
0 ; RUN: llc -march=amdgcn -mattr=-fp64-fp16-denormals -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
11 ; RUN: llc -march=amdgcn -mcpu=fiji -mattr=-fp64-fp16-denormals,-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
22
3 ; GCN-LABEL: {{^}}mac_f16
3 ; GCN-LABEL: {{^}}mac_f16:
44 ; GCN: {{buffer|flat}}_load_ushort v[[A_F16:[0-9]+]]
55 ; GCN: {{buffer|flat}}_load_ushort v[[B_F16:[0-9]+]]
66 ; GCN: {{buffer|flat}}_load_ushort v[[C_F16:[0-9]+]]
134134 ret void
135135 }
136136
137 ; GCN-LABEL: {{^}}mac_f16_neg_a_safe_fp_math
138 ; SI: v_cvt_f32_f16_e32 v[[ZERO:[0-9]+]], 0{{$}}
139 ; SI: v_subrev_f32_e32 v[[NEG_A:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
137 ; GCN-LABEL: {{^}}mac_f16_neg_a_safe_fp_math:
138 ; SI: v_sub_f32_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
140139 ; SI: v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A]]
141140 ; VI: v_sub_f16_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
142141 ; VI: v_mac_f16_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A]]
159158 ret void
160159 }
161160
162 ; GCN-LABEL: {{^}}mac_f16_neg_b_safe_fp_math
163 ; SI: v_cvt_f32_f16_e32 v[[ZERO:[0-9]+]], 0{{$}}
164 ; SI: v_subrev_f32_e32 v[[NEG_A:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
161 ; GCN-LABEL: {{^}}mac_f16_neg_b_safe_fp_math:
162 ; SI: v_sub_f32_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
165163 ; SI: v_mac_f32_e32 v{{[0-9]+}}, v[[NEG_A]], v{{[0-9]+}}
166164 ; VI: v_sub_f16_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
167165 ; VI: v_mac_f16_e32 v{{[0-9]+}}, v[[NEG_A]], v{{[0-9]+}}
184182 ret void
185183 }
186184
187 ; GCN-LABEL: {{^}}mac_f16_neg_c_safe_fp_math
188 ; SI: v_cvt_f32_f16_e32 v[[ZERO:[0-9]+]], 0{{$}}
189 ; SI: v_subrev_f32_e32 v[[NEG_A:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
185 ; GCN-LABEL: {{^}}mac_f16_neg_c_safe_fp_math:
186 ; SI: v_sub_f32_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
190187 ; SI: v_mac_f32_e32 v[[NEG_A]], v{{[0-9]+}}, v{{[0-9]+}}
191188 ; VI: v_sub_f16_e32 v[[NEG_A:[0-9]+]], 0, v{{[0-9]+}}
192189 ; VI: v_mac_f16_e32 v[[NEG_A]], v{{[0-9]+}}, v{{[0-9]+}}
438435 ret void
439436 }
440437
441 ; GCN-LABEL: {{^}}mac_v2f16_neg_a_safe_fp_math
442 ; SI: v_cvt_f32_f16_e32 v[[ZERO:[0-9]+]], 0{{$}}
443 ; SI: v_subrev_f32_e32 v[[NEG_A0:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
444 ; SI: v_subrev_f32_e32 v[[NEG_A1:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
438 ; GCN-LABEL: {{^}}mac_v2f16_neg_a_safe_fp_math:
439 ; SI: v_sub_f32_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
440 ; SI: v_sub_f32_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
445441 ; SI: v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A0]]
446442 ; SI: v_mac_f32_e32 v{{[0-9]+}}, v{{[0-9]+}}, v[[NEG_A1]]
447443 ; VI: v_sub_f16_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
468464 }
469465
470466 ; GCN-LABEL: {{^}}mac_v2f16_neg_b_safe_fp_math
471 ; SI: v_cvt_f32_f16_e32 v[[ZERO:[0-9]+]], 0{{$}}
472 ; SI: v_subrev_f32_e32 v[[NEG_A0:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
473 ; SI: v_subrev_f32_e32 v[[NEG_A1:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
467 ; SI: v_sub_f32_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
468 ; SI: v_sub_f32_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
474469 ; SI: v_mac_f32_e32 v{{[0-9]+}}, v[[NEG_A0]], v{{[0-9]+}}
475470 ; SI: v_mac_f32_e32 v{{[0-9]+}}, v[[NEG_A1]], v{{[0-9]+}}
476471 ; VI: v_sub_f16_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
497492 }
498493
499494 ; GCN-LABEL: {{^}}mac_v2f16_neg_c_safe_fp_math
500 ; SI: v_cvt_f32_f16_e32 v[[ZERO:[0-9]+]], 0{{$}}
501 ; SI: v_subrev_f32_e32 v[[NEG_A0:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
502 ; SI: v_subrev_f32_e32 v[[NEG_A1:[0-9]+]], v{{[0-9]+}}, v[[ZERO]]
495 ; SI: v_sub_f32_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
496 ; SI: v_sub_f32_e32 v[[NEG_A1:[0-9]+]], 0, v{{[0-9]+}}
503497 ; SI: v_mac_f32_e32 v[[NEG_A0]], v{{[0-9]+}}, v{{[0-9]+}}
504498 ; SI: v_mac_f32_e32 v[[NEG_A1]], v{{[0-9]+}}, v{{[0-9]+}}
505499 ; VI: v_sub_f16_e32 v[[NEG_A0:[0-9]+]], 0, v{{[0-9]+}}
642642 }
643643
644644 ; CHECK-ALL-LABEL: test_minnan:
645 ; CHECK-FP16: vcvtb.f32.f16
646 ; CHECK-FP16: vcvtb.f32.f16
647 ; CHECK-LIBCALL: bl __aeabi_h2f
648 ; CHECK-LIBCALL: bl __aeabi_h2f
645 ; CHECK-FP16: vmov.f32 s0, #1.000000e+00
646 ; CHECK-FP16: vcvtb.f32.f16
647 ; CHECK-LIBCALL: bl __aeabi_h2f
648 ; CHECK-LIBCALL-VFP: vmov.f32 s{{[0-9]+}}, #1.000000e+00
649 ; CHECK-NOVFP: mov r{{[0-9]+}}, #1065353216
649650 ; CHECK-VFP: vmin.f32
650651 ; CHECK-NOVFP: bl __aeabi_fcmpge
651652 ; CHECK-FP16: vcvtb.f16.f32
659660 }
660661
661662 ; CHECK-ALL-LABEL: test_maxnan:
662 ; CHECK-FP16: vcvtb.f32.f16
663 ; CHECK-FP16: vcvtb.f32.f16
664 ; CHECK-LIBCALL: bl __aeabi_h2f
665 ; CHECK-LIBCALL: bl __aeabi_h2f
663 ; CHECK-FP16: vmov.f32 s0, #1.000000e+00
664 ; CHECK-FP16: vcvtb.f32.f16
665 ; CHECK-LIBCALL: bl __aeabi_h2f
666 ; CHECK-LIBCALL-VFP: vmov.f32 s0, #1.000000e+00
667 ; CHECK-NOVFP: mov r{{[0-9]+}}, #1065353216
666668 ; CHECK-VFP: vmax.f32
667669 ; CHECK-NOVFP: bl __aeabi_fcmple
668670 ; CHECK-FP16: vcvtb.f16.f32
33 target triple = "armv7a--none-eabi"
44
55 ; CHECK-LABEL: test_vec3:
6 ; CHECK-DAG: vcvtb.f32.f16 [[SREG1:s[0-9]+]],
6 ; CHECK-DAG: vmov.f32 [[SREG1:s[0-9]+]], #1.200000e+01
77 ; CHECK-DAG: vcvt.f32.s32 [[SREG2:s[0-9]+]],
88 ; CHECK-DAG: vcvtb.f16.f32 [[SREG3:s[0-9]+]], [[SREG2]]
99 ; CHECK-DAG: vcvtb.f32.f16 [[SREG4:s[0-9]+]], [[SREG3]]