@@ -2138,19 +2138,26 @@ def : GCNPat <
2138
2138
/********** Immediate Patterns **********/
2139
2139
/********** ================== **********/
2140
2140
2141
+ // FIXME: Remove VGPRImm. Should be inferrable from register bank.
2142
+
2141
2143
def : GCNPat <
2142
2144
(VGPRImm<(i32 imm)>:$imm),
2143
2145
(V_MOV_B32_e32 imm:$imm)
2144
2146
>;
2145
2147
2146
2148
def : GCNPat <
2147
- (VGPRImm<(f32 fpimm)> :$imm),
2148
- (V_MOV_B32_e32 (f32 (bitcast_fpimm_to_i32 $imm)) )
2149
+ (i32 imm :$imm),
2150
+ (S_MOV_B32 imm: $imm)
2149
2151
>;
2150
2152
2151
2153
def : GCNPat <
2152
- (i32 imm:$imm),
2153
- (S_MOV_B32 imm:$imm)
2154
+ (p5 frameindex:$fi),
2155
+ (V_MOV_B32_e32 (p5 (frameindex_to_targetframeindex $fi)))
2156
+ >;
2157
+
2158
+ def : GCNPat <
2159
+ (p5 frameindex:$fi),
2160
+ (S_MOV_B32 (p5 (frameindex_to_targetframeindex $fi)))
2154
2161
>;
2155
2162
2156
2163
def : GCNPat <
@@ -2174,15 +2181,13 @@ foreach pred = [NotHasTrue16BitInsts, UseFakeTrue16Insts] in {
2174
2181
// FIXME: Workaround for ordering issue with peephole optimizer where
2175
2182
// a register class copy interferes with immediate folding. Should
2176
2183
// use s_mov_b32, which can be shrunk to s_movk_i32
2177
- def : GCNPat <
2178
- (VGPRImm<(f16 fpimm)>:$imm),
2179
- (V_MOV_B32_e32 (f16 (bitcast_fpimm_to_i32 $imm)))
2180
- >;
2181
2184
2182
- def : GCNPat <
2183
- (VGPRImm<(bf16 fpimm)>:$imm),
2184
- (V_MOV_B32_e32 (bf16 (bitcast_fpimm_to_i32 $imm)))
2185
- >;
2185
+ foreach vt = [f16, bf16] in {
2186
+ def : GCNPat <
2187
+ (VGPRImm<(f16 fpimm)>:$imm),
2188
+ (V_MOV_B32_e32 (vt (bitcast_fpimm_to_i32 $imm)))
2189
+ >;
2190
+ }
2186
2191
}
2187
2192
2188
2193
let True16Predicate = UseRealTrue16Insts in {
@@ -2191,15 +2196,12 @@ let True16Predicate = UseRealTrue16Insts in {
2191
2196
(V_MOV_B16_t16_e64 0, imm:$imm, 0)
2192
2197
>;
2193
2198
2194
- def : GCNPat <
2195
- (VGPRImm<(f16 fpimm)>:$imm),
2196
- (V_MOV_B16_t16_e64 0, $imm, 0)
2197
- >;
2198
-
2199
- def : GCNPat <
2200
- (VGPRImm<(bf16 fpimm)>:$imm),
2201
- (V_MOV_B16_t16_e64 0, $imm, 0)
2202
- >;
2199
+ foreach vt = [f16, bf16] in {
2200
+ def : GCNPat <
2201
+ (VGPRImm<(vt fpimm)>:$imm),
2202
+ (V_MOV_B16_t16_e64 0, $imm, 0)
2203
+ >;
2204
+ }
2203
2205
}
2204
2206
2205
2207
// V_MOV_B64_PSEUDO and S_MOV_B64_IMM_PSEUDO can be used with any 64-bit
@@ -2235,27 +2237,59 @@ def : GCNPat <
2235
2237
(S_MOV_B32 (i32 (bitcast_fpimm_to_i32 $imm)))
2236
2238
>;
2237
2239
2240
+ def : GCNPat <
2241
+ (VGPRImm<(bf16 fpimm)>:$imm),
2242
+ (V_MOV_B32_e32 (bf16 (bitcast_fpimm_to_i32 $imm)))
2243
+ >;
2244
+
2238
2245
def : GCNPat <
2239
2246
(bf16 fpimm:$imm),
2240
2247
(S_MOV_B32 (i32 (bitcast_fpimm_to_i32 $imm)))
2241
2248
>;
2242
2249
2243
2250
def : GCNPat <
2244
- (p5 frameindex:$fi ),
2245
- (V_MOV_B32_e32 (p5 (frameindex_to_targetframeindex $fi )))
2251
+ (VGPRImm<(f32 fpimm)>:$imm ),
2252
+ (V_MOV_B32_e32 (f32 (bitcast_fpimm_to_i32 $imm )))
2246
2253
>;
2247
2254
2248
2255
def : GCNPat <
2249
- (p5 frameindex:$fi),
2250
- (S_MOV_B32 (p5 (frameindex_to_targetframeindex $fi)))
2256
+ (f32 fpimm:$imm),
2257
+ (S_MOV_B32 (f32 (bitcast_fpimm_to_i32 $imm)))
2258
+ >;
2259
+
2260
+ def : GCNPat <
2261
+ (VGPRImm<(i64 imm)>:$imm),
2262
+ (V_MOV_B64_PSEUDO imm:$imm)
2251
2263
>;
2252
2264
2253
2265
def : GCNPat <
2254
2266
(i64 InlineImm64:$imm),
2255
2267
(S_MOV_B64 InlineImm64:$imm)
2256
2268
>;
2257
2269
2258
- // Set to sign-extended 64-bit value (true = -1, false = 0)
2270
+ def : GCNPat <
2271
+ (i64 imm:$imm),
2272
+ (S_MOV_B64_IMM_PSEUDO imm:$imm)
2273
+ >;
2274
+
2275
+ def : GCNPat <
2276
+ (VGPRImm<(f64 fpimm)>:$imm),
2277
+ (V_MOV_B64_PSEUDO (f64 (bitcast_fpimm_to_i64 $imm)))
2278
+ >;
2279
+
2280
+ // V_MOV_B64_PSEUDO and S_MOV_B64_IMM_PSEUDO can be used with any 64-bit
2281
+ // immediate and wil be expanded as needed, but we will only use these patterns
2282
+ // for values which can be encoded.
2283
+ def : GCNPat <
2284
+ (f64 InlineImmFP64:$imm),
2285
+ (S_MOV_B64 (i64 (bitcast_fpimm_to_i64 $imm)))
2286
+ >;
2287
+
2288
+ def : GCNPat <
2289
+ (f64 fpimm:$imm),
2290
+ (S_MOV_B64_IMM_PSEUDO (i64 (bitcast_fpimm_to_i64 fpimm:$imm)))
2291
+ >;
2292
+
2259
2293
// Set to sign-extended 64-bit value (true = -1, false = 0)
2260
2294
def : GCNPat <(i1 imm:$imm),
2261
2295
(S_MOV_B64 imm:$imm)> {
@@ -2267,11 +2301,6 @@ def : GCNPat <(i1 imm:$imm),
2267
2301
let WaveSizePredicate = isWave32;
2268
2302
}
2269
2303
2270
- def : GCNPat <
2271
- (f64 InlineImmFP64:$imm),
2272
- (S_MOV_B64 (f64 (bitcast_fpimm_to_i64 InlineImmFP64:$imm)))
2273
- >;
2274
-
2275
2304
/********** ================== **********/
2276
2305
/********** Intrinsic Patterns **********/
2277
2306
/********** ================== **********/
0 commit comments