8055 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=amdgcn | FileCheck %s -check-prefixes=GCN3; RUN: llc < %s -mtriple=amdgcn -mcpu=hawaii | FileCheck %s -check-prefixes=GFX74; RUN: llc < %s -mtriple=amdgcn -mcpu=tonga | FileCheck %s -check-prefixes=GFX85; RUN: llc < %s -mtriple=amdgcn -mcpu=gfx900 | FileCheck %s -check-prefixes=GFX96; RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1010 | FileCheck %s -check-prefixes=GFX107; RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 | FileCheck %s -check-prefixes=GFX11,GFX11TRUE168; RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 | FileCheck %s -check-prefixes=GFX11,GFX11FAKE169 10declare bfloat @llvm.copysign.bf16(bfloat, bfloat)11 12define bfloat @v_copysign_bf16_bf16(bfloat %mag, bfloat %sign) {13; GCN-LABEL: v_copysign_bf16_bf16:14; GCN: ; %bb.0:15; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)16; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v017; GCN-NEXT: v_and_b32_e32 v1, 0x80000000, v118; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v119; GCN-NEXT: v_bfe_u32 v0, v0, 16, 1520; GCN-NEXT: v_or_b32_e32 v0, v0, v121; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v022; GCN-NEXT: s_setpc_b64 s[30:31]23;24; GFX7-LABEL: v_copysign_bf16_bf16:25; GFX7: ; %bb.0:26; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)27; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v028; GFX7-NEXT: v_and_b32_e32 v1, 0x80000000, v129; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v130; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 1531; GFX7-NEXT: v_or_b32_e32 v0, v0, v132; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v033; GFX7-NEXT: s_setpc_b64 s[30:31]34;35; GFX8-LABEL: v_copysign_bf16_bf16:36; GFX8: ; %bb.0:37; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)38; GFX8-NEXT: s_movk_i32 s4, 0x7fff39; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v140; GFX8-NEXT: s_setpc_b64 s[30:31]41;42; GFX9-LABEL: v_copysign_bf16_bf16:43; GFX9: ; %bb.0:44; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)45; GFX9-NEXT: s_movk_i32 s4, 0x7fff46; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v147; GFX9-NEXT: s_setpc_b64 s[30:31]48;49; GFX10-LABEL: v_copysign_bf16_bf16:50; GFX10: ; %bb.0:51; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)52; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, v0, v153; GFX10-NEXT: s_setpc_b64 s[30:31]54;55; GFX11-LABEL: v_copysign_bf16_bf16:56; GFX11: ; %bb.0:57; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)58; GFX11-NEXT: v_bfi_b32 v0, 0x7fff, v0, v159; GFX11-NEXT: s_setpc_b64 s[30:31]60 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)61 ret bfloat %op62}63 64define bfloat @v_copysign_bf16_s_bf16(bfloat %mag, bfloat inreg %sign) {65; GCN-LABEL: v_copysign_bf16_s_bf16:66; GCN: ; %bb.0:67; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)68; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v069; GCN-NEXT: s_and_b32 s4, s16, 0x8000000070; GCN-NEXT: s_lshr_b32 s4, s4, 1671; GCN-NEXT: v_bfe_u32 v0, v0, 16, 1572; GCN-NEXT: v_or_b32_e32 v0, s4, v073; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v074; GCN-NEXT: s_setpc_b64 s[30:31]75;76; GFX7-LABEL: v_copysign_bf16_s_bf16:77; GFX7: ; %bb.0:78; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)79; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v080; GFX7-NEXT: s_and_b32 s4, s16, 0x8000000081; GFX7-NEXT: s_lshr_b32 s4, s4, 1682; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 1583; GFX7-NEXT: v_or_b32_e32 v0, s4, v084; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v085; GFX7-NEXT: s_setpc_b64 s[30:31]86;87; GFX8-LABEL: v_copysign_bf16_s_bf16:88; GFX8: ; %bb.0:89; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)90; GFX8-NEXT: s_movk_i32 s4, 0x7fff91; GFX8-NEXT: v_mov_b32_e32 v1, s1692; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v193; GFX8-NEXT: s_setpc_b64 s[30:31]94;95; GFX9-LABEL: v_copysign_bf16_s_bf16:96; GFX9: ; %bb.0:97; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)98; GFX9-NEXT: s_movk_i32 s4, 0x7fff99; GFX9-NEXT: v_mov_b32_e32 v1, s16100; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v1101; GFX9-NEXT: s_setpc_b64 s[30:31]102;103; GFX10-LABEL: v_copysign_bf16_s_bf16:104; GFX10: ; %bb.0:105; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)106; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, v0, s16107; GFX10-NEXT: s_setpc_b64 s[30:31]108;109; GFX11TRUE16-LABEL: v_copysign_bf16_s_bf16:110; GFX11TRUE16: ; %bb.0:111; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)112; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, s0113; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)114; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1115; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]116;117; GFX11FAKE16-LABEL: v_copysign_bf16_s_bf16:118; GFX11FAKE16: ; %bb.0:119; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)120; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, s0121; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]122 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)123 ret bfloat %op124}125 126define bfloat @v_copysign_s_bf16_bf16(bfloat inreg %mag, bfloat %sign) {127; GCN-LABEL: v_copysign_s_bf16_bf16:128; GCN: ; %bb.0:129; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)130; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s16131; GCN-NEXT: v_and_b32_e32 v0, 0x80000000, v0132; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v0133; GCN-NEXT: v_bfe_u32 v1, v1, 16, 15134; GCN-NEXT: v_or_b32_e32 v0, v1, v0135; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v0136; GCN-NEXT: s_setpc_b64 s[30:31]137;138; GFX7-LABEL: v_copysign_s_bf16_bf16:139; GFX7: ; %bb.0:140; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)141; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s16142; GFX7-NEXT: v_and_b32_e32 v0, 0x80000000, v0143; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v0144; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 15145; GFX7-NEXT: v_or_b32_e32 v0, v1, v0146; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0147; GFX7-NEXT: s_setpc_b64 s[30:31]148;149; GFX8-LABEL: v_copysign_s_bf16_bf16:150; GFX8: ; %bb.0:151; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)152; GFX8-NEXT: s_movk_i32 s4, 0x7fff153; GFX8-NEXT: v_mov_b32_e32 v1, s16154; GFX8-NEXT: v_bfi_b32 v0, s4, v1, v0155; GFX8-NEXT: s_setpc_b64 s[30:31]156;157; GFX9-LABEL: v_copysign_s_bf16_bf16:158; GFX9: ; %bb.0:159; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)160; GFX9-NEXT: s_movk_i32 s4, 0x7fff161; GFX9-NEXT: v_mov_b32_e32 v1, s16162; GFX9-NEXT: v_bfi_b32 v0, s4, v1, v0163; GFX9-NEXT: s_setpc_b64 s[30:31]164;165; GFX10-LABEL: v_copysign_s_bf16_bf16:166; GFX10: ; %bb.0:167; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)168; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s16, v0169; GFX10-NEXT: s_setpc_b64 s[30:31]170;171; GFX11TRUE16-LABEL: v_copysign_s_bf16_bf16:172; GFX11TRUE16: ; %bb.0:173; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)174; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, s0175; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)176; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v1, v0177; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]178;179; GFX11FAKE16-LABEL: v_copysign_s_bf16_bf16:180; GFX11FAKE16: ; %bb.0:181; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)182; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0183; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]184 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)185 ret bfloat %op186}187 188define bfloat @v_copysign_bf16_f32(bfloat %mag, float %sign.f32) {189; GCN-LABEL: v_copysign_bf16_f32:190; GCN: ; %bb.0:191; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)192; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0193; GCN-NEXT: v_and_b32_e32 v1, 0x80000000, v1194; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v1195; GCN-NEXT: v_bfe_u32 v0, v0, 16, 15196; GCN-NEXT: v_or_b32_e32 v0, v0, v1197; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v0198; GCN-NEXT: s_setpc_b64 s[30:31]199;200; GFX7-LABEL: v_copysign_bf16_f32:201; GFX7: ; %bb.0:202; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)203; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v0204; GFX7-NEXT: v_and_b32_e32 v1, 0x80000000, v1205; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v1206; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 15207; GFX7-NEXT: v_or_b32_e32 v0, v0, v1208; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0209; GFX7-NEXT: s_setpc_b64 s[30:31]210;211; GFX8-LABEL: v_copysign_bf16_f32:212; GFX8: ; %bb.0:213; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)214; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v1215; GFX8-NEXT: s_movk_i32 s4, 0x7fff216; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v1217; GFX8-NEXT: s_setpc_b64 s[30:31]218;219; GFX9-LABEL: v_copysign_bf16_f32:220; GFX9: ; %bb.0:221; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)222; GFX9-NEXT: v_lshrrev_b32_e32 v1, 16, v1223; GFX9-NEXT: s_movk_i32 s4, 0x7fff224; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v1225; GFX9-NEXT: s_setpc_b64 s[30:31]226;227; GFX10-LABEL: v_copysign_bf16_f32:228; GFX10: ; %bb.0:229; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)230; GFX10-NEXT: v_lshrrev_b32_e32 v1, 16, v1231; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1232; GFX10-NEXT: s_setpc_b64 s[30:31]233;234; GFX11-LABEL: v_copysign_bf16_f32:235; GFX11: ; %bb.0:236; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)237; GFX11-NEXT: v_lshrrev_b32_e32 v1, 16, v1238; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)239; GFX11-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1240; GFX11-NEXT: s_setpc_b64 s[30:31]241 %sign = fptrunc float %sign.f32 to bfloat242 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)243 ret bfloat %op244}245 246define bfloat @v_copysign_bf16_f64(bfloat %mag, double %sign.f64) {247; GCN-LABEL: v_copysign_bf16_f64:248; GCN: ; %bb.0:249; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)250; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0251; GCN-NEXT: v_and_b32_e32 v1, 0x80000000, v2252; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v1253; GCN-NEXT: v_bfe_u32 v0, v0, 16, 15254; GCN-NEXT: v_or_b32_e32 v0, v0, v1255; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v0256; GCN-NEXT: s_setpc_b64 s[30:31]257;258; GFX7-LABEL: v_copysign_bf16_f64:259; GFX7: ; %bb.0:260; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)261; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v0262; GFX7-NEXT: v_and_b32_e32 v1, 0x80000000, v2263; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v1264; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 15265; GFX7-NEXT: v_or_b32_e32 v0, v0, v1266; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0267; GFX7-NEXT: s_setpc_b64 s[30:31]268;269; GFX8-LABEL: v_copysign_bf16_f64:270; GFX8: ; %bb.0:271; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)272; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v2273; GFX8-NEXT: s_movk_i32 s4, 0x7fff274; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v1275; GFX8-NEXT: s_setpc_b64 s[30:31]276;277; GFX9-LABEL: v_copysign_bf16_f64:278; GFX9: ; %bb.0:279; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)280; GFX9-NEXT: v_lshrrev_b32_e32 v1, 16, v2281; GFX9-NEXT: s_movk_i32 s4, 0x7fff282; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v1283; GFX9-NEXT: s_setpc_b64 s[30:31]284;285; GFX10-LABEL: v_copysign_bf16_f64:286; GFX10: ; %bb.0:287; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)288; GFX10-NEXT: v_lshrrev_b32_e32 v1, 16, v2289; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1290; GFX10-NEXT: s_setpc_b64 s[30:31]291;292; GFX11-LABEL: v_copysign_bf16_f64:293; GFX11: ; %bb.0:294; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)295; GFX11-NEXT: v_lshrrev_b32_e32 v1, 16, v2296; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)297; GFX11-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1298; GFX11-NEXT: s_setpc_b64 s[30:31]299 %sign = fptrunc double %sign.f64 to bfloat300 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)301 ret bfloat %op302}303 304define bfloat @v_copysign_bf16_f16(bfloat %mag, half %sign.f16) {305; GCN-LABEL: v_copysign_bf16_f16:306; GCN: ; %bb.0:307; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)308; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v0309; GCN-NEXT: v_cvt_f16_f32_e32 v1, v1310; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v1311; GCN-NEXT: v_bfe_u32 v0, v0, 16, 15312; GCN-NEXT: v_or_b32_e32 v0, v0, v1313; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v0314; GCN-NEXT: s_setpc_b64 s[30:31]315;316; GFX7-LABEL: v_copysign_bf16_f16:317; GFX7: ; %bb.0:318; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)319; GFX7-NEXT: v_cvt_f16_f32_e32 v1, v1320; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v0321; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 15322; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v1323; GFX7-NEXT: v_or_b32_e32 v0, v0, v1324; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0325; GFX7-NEXT: s_setpc_b64 s[30:31]326;327; GFX8-LABEL: v_copysign_bf16_f16:328; GFX8: ; %bb.0:329; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)330; GFX8-NEXT: s_movk_i32 s4, 0x7fff331; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v1332; GFX8-NEXT: s_setpc_b64 s[30:31]333;334; GFX9-LABEL: v_copysign_bf16_f16:335; GFX9: ; %bb.0:336; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)337; GFX9-NEXT: s_movk_i32 s4, 0x7fff338; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v1339; GFX9-NEXT: s_setpc_b64 s[30:31]340;341; GFX10-LABEL: v_copysign_bf16_f16:342; GFX10: ; %bb.0:343; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)344; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1345; GFX10-NEXT: s_setpc_b64 s[30:31]346;347; GFX11-LABEL: v_copysign_bf16_f16:348; GFX11: ; %bb.0:349; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)350; GFX11-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1351; GFX11-NEXT: s_setpc_b64 s[30:31]352 %sign = bitcast half %sign.f16 to bfloat353 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)354 ret bfloat %op355}356 357define amdgpu_ps i32 @s_copysign_bf16_bf16(bfloat inreg %mag, bfloat inreg %sign) {358; GCN-LABEL: s_copysign_bf16_bf16:359; GCN: ; %bb.0:360; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s0361; GCN-NEXT: s_and_b32 s0, s1, 0x80000000362; GCN-NEXT: s_lshr_b32 s0, s0, 16363; GCN-NEXT: v_bfe_u32 v0, v0, 16, 15364; GCN-NEXT: v_or_b32_e32 v0, s0, v0365; GCN-NEXT: v_readfirstlane_b32 s0, v0366; GCN-NEXT: ; return to shader part epilog367;368; GFX7-LABEL: s_copysign_bf16_bf16:369; GFX7: ; %bb.0:370; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s0371; GFX7-NEXT: s_and_b32 s0, s1, 0x80000000372; GFX7-NEXT: s_lshr_b32 s0, s0, 16373; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 15374; GFX7-NEXT: v_or_b32_e32 v0, s0, v0375; GFX7-NEXT: v_readfirstlane_b32 s0, v0376; GFX7-NEXT: ; return to shader part epilog377;378; GFX8-LABEL: s_copysign_bf16_bf16:379; GFX8: ; %bb.0:380; GFX8-NEXT: s_movk_i32 s2, 0x7fff381; GFX8-NEXT: v_mov_b32_e32 v0, s0382; GFX8-NEXT: v_mov_b32_e32 v1, s1383; GFX8-NEXT: v_bfi_b32 v0, s2, v0, v1384; GFX8-NEXT: v_and_b32_e32 v0, 0xffff, v0385; GFX8-NEXT: v_readfirstlane_b32 s0, v0386; GFX8-NEXT: ; return to shader part epilog387;388; GFX9-LABEL: s_copysign_bf16_bf16:389; GFX9: ; %bb.0:390; GFX9-NEXT: s_movk_i32 s2, 0x7fff391; GFX9-NEXT: v_mov_b32_e32 v0, s0392; GFX9-NEXT: v_mov_b32_e32 v1, s1393; GFX9-NEXT: v_bfi_b32 v0, s2, v0, v1394; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0395; GFX9-NEXT: v_readfirstlane_b32 s0, v0396; GFX9-NEXT: ; return to shader part epilog397;398; GFX10-LABEL: s_copysign_bf16_bf16:399; GFX10: ; %bb.0:400; GFX10-NEXT: v_mov_b32_e32 v0, s1401; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0402; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0403; GFX10-NEXT: v_readfirstlane_b32 s0, v0404; GFX10-NEXT: ; return to shader part epilog405;406; GFX11TRUE16-LABEL: s_copysign_bf16_bf16:407; GFX11TRUE16: ; %bb.0:408; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s1409; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, s0410; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)411; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v1, v0412; GFX11TRUE16-NEXT: v_and_b32_e32 v0, 0xffff, v0413; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)414; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v0415; GFX11TRUE16-NEXT: ; return to shader part epilog416;417; GFX11FAKE16-LABEL: s_copysign_bf16_bf16:418; GFX11FAKE16: ; %bb.0:419; GFX11FAKE16-NEXT: v_mov_b32_e32 v0, s1420; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)421; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0422; GFX11FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0423; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)424; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v0425; GFX11FAKE16-NEXT: ; return to shader part epilog426 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)427 %cast = bitcast bfloat %op to i16428 %zext = zext i16 %cast to i32429 %readlane = call i32 @llvm.amdgcn.readfirstlane(i32 %zext)430 ret i32 %readlane431}432 433define amdgpu_ps i32 @s_copysign_bf16_f32(bfloat inreg %mag, float inreg %sign.f32) {434; GCN-LABEL: s_copysign_bf16_f32:435; GCN: ; %bb.0:436; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s0437; GCN-NEXT: s_and_b32 s0, s1, 0x80000000438; GCN-NEXT: s_lshr_b32 s0, s0, 16439; GCN-NEXT: v_bfe_u32 v0, v0, 16, 15440; GCN-NEXT: v_or_b32_e32 v0, s0, v0441; GCN-NEXT: v_readfirstlane_b32 s0, v0442; GCN-NEXT: ; return to shader part epilog443;444; GFX7-LABEL: s_copysign_bf16_f32:445; GFX7: ; %bb.0:446; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s0447; GFX7-NEXT: s_and_b32 s0, s1, 0x80000000448; GFX7-NEXT: s_lshr_b32 s0, s0, 16449; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 15450; GFX7-NEXT: v_or_b32_e32 v0, s0, v0451; GFX7-NEXT: v_readfirstlane_b32 s0, v0452; GFX7-NEXT: ; return to shader part epilog453;454; GFX8-LABEL: s_copysign_bf16_f32:455; GFX8: ; %bb.0:456; GFX8-NEXT: v_lshrrev_b32_e64 v0, 16, s1457; GFX8-NEXT: s_movk_i32 s1, 0x7fff458; GFX8-NEXT: v_mov_b32_e32 v1, s0459; GFX8-NEXT: v_bfi_b32 v0, s1, v1, v0460; GFX8-NEXT: v_and_b32_e32 v0, 0xffff, v0461; GFX8-NEXT: v_readfirstlane_b32 s0, v0462; GFX8-NEXT: ; return to shader part epilog463;464; GFX9-LABEL: s_copysign_bf16_f32:465; GFX9: ; %bb.0:466; GFX9-NEXT: v_lshrrev_b32_e64 v0, 16, s1467; GFX9-NEXT: s_movk_i32 s1, 0x7fff468; GFX9-NEXT: v_mov_b32_e32 v1, s0469; GFX9-NEXT: v_bfi_b32 v0, s1, v1, v0470; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0471; GFX9-NEXT: v_readfirstlane_b32 s0, v0472; GFX9-NEXT: ; return to shader part epilog473;474; GFX10-LABEL: s_copysign_bf16_f32:475; GFX10: ; %bb.0:476; GFX10-NEXT: v_lshrrev_b32_e64 v0, 16, s1477; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0478; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0479; GFX10-NEXT: v_readfirstlane_b32 s0, v0480; GFX10-NEXT: ; return to shader part epilog481;482; GFX11TRUE16-LABEL: s_copysign_bf16_f32:483; GFX11TRUE16: ; %bb.0:484; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s0485; GFX11TRUE16-NEXT: v_lshrrev_b32_e64 v1, 16, s1486; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)487; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1488; GFX11TRUE16-NEXT: v_and_b32_e32 v0, 0xffff, v0489; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)490; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v0491; GFX11TRUE16-NEXT: ; return to shader part epilog492;493; GFX11FAKE16-LABEL: s_copysign_bf16_f32:494; GFX11FAKE16: ; %bb.0:495; GFX11FAKE16-NEXT: v_lshrrev_b32_e64 v0, 16, s1496; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)497; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0498; GFX11FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0499; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)500; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v0501; GFX11FAKE16-NEXT: ; return to shader part epilog502 %sign = fptrunc float %sign.f32 to bfloat503 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)504 %cast = bitcast bfloat %op to i16505 %zext = zext i16 %cast to i32506 %readlane = call i32 @llvm.amdgcn.readfirstlane(i32 %zext)507 ret i32 %readlane508}509 510define amdgpu_ps i32 @s_copysign_bf16_f64(bfloat inreg %mag, double inreg %sign.f64) {511; GCN-LABEL: s_copysign_bf16_f64:512; GCN: ; %bb.0:513; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s0514; GCN-NEXT: s_and_b32 s0, s2, 0x80000000515; GCN-NEXT: s_lshr_b32 s0, s0, 16516; GCN-NEXT: v_bfe_u32 v0, v0, 16, 15517; GCN-NEXT: v_or_b32_e32 v0, s0, v0518; GCN-NEXT: v_readfirstlane_b32 s0, v0519; GCN-NEXT: ; return to shader part epilog520;521; GFX7-LABEL: s_copysign_bf16_f64:522; GFX7: ; %bb.0:523; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s0524; GFX7-NEXT: s_and_b32 s0, s2, 0x80000000525; GFX7-NEXT: s_lshr_b32 s0, s0, 16526; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 15527; GFX7-NEXT: v_or_b32_e32 v0, s0, v0528; GFX7-NEXT: v_readfirstlane_b32 s0, v0529; GFX7-NEXT: ; return to shader part epilog530;531; GFX8-LABEL: s_copysign_bf16_f64:532; GFX8: ; %bb.0:533; GFX8-NEXT: v_lshrrev_b32_e64 v0, 16, s2534; GFX8-NEXT: s_movk_i32 s1, 0x7fff535; GFX8-NEXT: v_mov_b32_e32 v1, s0536; GFX8-NEXT: v_bfi_b32 v0, s1, v1, v0537; GFX8-NEXT: v_and_b32_e32 v0, 0xffff, v0538; GFX8-NEXT: v_readfirstlane_b32 s0, v0539; GFX8-NEXT: ; return to shader part epilog540;541; GFX9-LABEL: s_copysign_bf16_f64:542; GFX9: ; %bb.0:543; GFX9-NEXT: v_lshrrev_b32_e64 v0, 16, s2544; GFX9-NEXT: s_movk_i32 s1, 0x7fff545; GFX9-NEXT: v_mov_b32_e32 v1, s0546; GFX9-NEXT: v_bfi_b32 v0, s1, v1, v0547; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0548; GFX9-NEXT: v_readfirstlane_b32 s0, v0549; GFX9-NEXT: ; return to shader part epilog550;551; GFX10-LABEL: s_copysign_bf16_f64:552; GFX10: ; %bb.0:553; GFX10-NEXT: v_lshrrev_b32_e64 v0, 16, s2554; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0555; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0556; GFX10-NEXT: v_readfirstlane_b32 s0, v0557; GFX10-NEXT: ; return to shader part epilog558;559; GFX11TRUE16-LABEL: s_copysign_bf16_f64:560; GFX11TRUE16: ; %bb.0:561; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s0562; GFX11TRUE16-NEXT: v_lshrrev_b32_e64 v1, 16, s2563; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)564; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1565; GFX11TRUE16-NEXT: v_and_b32_e32 v0, 0xffff, v0566; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)567; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v0568; GFX11TRUE16-NEXT: ; return to shader part epilog569;570; GFX11FAKE16-LABEL: s_copysign_bf16_f64:571; GFX11FAKE16: ; %bb.0:572; GFX11FAKE16-NEXT: v_lshrrev_b32_e64 v0, 16, s2573; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)574; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0575; GFX11FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0576; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)577; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v0578; GFX11FAKE16-NEXT: ; return to shader part epilog579 %sign = fptrunc double %sign.f64 to bfloat580 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)581 %cast = bitcast bfloat %op to i16582 %zext = zext i16 %cast to i32583 %readlane = call i32 @llvm.amdgcn.readfirstlane(i32 %zext)584 ret i32 %readlane585}586 587define amdgpu_ps i32 @s_copysign_bf16_f16(bfloat inreg %mag, half inreg %sign.f16) {588; GCN-LABEL: s_copysign_bf16_f16:589; GCN: ; %bb.0:590; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s0591; GCN-NEXT: v_cvt_f16_f32_e32 v1, s1592; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v1593; GCN-NEXT: v_bfe_u32 v0, v0, 16, 15594; GCN-NEXT: v_or_b32_e32 v0, v0, v1595; GCN-NEXT: v_readfirstlane_b32 s0, v0596; GCN-NEXT: ; return to shader part epilog597;598; GFX7-LABEL: s_copysign_bf16_f16:599; GFX7: ; %bb.0:600; GFX7-NEXT: v_cvt_f16_f32_e32 v0, s1601; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s0602; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 15603; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v0604; GFX7-NEXT: v_or_b32_e32 v0, v1, v0605; GFX7-NEXT: v_readfirstlane_b32 s0, v0606; GFX7-NEXT: ; return to shader part epilog607;608; GFX8-LABEL: s_copysign_bf16_f16:609; GFX8: ; %bb.0:610; GFX8-NEXT: s_movk_i32 s2, 0x7fff611; GFX8-NEXT: v_mov_b32_e32 v0, s0612; GFX8-NEXT: v_mov_b32_e32 v1, s1613; GFX8-NEXT: v_bfi_b32 v0, s2, v0, v1614; GFX8-NEXT: v_and_b32_e32 v0, 0xffff, v0615; GFX8-NEXT: v_readfirstlane_b32 s0, v0616; GFX8-NEXT: ; return to shader part epilog617;618; GFX9-LABEL: s_copysign_bf16_f16:619; GFX9: ; %bb.0:620; GFX9-NEXT: s_movk_i32 s2, 0x7fff621; GFX9-NEXT: v_mov_b32_e32 v0, s0622; GFX9-NEXT: v_mov_b32_e32 v1, s1623; GFX9-NEXT: v_bfi_b32 v0, s2, v0, v1624; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0625; GFX9-NEXT: v_readfirstlane_b32 s0, v0626; GFX9-NEXT: ; return to shader part epilog627;628; GFX10-LABEL: s_copysign_bf16_f16:629; GFX10: ; %bb.0:630; GFX10-NEXT: v_mov_b32_e32 v0, s1631; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0632; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0633; GFX10-NEXT: v_readfirstlane_b32 s0, v0634; GFX10-NEXT: ; return to shader part epilog635;636; GFX11TRUE16-LABEL: s_copysign_bf16_f16:637; GFX11TRUE16: ; %bb.0:638; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s1639; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, s0640; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)641; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v1, v0642; GFX11TRUE16-NEXT: v_and_b32_e32 v0, 0xffff, v0643; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)644; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v0645; GFX11TRUE16-NEXT: ; return to shader part epilog646;647; GFX11FAKE16-LABEL: s_copysign_bf16_f16:648; GFX11FAKE16: ; %bb.0:649; GFX11FAKE16-NEXT: v_mov_b32_e32 v0, s1650; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)651; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0652; GFX11FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0653; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)654; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v0655; GFX11FAKE16-NEXT: ; return to shader part epilog656 %sign = bitcast half %sign.f16 to bfloat657 %op = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign)658 %cast = bitcast bfloat %op to i16659 %zext = zext i16 %cast to i32660 %readlane = call i32 @llvm.amdgcn.readfirstlane(i32 %zext)661 ret i32 %readlane662}663 664declare float @llvm.copysign.f32(float, float)665 666define float @v_copysign_f32_bf16(float %mag, bfloat %sign.bf16) {667; GCN-LABEL: v_copysign_f32_bf16:668; GCN: ; %bb.0:669; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)670; GCN-NEXT: s_brev_b32 s4, -2671; GCN-NEXT: v_bfi_b32 v0, s4, v0, v1672; GCN-NEXT: s_setpc_b64 s[30:31]673;674; GFX7-LABEL: v_copysign_f32_bf16:675; GFX7: ; %bb.0:676; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)677; GFX7-NEXT: s_brev_b32 s4, -2678; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v1679; GFX7-NEXT: s_setpc_b64 s[30:31]680;681; GFX8-LABEL: v_copysign_f32_bf16:682; GFX8: ; %bb.0:683; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)684; GFX8-NEXT: v_lshlrev_b32_e32 v1, 16, v1685; GFX8-NEXT: s_brev_b32 s4, -2686; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v1687; GFX8-NEXT: s_setpc_b64 s[30:31]688;689; GFX9-LABEL: v_copysign_f32_bf16:690; GFX9: ; %bb.0:691; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)692; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1693; GFX9-NEXT: s_brev_b32 s4, -2694; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v1695; GFX9-NEXT: s_setpc_b64 s[30:31]696;697; GFX10-LABEL: v_copysign_f32_bf16:698; GFX10: ; %bb.0:699; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)700; GFX10-NEXT: v_lshlrev_b32_e32 v1, 16, v1701; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v1702; GFX10-NEXT: s_setpc_b64 s[30:31]703;704; GFX11TRUE16-LABEL: v_copysign_f32_bf16:705; GFX11TRUE16: ; %bb.0:706; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)707; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.h, v1.l708; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)709; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v1710; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]711;712; GFX11FAKE16-LABEL: v_copysign_f32_bf16:713; GFX11FAKE16: ; %bb.0:714; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)715; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v1, 16, v1716; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)717; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v1718; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]719 %sign = fpext bfloat %sign.bf16 to float720 %op = call float @llvm.copysign.f32(float %mag, float %sign)721 ret float %op722}723 724define amdgpu_ps i32 @s_copysign_f32_bf16(float inreg %mag, bfloat inreg %sign.bf16) {725; GCN-LABEL: s_copysign_f32_bf16:726; GCN: ; %bb.0:727; GCN-NEXT: s_brev_b32 s2, -2728; GCN-NEXT: v_mov_b32_e32 v0, s0729; GCN-NEXT: v_mov_b32_e32 v1, s1730; GCN-NEXT: v_bfi_b32 v0, s2, v0, v1731; GCN-NEXT: v_readfirstlane_b32 s0, v0732; GCN-NEXT: ; return to shader part epilog733;734; GFX7-LABEL: s_copysign_f32_bf16:735; GFX7: ; %bb.0:736; GFX7-NEXT: s_brev_b32 s2, -2737; GFX7-NEXT: v_mov_b32_e32 v0, s0738; GFX7-NEXT: v_mov_b32_e32 v1, s1739; GFX7-NEXT: v_bfi_b32 v0, s2, v0, v1740; GFX7-NEXT: v_readfirstlane_b32 s0, v0741; GFX7-NEXT: ; return to shader part epilog742;743; GFX8-LABEL: s_copysign_f32_bf16:744; GFX8: ; %bb.0:745; GFX8-NEXT: v_lshlrev_b32_e64 v0, 16, s1746; GFX8-NEXT: s_brev_b32 s1, -2747; GFX8-NEXT: v_mov_b32_e32 v1, s0748; GFX8-NEXT: v_bfi_b32 v0, s1, v1, v0749; GFX8-NEXT: v_readfirstlane_b32 s0, v0750; GFX8-NEXT: ; return to shader part epilog751;752; GFX9-LABEL: s_copysign_f32_bf16:753; GFX9: ; %bb.0:754; GFX9-NEXT: v_lshlrev_b32_e64 v0, 16, s1755; GFX9-NEXT: s_brev_b32 s1, -2756; GFX9-NEXT: v_mov_b32_e32 v1, s0757; GFX9-NEXT: v_bfi_b32 v0, s1, v1, v0758; GFX9-NEXT: v_readfirstlane_b32 s0, v0759; GFX9-NEXT: ; return to shader part epilog760;761; GFX10-LABEL: s_copysign_f32_bf16:762; GFX10: ; %bb.0:763; GFX10-NEXT: v_lshlrev_b32_e64 v0, 16, s1764; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v0765; GFX10-NEXT: v_readfirstlane_b32 s0, v0766; GFX10-NEXT: ; return to shader part epilog767;768; GFX11TRUE16-LABEL: s_copysign_f32_bf16:769; GFX11TRUE16: ; %bb.0:770; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.h, s1771; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)772; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v0773; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v0774; GFX11TRUE16-NEXT: ; return to shader part epilog775;776; GFX11FAKE16-LABEL: s_copysign_f32_bf16:777; GFX11FAKE16: ; %bb.0:778; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v0, 16, s1779; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)780; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v0781; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v0782; GFX11FAKE16-NEXT: ; return to shader part epilog783 %sign = fpext bfloat %sign.bf16 to float784 %op = call float @llvm.copysign.f32(float %mag, float %sign)785 %cast = bitcast float %op to i32786 %readlane = call i32 @llvm.amdgcn.readfirstlane(i32 %cast)787 ret i32 %readlane788}789 790declare half @llvm.copysign.f16(half, half)791 792define half @v_copysign_f16_bf16(half %mag, bfloat %sign.bf16) {793; GCN-LABEL: v_copysign_f16_bf16:794; GCN: ; %bb.0:795; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)796; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v1797; GCN-NEXT: v_cvt_f16_f32_e32 v0, v0798; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v1799; GCN-NEXT: v_cvt_f32_f16_e32 v0, v0800; GCN-NEXT: v_cvt_f32_f16_e32 v1, v1801; GCN-NEXT: s_brev_b32 s4, -2802; GCN-NEXT: v_bfi_b32 v0, s4, v0, v1803; GCN-NEXT: s_setpc_b64 s[30:31]804;805; GFX7-LABEL: v_copysign_f16_bf16:806; GFX7: ; %bb.0:807; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)808; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0809; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v1810; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v1811; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1812; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0813; GFX7-NEXT: s_brev_b32 s4, -2814; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v1815; GFX7-NEXT: s_setpc_b64 s[30:31]816;817; GFX8-LABEL: v_copysign_f16_bf16:818; GFX8: ; %bb.0:819; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)820; GFX8-NEXT: s_movk_i32 s4, 0x7fff821; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v1822; GFX8-NEXT: s_setpc_b64 s[30:31]823;824; GFX9-LABEL: v_copysign_f16_bf16:825; GFX9: ; %bb.0:826; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)827; GFX9-NEXT: s_movk_i32 s4, 0x7fff828; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v1829; GFX9-NEXT: s_setpc_b64 s[30:31]830;831; GFX10-LABEL: v_copysign_f16_bf16:832; GFX10: ; %bb.0:833; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)834; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1835; GFX10-NEXT: s_setpc_b64 s[30:31]836;837; GFX11-LABEL: v_copysign_f16_bf16:838; GFX11: ; %bb.0:839; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)840; GFX11-NEXT: v_bfi_b32 v0, 0x7fff, v0, v1841; GFX11-NEXT: s_setpc_b64 s[30:31]842 %sign = bitcast bfloat %sign.bf16 to half843 %op = call half @llvm.copysign.f16(half %mag, half %sign)844 ret half %op845}846 847define amdgpu_ps i32 @s_copysign_f16_bf16(half inreg %mag, bfloat inreg %sign.bf16) {848; GCN-LABEL: s_copysign_f16_bf16:849; GCN: ; %bb.0:850; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s1851; GCN-NEXT: v_cvt_f16_f32_e32 v1, s0852; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v0853; GCN-NEXT: v_cvt_f32_f16_e32 v1, v1854; GCN-NEXT: v_cvt_f32_f16_e32 v0, v0855; GCN-NEXT: s_brev_b32 s0, -2856; GCN-NEXT: v_bfi_b32 v0, s0, v1, v0857; GCN-NEXT: v_cvt_f16_f32_e32 v0, v0858; GCN-NEXT: v_readfirstlane_b32 s0, v0859; GCN-NEXT: ; return to shader part epilog860;861; GFX7-LABEL: s_copysign_f16_bf16:862; GFX7: ; %bb.0:863; GFX7-NEXT: v_cvt_f16_f32_e32 v0, s0864; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s1865; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v1866; GFX7-NEXT: v_cvt_f32_f16_e32 v1, v1867; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v0868; GFX7-NEXT: s_brev_b32 s0, -2869; GFX7-NEXT: v_bfi_b32 v0, s0, v0, v1870; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v0871; GFX7-NEXT: v_readfirstlane_b32 s0, v0872; GFX7-NEXT: ; return to shader part epilog873;874; GFX8-LABEL: s_copysign_f16_bf16:875; GFX8: ; %bb.0:876; GFX8-NEXT: s_movk_i32 s2, 0x7fff877; GFX8-NEXT: v_mov_b32_e32 v0, s0878; GFX8-NEXT: v_mov_b32_e32 v1, s1879; GFX8-NEXT: v_bfi_b32 v0, s2, v0, v1880; GFX8-NEXT: v_and_b32_e32 v0, 0xffff, v0881; GFX8-NEXT: v_readfirstlane_b32 s0, v0882; GFX8-NEXT: ; return to shader part epilog883;884; GFX9-LABEL: s_copysign_f16_bf16:885; GFX9: ; %bb.0:886; GFX9-NEXT: s_movk_i32 s2, 0x7fff887; GFX9-NEXT: v_mov_b32_e32 v0, s0888; GFX9-NEXT: v_mov_b32_e32 v1, s1889; GFX9-NEXT: v_bfi_b32 v0, s2, v0, v1890; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0891; GFX9-NEXT: v_readfirstlane_b32 s0, v0892; GFX9-NEXT: ; return to shader part epilog893;894; GFX10-LABEL: s_copysign_f16_bf16:895; GFX10: ; %bb.0:896; GFX10-NEXT: v_mov_b32_e32 v0, s1897; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0898; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0899; GFX10-NEXT: v_readfirstlane_b32 s0, v0900; GFX10-NEXT: ; return to shader part epilog901;902; GFX11TRUE16-LABEL: s_copysign_f16_bf16:903; GFX11TRUE16: ; %bb.0:904; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s1905; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, s0906; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)907; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v1, v0908; GFX11TRUE16-NEXT: v_and_b32_e32 v0, 0xffff, v0909; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)910; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v0911; GFX11TRUE16-NEXT: ; return to shader part epilog912;913; GFX11FAKE16-LABEL: s_copysign_f16_bf16:914; GFX11FAKE16: ; %bb.0:915; GFX11FAKE16-NEXT: v_mov_b32_e32 v0, s1916; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)917; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v0918; GFX11FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0919; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)920; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v0921; GFX11FAKE16-NEXT: ; return to shader part epilog922 %sign = bitcast bfloat %sign.bf16 to half923 %op = call half @llvm.copysign.f16(half %mag, half %sign)924 %cast = bitcast half %op to i16925 %zext = zext i16 %cast to i32926 %readlane = call i32 @llvm.amdgcn.readfirstlane(i32 %zext)927 ret i32 %readlane928}929 930declare double @llvm.copysign.f64(double, double)931 932define double @v_copysign_f64_bf16(double %mag, bfloat %sign.bf16) {933; GCN-LABEL: v_copysign_f64_bf16:934; GCN: ; %bb.0:935; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)936; GCN-NEXT: s_brev_b32 s4, -2937; GCN-NEXT: v_bfi_b32 v1, s4, v1, v2938; GCN-NEXT: s_setpc_b64 s[30:31]939;940; GFX7-LABEL: v_copysign_f64_bf16:941; GFX7: ; %bb.0:942; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)943; GFX7-NEXT: s_brev_b32 s4, -2944; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v2945; GFX7-NEXT: s_setpc_b64 s[30:31]946;947; GFX8-LABEL: v_copysign_f64_bf16:948; GFX8: ; %bb.0:949; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)950; GFX8-NEXT: v_lshlrev_b32_e32 v2, 16, v2951; GFX8-NEXT: s_brev_b32 s4, -2952; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v2953; GFX8-NEXT: s_setpc_b64 s[30:31]954;955; GFX9-LABEL: v_copysign_f64_bf16:956; GFX9: ; %bb.0:957; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)958; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v2959; GFX9-NEXT: s_brev_b32 s4, -2960; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v2961; GFX9-NEXT: s_setpc_b64 s[30:31]962;963; GFX10-LABEL: v_copysign_f64_bf16:964; GFX10: ; %bb.0:965; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)966; GFX10-NEXT: v_lshlrev_b32_e32 v2, 16, v2967; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v2968; GFX10-NEXT: s_setpc_b64 s[30:31]969;970; GFX11TRUE16-LABEL: v_copysign_f64_bf16:971; GFX11TRUE16: ; %bb.0:972; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)973; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.h, v2.l974; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)975; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v2976; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]977;978; GFX11FAKE16-LABEL: v_copysign_f64_bf16:979; GFX11FAKE16: ; %bb.0:980; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)981; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v2, 16, v2982; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)983; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v2984; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]985 %sign = fpext bfloat %sign.bf16 to double986 %op = call double @llvm.copysign.f64(double %mag, double %sign)987 ret double %op988}989 990define amdgpu_ps <2 x i32> @s_copysign_f64_bf16(double inreg %mag, bfloat inreg %sign.bf16) {991; GCN-LABEL: s_copysign_f64_bf16:992; GCN: ; %bb.0:993; GCN-NEXT: s_brev_b32 s3, -2994; GCN-NEXT: v_mov_b32_e32 v0, s1995; GCN-NEXT: v_mov_b32_e32 v1, s2996; GCN-NEXT: v_bfi_b32 v0, s3, v0, v1997; GCN-NEXT: v_readfirstlane_b32 s1, v0998; GCN-NEXT: ; return to shader part epilog999;1000; GFX7-LABEL: s_copysign_f64_bf16:1001; GFX7: ; %bb.0:1002; GFX7-NEXT: s_brev_b32 s3, -21003; GFX7-NEXT: v_mov_b32_e32 v0, s11004; GFX7-NEXT: v_mov_b32_e32 v1, s21005; GFX7-NEXT: v_bfi_b32 v0, s3, v0, v11006; GFX7-NEXT: v_readfirstlane_b32 s1, v01007; GFX7-NEXT: ; return to shader part epilog1008;1009; GFX8-LABEL: s_copysign_f64_bf16:1010; GFX8: ; %bb.0:1011; GFX8-NEXT: v_lshlrev_b32_e64 v0, 16, s21012; GFX8-NEXT: s_brev_b32 s2, -21013; GFX8-NEXT: v_mov_b32_e32 v1, s11014; GFX8-NEXT: v_bfi_b32 v0, s2, v1, v01015; GFX8-NEXT: v_readfirstlane_b32 s1, v01016; GFX8-NEXT: ; return to shader part epilog1017;1018; GFX9-LABEL: s_copysign_f64_bf16:1019; GFX9: ; %bb.0:1020; GFX9-NEXT: v_lshlrev_b32_e64 v0, 16, s21021; GFX9-NEXT: s_brev_b32 s2, -21022; GFX9-NEXT: v_mov_b32_e32 v1, s11023; GFX9-NEXT: v_bfi_b32 v0, s2, v1, v01024; GFX9-NEXT: v_readfirstlane_b32 s1, v01025; GFX9-NEXT: ; return to shader part epilog1026;1027; GFX10-LABEL: s_copysign_f64_bf16:1028; GFX10: ; %bb.0:1029; GFX10-NEXT: v_lshlrev_b32_e64 v0, 16, s21030; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v01031; GFX10-NEXT: v_readfirstlane_b32 s1, v01032; GFX10-NEXT: ; return to shader part epilog1033;1034; GFX11TRUE16-LABEL: s_copysign_f64_bf16:1035; GFX11TRUE16: ; %bb.0:1036; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.h, s21037; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1038; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v01039; GFX11TRUE16-NEXT: v_readfirstlane_b32 s1, v01040; GFX11TRUE16-NEXT: ; return to shader part epilog1041;1042; GFX11FAKE16-LABEL: s_copysign_f64_bf16:1043; GFX11FAKE16: ; %bb.0:1044; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v0, 16, s21045; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1046; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v01047; GFX11FAKE16-NEXT: v_readfirstlane_b32 s1, v01048; GFX11FAKE16-NEXT: ; return to shader part epilog1049 %sign = fpext bfloat %sign.bf16 to double1050 %op = call double @llvm.copysign.f64(double %mag, double %sign)1051 %cast = bitcast double %op to <2 x i32>1052 %cast.0 = extractelement <2 x i32> %cast, i32 01053 %cast.1 = extractelement <2 x i32> %cast, i32 11054 %readlane0 = call i32 @llvm.amdgcn.readfirstlane(i32 %cast.0)1055 %readlane1 = call i32 @llvm.amdgcn.readfirstlane(i32 %cast.1)1056 %ins.0 = insertelement <2 x i32> poison, i32 %readlane0, i32 01057 %ins.1 = insertelement <2 x i32> %ins.0, i32 %readlane1, i32 11058 ret <2 x i32> %ins.11059}1060 1061define amdgpu_ps i32 @s_copysign_v2bf16(<2 x bfloat> inreg %arg_mag, <2 x bfloat> inreg %arg_sign) {1062; GCN-LABEL: s_copysign_v2bf16:1063; GCN: ; %bb.0:1064; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s31065; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s21066; GCN-NEXT: v_mul_f32_e64 v2, 1.0, s11067; GCN-NEXT: v_mul_f32_e64 v3, 1.0, s01068; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v01069; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v11070; GCN-NEXT: v_bfe_u32 v3, v3, 16, 151071; GCN-NEXT: v_bfe_u32 v2, v2, 16, 151072; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v11073; GCN-NEXT: v_and_b32_e32 v0, 0x8000, v01074; GCN-NEXT: v_or_b32_e32 v1, v3, v11075; GCN-NEXT: v_or_b32_e32 v0, v2, v01076; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v01077; GCN-NEXT: v_or_b32_e32 v0, v1, v01078; GCN-NEXT: v_readfirstlane_b32 s0, v01079; GCN-NEXT: ; return to shader part epilog1080;1081; GFX7-LABEL: s_copysign_v2bf16:1082; GFX7: ; %bb.0:1083; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s31084; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v01085; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s21086; GFX7-NEXT: v_mul_f32_e64 v2, 1.0, s11087; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v11088; GFX7-NEXT: v_mul_f32_e64 v3, 1.0, s01089; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v01090; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 151091; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v11092; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 151093; GFX7-NEXT: v_or_b32_e32 v0, v2, v01094; GFX7-NEXT: v_or_b32_e32 v1, v3, v11095; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v01096; GFX7-NEXT: v_or_b32_e32 v0, v1, v01097; GFX7-NEXT: v_readfirstlane_b32 s0, v01098; GFX7-NEXT: ; return to shader part epilog1099;1100; GFX8-LABEL: s_copysign_v2bf16:1101; GFX8: ; %bb.0:1102; GFX8-NEXT: s_mov_b32 s2, 0x7fff7fff1103; GFX8-NEXT: v_mov_b32_e32 v0, s01104; GFX8-NEXT: v_mov_b32_e32 v1, s11105; GFX8-NEXT: v_bfi_b32 v0, s2, v0, v11106; GFX8-NEXT: v_readfirstlane_b32 s0, v01107; GFX8-NEXT: ; return to shader part epilog1108;1109; GFX9-LABEL: s_copysign_v2bf16:1110; GFX9: ; %bb.0:1111; GFX9-NEXT: s_mov_b32 s2, 0x7fff7fff1112; GFX9-NEXT: v_mov_b32_e32 v0, s01113; GFX9-NEXT: v_mov_b32_e32 v1, s11114; GFX9-NEXT: v_bfi_b32 v0, s2, v0, v11115; GFX9-NEXT: v_readfirstlane_b32 s0, v01116; GFX9-NEXT: ; return to shader part epilog1117;1118; GFX10-LABEL: s_copysign_v2bf16:1119; GFX10: ; %bb.0:1120; GFX10-NEXT: v_mov_b32_e32 v0, s11121; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01122; GFX10-NEXT: v_readfirstlane_b32 s0, v01123; GFX10-NEXT: ; return to shader part epilog1124;1125; GFX11-LABEL: s_copysign_v2bf16:1126; GFX11: ; %bb.0:1127; GFX11-NEXT: v_mov_b32_e32 v0, s11128; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)1129; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01130; GFX11-NEXT: v_readfirstlane_b32 s0, v01131; GFX11-NEXT: ; return to shader part epilog1132 %out = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %arg_mag, <2 x bfloat> %arg_sign)1133 %cast = bitcast <2 x bfloat> %out to i321134 ret i32 %cast1135}1136 1137define amdgpu_ps <3 x i16> @s_copysign_v3bf16(<3 x bfloat> inreg %arg_mag, <3 x bfloat> inreg %arg_sign) {1138; GCN-LABEL: s_copysign_v3bf16:1139; GCN: ; %bb.0:1140; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s31141; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s41142; GCN-NEXT: v_mul_f32_e64 v2, 1.0, s51143; GCN-NEXT: v_mul_f32_e64 v3, 1.0, s01144; GCN-NEXT: v_mul_f32_e64 v4, 1.0, s11145; GCN-NEXT: v_mul_f32_e64 v5, 1.0, s21146; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v01147; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v11148; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v21149; GCN-NEXT: v_bfe_u32 v5, v5, 16, 151150; GCN-NEXT: v_bfe_u32 v4, v4, 16, 151151; GCN-NEXT: v_bfe_u32 v3, v3, 16, 151152; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v21153; GCN-NEXT: v_and_b32_e32 v6, 0x8000, v11154; GCN-NEXT: v_and_b32_e32 v0, 0x8000, v01155; GCN-NEXT: v_or_b32_e32 v1, v5, v21156; GCN-NEXT: v_or_b32_e32 v2, v4, v61157; GCN-NEXT: v_or_b32_e32 v3, v3, v01158; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v21159; GCN-NEXT: v_or_b32_e32 v4, v3, v01160; GCN-NEXT: v_lshr_b64 v[2:3], v[0:1], 161161; GCN-NEXT: v_readfirstlane_b32 s0, v41162; GCN-NEXT: v_readfirstlane_b32 s1, v21163; GCN-NEXT: v_readfirstlane_b32 s2, v11164; GCN-NEXT: ; return to shader part epilog1165;1166; GFX7-LABEL: s_copysign_v3bf16:1167; GFX7: ; %bb.0:1168; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s31169; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v01170; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s41171; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v01172; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s51173; GFX7-NEXT: v_mul_f32_e64 v4, 1.0, s11174; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v11175; GFX7-NEXT: v_mul_f32_e64 v3, 1.0, s01176; GFX7-NEXT: v_mul_f32_e64 v5, 1.0, s21177; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v01178; GFX7-NEXT: v_bfe_u32 v4, v4, 16, 151179; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v11180; GFX7-NEXT: v_bfe_u32 v5, v5, 16, 151181; GFX7-NEXT: v_or_b32_e32 v0, v4, v01182; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v21183; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 151184; GFX7-NEXT: v_or_b32_e32 v1, v5, v11185; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v01186; GFX7-NEXT: v_or_b32_e32 v2, v3, v21187; GFX7-NEXT: v_or_b32_e32 v4, v2, v01188; GFX7-NEXT: v_lshr_b64 v[2:3], v[0:1], 161189; GFX7-NEXT: v_readfirstlane_b32 s0, v41190; GFX7-NEXT: v_readfirstlane_b32 s1, v21191; GFX7-NEXT: v_readfirstlane_b32 s2, v11192; GFX7-NEXT: ; return to shader part epilog1193;1194; GFX8-LABEL: s_copysign_v3bf16:1195; GFX8: ; %bb.0:1196; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff1197; GFX8-NEXT: v_mov_b32_e32 v0, s11198; GFX8-NEXT: v_mov_b32_e32 v1, s31199; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v11200; GFX8-NEXT: v_mov_b32_e32 v1, s01201; GFX8-NEXT: v_mov_b32_e32 v2, s21202; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v21203; GFX8-NEXT: v_readfirstlane_b32 s0, v11204; GFX8-NEXT: v_readfirstlane_b32 s1, v01205; GFX8-NEXT: ; return to shader part epilog1206;1207; GFX9-LABEL: s_copysign_v3bf16:1208; GFX9: ; %bb.0:1209; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff1210; GFX9-NEXT: v_mov_b32_e32 v0, s11211; GFX9-NEXT: v_mov_b32_e32 v1, s31212; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v11213; GFX9-NEXT: v_mov_b32_e32 v1, s01214; GFX9-NEXT: v_mov_b32_e32 v2, s21215; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v21216; GFX9-NEXT: v_readfirstlane_b32 s0, v11217; GFX9-NEXT: v_readfirstlane_b32 s1, v01218; GFX9-NEXT: ; return to shader part epilog1219;1220; GFX10-LABEL: s_copysign_v3bf16:1221; GFX10: ; %bb.0:1222; GFX10-NEXT: v_mov_b32_e32 v0, s21223; GFX10-NEXT: v_mov_b32_e32 v1, s31224; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01225; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, s1, v11226; GFX10-NEXT: v_readfirstlane_b32 s0, v01227; GFX10-NEXT: v_readfirstlane_b32 s1, v11228; GFX10-NEXT: ; return to shader part epilog1229;1230; GFX11-LABEL: s_copysign_v3bf16:1231; GFX11: ; %bb.0:1232; GFX11-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s31233; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)1234; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01235; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, s1, v11236; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1237; GFX11-NEXT: v_readfirstlane_b32 s0, v01238; GFX11-NEXT: v_readfirstlane_b32 s1, v11239; GFX11-NEXT: ; return to shader part epilog1240 %out = call <3 x bfloat> @llvm.copysign.v3bf16(<3 x bfloat> %arg_mag, <3 x bfloat> %arg_sign)1241 %cast = bitcast <3 x bfloat> %out to <3 x i16>1242 ret <3 x i16> %cast1243}1244 1245define amdgpu_ps <2 x i32> @s_copysign_v4bf16(<4 x bfloat> inreg %arg_mag, <4 x bfloat> inreg %arg_sign) {1246; GCN-LABEL: s_copysign_v4bf16:1247; GCN: ; %bb.0:1248; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s51249; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s41250; GCN-NEXT: v_mul_f32_e64 v2, 1.0, s71251; GCN-NEXT: v_mul_f32_e64 v3, 1.0, s61252; GCN-NEXT: v_mul_f32_e64 v4, 1.0, s11253; GCN-NEXT: v_mul_f32_e64 v5, 1.0, s01254; GCN-NEXT: v_mul_f32_e64 v6, 1.0, s31255; GCN-NEXT: v_mul_f32_e64 v7, 1.0, s21256; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v01257; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v11258; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v21259; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v31260; GCN-NEXT: v_bfe_u32 v7, v7, 16, 151261; GCN-NEXT: v_bfe_u32 v6, v6, 16, 151262; GCN-NEXT: v_bfe_u32 v5, v5, 16, 151263; GCN-NEXT: v_bfe_u32 v4, v4, 16, 151264; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v31265; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v21266; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v11267; GCN-NEXT: v_and_b32_e32 v0, 0x8000, v01268; GCN-NEXT: v_or_b32_e32 v3, v7, v31269; GCN-NEXT: v_or_b32_e32 v2, v6, v21270; GCN-NEXT: v_or_b32_e32 v1, v5, v11271; GCN-NEXT: v_or_b32_e32 v0, v4, v01272; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v21273; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v01274; GCN-NEXT: v_or_b32_e32 v2, v3, v21275; GCN-NEXT: v_or_b32_e32 v0, v1, v01276; GCN-NEXT: v_readfirstlane_b32 s0, v01277; GCN-NEXT: v_readfirstlane_b32 s1, v21278; GCN-NEXT: ; return to shader part epilog1279;1280; GFX7-LABEL: s_copysign_v4bf16:1281; GFX7: ; %bb.0:1282; GFX7-NEXT: v_mul_f32_e64 v2, 1.0, s71283; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v21284; GFX7-NEXT: v_mul_f32_e64 v3, 1.0, s61285; GFX7-NEXT: v_mul_f32_e64 v6, 1.0, s31286; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v31287; GFX7-NEXT: v_mul_f32_e64 v7, 1.0, s21288; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v21289; GFX7-NEXT: v_bfe_u32 v6, v6, 16, 151290; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s41291; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v31292; GFX7-NEXT: v_bfe_u32 v7, v7, 16, 151293; GFX7-NEXT: v_or_b32_e32 v2, v6, v21294; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s51295; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v11296; GFX7-NEXT: v_mul_f32_e64 v5, 1.0, s01297; GFX7-NEXT: v_or_b32_e32 v3, v7, v31298; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v21299; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v01300; GFX7-NEXT: v_mul_f32_e64 v4, 1.0, s11301; GFX7-NEXT: v_or_b32_e32 v2, v3, v21302; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v11303; GFX7-NEXT: v_bfe_u32 v3, v5, 16, 151304; GFX7-NEXT: v_or_b32_e32 v1, v3, v11305; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v01306; GFX7-NEXT: v_bfe_u32 v3, v4, 16, 151307; GFX7-NEXT: v_or_b32_e32 v0, v3, v01308; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v01309; GFX7-NEXT: v_or_b32_e32 v0, v1, v01310; GFX7-NEXT: v_readfirstlane_b32 s0, v01311; GFX7-NEXT: v_readfirstlane_b32 s1, v21312; GFX7-NEXT: ; return to shader part epilog1313;1314; GFX8-LABEL: s_copysign_v4bf16:1315; GFX8: ; %bb.0:1316; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff1317; GFX8-NEXT: v_mov_b32_e32 v0, s11318; GFX8-NEXT: v_mov_b32_e32 v1, s31319; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v11320; GFX8-NEXT: v_mov_b32_e32 v1, s01321; GFX8-NEXT: v_mov_b32_e32 v2, s21322; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v21323; GFX8-NEXT: v_readfirstlane_b32 s0, v11324; GFX8-NEXT: v_readfirstlane_b32 s1, v01325; GFX8-NEXT: ; return to shader part epilog1326;1327; GFX9-LABEL: s_copysign_v4bf16:1328; GFX9: ; %bb.0:1329; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff1330; GFX9-NEXT: v_mov_b32_e32 v0, s11331; GFX9-NEXT: v_mov_b32_e32 v1, s31332; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v11333; GFX9-NEXT: v_mov_b32_e32 v1, s01334; GFX9-NEXT: v_mov_b32_e32 v2, s21335; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v21336; GFX9-NEXT: v_readfirstlane_b32 s0, v11337; GFX9-NEXT: v_readfirstlane_b32 s1, v01338; GFX9-NEXT: ; return to shader part epilog1339;1340; GFX10-LABEL: s_copysign_v4bf16:1341; GFX10: ; %bb.0:1342; GFX10-NEXT: v_mov_b32_e32 v0, s21343; GFX10-NEXT: v_mov_b32_e32 v1, s31344; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01345; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, s1, v11346; GFX10-NEXT: v_readfirstlane_b32 s0, v01347; GFX10-NEXT: v_readfirstlane_b32 s1, v11348; GFX10-NEXT: ; return to shader part epilog1349;1350; GFX11-LABEL: s_copysign_v4bf16:1351; GFX11: ; %bb.0:1352; GFX11-NEXT: v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s31353; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)1354; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01355; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, s1, v11356; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)1357; GFX11-NEXT: v_readfirstlane_b32 s0, v01358; GFX11-NEXT: v_readfirstlane_b32 s1, v11359; GFX11-NEXT: ; return to shader part epilog1360 %out = call <4 x bfloat> @llvm.copysign.v4bf16(<4 x bfloat> %arg_mag, <4 x bfloat> %arg_sign)1361 %cast = bitcast <4 x bfloat> %out to <2 x i32>1362 ret <2 x i32> %cast1363}1364 1365define amdgpu_ps <4 x i32> @s_copysign_v8bf16(<8 x bfloat> inreg %arg_mag, <8 x bfloat> inreg %arg_sign) {1366; GCN-LABEL: s_copysign_v8bf16:1367; GCN: ; %bb.0:1368; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s91369; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s81370; GCN-NEXT: v_mul_f32_e64 v2, 1.0, s111371; GCN-NEXT: v_mul_f32_e64 v3, 1.0, s101372; GCN-NEXT: v_mul_f32_e64 v4, 1.0, s131373; GCN-NEXT: v_mul_f32_e64 v5, 1.0, s121374; GCN-NEXT: v_mul_f32_e64 v6, 1.0, s151375; GCN-NEXT: v_mul_f32_e64 v7, 1.0, s141376; GCN-NEXT: v_mul_f32_e64 v8, 1.0, s11377; GCN-NEXT: v_mul_f32_e64 v9, 1.0, s01378; GCN-NEXT: v_mul_f32_e64 v10, 1.0, s31379; GCN-NEXT: v_mul_f32_e64 v11, 1.0, s21380; GCN-NEXT: v_mul_f32_e64 v12, 1.0, s51381; GCN-NEXT: v_mul_f32_e64 v13, 1.0, s41382; GCN-NEXT: v_mul_f32_e64 v14, 1.0, s71383; GCN-NEXT: v_mul_f32_e64 v15, 1.0, s61384; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v01385; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v11386; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v21387; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v31388; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v41389; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v51390; GCN-NEXT: v_lshrrev_b32_e32 v6, 16, v61391; GCN-NEXT: v_lshrrev_b32_e32 v7, 16, v71392; GCN-NEXT: v_bfe_u32 v15, v15, 16, 151393; GCN-NEXT: v_bfe_u32 v14, v14, 16, 151394; GCN-NEXT: v_bfe_u32 v13, v13, 16, 151395; GCN-NEXT: v_bfe_u32 v12, v12, 16, 151396; GCN-NEXT: v_bfe_u32 v11, v11, 16, 151397; GCN-NEXT: v_bfe_u32 v10, v10, 16, 151398; GCN-NEXT: v_bfe_u32 v9, v9, 16, 151399; GCN-NEXT: v_bfe_u32 v8, v8, 16, 151400; GCN-NEXT: v_and_b32_e32 v7, 0x8000, v71401; GCN-NEXT: v_and_b32_e32 v6, 0x8000, v61402; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v51403; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v41404; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v31405; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v21406; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v11407; GCN-NEXT: v_and_b32_e32 v0, 0x8000, v01408; GCN-NEXT: v_or_b32_e32 v7, v15, v71409; GCN-NEXT: v_or_b32_e32 v6, v14, v61410; GCN-NEXT: v_or_b32_e32 v5, v13, v51411; GCN-NEXT: v_or_b32_e32 v4, v12, v41412; GCN-NEXT: v_or_b32_e32 v3, v11, v31413; GCN-NEXT: v_or_b32_e32 v2, v10, v21414; GCN-NEXT: v_or_b32_e32 v1, v9, v11415; GCN-NEXT: v_or_b32_e32 v0, v8, v01416; GCN-NEXT: v_lshlrev_b32_e32 v6, 16, v61417; GCN-NEXT: v_lshlrev_b32_e32 v4, 16, v41418; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v21419; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v01420; GCN-NEXT: v_or_b32_e32 v6, v7, v61421; GCN-NEXT: v_or_b32_e32 v4, v5, v41422; GCN-NEXT: v_or_b32_e32 v2, v3, v21423; GCN-NEXT: v_or_b32_e32 v0, v1, v01424; GCN-NEXT: v_readfirstlane_b32 s0, v01425; GCN-NEXT: v_readfirstlane_b32 s1, v21426; GCN-NEXT: v_readfirstlane_b32 s2, v41427; GCN-NEXT: v_readfirstlane_b32 s3, v61428; GCN-NEXT: ; return to shader part epilog1429;1430; GFX7-LABEL: s_copysign_v8bf16:1431; GFX7: ; %bb.0:1432; GFX7-NEXT: v_mul_f32_e64 v6, 1.0, s151433; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v61434; GFX7-NEXT: v_mul_f32_e64 v7, 1.0, s141435; GFX7-NEXT: v_mul_f32_e64 v14, 1.0, s71436; GFX7-NEXT: v_lshrrev_b32_e32 v7, 16, v71437; GFX7-NEXT: v_mul_f32_e64 v15, 1.0, s61438; GFX7-NEXT: v_and_b32_e32 v6, 0x8000, v61439; GFX7-NEXT: v_bfe_u32 v14, v14, 16, 151440; GFX7-NEXT: v_mul_f32_e64 v5, 1.0, s121441; GFX7-NEXT: v_and_b32_e32 v7, 0x8000, v71442; GFX7-NEXT: v_bfe_u32 v15, v15, 16, 151443; GFX7-NEXT: v_or_b32_e32 v6, v14, v61444; GFX7-NEXT: v_mul_f32_e64 v4, 1.0, s131445; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v51446; GFX7-NEXT: v_mul_f32_e64 v13, 1.0, s41447; GFX7-NEXT: v_or_b32_e32 v7, v15, v71448; GFX7-NEXT: v_lshlrev_b32_e32 v6, 16, v61449; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v41450; GFX7-NEXT: v_mul_f32_e64 v12, 1.0, s51451; GFX7-NEXT: v_or_b32_e32 v6, v7, v61452; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v51453; GFX7-NEXT: v_bfe_u32 v7, v13, 16, 151454; GFX7-NEXT: v_or_b32_e32 v5, v7, v51455; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v41456; GFX7-NEXT: v_bfe_u32 v7, v12, 16, 151457; GFX7-NEXT: v_mul_f32_e64 v3, 1.0, s101458; GFX7-NEXT: v_or_b32_e32 v4, v7, v41459; GFX7-NEXT: v_mul_f32_e64 v2, 1.0, s111460; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v31461; GFX7-NEXT: v_mul_f32_e64 v11, 1.0, s21462; GFX7-NEXT: v_lshlrev_b32_e32 v4, 16, v41463; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v21464; GFX7-NEXT: v_mul_f32_e64 v10, 1.0, s31465; GFX7-NEXT: v_or_b32_e32 v4, v5, v41466; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v31467; GFX7-NEXT: v_bfe_u32 v5, v11, 16, 151468; GFX7-NEXT: v_or_b32_e32 v3, v5, v31469; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v21470; GFX7-NEXT: v_bfe_u32 v5, v10, 16, 151471; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s81472; GFX7-NEXT: v_or_b32_e32 v2, v5, v21473; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s91474; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v11475; GFX7-NEXT: v_mul_f32_e64 v9, 1.0, s01476; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v21477; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v01478; GFX7-NEXT: v_mul_f32_e64 v8, 1.0, s11479; GFX7-NEXT: v_or_b32_e32 v2, v3, v21480; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v11481; GFX7-NEXT: v_bfe_u32 v3, v9, 16, 151482; GFX7-NEXT: v_or_b32_e32 v1, v3, v11483; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v01484; GFX7-NEXT: v_bfe_u32 v3, v8, 16, 151485; GFX7-NEXT: v_or_b32_e32 v0, v3, v01486; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v01487; GFX7-NEXT: v_or_b32_e32 v0, v1, v01488; GFX7-NEXT: v_readfirstlane_b32 s0, v01489; GFX7-NEXT: v_readfirstlane_b32 s1, v21490; GFX7-NEXT: v_readfirstlane_b32 s2, v41491; GFX7-NEXT: v_readfirstlane_b32 s3, v61492; GFX7-NEXT: ; return to shader part epilog1493;1494; GFX8-LABEL: s_copysign_v8bf16:1495; GFX8: ; %bb.0:1496; GFX8-NEXT: s_mov_b32 s8, 0x7fff7fff1497; GFX8-NEXT: v_mov_b32_e32 v0, s31498; GFX8-NEXT: v_mov_b32_e32 v1, s71499; GFX8-NEXT: v_bfi_b32 v0, s8, v0, v11500; GFX8-NEXT: v_mov_b32_e32 v1, s21501; GFX8-NEXT: v_mov_b32_e32 v2, s61502; GFX8-NEXT: v_bfi_b32 v1, s8, v1, v21503; GFX8-NEXT: v_mov_b32_e32 v2, s11504; GFX8-NEXT: v_mov_b32_e32 v3, s51505; GFX8-NEXT: v_bfi_b32 v2, s8, v2, v31506; GFX8-NEXT: v_mov_b32_e32 v3, s01507; GFX8-NEXT: v_mov_b32_e32 v4, s41508; GFX8-NEXT: v_bfi_b32 v3, s8, v3, v41509; GFX8-NEXT: v_readfirstlane_b32 s0, v31510; GFX8-NEXT: v_readfirstlane_b32 s1, v21511; GFX8-NEXT: v_readfirstlane_b32 s2, v11512; GFX8-NEXT: v_readfirstlane_b32 s3, v01513; GFX8-NEXT: ; return to shader part epilog1514;1515; GFX9-LABEL: s_copysign_v8bf16:1516; GFX9: ; %bb.0:1517; GFX9-NEXT: s_mov_b32 s8, 0x7fff7fff1518; GFX9-NEXT: v_mov_b32_e32 v0, s31519; GFX9-NEXT: v_mov_b32_e32 v1, s71520; GFX9-NEXT: v_bfi_b32 v0, s8, v0, v11521; GFX9-NEXT: v_mov_b32_e32 v1, s21522; GFX9-NEXT: v_mov_b32_e32 v2, s61523; GFX9-NEXT: v_bfi_b32 v1, s8, v1, v21524; GFX9-NEXT: v_mov_b32_e32 v2, s11525; GFX9-NEXT: v_mov_b32_e32 v3, s51526; GFX9-NEXT: v_bfi_b32 v2, s8, v2, v31527; GFX9-NEXT: v_mov_b32_e32 v3, s01528; GFX9-NEXT: v_mov_b32_e32 v4, s41529; GFX9-NEXT: v_bfi_b32 v3, s8, v3, v41530; GFX9-NEXT: v_readfirstlane_b32 s0, v31531; GFX9-NEXT: v_readfirstlane_b32 s1, v21532; GFX9-NEXT: v_readfirstlane_b32 s2, v11533; GFX9-NEXT: v_readfirstlane_b32 s3, v01534; GFX9-NEXT: ; return to shader part epilog1535;1536; GFX10-LABEL: s_copysign_v8bf16:1537; GFX10: ; %bb.0:1538; GFX10-NEXT: v_mov_b32_e32 v0, s41539; GFX10-NEXT: v_mov_b32_e32 v1, s51540; GFX10-NEXT: v_mov_b32_e32 v2, s61541; GFX10-NEXT: v_mov_b32_e32 v3, s71542; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01543; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, s1, v11544; GFX10-NEXT: v_bfi_b32 v2, 0x7fff7fff, s2, v21545; GFX10-NEXT: v_bfi_b32 v3, 0x7fff7fff, s3, v31546; GFX10-NEXT: v_readfirstlane_b32 s0, v01547; GFX10-NEXT: v_readfirstlane_b32 s1, v11548; GFX10-NEXT: v_readfirstlane_b32 s2, v21549; GFX10-NEXT: v_readfirstlane_b32 s3, v31550; GFX10-NEXT: ; return to shader part epilog1551;1552; GFX11-LABEL: s_copysign_v8bf16:1553; GFX11: ; %bb.0:1554; GFX11-NEXT: v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v1, s51555; GFX11-NEXT: v_dual_mov_b32 v2, s6 :: v_dual_mov_b32 v3, s71556; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_3)1557; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v01558; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, s1, v11559; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_4)1560; GFX11-NEXT: v_bfi_b32 v2, 0x7fff7fff, s2, v21561; GFX11-NEXT: v_bfi_b32 v3, 0x7fff7fff, s3, v31562; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)1563; GFX11-NEXT: v_readfirstlane_b32 s0, v01564; GFX11-NEXT: v_readfirstlane_b32 s1, v11565; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)1566; GFX11-NEXT: v_readfirstlane_b32 s2, v21567; GFX11-NEXT: v_readfirstlane_b32 s3, v31568; GFX11-NEXT: ; return to shader part epilog1569 %out = call <8 x bfloat> @llvm.copysign.v8bf16(<8 x bfloat> %arg_mag, <8 x bfloat> %arg_sign)1570 %cast = bitcast <8 x bfloat> %out to <4 x i32>1571 ret <4 x i32> %cast1572}1573 1574define amdgpu_ps <8 x i32> @s_copysign_v16bf16(<16 x bfloat> inreg %arg_mag, <16 x bfloat> inreg %arg_sign) {1575; GCN-LABEL: s_copysign_v16bf16:1576; GCN: ; %bb.0:1577; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s171578; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s161579; GCN-NEXT: v_mul_f32_e64 v2, 1.0, s191580; GCN-NEXT: v_mul_f32_e64 v3, 1.0, s181581; GCN-NEXT: v_mul_f32_e64 v4, 1.0, s211582; GCN-NEXT: v_mul_f32_e64 v5, 1.0, s201583; GCN-NEXT: v_mul_f32_e64 v6, 1.0, s231584; GCN-NEXT: v_mul_f32_e64 v7, 1.0, s221585; GCN-NEXT: v_mul_f32_e64 v8, 1.0, s251586; GCN-NEXT: v_mul_f32_e64 v9, 1.0, s241587; GCN-NEXT: v_mul_f32_e64 v10, 1.0, s271588; GCN-NEXT: v_mul_f32_e64 v11, 1.0, s261589; GCN-NEXT: v_mul_f32_e64 v12, 1.0, s291590; GCN-NEXT: v_mul_f32_e64 v13, 1.0, s281591; GCN-NEXT: v_mul_f32_e64 v14, 1.0, s311592; GCN-NEXT: v_mul_f32_e64 v15, 1.0, s301593; GCN-NEXT: v_mul_f32_e64 v16, 1.0, s11594; GCN-NEXT: v_mul_f32_e64 v17, 1.0, s01595; GCN-NEXT: v_mul_f32_e64 v18, 1.0, s31596; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s141597; GCN-NEXT: v_lshrrev_b32_e32 v15, 16, v151598; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151599; GCN-NEXT: v_and_b32_e32 v15, 0x8000, v151600; GCN-NEXT: v_or_b32_e32 v15, v19, v151601; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s151602; GCN-NEXT: v_lshrrev_b32_e32 v14, 16, v141603; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151604; GCN-NEXT: v_and_b32_e32 v14, 0x8000, v141605; GCN-NEXT: v_or_b32_e32 v14, v19, v141606; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s121607; GCN-NEXT: v_lshrrev_b32_e32 v13, 16, v131608; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151609; GCN-NEXT: v_and_b32_e32 v13, 0x8000, v131610; GCN-NEXT: v_or_b32_e32 v13, v19, v131611; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s131612; GCN-NEXT: v_lshrrev_b32_e32 v12, 16, v121613; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151614; GCN-NEXT: v_and_b32_e32 v12, 0x8000, v121615; GCN-NEXT: v_or_b32_e32 v12, v19, v121616; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s101617; GCN-NEXT: v_lshrrev_b32_e32 v11, 16, v111618; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151619; GCN-NEXT: v_and_b32_e32 v11, 0x8000, v111620; GCN-NEXT: v_or_b32_e32 v11, v19, v111621; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s111622; GCN-NEXT: v_lshrrev_b32_e32 v10, 16, v101623; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151624; GCN-NEXT: v_and_b32_e32 v10, 0x8000, v101625; GCN-NEXT: v_or_b32_e32 v10, v19, v101626; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s81627; GCN-NEXT: v_lshrrev_b32_e32 v9, 16, v91628; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151629; GCN-NEXT: v_and_b32_e32 v9, 0x8000, v91630; GCN-NEXT: v_or_b32_e32 v9, v19, v91631; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s91632; GCN-NEXT: v_lshrrev_b32_e32 v8, 16, v81633; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151634; GCN-NEXT: v_and_b32_e32 v8, 0x8000, v81635; GCN-NEXT: v_or_b32_e32 v8, v19, v81636; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s61637; GCN-NEXT: v_lshrrev_b32_e32 v7, 16, v71638; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151639; GCN-NEXT: v_and_b32_e32 v7, 0x8000, v71640; GCN-NEXT: v_or_b32_e32 v7, v19, v71641; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s71642; GCN-NEXT: v_lshrrev_b32_e32 v6, 16, v61643; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151644; GCN-NEXT: v_and_b32_e32 v6, 0x8000, v61645; GCN-NEXT: v_or_b32_e32 v6, v19, v61646; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s41647; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v51648; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151649; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v51650; GCN-NEXT: v_or_b32_e32 v5, v19, v51651; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s51652; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v41653; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151654; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v41655; GCN-NEXT: v_or_b32_e32 v4, v19, v41656; GCN-NEXT: v_mul_f32_e64 v19, 1.0, s21657; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v01658; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v11659; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v21660; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v31661; GCN-NEXT: v_bfe_u32 v19, v19, 16, 151662; GCN-NEXT: v_bfe_u32 v18, v18, 16, 151663; GCN-NEXT: v_bfe_u32 v17, v17, 16, 151664; GCN-NEXT: v_bfe_u32 v16, v16, 16, 151665; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v31666; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v21667; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v11668; GCN-NEXT: v_and_b32_e32 v0, 0x8000, v01669; GCN-NEXT: v_or_b32_e32 v3, v19, v31670; GCN-NEXT: v_or_b32_e32 v2, v18, v21671; GCN-NEXT: v_or_b32_e32 v1, v17, v11672; GCN-NEXT: v_or_b32_e32 v0, v16, v01673; GCN-NEXT: v_lshlrev_b32_e32 v14, 16, v141674; GCN-NEXT: v_lshlrev_b32_e32 v12, 16, v121675; GCN-NEXT: v_lshlrev_b32_e32 v10, 16, v101676; GCN-NEXT: v_lshlrev_b32_e32 v8, 16, v81677; GCN-NEXT: v_lshlrev_b32_e32 v6, 16, v61678; GCN-NEXT: v_lshlrev_b32_e32 v4, 16, v41679; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v21680; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v01681; GCN-NEXT: v_or_b32_e32 v14, v15, v141682; GCN-NEXT: v_or_b32_e32 v12, v13, v121683; GCN-NEXT: v_or_b32_e32 v10, v11, v101684; GCN-NEXT: v_or_b32_e32 v8, v9, v81685; GCN-NEXT: v_or_b32_e32 v6, v7, v61686; GCN-NEXT: v_or_b32_e32 v4, v5, v41687; GCN-NEXT: v_or_b32_e32 v2, v3, v21688; GCN-NEXT: v_or_b32_e32 v0, v1, v01689; GCN-NEXT: v_readfirstlane_b32 s0, v01690; GCN-NEXT: v_readfirstlane_b32 s1, v21691; GCN-NEXT: v_readfirstlane_b32 s2, v41692; GCN-NEXT: v_readfirstlane_b32 s3, v61693; GCN-NEXT: v_readfirstlane_b32 s4, v81694; GCN-NEXT: v_readfirstlane_b32 s5, v101695; GCN-NEXT: v_readfirstlane_b32 s6, v121696; GCN-NEXT: v_readfirstlane_b32 s7, v141697; GCN-NEXT: ; return to shader part epilog1698;1699; GFX7-LABEL: s_copysign_v16bf16:1700; GFX7: ; %bb.0:1701; GFX7-NEXT: v_mul_f32_e64 v15, 1.0, s301702; GFX7-NEXT: v_lshrrev_b32_e32 v15, 16, v151703; GFX7-NEXT: v_mul_f32_e64 v19, 1.0, s141704; GFX7-NEXT: v_mul_f32_e64 v14, 1.0, s311705; GFX7-NEXT: v_and_b32_e32 v15, 0x8000, v151706; GFX7-NEXT: v_bfe_u32 v19, v19, 16, 151707; GFX7-NEXT: v_lshrrev_b32_e32 v14, 16, v141708; GFX7-NEXT: v_or_b32_e32 v15, v19, v151709; GFX7-NEXT: v_mul_f32_e64 v19, 1.0, s151710; GFX7-NEXT: v_and_b32_e32 v14, 0x8000, v141711; GFX7-NEXT: v_bfe_u32 v19, v19, 16, 151712; GFX7-NEXT: v_or_b32_e32 v14, v19, v141713; GFX7-NEXT: v_mul_f32_e64 v13, 1.0, s281714; GFX7-NEXT: v_lshlrev_b32_e32 v14, 16, v141715; GFX7-NEXT: v_lshrrev_b32_e32 v13, 16, v131716; GFX7-NEXT: v_or_b32_e32 v14, v15, v141717; GFX7-NEXT: v_mul_f32_e64 v15, 1.0, s121718; GFX7-NEXT: v_mul_f32_e64 v12, 1.0, s291719; GFX7-NEXT: v_and_b32_e32 v13, 0x8000, v131720; GFX7-NEXT: v_bfe_u32 v15, v15, 16, 151721; GFX7-NEXT: v_lshrrev_b32_e32 v12, 16, v121722; GFX7-NEXT: v_or_b32_e32 v13, v15, v131723; GFX7-NEXT: v_mul_f32_e64 v15, 1.0, s131724; GFX7-NEXT: v_and_b32_e32 v12, 0x8000, v121725; GFX7-NEXT: v_bfe_u32 v15, v15, 16, 151726; GFX7-NEXT: v_or_b32_e32 v12, v15, v121727; GFX7-NEXT: v_mul_f32_e64 v11, 1.0, s261728; GFX7-NEXT: v_lshlrev_b32_e32 v12, 16, v121729; GFX7-NEXT: v_lshrrev_b32_e32 v11, 16, v111730; GFX7-NEXT: v_or_b32_e32 v12, v13, v121731; GFX7-NEXT: v_mul_f32_e64 v13, 1.0, s101732; GFX7-NEXT: v_mul_f32_e64 v10, 1.0, s271733; GFX7-NEXT: v_and_b32_e32 v11, 0x8000, v111734; GFX7-NEXT: v_bfe_u32 v13, v13, 16, 151735; GFX7-NEXT: v_lshrrev_b32_e32 v10, 16, v101736; GFX7-NEXT: v_or_b32_e32 v11, v13, v111737; GFX7-NEXT: v_mul_f32_e64 v13, 1.0, s111738; GFX7-NEXT: v_and_b32_e32 v10, 0x8000, v101739; GFX7-NEXT: v_bfe_u32 v13, v13, 16, 151740; GFX7-NEXT: v_or_b32_e32 v10, v13, v101741; GFX7-NEXT: v_mul_f32_e64 v9, 1.0, s241742; GFX7-NEXT: v_lshlrev_b32_e32 v10, 16, v101743; GFX7-NEXT: v_lshrrev_b32_e32 v9, 16, v91744; GFX7-NEXT: v_or_b32_e32 v10, v11, v101745; GFX7-NEXT: v_mul_f32_e64 v11, 1.0, s81746; GFX7-NEXT: v_mul_f32_e64 v8, 1.0, s251747; GFX7-NEXT: v_and_b32_e32 v9, 0x8000, v91748; GFX7-NEXT: v_bfe_u32 v11, v11, 16, 151749; GFX7-NEXT: v_lshrrev_b32_e32 v8, 16, v81750; GFX7-NEXT: v_or_b32_e32 v9, v11, v91751; GFX7-NEXT: v_mul_f32_e64 v11, 1.0, s91752; GFX7-NEXT: v_and_b32_e32 v8, 0x8000, v81753; GFX7-NEXT: v_bfe_u32 v11, v11, 16, 151754; GFX7-NEXT: v_or_b32_e32 v8, v11, v81755; GFX7-NEXT: v_mul_f32_e64 v7, 1.0, s221756; GFX7-NEXT: v_lshlrev_b32_e32 v8, 16, v81757; GFX7-NEXT: v_mul_f32_e64 v6, 1.0, s231758; GFX7-NEXT: v_lshrrev_b32_e32 v7, 16, v71759; GFX7-NEXT: v_or_b32_e32 v8, v9, v81760; GFX7-NEXT: v_mul_f32_e64 v9, 1.0, s61761; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v61762; GFX7-NEXT: v_mul_f32_e64 v11, 1.0, s71763; GFX7-NEXT: v_and_b32_e32 v7, 0x8000, v71764; GFX7-NEXT: v_bfe_u32 v9, v9, 16, 151765; GFX7-NEXT: v_or_b32_e32 v7, v9, v71766; GFX7-NEXT: v_and_b32_e32 v6, 0x8000, v61767; GFX7-NEXT: v_bfe_u32 v9, v11, 16, 151768; GFX7-NEXT: v_mul_f32_e64 v5, 1.0, s201769; GFX7-NEXT: v_or_b32_e32 v6, v9, v61770; GFX7-NEXT: v_mul_f32_e64 v4, 1.0, s211771; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v51772; GFX7-NEXT: v_mul_f32_e64 v13, 1.0, s41773; GFX7-NEXT: v_lshlrev_b32_e32 v6, 16, v61774; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v41775; GFX7-NEXT: v_mul_f32_e64 v15, 1.0, s51776; GFX7-NEXT: v_or_b32_e32 v6, v7, v61777; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v51778; GFX7-NEXT: v_bfe_u32 v7, v13, 16, 151779; GFX7-NEXT: v_or_b32_e32 v5, v7, v51780; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v41781; GFX7-NEXT: v_bfe_u32 v7, v15, 16, 151782; GFX7-NEXT: v_mul_f32_e64 v3, 1.0, s181783; GFX7-NEXT: v_or_b32_e32 v4, v7, v41784; GFX7-NEXT: v_mul_f32_e64 v2, 1.0, s191785; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v31786; GFX7-NEXT: v_mul_f32_e64 v19, 1.0, s21787; GFX7-NEXT: v_lshlrev_b32_e32 v4, 16, v41788; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v21789; GFX7-NEXT: v_mul_f32_e64 v18, 1.0, s31790; GFX7-NEXT: v_or_b32_e32 v4, v5, v41791; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v31792; GFX7-NEXT: v_bfe_u32 v5, v19, 16, 151793; GFX7-NEXT: v_or_b32_e32 v3, v5, v31794; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v21795; GFX7-NEXT: v_bfe_u32 v5, v18, 16, 151796; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s161797; GFX7-NEXT: v_or_b32_e32 v2, v5, v21798; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s171799; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v11800; GFX7-NEXT: v_mul_f32_e64 v17, 1.0, s01801; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v21802; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v01803; GFX7-NEXT: v_mul_f32_e64 v16, 1.0, s11804; GFX7-NEXT: v_or_b32_e32 v2, v3, v21805; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v11806; GFX7-NEXT: v_bfe_u32 v3, v17, 16, 151807; GFX7-NEXT: v_or_b32_e32 v1, v3, v11808; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v01809; GFX7-NEXT: v_bfe_u32 v3, v16, 16, 151810; GFX7-NEXT: v_or_b32_e32 v0, v3, v01811; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v01812; GFX7-NEXT: v_or_b32_e32 v0, v1, v01813; GFX7-NEXT: v_readfirstlane_b32 s0, v01814; GFX7-NEXT: v_readfirstlane_b32 s1, v21815; GFX7-NEXT: v_readfirstlane_b32 s2, v41816; GFX7-NEXT: v_readfirstlane_b32 s3, v61817; GFX7-NEXT: v_readfirstlane_b32 s4, v81818; GFX7-NEXT: v_readfirstlane_b32 s5, v101819; GFX7-NEXT: v_readfirstlane_b32 s6, v121820; GFX7-NEXT: v_readfirstlane_b32 s7, v141821; GFX7-NEXT: ; return to shader part epilog1822;1823; GFX8-LABEL: s_copysign_v16bf16:1824; GFX8: ; %bb.0:1825; GFX8-NEXT: s_mov_b32 s16, 0x7fff7fff1826; GFX8-NEXT: v_mov_b32_e32 v0, s71827; GFX8-NEXT: v_mov_b32_e32 v1, s151828; GFX8-NEXT: v_bfi_b32 v0, s16, v0, v11829; GFX8-NEXT: v_mov_b32_e32 v1, s61830; GFX8-NEXT: v_mov_b32_e32 v2, s141831; GFX8-NEXT: v_bfi_b32 v1, s16, v1, v21832; GFX8-NEXT: v_mov_b32_e32 v2, s51833; GFX8-NEXT: v_mov_b32_e32 v3, s131834; GFX8-NEXT: v_bfi_b32 v2, s16, v2, v31835; GFX8-NEXT: v_mov_b32_e32 v3, s41836; GFX8-NEXT: v_mov_b32_e32 v4, s121837; GFX8-NEXT: v_bfi_b32 v3, s16, v3, v41838; GFX8-NEXT: v_mov_b32_e32 v4, s31839; GFX8-NEXT: v_mov_b32_e32 v5, s111840; GFX8-NEXT: v_bfi_b32 v4, s16, v4, v51841; GFX8-NEXT: v_mov_b32_e32 v5, s21842; GFX8-NEXT: v_mov_b32_e32 v6, s101843; GFX8-NEXT: v_bfi_b32 v5, s16, v5, v61844; GFX8-NEXT: v_mov_b32_e32 v6, s11845; GFX8-NEXT: v_mov_b32_e32 v7, s91846; GFX8-NEXT: v_bfi_b32 v6, s16, v6, v71847; GFX8-NEXT: v_mov_b32_e32 v7, s01848; GFX8-NEXT: v_mov_b32_e32 v8, s81849; GFX8-NEXT: v_bfi_b32 v7, s16, v7, v81850; GFX8-NEXT: v_readfirstlane_b32 s0, v71851; GFX8-NEXT: v_readfirstlane_b32 s1, v61852; GFX8-NEXT: v_readfirstlane_b32 s2, v51853; GFX8-NEXT: v_readfirstlane_b32 s3, v41854; GFX8-NEXT: v_readfirstlane_b32 s4, v31855; GFX8-NEXT: v_readfirstlane_b32 s5, v21856; GFX8-NEXT: v_readfirstlane_b32 s6, v11857; GFX8-NEXT: v_readfirstlane_b32 s7, v01858; GFX8-NEXT: ; return to shader part epilog1859;1860; GFX9-LABEL: s_copysign_v16bf16:1861; GFX9: ; %bb.0:1862; GFX9-NEXT: s_mov_b32 s16, 0x7fff7fff1863; GFX9-NEXT: v_mov_b32_e32 v0, s71864; GFX9-NEXT: v_mov_b32_e32 v1, s151865; GFX9-NEXT: v_bfi_b32 v0, s16, v0, v11866; GFX9-NEXT: v_mov_b32_e32 v1, s61867; GFX9-NEXT: v_mov_b32_e32 v2, s141868; GFX9-NEXT: v_bfi_b32 v1, s16, v1, v21869; GFX9-NEXT: v_mov_b32_e32 v2, s51870; GFX9-NEXT: v_mov_b32_e32 v3, s131871; GFX9-NEXT: v_bfi_b32 v2, s16, v2, v31872; GFX9-NEXT: v_mov_b32_e32 v3, s41873; GFX9-NEXT: v_mov_b32_e32 v4, s121874; GFX9-NEXT: v_bfi_b32 v3, s16, v3, v41875; GFX9-NEXT: v_mov_b32_e32 v4, s31876; GFX9-NEXT: v_mov_b32_e32 v5, s111877; GFX9-NEXT: v_bfi_b32 v4, s16, v4, v51878; GFX9-NEXT: v_mov_b32_e32 v5, s21879; GFX9-NEXT: v_mov_b32_e32 v6, s101880; GFX9-NEXT: v_bfi_b32 v5, s16, v5, v61881; GFX9-NEXT: v_mov_b32_e32 v6, s11882; GFX9-NEXT: v_mov_b32_e32 v7, s91883; GFX9-NEXT: v_bfi_b32 v6, s16, v6, v71884; GFX9-NEXT: v_mov_b32_e32 v7, s01885; GFX9-NEXT: v_mov_b32_e32 v8, s81886; GFX9-NEXT: v_bfi_b32 v7, s16, v7, v81887; GFX9-NEXT: v_readfirstlane_b32 s0, v71888; GFX9-NEXT: v_readfirstlane_b32 s1, v61889; GFX9-NEXT: v_readfirstlane_b32 s2, v51890; GFX9-NEXT: v_readfirstlane_b32 s3, v41891; GFX9-NEXT: v_readfirstlane_b32 s4, v31892; GFX9-NEXT: v_readfirstlane_b32 s5, v21893; GFX9-NEXT: v_readfirstlane_b32 s6, v11894; GFX9-NEXT: v_readfirstlane_b32 s7, v01895; GFX9-NEXT: ; return to shader part epilog1896;1897; GFX10-LABEL: s_copysign_v16bf16:1898; GFX10: ; %bb.0:1899; GFX10-NEXT: v_mov_b32_e32 v0, s151900; GFX10-NEXT: v_mov_b32_e32 v1, s141901; GFX10-NEXT: v_mov_b32_e32 v2, s131902; GFX10-NEXT: v_mov_b32_e32 v3, s81903; GFX10-NEXT: v_mov_b32_e32 v4, s91904; GFX10-NEXT: v_mov_b32_e32 v5, s101905; GFX10-NEXT: v_mov_b32_e32 v6, s111906; GFX10-NEXT: v_mov_b32_e32 v7, s121907; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s7, v01908; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, s6, v11909; GFX10-NEXT: v_bfi_b32 v2, 0x7fff7fff, s5, v21910; GFX10-NEXT: v_bfi_b32 v3, 0x7fff7fff, s0, v31911; GFX10-NEXT: v_bfi_b32 v4, 0x7fff7fff, s1, v41912; GFX10-NEXT: v_bfi_b32 v5, 0x7fff7fff, s2, v51913; GFX10-NEXT: v_bfi_b32 v6, 0x7fff7fff, s3, v61914; GFX10-NEXT: v_bfi_b32 v7, 0x7fff7fff, s4, v71915; GFX10-NEXT: v_readfirstlane_b32 s0, v31916; GFX10-NEXT: v_readfirstlane_b32 s1, v41917; GFX10-NEXT: v_readfirstlane_b32 s2, v51918; GFX10-NEXT: v_readfirstlane_b32 s3, v61919; GFX10-NEXT: v_readfirstlane_b32 s4, v71920; GFX10-NEXT: v_readfirstlane_b32 s5, v21921; GFX10-NEXT: v_readfirstlane_b32 s6, v11922; GFX10-NEXT: v_readfirstlane_b32 s7, v01923; GFX10-NEXT: ; return to shader part epilog1924;1925; GFX11-LABEL: s_copysign_v16bf16:1926; GFX11: ; %bb.0:1927; GFX11-NEXT: v_dual_mov_b32 v0, s15 :: v_dual_mov_b32 v1, s141928; GFX11-NEXT: v_dual_mov_b32 v2, s13 :: v_dual_mov_b32 v3, s81929; GFX11-NEXT: v_dual_mov_b32 v4, s9 :: v_dual_mov_b32 v5, s101930; GFX11-NEXT: v_dual_mov_b32 v6, s11 :: v_dual_mov_b32 v7, s121931; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4)1932; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s7, v01933; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, s6, v11934; GFX11-NEXT: v_bfi_b32 v2, 0x7fff7fff, s5, v21935; GFX11-NEXT: v_bfi_b32 v3, 0x7fff7fff, s0, v31936; GFX11-NEXT: v_bfi_b32 v4, 0x7fff7fff, s1, v41937; GFX11-NEXT: v_bfi_b32 v5, 0x7fff7fff, s2, v51938; GFX11-NEXT: v_bfi_b32 v6, 0x7fff7fff, s3, v61939; GFX11-NEXT: v_bfi_b32 v7, 0x7fff7fff, s4, v71940; GFX11-NEXT: v_readfirstlane_b32 s0, v31941; GFX11-NEXT: v_readfirstlane_b32 s1, v41942; GFX11-NEXT: v_readfirstlane_b32 s2, v51943; GFX11-NEXT: v_readfirstlane_b32 s3, v61944; GFX11-NEXT: v_readfirstlane_b32 s4, v71945; GFX11-NEXT: v_readfirstlane_b32 s5, v21946; GFX11-NEXT: v_readfirstlane_b32 s6, v11947; GFX11-NEXT: v_readfirstlane_b32 s7, v01948; GFX11-NEXT: ; return to shader part epilog1949 %out = call <16 x bfloat> @llvm.copysign.v16bf16(<16 x bfloat> %arg_mag, <16 x bfloat> %arg_sign)1950 %cast = bitcast <16 x bfloat> %out to <8 x i32>1951 ret <8 x i32> %cast1952}1953 1954define <2 x bfloat> @v_copysign_v2bf16(<2 x bfloat> %mag, <2 x bfloat> %sign) {1955; GCN-LABEL: v_copysign_v2bf16:1956; GCN: ; %bb.0:1957; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1958; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v21959; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v31960; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v01961; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v11962; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v21963; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v31964; GCN-NEXT: v_bfe_u32 v1, v1, 16, 151965; GCN-NEXT: v_bfe_u32 v0, v0, 16, 151966; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v31967; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v21968; GCN-NEXT: v_or_b32_e32 v1, v1, v31969; GCN-NEXT: v_or_b32_e32 v0, v0, v21970; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v01971; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v11972; GCN-NEXT: s_setpc_b64 s[30:31]1973;1974; GFX7-LABEL: v_copysign_v2bf16:1975; GFX7: ; %bb.0:1976; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1977; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v21978; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v31979; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v21980; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v31981; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v01982; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v11983; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v31984; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 151985; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v21986; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 151987; GFX7-NEXT: v_or_b32_e32 v1, v1, v31988; GFX7-NEXT: v_or_b32_e32 v0, v0, v21989; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v01990; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v11991; GFX7-NEXT: s_setpc_b64 s[30:31]1992;1993; GFX8-LABEL: v_copysign_v2bf16:1994; GFX8: ; %bb.0:1995; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1996; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff1997; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v11998; GFX8-NEXT: s_setpc_b64 s[30:31]1999;2000; GFX9-LABEL: v_copysign_v2bf16:2001; GFX9: ; %bb.0:2002; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2003; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff2004; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v12005; GFX9-NEXT: s_setpc_b64 s[30:31]2006;2007; GFX10-LABEL: v_copysign_v2bf16:2008; GFX10: ; %bb.0:2009; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2010; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v12011; GFX10-NEXT: s_setpc_b64 s[30:31]2012;2013; GFX11-LABEL: v_copysign_v2bf16:2014; GFX11: ; %bb.0:2015; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2016; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v12017; GFX11-NEXT: s_setpc_b64 s[30:31]2018 %result = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag, <2 x bfloat> %sign)2019 ret <2 x bfloat> %result2020}2021 2022define <3 x bfloat> @v_copysign_v3bf16(<3 x bfloat> %mag, <3 x bfloat> %sign) {2023; GCN-LABEL: v_copysign_v3bf16:2024; GCN: ; %bb.0:2025; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2026; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v32027; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v42028; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v52029; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v02030; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v12031; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v22032; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v32033; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v42034; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v52035; GCN-NEXT: v_bfe_u32 v2, v2, 16, 152036; GCN-NEXT: v_bfe_u32 v1, v1, 16, 152037; GCN-NEXT: v_bfe_u32 v0, v0, 16, 152038; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v52039; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v42040; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v32041; GCN-NEXT: v_or_b32_e32 v2, v2, v52042; GCN-NEXT: v_or_b32_e32 v1, v1, v42043; GCN-NEXT: v_or_b32_e32 v0, v0, v32044; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v02045; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v12046; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v22047; GCN-NEXT: s_setpc_b64 s[30:31]2048;2049; GFX7-LABEL: v_copysign_v3bf16:2050; GFX7: ; %bb.0:2051; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2052; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v32053; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v42054; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v52055; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v32056; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v42057; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v52058; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v02059; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v12060; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v22061; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v52062; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 152063; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v42064; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 152065; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v32066; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 152067; GFX7-NEXT: v_or_b32_e32 v2, v2, v52068; GFX7-NEXT: v_or_b32_e32 v1, v1, v42069; GFX7-NEXT: v_or_b32_e32 v0, v0, v32070; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v02071; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v12072; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v22073; GFX7-NEXT: s_setpc_b64 s[30:31]2074;2075; GFX8-LABEL: v_copysign_v3bf16:2076; GFX8: ; %bb.0:2077; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2078; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff2079; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v22080; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v32081; GFX8-NEXT: s_setpc_b64 s[30:31]2082;2083; GFX9-LABEL: v_copysign_v3bf16:2084; GFX9: ; %bb.0:2085; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2086; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff2087; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v22088; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v32089; GFX9-NEXT: s_setpc_b64 s[30:31]2090;2091; GFX10-LABEL: v_copysign_v3bf16:2092; GFX10: ; %bb.0:2093; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2094; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v22095; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v32096; GFX10-NEXT: s_setpc_b64 s[30:31]2097;2098; GFX11-LABEL: v_copysign_v3bf16:2099; GFX11: ; %bb.0:2100; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2101; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v22102; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v32103; GFX11-NEXT: s_setpc_b64 s[30:31]2104 %result = call <3 x bfloat> @llvm.copysign.v3bf16(<3 x bfloat> %mag, <3 x bfloat> %sign)2105 ret <3 x bfloat> %result2106}2107 2108define <4 x bfloat> @v_copysign_v4bf16(<4 x bfloat> %mag, <4 x bfloat> %sign) {2109; GCN-LABEL: v_copysign_v4bf16:2110; GCN: ; %bb.0:2111; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2112; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v42113; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v52114; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v62115; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v72116; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v02117; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v12118; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v22119; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v32120; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v42121; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v52122; GCN-NEXT: v_lshrrev_b32_e32 v6, 16, v62123; GCN-NEXT: v_lshrrev_b32_e32 v7, 16, v72124; GCN-NEXT: v_bfe_u32 v3, v3, 16, 152125; GCN-NEXT: v_bfe_u32 v2, v2, 16, 152126; GCN-NEXT: v_bfe_u32 v1, v1, 16, 152127; GCN-NEXT: v_bfe_u32 v0, v0, 16, 152128; GCN-NEXT: v_and_b32_e32 v7, 0x8000, v72129; GCN-NEXT: v_and_b32_e32 v6, 0x8000, v62130; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v52131; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v42132; GCN-NEXT: v_or_b32_e32 v3, v3, v72133; GCN-NEXT: v_or_b32_e32 v2, v2, v62134; GCN-NEXT: v_or_b32_e32 v1, v1, v52135; GCN-NEXT: v_or_b32_e32 v0, v0, v42136; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v02137; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v12138; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v22139; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v32140; GCN-NEXT: s_setpc_b64 s[30:31]2141;2142; GFX7-LABEL: v_copysign_v4bf16:2143; GFX7: ; %bb.0:2144; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2145; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v42146; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v52147; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v62148; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v72149; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v42150; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v52151; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v62152; GFX7-NEXT: v_lshrrev_b32_e32 v7, 16, v72153; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v02154; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v12155; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v22156; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v32157; GFX7-NEXT: v_and_b32_e32 v7, 0x8000, v72158; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 152159; GFX7-NEXT: v_and_b32_e32 v6, 0x8000, v62160; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 152161; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v52162; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 152163; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v42164; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 152165; GFX7-NEXT: v_or_b32_e32 v3, v3, v72166; GFX7-NEXT: v_or_b32_e32 v2, v2, v62167; GFX7-NEXT: v_or_b32_e32 v1, v1, v52168; GFX7-NEXT: v_or_b32_e32 v0, v0, v42169; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v02170; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v12171; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v22172; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v32173; GFX7-NEXT: s_setpc_b64 s[30:31]2174;2175; GFX8-LABEL: v_copysign_v4bf16:2176; GFX8: ; %bb.0:2177; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2178; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff2179; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v22180; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v32181; GFX8-NEXT: s_setpc_b64 s[30:31]2182;2183; GFX9-LABEL: v_copysign_v4bf16:2184; GFX9: ; %bb.0:2185; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2186; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff2187; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v22188; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v32189; GFX9-NEXT: s_setpc_b64 s[30:31]2190;2191; GFX10-LABEL: v_copysign_v4bf16:2192; GFX10: ; %bb.0:2193; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2194; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v22195; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v32196; GFX10-NEXT: s_setpc_b64 s[30:31]2197;2198; GFX11-LABEL: v_copysign_v4bf16:2199; GFX11: ; %bb.0:2200; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2201; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v22202; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v32203; GFX11-NEXT: s_setpc_b64 s[30:31]2204 %result = call <4 x bfloat> @llvm.copysign.v4bf16(<4 x bfloat> %mag, <4 x bfloat> %sign)2205 ret <4 x bfloat> %result2206}2207 2208define <8 x bfloat> @v_copysign_v8bf16(<8 x bfloat> %mag, <8 x bfloat> %sign) {2209; GCN-LABEL: v_copysign_v8bf16:2210; GCN: ; %bb.0:2211; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2212; GCN-NEXT: v_mul_f32_e32 v8, 1.0, v82213; GCN-NEXT: v_mul_f32_e32 v9, 1.0, v92214; GCN-NEXT: v_mul_f32_e32 v10, 1.0, v102215; GCN-NEXT: v_mul_f32_e32 v11, 1.0, v112216; GCN-NEXT: v_mul_f32_e32 v12, 1.0, v122217; GCN-NEXT: v_mul_f32_e32 v13, 1.0, v132218; GCN-NEXT: v_mul_f32_e32 v14, 1.0, v142219; GCN-NEXT: v_mul_f32_e32 v15, 1.0, v152220; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v02221; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v12222; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v22223; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v32224; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v42225; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v52226; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v62227; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v72228; GCN-NEXT: v_lshrrev_b32_e32 v8, 16, v82229; GCN-NEXT: v_lshrrev_b32_e32 v9, 16, v92230; GCN-NEXT: v_lshrrev_b32_e32 v10, 16, v102231; GCN-NEXT: v_lshrrev_b32_e32 v11, 16, v112232; GCN-NEXT: v_lshrrev_b32_e32 v12, 16, v122233; GCN-NEXT: v_lshrrev_b32_e32 v13, 16, v132234; GCN-NEXT: v_lshrrev_b32_e32 v14, 16, v142235; GCN-NEXT: v_lshrrev_b32_e32 v15, 16, v152236; GCN-NEXT: v_bfe_u32 v7, v7, 16, 152237; GCN-NEXT: v_bfe_u32 v6, v6, 16, 152238; GCN-NEXT: v_bfe_u32 v5, v5, 16, 152239; GCN-NEXT: v_bfe_u32 v4, v4, 16, 152240; GCN-NEXT: v_bfe_u32 v3, v3, 16, 152241; GCN-NEXT: v_bfe_u32 v2, v2, 16, 152242; GCN-NEXT: v_bfe_u32 v1, v1, 16, 152243; GCN-NEXT: v_bfe_u32 v0, v0, 16, 152244; GCN-NEXT: v_and_b32_e32 v15, 0x8000, v152245; GCN-NEXT: v_and_b32_e32 v14, 0x8000, v142246; GCN-NEXT: v_and_b32_e32 v13, 0x8000, v132247; GCN-NEXT: v_and_b32_e32 v12, 0x8000, v122248; GCN-NEXT: v_and_b32_e32 v11, 0x8000, v112249; GCN-NEXT: v_and_b32_e32 v10, 0x8000, v102250; GCN-NEXT: v_and_b32_e32 v9, 0x8000, v92251; GCN-NEXT: v_and_b32_e32 v8, 0x8000, v82252; GCN-NEXT: v_or_b32_e32 v7, v7, v152253; GCN-NEXT: v_or_b32_e32 v6, v6, v142254; GCN-NEXT: v_or_b32_e32 v5, v5, v132255; GCN-NEXT: v_or_b32_e32 v4, v4, v122256; GCN-NEXT: v_or_b32_e32 v3, v3, v112257; GCN-NEXT: v_or_b32_e32 v2, v2, v102258; GCN-NEXT: v_or_b32_e32 v1, v1, v92259; GCN-NEXT: v_or_b32_e32 v0, v0, v82260; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v02261; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v12262; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v22263; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v32264; GCN-NEXT: v_lshlrev_b32_e32 v4, 16, v42265; GCN-NEXT: v_lshlrev_b32_e32 v5, 16, v52266; GCN-NEXT: v_lshlrev_b32_e32 v6, 16, v62267; GCN-NEXT: v_lshlrev_b32_e32 v7, 16, v72268; GCN-NEXT: s_setpc_b64 s[30:31]2269;2270; GFX7-LABEL: v_copysign_v8bf16:2271; GFX7: ; %bb.0:2272; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2273; GFX7-NEXT: v_mul_f32_e32 v8, 1.0, v82274; GFX7-NEXT: v_mul_f32_e32 v9, 1.0, v92275; GFX7-NEXT: v_mul_f32_e32 v10, 1.0, v102276; GFX7-NEXT: v_mul_f32_e32 v11, 1.0, v112277; GFX7-NEXT: v_mul_f32_e32 v12, 1.0, v122278; GFX7-NEXT: v_mul_f32_e32 v13, 1.0, v132279; GFX7-NEXT: v_mul_f32_e32 v14, 1.0, v142280; GFX7-NEXT: v_mul_f32_e32 v15, 1.0, v152281; GFX7-NEXT: v_lshrrev_b32_e32 v8, 16, v82282; GFX7-NEXT: v_lshrrev_b32_e32 v9, 16, v92283; GFX7-NEXT: v_lshrrev_b32_e32 v10, 16, v102284; GFX7-NEXT: v_lshrrev_b32_e32 v11, 16, v112285; GFX7-NEXT: v_lshrrev_b32_e32 v12, 16, v122286; GFX7-NEXT: v_lshrrev_b32_e32 v13, 16, v132287; GFX7-NEXT: v_lshrrev_b32_e32 v14, 16, v142288; GFX7-NEXT: v_lshrrev_b32_e32 v15, 16, v152289; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v02290; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v12291; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v22292; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v32293; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v42294; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v52295; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v62296; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v72297; GFX7-NEXT: v_and_b32_e32 v15, 0x8000, v152298; GFX7-NEXT: v_bfe_u32 v7, v7, 16, 152299; GFX7-NEXT: v_and_b32_e32 v14, 0x8000, v142300; GFX7-NEXT: v_bfe_u32 v6, v6, 16, 152301; GFX7-NEXT: v_and_b32_e32 v13, 0x8000, v132302; GFX7-NEXT: v_bfe_u32 v5, v5, 16, 152303; GFX7-NEXT: v_and_b32_e32 v12, 0x8000, v122304; GFX7-NEXT: v_bfe_u32 v4, v4, 16, 152305; GFX7-NEXT: v_and_b32_e32 v11, 0x8000, v112306; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 152307; GFX7-NEXT: v_and_b32_e32 v10, 0x8000, v102308; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 152309; GFX7-NEXT: v_and_b32_e32 v9, 0x8000, v92310; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 152311; GFX7-NEXT: v_and_b32_e32 v8, 0x8000, v82312; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 152313; GFX7-NEXT: v_or_b32_e32 v7, v7, v152314; GFX7-NEXT: v_or_b32_e32 v6, v6, v142315; GFX7-NEXT: v_or_b32_e32 v5, v5, v132316; GFX7-NEXT: v_or_b32_e32 v4, v4, v122317; GFX7-NEXT: v_or_b32_e32 v3, v3, v112318; GFX7-NEXT: v_or_b32_e32 v2, v2, v102319; GFX7-NEXT: v_or_b32_e32 v1, v1, v92320; GFX7-NEXT: v_or_b32_e32 v0, v0, v82321; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v02322; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v12323; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v22324; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v32325; GFX7-NEXT: v_lshlrev_b32_e32 v4, 16, v42326; GFX7-NEXT: v_lshlrev_b32_e32 v5, 16, v52327; GFX7-NEXT: v_lshlrev_b32_e32 v6, 16, v62328; GFX7-NEXT: v_lshlrev_b32_e32 v7, 16, v72329; GFX7-NEXT: s_setpc_b64 s[30:31]2330;2331; GFX8-LABEL: v_copysign_v8bf16:2332; GFX8: ; %bb.0:2333; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2334; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff2335; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v42336; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v52337; GFX8-NEXT: v_bfi_b32 v2, s4, v2, v62338; GFX8-NEXT: v_bfi_b32 v3, s4, v3, v72339; GFX8-NEXT: s_setpc_b64 s[30:31]2340;2341; GFX9-LABEL: v_copysign_v8bf16:2342; GFX9: ; %bb.0:2343; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2344; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff2345; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v42346; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v52347; GFX9-NEXT: v_bfi_b32 v2, s4, v2, v62348; GFX9-NEXT: v_bfi_b32 v3, s4, v3, v72349; GFX9-NEXT: s_setpc_b64 s[30:31]2350;2351; GFX10-LABEL: v_copysign_v8bf16:2352; GFX10: ; %bb.0:2353; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2354; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v42355; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v52356; GFX10-NEXT: v_bfi_b32 v2, 0x7fff7fff, v2, v62357; GFX10-NEXT: v_bfi_b32 v3, 0x7fff7fff, v3, v72358; GFX10-NEXT: s_setpc_b64 s[30:31]2359;2360; GFX11-LABEL: v_copysign_v8bf16:2361; GFX11: ; %bb.0:2362; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2363; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v42364; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v52365; GFX11-NEXT: v_bfi_b32 v2, 0x7fff7fff, v2, v62366; GFX11-NEXT: v_bfi_b32 v3, 0x7fff7fff, v3, v72367; GFX11-NEXT: s_setpc_b64 s[30:31]2368 %result = call <8 x bfloat> @llvm.copysign.v8bf16(<8 x bfloat> %mag, <8 x bfloat> %sign)2369 ret <8 x bfloat> %result2370}2371 2372define <16 x bfloat> @v_copysign_v16bf16(<16 x bfloat> %mag, <16 x bfloat> %sign) {2373; GCN-LABEL: v_copysign_v16bf16:2374; GCN: ; %bb.0:2375; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2376; GCN-NEXT: v_mul_f32_e32 v30, 1.0, v302377; GCN-NEXT: v_mul_f32_e32 v14, 1.0, v142378; GCN-NEXT: v_lshrrev_b32_e32 v30, 16, v302379; GCN-NEXT: v_bfe_u32 v14, v14, 16, 152380; GCN-NEXT: v_and_b32_e32 v30, 0x8000, v302381; GCN-NEXT: v_or_b32_e32 v14, v14, v302382; GCN-NEXT: v_mul_f32_e32 v29, 1.0, v292383; GCN-NEXT: v_mul_f32_e32 v13, 1.0, v132384; GCN-NEXT: v_lshrrev_b32_e32 v29, 16, v292385; GCN-NEXT: v_bfe_u32 v13, v13, 16, 152386; GCN-NEXT: v_and_b32_e32 v29, 0x8000, v292387; GCN-NEXT: v_or_b32_e32 v13, v13, v292388; GCN-NEXT: v_mul_f32_e32 v28, 1.0, v282389; GCN-NEXT: v_mul_f32_e32 v12, 1.0, v122390; GCN-NEXT: v_lshrrev_b32_e32 v28, 16, v282391; GCN-NEXT: v_bfe_u32 v12, v12, 16, 152392; GCN-NEXT: v_and_b32_e32 v28, 0x8000, v282393; GCN-NEXT: v_or_b32_e32 v12, v12, v282394; GCN-NEXT: v_mul_f32_e32 v27, 1.0, v272395; GCN-NEXT: v_mul_f32_e32 v11, 1.0, v112396; GCN-NEXT: v_mul_f32_e32 v26, 1.0, v262397; GCN-NEXT: v_mul_f32_e32 v10, 1.0, v102398; GCN-NEXT: v_mul_f32_e32 v25, 1.0, v252399; GCN-NEXT: v_mul_f32_e32 v9, 1.0, v92400; GCN-NEXT: v_mul_f32_e32 v24, 1.0, v242401; GCN-NEXT: v_mul_f32_e32 v8, 1.0, v82402; GCN-NEXT: v_mul_f32_e32 v23, 1.0, v232403; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v72404; GCN-NEXT: v_mul_f32_e32 v22, 1.0, v222405; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v62406; GCN-NEXT: v_mul_f32_e32 v21, 1.0, v212407; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v52408; GCN-NEXT: v_mul_f32_e32 v20, 1.0, v202409; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v42410; GCN-NEXT: v_mul_f32_e32 v19, 1.0, v192411; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v32412; GCN-NEXT: v_mul_f32_e32 v18, 1.0, v182413; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v22414; GCN-NEXT: v_mul_f32_e32 v17, 1.0, v172415; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v12416; GCN-NEXT: v_mul_f32_e32 v16, 1.0, v162417; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v02418; GCN-NEXT: v_lshrrev_b32_e32 v27, 16, v272419; GCN-NEXT: v_bfe_u32 v11, v11, 16, 152420; GCN-NEXT: v_and_b32_e32 v27, 0x8000, v272421; GCN-NEXT: v_or_b32_e32 v11, v11, v272422; GCN-NEXT: buffer_load_dword v27, off, s[0:3], s322423; GCN-NEXT: v_mul_f32_e32 v15, 1.0, v152424; GCN-NEXT: v_lshrrev_b32_e32 v26, 16, v262425; GCN-NEXT: v_bfe_u32 v10, v10, 16, 152426; GCN-NEXT: v_lshrrev_b32_e32 v25, 16, v252427; GCN-NEXT: v_bfe_u32 v9, v9, 16, 152428; GCN-NEXT: v_lshrrev_b32_e32 v24, 16, v242429; GCN-NEXT: v_bfe_u32 v8, v8, 16, 152430; GCN-NEXT: v_lshrrev_b32_e32 v23, 16, v232431; GCN-NEXT: v_bfe_u32 v7, v7, 16, 152432; GCN-NEXT: v_lshrrev_b32_e32 v22, 16, v222433; GCN-NEXT: v_bfe_u32 v6, v6, 16, 152434; GCN-NEXT: v_lshrrev_b32_e32 v21, 16, v212435; GCN-NEXT: v_bfe_u32 v5, v5, 16, 152436; GCN-NEXT: v_lshrrev_b32_e32 v20, 16, v202437; GCN-NEXT: v_bfe_u32 v4, v4, 16, 152438; GCN-NEXT: v_lshrrev_b32_e32 v19, 16, v192439; GCN-NEXT: v_bfe_u32 v3, v3, 16, 152440; GCN-NEXT: v_lshrrev_b32_e32 v18, 16, v182441; GCN-NEXT: v_bfe_u32 v2, v2, 16, 152442; GCN-NEXT: v_lshrrev_b32_e32 v17, 16, v172443; GCN-NEXT: v_bfe_u32 v1, v1, 16, 152444; GCN-NEXT: v_lshrrev_b32_e32 v16, 16, v162445; GCN-NEXT: v_bfe_u32 v0, v0, 16, 152446; GCN-NEXT: v_bfe_u32 v15, v15, 16, 152447; GCN-NEXT: v_and_b32_e32 v26, 0x8000, v262448; GCN-NEXT: v_and_b32_e32 v25, 0x8000, v252449; GCN-NEXT: v_and_b32_e32 v24, 0x8000, v242450; GCN-NEXT: v_and_b32_e32 v23, 0x8000, v232451; GCN-NEXT: v_and_b32_e32 v22, 0x8000, v222452; GCN-NEXT: v_and_b32_e32 v21, 0x8000, v212453; GCN-NEXT: v_and_b32_e32 v20, 0x8000, v202454; GCN-NEXT: v_and_b32_e32 v19, 0x8000, v192455; GCN-NEXT: v_and_b32_e32 v18, 0x8000, v182456; GCN-NEXT: v_and_b32_e32 v17, 0x8000, v172457; GCN-NEXT: v_and_b32_e32 v16, 0x8000, v162458; GCN-NEXT: v_or_b32_e32 v10, v10, v262459; GCN-NEXT: v_or_b32_e32 v9, v9, v252460; GCN-NEXT: v_or_b32_e32 v8, v8, v242461; GCN-NEXT: v_or_b32_e32 v7, v7, v232462; GCN-NEXT: v_or_b32_e32 v6, v6, v222463; GCN-NEXT: v_or_b32_e32 v5, v5, v212464; GCN-NEXT: v_or_b32_e32 v4, v4, v202465; GCN-NEXT: v_or_b32_e32 v3, v3, v192466; GCN-NEXT: v_or_b32_e32 v2, v2, v182467; GCN-NEXT: v_or_b32_e32 v1, v1, v172468; GCN-NEXT: v_or_b32_e32 v0, v0, v162469; GCN-NEXT: s_waitcnt vmcnt(0)2470; GCN-NEXT: v_mul_f32_e32 v16, 1.0, v272471; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v02472; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v12473; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v22474; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v32475; GCN-NEXT: v_lshlrev_b32_e32 v4, 16, v42476; GCN-NEXT: v_lshlrev_b32_e32 v5, 16, v52477; GCN-NEXT: v_lshlrev_b32_e32 v6, 16, v62478; GCN-NEXT: v_lshlrev_b32_e32 v7, 16, v72479; GCN-NEXT: v_lshlrev_b32_e32 v8, 16, v82480; GCN-NEXT: v_lshlrev_b32_e32 v9, 16, v92481; GCN-NEXT: v_lshlrev_b32_e32 v10, 16, v102482; GCN-NEXT: v_lshlrev_b32_e32 v11, 16, v112483; GCN-NEXT: v_lshlrev_b32_e32 v12, 16, v122484; GCN-NEXT: v_lshlrev_b32_e32 v13, 16, v132485; GCN-NEXT: v_lshrrev_b32_e32 v16, 16, v162486; GCN-NEXT: v_and_b32_e32 v16, 0x8000, v162487; GCN-NEXT: v_or_b32_e32 v15, v15, v162488; GCN-NEXT: v_lshlrev_b32_e32 v14, 16, v142489; GCN-NEXT: v_lshlrev_b32_e32 v15, 16, v152490; GCN-NEXT: s_setpc_b64 s[30:31]2491;2492; GFX7-LABEL: v_copysign_v16bf16:2493; GFX7: ; %bb.0:2494; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2495; GFX7-NEXT: v_mul_f32_e32 v27, 1.0, v272496; GFX7-NEXT: v_lshrrev_b32_e32 v27, 16, v272497; GFX7-NEXT: v_mul_f32_e32 v11, 1.0, v112498; GFX7-NEXT: v_and_b32_e32 v27, 0x8000, v272499; GFX7-NEXT: v_bfe_u32 v11, v11, 16, 152500; GFX7-NEXT: v_or_b32_e32 v11, v11, v272501; GFX7-NEXT: buffer_load_dword v27, off, s[0:3], s322502; GFX7-NEXT: v_mul_f32_e32 v24, 1.0, v242503; GFX7-NEXT: v_mul_f32_e32 v8, 1.0, v82504; GFX7-NEXT: v_lshrrev_b32_e32 v24, 16, v242505; GFX7-NEXT: v_bfe_u32 v8, v8, 16, 152506; GFX7-NEXT: v_and_b32_e32 v24, 0x8000, v242507; GFX7-NEXT: v_mul_f32_e32 v30, 1.0, v302508; GFX7-NEXT: v_mul_f32_e32 v29, 1.0, v292509; GFX7-NEXT: v_mul_f32_e32 v28, 1.0, v282510; GFX7-NEXT: v_mul_f32_e32 v26, 1.0, v262511; GFX7-NEXT: v_mul_f32_e32 v25, 1.0, v252512; GFX7-NEXT: v_mul_f32_e32 v23, 1.0, v232513; GFX7-NEXT: v_or_b32_e32 v8, v8, v242514; GFX7-NEXT: v_mul_f32_e32 v22, 1.0, v222515; GFX7-NEXT: v_mul_f32_e32 v21, 1.0, v212516; GFX7-NEXT: v_mul_f32_e32 v20, 1.0, v202517; GFX7-NEXT: v_mul_f32_e32 v19, 1.0, v192518; GFX7-NEXT: v_mul_f32_e32 v18, 1.0, v182519; GFX7-NEXT: v_mul_f32_e32 v17, 1.0, v172520; GFX7-NEXT: v_mul_f32_e32 v16, 1.0, v162521; GFX7-NEXT: v_lshrrev_b32_e32 v30, 16, v302522; GFX7-NEXT: v_mul_f32_e32 v14, 1.0, v142523; GFX7-NEXT: v_lshrrev_b32_e32 v29, 16, v292524; GFX7-NEXT: v_mul_f32_e32 v13, 1.0, v132525; GFX7-NEXT: v_lshrrev_b32_e32 v28, 16, v282526; GFX7-NEXT: v_mul_f32_e32 v12, 1.0, v122527; GFX7-NEXT: v_mul_f32_e32 v10, 1.0, v102528; GFX7-NEXT: v_mul_f32_e32 v9, 1.0, v92529; GFX7-NEXT: v_mul_f32_e32 v15, 1.0, v152530; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v72531; GFX7-NEXT: v_lshrrev_b32_e32 v26, 16, v262532; GFX7-NEXT: v_lshrrev_b32_e32 v25, 16, v252533; GFX7-NEXT: v_lshrrev_b32_e32 v23, 16, v232534; GFX7-NEXT: v_lshrrev_b32_e32 v22, 16, v222535; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v62536; GFX7-NEXT: v_lshrrev_b32_e32 v21, 16, v212537; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v52538; GFX7-NEXT: v_lshrrev_b32_e32 v20, 16, v202539; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v42540; GFX7-NEXT: v_lshrrev_b32_e32 v19, 16, v192541; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v32542; GFX7-NEXT: v_lshrrev_b32_e32 v18, 16, v182543; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v22544; GFX7-NEXT: v_lshrrev_b32_e32 v17, 16, v172545; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v12546; GFX7-NEXT: v_lshrrev_b32_e32 v16, 16, v162547; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v02548; GFX7-NEXT: v_and_b32_e32 v30, 0x8000, v302549; GFX7-NEXT: v_bfe_u32 v14, v14, 16, 152550; GFX7-NEXT: v_and_b32_e32 v29, 0x8000, v292551; GFX7-NEXT: v_bfe_u32 v13, v13, 16, 152552; GFX7-NEXT: v_and_b32_e32 v28, 0x8000, v282553; GFX7-NEXT: v_bfe_u32 v12, v12, 16, 152554; GFX7-NEXT: v_bfe_u32 v10, v10, 16, 152555; GFX7-NEXT: v_bfe_u32 v9, v9, 16, 152556; GFX7-NEXT: v_bfe_u32 v15, v15, 16, 152557; GFX7-NEXT: v_and_b32_e32 v26, 0x8000, v262558; GFX7-NEXT: v_and_b32_e32 v25, 0x8000, v252559; GFX7-NEXT: v_and_b32_e32 v23, 0x8000, v232560; GFX7-NEXT: v_bfe_u32 v7, v7, 16, 152561; GFX7-NEXT: v_and_b32_e32 v22, 0x8000, v222562; GFX7-NEXT: v_bfe_u32 v6, v6, 16, 152563; GFX7-NEXT: v_and_b32_e32 v21, 0x8000, v212564; GFX7-NEXT: v_bfe_u32 v5, v5, 16, 152565; GFX7-NEXT: v_and_b32_e32 v20, 0x8000, v202566; GFX7-NEXT: v_bfe_u32 v4, v4, 16, 152567; GFX7-NEXT: v_and_b32_e32 v19, 0x8000, v192568; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 152569; GFX7-NEXT: v_and_b32_e32 v18, 0x8000, v182570; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 152571; GFX7-NEXT: v_and_b32_e32 v17, 0x8000, v172572; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 152573; GFX7-NEXT: v_and_b32_e32 v16, 0x8000, v162574; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 152575; GFX7-NEXT: v_or_b32_e32 v14, v14, v302576; GFX7-NEXT: v_or_b32_e32 v13, v13, v292577; GFX7-NEXT: v_or_b32_e32 v12, v12, v282578; GFX7-NEXT: v_or_b32_e32 v10, v10, v262579; GFX7-NEXT: v_or_b32_e32 v9, v9, v252580; GFX7-NEXT: v_or_b32_e32 v7, v7, v232581; GFX7-NEXT: s_waitcnt vmcnt(0)2582; GFX7-NEXT: v_mul_f32_e32 v24, 1.0, v272583; GFX7-NEXT: v_lshrrev_b32_e32 v24, 16, v242584; GFX7-NEXT: v_and_b32_e32 v24, 0x8000, v242585; GFX7-NEXT: v_or_b32_e32 v15, v15, v242586; GFX7-NEXT: v_or_b32_e32 v6, v6, v222587; GFX7-NEXT: v_or_b32_e32 v5, v5, v212588; GFX7-NEXT: v_or_b32_e32 v4, v4, v202589; GFX7-NEXT: v_or_b32_e32 v3, v3, v192590; GFX7-NEXT: v_or_b32_e32 v2, v2, v182591; GFX7-NEXT: v_or_b32_e32 v1, v1, v172592; GFX7-NEXT: v_or_b32_e32 v0, v0, v162593; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v02594; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v12595; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v22596; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v32597; GFX7-NEXT: v_lshlrev_b32_e32 v4, 16, v42598; GFX7-NEXT: v_lshlrev_b32_e32 v5, 16, v52599; GFX7-NEXT: v_lshlrev_b32_e32 v6, 16, v62600; GFX7-NEXT: v_lshlrev_b32_e32 v7, 16, v72601; GFX7-NEXT: v_lshlrev_b32_e32 v8, 16, v82602; GFX7-NEXT: v_lshlrev_b32_e32 v9, 16, v92603; GFX7-NEXT: v_lshlrev_b32_e32 v10, 16, v102604; GFX7-NEXT: v_lshlrev_b32_e32 v11, 16, v112605; GFX7-NEXT: v_lshlrev_b32_e32 v12, 16, v122606; GFX7-NEXT: v_lshlrev_b32_e32 v13, 16, v132607; GFX7-NEXT: v_lshlrev_b32_e32 v14, 16, v142608; GFX7-NEXT: v_lshlrev_b32_e32 v15, 16, v152609; GFX7-NEXT: s_setpc_b64 s[30:31]2610;2611; GFX8-LABEL: v_copysign_v16bf16:2612; GFX8: ; %bb.0:2613; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2614; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff2615; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v82616; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v92617; GFX8-NEXT: v_bfi_b32 v2, s4, v2, v102618; GFX8-NEXT: v_bfi_b32 v3, s4, v3, v112619; GFX8-NEXT: v_bfi_b32 v4, s4, v4, v122620; GFX8-NEXT: v_bfi_b32 v5, s4, v5, v132621; GFX8-NEXT: v_bfi_b32 v6, s4, v6, v142622; GFX8-NEXT: v_bfi_b32 v7, s4, v7, v152623; GFX8-NEXT: s_setpc_b64 s[30:31]2624;2625; GFX9-LABEL: v_copysign_v16bf16:2626; GFX9: ; %bb.0:2627; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2628; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff2629; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v82630; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v92631; GFX9-NEXT: v_bfi_b32 v2, s4, v2, v102632; GFX9-NEXT: v_bfi_b32 v3, s4, v3, v112633; GFX9-NEXT: v_bfi_b32 v4, s4, v4, v122634; GFX9-NEXT: v_bfi_b32 v5, s4, v5, v132635; GFX9-NEXT: v_bfi_b32 v6, s4, v6, v142636; GFX9-NEXT: v_bfi_b32 v7, s4, v7, v152637; GFX9-NEXT: s_setpc_b64 s[30:31]2638;2639; GFX10-LABEL: v_copysign_v16bf16:2640; GFX10: ; %bb.0:2641; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2642; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v82643; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v92644; GFX10-NEXT: v_bfi_b32 v2, 0x7fff7fff, v2, v102645; GFX10-NEXT: v_bfi_b32 v3, 0x7fff7fff, v3, v112646; GFX10-NEXT: v_bfi_b32 v4, 0x7fff7fff, v4, v122647; GFX10-NEXT: v_bfi_b32 v5, 0x7fff7fff, v5, v132648; GFX10-NEXT: v_bfi_b32 v6, 0x7fff7fff, v6, v142649; GFX10-NEXT: v_bfi_b32 v7, 0x7fff7fff, v7, v152650; GFX10-NEXT: s_setpc_b64 s[30:31]2651;2652; GFX11-LABEL: v_copysign_v16bf16:2653; GFX11: ; %bb.0:2654; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2655; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v82656; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v92657; GFX11-NEXT: v_bfi_b32 v2, 0x7fff7fff, v2, v102658; GFX11-NEXT: v_bfi_b32 v3, 0x7fff7fff, v3, v112659; GFX11-NEXT: v_bfi_b32 v4, 0x7fff7fff, v4, v122660; GFX11-NEXT: v_bfi_b32 v5, 0x7fff7fff, v5, v132661; GFX11-NEXT: v_bfi_b32 v6, 0x7fff7fff, v6, v142662; GFX11-NEXT: v_bfi_b32 v7, 0x7fff7fff, v7, v152663; GFX11-NEXT: s_setpc_b64 s[30:31]2664 %result = call <16 x bfloat> @llvm.copysign.v16bf16(<16 x bfloat> %mag, <16 x bfloat> %sign)2665 ret <16 x bfloat> %result2666}2667 2668define <32 x bfloat> @v_copysign_v32bf16(<32 x bfloat> %mag, <32 x bfloat> %sign) {2669; GCN-LABEL: v_copysign_v32bf16:2670; GCN: ; %bb.0:2671; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2672; GCN-NEXT: buffer_load_dword v31, off, s[0:3], s32 offset:1282673; GCN-NEXT: buffer_load_dword v32, off, s[0:3], s322674; GCN-NEXT: s_waitcnt vmcnt(1)2675; GCN-NEXT: v_mul_f32_e32 v31, 1.0, v312676; GCN-NEXT: s_waitcnt vmcnt(0)2677; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v322678; GCN-NEXT: v_lshrrev_b32_e32 v31, 16, v312679; GCN-NEXT: v_bfe_u32 v32, v32, 16, 152680; GCN-NEXT: v_and_b32_e32 v31, 0x8000, v312681; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:1242682; GCN-NEXT: v_or_b32_e32 v31, v32, v312683; GCN-NEXT: v_mul_f32_e32 v30, 1.0, v302684; GCN-NEXT: v_bfe_u32 v30, v30, 16, 152685; GCN-NEXT: s_waitcnt vmcnt(0)2686; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332687; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322688; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322689; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:1202690; GCN-NEXT: v_or_b32_e32 v30, v30, v322691; GCN-NEXT: v_mul_f32_e32 v29, 1.0, v292692; GCN-NEXT: v_bfe_u32 v29, v29, 16, 152693; GCN-NEXT: s_waitcnt vmcnt(0)2694; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332695; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322696; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322697; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:1162698; GCN-NEXT: v_or_b32_e32 v29, v29, v322699; GCN-NEXT: v_mul_f32_e32 v28, 1.0, v282700; GCN-NEXT: v_bfe_u32 v28, v28, 16, 152701; GCN-NEXT: s_waitcnt vmcnt(0)2702; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332703; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322704; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322705; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:1122706; GCN-NEXT: v_or_b32_e32 v28, v28, v322707; GCN-NEXT: v_mul_f32_e32 v27, 1.0, v272708; GCN-NEXT: v_bfe_u32 v27, v27, 16, 152709; GCN-NEXT: s_waitcnt vmcnt(0)2710; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332711; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322712; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322713; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:1082714; GCN-NEXT: v_or_b32_e32 v27, v27, v322715; GCN-NEXT: v_mul_f32_e32 v26, 1.0, v262716; GCN-NEXT: v_bfe_u32 v26, v26, 16, 152717; GCN-NEXT: s_waitcnt vmcnt(0)2718; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332719; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322720; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322721; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:1042722; GCN-NEXT: v_or_b32_e32 v26, v26, v322723; GCN-NEXT: v_mul_f32_e32 v25, 1.0, v252724; GCN-NEXT: v_bfe_u32 v25, v25, 16, 152725; GCN-NEXT: s_waitcnt vmcnt(0)2726; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332727; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322728; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322729; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:1002730; GCN-NEXT: v_or_b32_e32 v25, v25, v322731; GCN-NEXT: v_mul_f32_e32 v24, 1.0, v242732; GCN-NEXT: v_bfe_u32 v24, v24, 16, 152733; GCN-NEXT: s_waitcnt vmcnt(0)2734; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332735; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322736; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322737; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:962738; GCN-NEXT: v_or_b32_e32 v24, v24, v322739; GCN-NEXT: v_mul_f32_e32 v23, 1.0, v232740; GCN-NEXT: v_bfe_u32 v23, v23, 16, 152741; GCN-NEXT: s_waitcnt vmcnt(0)2742; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332743; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322744; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322745; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:922746; GCN-NEXT: v_or_b32_e32 v23, v23, v322747; GCN-NEXT: v_mul_f32_e32 v22, 1.0, v222748; GCN-NEXT: v_bfe_u32 v22, v22, 16, 152749; GCN-NEXT: s_waitcnt vmcnt(0)2750; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332751; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322752; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322753; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:882754; GCN-NEXT: v_or_b32_e32 v22, v22, v322755; GCN-NEXT: v_mul_f32_e32 v21, 1.0, v212756; GCN-NEXT: v_bfe_u32 v21, v21, 16, 152757; GCN-NEXT: s_waitcnt vmcnt(0)2758; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332759; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322760; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322761; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:842762; GCN-NEXT: v_or_b32_e32 v21, v21, v322763; GCN-NEXT: v_mul_f32_e32 v20, 1.0, v202764; GCN-NEXT: v_bfe_u32 v20, v20, 16, 152765; GCN-NEXT: s_waitcnt vmcnt(0)2766; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332767; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322768; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322769; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:802770; GCN-NEXT: v_or_b32_e32 v20, v20, v322771; GCN-NEXT: v_mul_f32_e32 v19, 1.0, v192772; GCN-NEXT: v_bfe_u32 v19, v19, 16, 152773; GCN-NEXT: s_waitcnt vmcnt(0)2774; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332775; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322776; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322777; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:762778; GCN-NEXT: v_or_b32_e32 v19, v19, v322779; GCN-NEXT: v_mul_f32_e32 v18, 1.0, v182780; GCN-NEXT: v_bfe_u32 v18, v18, 16, 152781; GCN-NEXT: s_waitcnt vmcnt(0)2782; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332783; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322784; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322785; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:722786; GCN-NEXT: v_or_b32_e32 v18, v18, v322787; GCN-NEXT: v_mul_f32_e32 v17, 1.0, v172788; GCN-NEXT: v_bfe_u32 v17, v17, 16, 152789; GCN-NEXT: s_waitcnt vmcnt(0)2790; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332791; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322792; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322793; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:682794; GCN-NEXT: v_or_b32_e32 v17, v17, v322795; GCN-NEXT: v_mul_f32_e32 v16, 1.0, v162796; GCN-NEXT: v_bfe_u32 v16, v16, 16, 152797; GCN-NEXT: s_waitcnt vmcnt(0)2798; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332799; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322800; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322801; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:642802; GCN-NEXT: v_or_b32_e32 v16, v16, v322803; GCN-NEXT: v_mul_f32_e32 v15, 1.0, v152804; GCN-NEXT: v_bfe_u32 v15, v15, 16, 152805; GCN-NEXT: s_waitcnt vmcnt(0)2806; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332807; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322808; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322809; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:602810; GCN-NEXT: v_or_b32_e32 v15, v15, v322811; GCN-NEXT: v_mul_f32_e32 v14, 1.0, v142812; GCN-NEXT: v_bfe_u32 v14, v14, 16, 152813; GCN-NEXT: s_waitcnt vmcnt(0)2814; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332815; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322816; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322817; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:562818; GCN-NEXT: v_or_b32_e32 v14, v14, v322819; GCN-NEXT: v_mul_f32_e32 v13, 1.0, v132820; GCN-NEXT: v_bfe_u32 v13, v13, 16, 152821; GCN-NEXT: s_waitcnt vmcnt(0)2822; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332823; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322824; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322825; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:522826; GCN-NEXT: v_or_b32_e32 v13, v13, v322827; GCN-NEXT: v_mul_f32_e32 v12, 1.0, v122828; GCN-NEXT: v_bfe_u32 v12, v12, 16, 152829; GCN-NEXT: s_waitcnt vmcnt(0)2830; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332831; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322832; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322833; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:482834; GCN-NEXT: v_or_b32_e32 v12, v12, v322835; GCN-NEXT: v_mul_f32_e32 v11, 1.0, v112836; GCN-NEXT: v_bfe_u32 v11, v11, 16, 152837; GCN-NEXT: s_waitcnt vmcnt(0)2838; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332839; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322840; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322841; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:442842; GCN-NEXT: v_or_b32_e32 v11, v11, v322843; GCN-NEXT: v_mul_f32_e32 v10, 1.0, v102844; GCN-NEXT: v_bfe_u32 v10, v10, 16, 152845; GCN-NEXT: s_waitcnt vmcnt(0)2846; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332847; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322848; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322849; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:402850; GCN-NEXT: v_or_b32_e32 v10, v10, v322851; GCN-NEXT: v_mul_f32_e32 v9, 1.0, v92852; GCN-NEXT: v_bfe_u32 v9, v9, 16, 152853; GCN-NEXT: s_waitcnt vmcnt(0)2854; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332855; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322856; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322857; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:362858; GCN-NEXT: v_or_b32_e32 v9, v9, v322859; GCN-NEXT: v_mul_f32_e32 v8, 1.0, v82860; GCN-NEXT: v_bfe_u32 v8, v8, 16, 152861; GCN-NEXT: s_waitcnt vmcnt(0)2862; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332863; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322864; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322865; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:322866; GCN-NEXT: v_or_b32_e32 v8, v8, v322867; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v72868; GCN-NEXT: v_bfe_u32 v7, v7, 16, 152869; GCN-NEXT: s_waitcnt vmcnt(0)2870; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332871; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322872; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322873; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:282874; GCN-NEXT: v_or_b32_e32 v7, v7, v322875; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v62876; GCN-NEXT: v_bfe_u32 v6, v6, 16, 152877; GCN-NEXT: s_waitcnt vmcnt(0)2878; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332879; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322880; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322881; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:242882; GCN-NEXT: v_or_b32_e32 v6, v6, v322883; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v52884; GCN-NEXT: v_bfe_u32 v5, v5, 16, 152885; GCN-NEXT: s_waitcnt vmcnt(0)2886; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332887; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322888; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322889; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:202890; GCN-NEXT: v_or_b32_e32 v5, v5, v322891; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v42892; GCN-NEXT: v_bfe_u32 v4, v4, 16, 152893; GCN-NEXT: s_waitcnt vmcnt(0)2894; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332895; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322896; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322897; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:162898; GCN-NEXT: v_or_b32_e32 v4, v4, v322899; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v32900; GCN-NEXT: v_bfe_u32 v3, v3, 16, 152901; GCN-NEXT: s_waitcnt vmcnt(0)2902; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332903; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322904; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322905; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:122906; GCN-NEXT: v_or_b32_e32 v3, v3, v322907; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v22908; GCN-NEXT: v_bfe_u32 v2, v2, 16, 152909; GCN-NEXT: s_waitcnt vmcnt(0)2910; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332911; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322912; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322913; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:82914; GCN-NEXT: v_or_b32_e32 v2, v2, v322915; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v12916; GCN-NEXT: v_bfe_u32 v1, v1, 16, 152917; GCN-NEXT: s_waitcnt vmcnt(0)2918; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332919; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322920; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322921; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:42922; GCN-NEXT: v_or_b32_e32 v1, v1, v322923; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v02924; GCN-NEXT: v_bfe_u32 v0, v0, 16, 152925; GCN-NEXT: s_waitcnt vmcnt(0)2926; GCN-NEXT: v_mul_f32_e32 v32, 1.0, v332927; GCN-NEXT: v_lshrrev_b32_e32 v32, 16, v322928; GCN-NEXT: v_and_b32_e32 v32, 0x8000, v322929; GCN-NEXT: v_or_b32_e32 v0, v0, v322930; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v02931; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v12932; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v22933; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v32934; GCN-NEXT: v_lshlrev_b32_e32 v4, 16, v42935; GCN-NEXT: v_lshlrev_b32_e32 v5, 16, v52936; GCN-NEXT: v_lshlrev_b32_e32 v6, 16, v62937; GCN-NEXT: v_lshlrev_b32_e32 v7, 16, v72938; GCN-NEXT: v_lshlrev_b32_e32 v8, 16, v82939; GCN-NEXT: v_lshlrev_b32_e32 v9, 16, v92940; GCN-NEXT: v_lshlrev_b32_e32 v10, 16, v102941; GCN-NEXT: v_lshlrev_b32_e32 v11, 16, v112942; GCN-NEXT: v_lshlrev_b32_e32 v12, 16, v122943; GCN-NEXT: v_lshlrev_b32_e32 v13, 16, v132944; GCN-NEXT: v_lshlrev_b32_e32 v14, 16, v142945; GCN-NEXT: v_lshlrev_b32_e32 v15, 16, v152946; GCN-NEXT: v_lshlrev_b32_e32 v16, 16, v162947; GCN-NEXT: v_lshlrev_b32_e32 v17, 16, v172948; GCN-NEXT: v_lshlrev_b32_e32 v18, 16, v182949; GCN-NEXT: v_lshlrev_b32_e32 v19, 16, v192950; GCN-NEXT: v_lshlrev_b32_e32 v20, 16, v202951; GCN-NEXT: v_lshlrev_b32_e32 v21, 16, v212952; GCN-NEXT: v_lshlrev_b32_e32 v22, 16, v222953; GCN-NEXT: v_lshlrev_b32_e32 v23, 16, v232954; GCN-NEXT: v_lshlrev_b32_e32 v24, 16, v242955; GCN-NEXT: v_lshlrev_b32_e32 v25, 16, v252956; GCN-NEXT: v_lshlrev_b32_e32 v26, 16, v262957; GCN-NEXT: v_lshlrev_b32_e32 v27, 16, v272958; GCN-NEXT: v_lshlrev_b32_e32 v28, 16, v282959; GCN-NEXT: v_lshlrev_b32_e32 v29, 16, v292960; GCN-NEXT: v_lshlrev_b32_e32 v30, 16, v302961; GCN-NEXT: v_lshlrev_b32_e32 v31, 16, v312962; GCN-NEXT: s_setpc_b64 s[30:31]2963;2964; GFX7-LABEL: v_copysign_v32bf16:2965; GFX7: ; %bb.0:2966; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2967; GFX7-NEXT: buffer_load_dword v31, off, s[0:3], s32 offset:1282968; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s322969; GFX7-NEXT: v_mul_f32_e32 v30, 1.0, v302970; GFX7-NEXT: v_bfe_u32 v30, v30, 16, 152971; GFX7-NEXT: v_mul_f32_e32 v29, 1.0, v292972; GFX7-NEXT: v_bfe_u32 v29, v29, 16, 152973; GFX7-NEXT: v_mul_f32_e32 v28, 1.0, v282974; GFX7-NEXT: v_bfe_u32 v28, v28, 16, 152975; GFX7-NEXT: v_mul_f32_e32 v27, 1.0, v272976; GFX7-NEXT: v_bfe_u32 v27, v27, 16, 152977; GFX7-NEXT: v_mul_f32_e32 v26, 1.0, v262978; GFX7-NEXT: v_bfe_u32 v26, v26, 16, 152979; GFX7-NEXT: v_mul_f32_e32 v25, 1.0, v252980; GFX7-NEXT: v_bfe_u32 v25, v25, 16, 152981; GFX7-NEXT: v_mul_f32_e32 v24, 1.0, v242982; GFX7-NEXT: v_bfe_u32 v24, v24, 16, 152983; GFX7-NEXT: v_mul_f32_e32 v23, 1.0, v232984; GFX7-NEXT: v_bfe_u32 v23, v23, 16, 152985; GFX7-NEXT: v_mul_f32_e32 v22, 1.0, v222986; GFX7-NEXT: v_bfe_u32 v22, v22, 16, 152987; GFX7-NEXT: v_mul_f32_e32 v21, 1.0, v212988; GFX7-NEXT: v_bfe_u32 v21, v21, 16, 152989; GFX7-NEXT: v_mul_f32_e32 v20, 1.0, v202990; GFX7-NEXT: v_bfe_u32 v20, v20, 16, 152991; GFX7-NEXT: v_mul_f32_e32 v19, 1.0, v192992; GFX7-NEXT: v_bfe_u32 v19, v19, 16, 152993; GFX7-NEXT: v_mul_f32_e32 v18, 1.0, v182994; GFX7-NEXT: v_bfe_u32 v18, v18, 16, 152995; GFX7-NEXT: v_mul_f32_e32 v17, 1.0, v172996; GFX7-NEXT: v_bfe_u32 v17, v17, 16, 152997; GFX7-NEXT: v_mul_f32_e32 v16, 1.0, v162998; GFX7-NEXT: v_bfe_u32 v16, v16, 16, 152999; GFX7-NEXT: v_mul_f32_e32 v15, 1.0, v153000; GFX7-NEXT: v_bfe_u32 v15, v15, 16, 153001; GFX7-NEXT: v_mul_f32_e32 v14, 1.0, v143002; GFX7-NEXT: v_bfe_u32 v14, v14, 16, 153003; GFX7-NEXT: v_mul_f32_e32 v13, 1.0, v133004; GFX7-NEXT: v_bfe_u32 v13, v13, 16, 153005; GFX7-NEXT: v_mul_f32_e32 v12, 1.0, v123006; GFX7-NEXT: v_bfe_u32 v12, v12, 16, 153007; GFX7-NEXT: v_mul_f32_e32 v11, 1.0, v113008; GFX7-NEXT: v_bfe_u32 v11, v11, 16, 153009; GFX7-NEXT: v_mul_f32_e32 v10, 1.0, v103010; GFX7-NEXT: v_bfe_u32 v10, v10, 16, 153011; GFX7-NEXT: v_mul_f32_e32 v9, 1.0, v93012; GFX7-NEXT: v_bfe_u32 v9, v9, 16, 153013; GFX7-NEXT: v_mul_f32_e32 v8, 1.0, v83014; GFX7-NEXT: v_bfe_u32 v8, v8, 16, 153015; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v73016; GFX7-NEXT: v_bfe_u32 v7, v7, 16, 153017; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v63018; GFX7-NEXT: v_bfe_u32 v6, v6, 16, 153019; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v53020; GFX7-NEXT: v_bfe_u32 v5, v5, 16, 153021; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v43022; GFX7-NEXT: v_bfe_u32 v4, v4, 16, 153023; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v33024; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 153025; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v23026; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 153027; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v13028; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 153029; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v03030; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 153031; GFX7-NEXT: s_waitcnt vmcnt(1)3032; GFX7-NEXT: v_mul_f32_e32 v31, 1.0, v313033; GFX7-NEXT: s_waitcnt vmcnt(0)3034; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323035; GFX7-NEXT: v_lshrrev_b32_e32 v31, 16, v313036; GFX7-NEXT: v_bfe_u32 v32, v32, 16, 153037; GFX7-NEXT: v_and_b32_e32 v31, 0x8000, v313038; GFX7-NEXT: v_or_b32_e32 v31, v32, v313039; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:1243040; GFX7-NEXT: v_lshlrev_b32_e32 v31, 16, v313041; GFX7-NEXT: s_waitcnt vmcnt(0)3042; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323043; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323044; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323045; GFX7-NEXT: v_or_b32_e32 v30, v30, v323046; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:1203047; GFX7-NEXT: v_lshlrev_b32_e32 v30, 16, v303048; GFX7-NEXT: s_waitcnt vmcnt(0)3049; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323050; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323051; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323052; GFX7-NEXT: v_or_b32_e32 v29, v29, v323053; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:1163054; GFX7-NEXT: v_lshlrev_b32_e32 v29, 16, v293055; GFX7-NEXT: s_waitcnt vmcnt(0)3056; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323057; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323058; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323059; GFX7-NEXT: v_or_b32_e32 v28, v28, v323060; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:1123061; GFX7-NEXT: v_lshlrev_b32_e32 v28, 16, v283062; GFX7-NEXT: s_waitcnt vmcnt(0)3063; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323064; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323065; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323066; GFX7-NEXT: v_or_b32_e32 v27, v27, v323067; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:1083068; GFX7-NEXT: v_lshlrev_b32_e32 v27, 16, v273069; GFX7-NEXT: s_waitcnt vmcnt(0)3070; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323071; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323072; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323073; GFX7-NEXT: v_or_b32_e32 v26, v26, v323074; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:1043075; GFX7-NEXT: v_lshlrev_b32_e32 v26, 16, v263076; GFX7-NEXT: s_waitcnt vmcnt(0)3077; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323078; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323079; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323080; GFX7-NEXT: v_or_b32_e32 v25, v25, v323081; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:1003082; GFX7-NEXT: v_lshlrev_b32_e32 v25, 16, v253083; GFX7-NEXT: s_waitcnt vmcnt(0)3084; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323085; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323086; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323087; GFX7-NEXT: v_or_b32_e32 v24, v24, v323088; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:963089; GFX7-NEXT: v_lshlrev_b32_e32 v24, 16, v243090; GFX7-NEXT: s_waitcnt vmcnt(0)3091; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323092; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323093; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323094; GFX7-NEXT: v_or_b32_e32 v23, v23, v323095; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:923096; GFX7-NEXT: v_lshlrev_b32_e32 v23, 16, v233097; GFX7-NEXT: s_waitcnt vmcnt(0)3098; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323099; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323100; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323101; GFX7-NEXT: v_or_b32_e32 v22, v22, v323102; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:883103; GFX7-NEXT: v_lshlrev_b32_e32 v22, 16, v223104; GFX7-NEXT: s_waitcnt vmcnt(0)3105; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323106; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323107; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323108; GFX7-NEXT: v_or_b32_e32 v21, v21, v323109; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:843110; GFX7-NEXT: v_lshlrev_b32_e32 v21, 16, v213111; GFX7-NEXT: s_waitcnt vmcnt(0)3112; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323113; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323114; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323115; GFX7-NEXT: v_or_b32_e32 v20, v20, v323116; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:803117; GFX7-NEXT: v_lshlrev_b32_e32 v20, 16, v203118; GFX7-NEXT: s_waitcnt vmcnt(0)3119; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323120; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323121; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323122; GFX7-NEXT: v_or_b32_e32 v19, v19, v323123; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:763124; GFX7-NEXT: v_lshlrev_b32_e32 v19, 16, v193125; GFX7-NEXT: s_waitcnt vmcnt(0)3126; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323127; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323128; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323129; GFX7-NEXT: v_or_b32_e32 v18, v18, v323130; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:723131; GFX7-NEXT: v_lshlrev_b32_e32 v18, 16, v183132; GFX7-NEXT: s_waitcnt vmcnt(0)3133; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323134; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323135; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323136; GFX7-NEXT: v_or_b32_e32 v17, v17, v323137; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:683138; GFX7-NEXT: v_lshlrev_b32_e32 v17, 16, v173139; GFX7-NEXT: s_waitcnt vmcnt(0)3140; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323141; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323142; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323143; GFX7-NEXT: v_or_b32_e32 v16, v16, v323144; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:643145; GFX7-NEXT: v_lshlrev_b32_e32 v16, 16, v163146; GFX7-NEXT: s_waitcnt vmcnt(0)3147; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323148; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323149; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323150; GFX7-NEXT: v_or_b32_e32 v15, v15, v323151; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:603152; GFX7-NEXT: v_lshlrev_b32_e32 v15, 16, v153153; GFX7-NEXT: s_waitcnt vmcnt(0)3154; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323155; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323156; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323157; GFX7-NEXT: v_or_b32_e32 v14, v14, v323158; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:563159; GFX7-NEXT: v_lshlrev_b32_e32 v14, 16, v143160; GFX7-NEXT: s_waitcnt vmcnt(0)3161; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323162; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323163; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323164; GFX7-NEXT: v_or_b32_e32 v13, v13, v323165; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:523166; GFX7-NEXT: v_lshlrev_b32_e32 v13, 16, v133167; GFX7-NEXT: s_waitcnt vmcnt(0)3168; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323169; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323170; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323171; GFX7-NEXT: v_or_b32_e32 v12, v12, v323172; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:483173; GFX7-NEXT: v_lshlrev_b32_e32 v12, 16, v123174; GFX7-NEXT: s_waitcnt vmcnt(0)3175; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323176; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323177; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323178; GFX7-NEXT: v_or_b32_e32 v11, v11, v323179; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:443180; GFX7-NEXT: v_lshlrev_b32_e32 v11, 16, v113181; GFX7-NEXT: s_waitcnt vmcnt(0)3182; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323183; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323184; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323185; GFX7-NEXT: v_or_b32_e32 v10, v10, v323186; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:403187; GFX7-NEXT: v_lshlrev_b32_e32 v10, 16, v103188; GFX7-NEXT: s_waitcnt vmcnt(0)3189; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323190; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323191; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323192; GFX7-NEXT: v_or_b32_e32 v9, v9, v323193; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:363194; GFX7-NEXT: v_lshlrev_b32_e32 v9, 16, v93195; GFX7-NEXT: s_waitcnt vmcnt(0)3196; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323197; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323198; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323199; GFX7-NEXT: v_or_b32_e32 v8, v8, v323200; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:323201; GFX7-NEXT: v_lshlrev_b32_e32 v8, 16, v83202; GFX7-NEXT: s_waitcnt vmcnt(0)3203; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323204; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323205; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323206; GFX7-NEXT: v_or_b32_e32 v7, v7, v323207; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:283208; GFX7-NEXT: v_lshlrev_b32_e32 v7, 16, v73209; GFX7-NEXT: s_waitcnt vmcnt(0)3210; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323211; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323212; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323213; GFX7-NEXT: v_or_b32_e32 v6, v6, v323214; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:243215; GFX7-NEXT: v_lshlrev_b32_e32 v6, 16, v63216; GFX7-NEXT: s_waitcnt vmcnt(0)3217; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323218; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323219; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323220; GFX7-NEXT: v_or_b32_e32 v5, v5, v323221; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:203222; GFX7-NEXT: v_lshlrev_b32_e32 v5, 16, v53223; GFX7-NEXT: s_waitcnt vmcnt(0)3224; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323225; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323226; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323227; GFX7-NEXT: v_or_b32_e32 v4, v4, v323228; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:163229; GFX7-NEXT: v_lshlrev_b32_e32 v4, 16, v43230; GFX7-NEXT: s_waitcnt vmcnt(0)3231; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323232; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323233; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323234; GFX7-NEXT: v_or_b32_e32 v3, v3, v323235; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:123236; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v33237; GFX7-NEXT: s_waitcnt vmcnt(0)3238; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323239; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323240; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323241; GFX7-NEXT: v_or_b32_e32 v2, v2, v323242; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:83243; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v23244; GFX7-NEXT: s_waitcnt vmcnt(0)3245; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323246; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323247; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323248; GFX7-NEXT: v_or_b32_e32 v1, v1, v323249; GFX7-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:43250; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v13251; GFX7-NEXT: s_waitcnt vmcnt(0)3252; GFX7-NEXT: v_mul_f32_e32 v32, 1.0, v323253; GFX7-NEXT: v_lshrrev_b32_e32 v32, 16, v323254; GFX7-NEXT: v_and_b32_e32 v32, 0x8000, v323255; GFX7-NEXT: v_or_b32_e32 v0, v0, v323256; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v03257; GFX7-NEXT: s_setpc_b64 s[30:31]3258;3259; GFX8-LABEL: v_copysign_v32bf16:3260; GFX8: ; %bb.0:3261; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3262; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff3263; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v163264; GFX8-NEXT: buffer_load_dword v16, off, s[0:3], s323265; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v173266; GFX8-NEXT: v_bfi_b32 v2, s4, v2, v183267; GFX8-NEXT: v_bfi_b32 v3, s4, v3, v193268; GFX8-NEXT: v_bfi_b32 v4, s4, v4, v203269; GFX8-NEXT: v_bfi_b32 v5, s4, v5, v213270; GFX8-NEXT: v_bfi_b32 v6, s4, v6, v223271; GFX8-NEXT: v_bfi_b32 v7, s4, v7, v233272; GFX8-NEXT: v_bfi_b32 v8, s4, v8, v243273; GFX8-NEXT: v_bfi_b32 v9, s4, v9, v253274; GFX8-NEXT: v_bfi_b32 v10, s4, v10, v263275; GFX8-NEXT: v_bfi_b32 v11, s4, v11, v273276; GFX8-NEXT: v_bfi_b32 v12, s4, v12, v283277; GFX8-NEXT: v_bfi_b32 v13, s4, v13, v293278; GFX8-NEXT: v_bfi_b32 v14, s4, v14, v303279; GFX8-NEXT: s_waitcnt vmcnt(0)3280; GFX8-NEXT: v_bfi_b32 v15, s4, v15, v163281; GFX8-NEXT: s_setpc_b64 s[30:31]3282;3283; GFX9-LABEL: v_copysign_v32bf16:3284; GFX9: ; %bb.0:3285; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3286; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff3287; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v163288; GFX9-NEXT: buffer_load_dword v16, off, s[0:3], s323289; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v173290; GFX9-NEXT: v_bfi_b32 v2, s4, v2, v183291; GFX9-NEXT: v_bfi_b32 v3, s4, v3, v193292; GFX9-NEXT: v_bfi_b32 v4, s4, v4, v203293; GFX9-NEXT: v_bfi_b32 v5, s4, v5, v213294; GFX9-NEXT: v_bfi_b32 v6, s4, v6, v223295; GFX9-NEXT: v_bfi_b32 v7, s4, v7, v233296; GFX9-NEXT: v_bfi_b32 v8, s4, v8, v243297; GFX9-NEXT: v_bfi_b32 v9, s4, v9, v253298; GFX9-NEXT: v_bfi_b32 v10, s4, v10, v263299; GFX9-NEXT: v_bfi_b32 v11, s4, v11, v273300; GFX9-NEXT: v_bfi_b32 v12, s4, v12, v283301; GFX9-NEXT: v_bfi_b32 v13, s4, v13, v293302; GFX9-NEXT: v_bfi_b32 v14, s4, v14, v303303; GFX9-NEXT: s_waitcnt vmcnt(0)3304; GFX9-NEXT: v_bfi_b32 v15, s4, v15, v163305; GFX9-NEXT: s_setpc_b64 s[30:31]3306;3307; GFX10-LABEL: v_copysign_v32bf16:3308; GFX10: ; %bb.0:3309; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3310; GFX10-NEXT: buffer_load_dword v31, off, s[0:3], s323311; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v163312; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v173313; GFX10-NEXT: v_bfi_b32 v2, 0x7fff7fff, v2, v183314; GFX10-NEXT: v_bfi_b32 v3, 0x7fff7fff, v3, v193315; GFX10-NEXT: v_bfi_b32 v4, 0x7fff7fff, v4, v203316; GFX10-NEXT: v_bfi_b32 v5, 0x7fff7fff, v5, v213317; GFX10-NEXT: v_bfi_b32 v6, 0x7fff7fff, v6, v223318; GFX10-NEXT: v_bfi_b32 v7, 0x7fff7fff, v7, v233319; GFX10-NEXT: v_bfi_b32 v8, 0x7fff7fff, v8, v243320; GFX10-NEXT: v_bfi_b32 v9, 0x7fff7fff, v9, v253321; GFX10-NEXT: v_bfi_b32 v10, 0x7fff7fff, v10, v263322; GFX10-NEXT: v_bfi_b32 v11, 0x7fff7fff, v11, v273323; GFX10-NEXT: v_bfi_b32 v12, 0x7fff7fff, v12, v283324; GFX10-NEXT: v_bfi_b32 v13, 0x7fff7fff, v13, v293325; GFX10-NEXT: v_bfi_b32 v14, 0x7fff7fff, v14, v303326; GFX10-NEXT: s_waitcnt vmcnt(0)3327; GFX10-NEXT: v_bfi_b32 v15, 0x7fff7fff, v15, v313328; GFX10-NEXT: s_setpc_b64 s[30:31]3329;3330; GFX11-LABEL: v_copysign_v32bf16:3331; GFX11: ; %bb.0:3332; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3333; GFX11-NEXT: scratch_load_b32 v31, off, s323334; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v163335; GFX11-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v173336; GFX11-NEXT: v_bfi_b32 v2, 0x7fff7fff, v2, v183337; GFX11-NEXT: v_bfi_b32 v3, 0x7fff7fff, v3, v193338; GFX11-NEXT: v_bfi_b32 v4, 0x7fff7fff, v4, v203339; GFX11-NEXT: v_bfi_b32 v5, 0x7fff7fff, v5, v213340; GFX11-NEXT: v_bfi_b32 v6, 0x7fff7fff, v6, v223341; GFX11-NEXT: v_bfi_b32 v7, 0x7fff7fff, v7, v233342; GFX11-NEXT: v_bfi_b32 v8, 0x7fff7fff, v8, v243343; GFX11-NEXT: v_bfi_b32 v9, 0x7fff7fff, v9, v253344; GFX11-NEXT: v_bfi_b32 v10, 0x7fff7fff, v10, v263345; GFX11-NEXT: v_bfi_b32 v11, 0x7fff7fff, v11, v273346; GFX11-NEXT: v_bfi_b32 v12, 0x7fff7fff, v12, v283347; GFX11-NEXT: v_bfi_b32 v13, 0x7fff7fff, v13, v293348; GFX11-NEXT: v_bfi_b32 v14, 0x7fff7fff, v14, v303349; GFX11-NEXT: s_waitcnt vmcnt(0)3350; GFX11-NEXT: v_bfi_b32 v15, 0x7fff7fff, v15, v313351; GFX11-NEXT: s_setpc_b64 s[30:31]3352 %result = call <32 x bfloat> @llvm.copysign.v32bf16(<32 x bfloat> %mag, <32 x bfloat> %sign)3353 ret <32 x bfloat> %result3354}3355 3356define amdgpu_ps i32 @s_copysign_out_f32_mag_bf16_sign_f32(bfloat inreg %mag, float inreg %sign) {3357; GCN-LABEL: s_copysign_out_f32_mag_bf16_sign_f32:3358; GCN: ; %bb.0:3359; GCN-NEXT: s_brev_b32 s2, -23360; GCN-NEXT: v_mov_b32_e32 v0, s03361; GCN-NEXT: v_mov_b32_e32 v1, s13362; GCN-NEXT: v_bfi_b32 v0, s2, v0, v13363; GCN-NEXT: v_readfirstlane_b32 s0, v03364; GCN-NEXT: ; return to shader part epilog3365;3366; GFX7-LABEL: s_copysign_out_f32_mag_bf16_sign_f32:3367; GFX7: ; %bb.0:3368; GFX7-NEXT: s_brev_b32 s2, -23369; GFX7-NEXT: v_mov_b32_e32 v0, s03370; GFX7-NEXT: v_mov_b32_e32 v1, s13371; GFX7-NEXT: v_bfi_b32 v0, s2, v0, v13372; GFX7-NEXT: v_readfirstlane_b32 s0, v03373; GFX7-NEXT: ; return to shader part epilog3374;3375; GFX8-LABEL: s_copysign_out_f32_mag_bf16_sign_f32:3376; GFX8: ; %bb.0:3377; GFX8-NEXT: s_lshl_b32 s0, s0, 163378; GFX8-NEXT: s_brev_b32 s2, -23379; GFX8-NEXT: v_mov_b32_e32 v0, s03380; GFX8-NEXT: v_mov_b32_e32 v1, s13381; GFX8-NEXT: v_bfi_b32 v0, s2, v0, v13382; GFX8-NEXT: v_readfirstlane_b32 s0, v03383; GFX8-NEXT: ; return to shader part epilog3384;3385; GFX9-LABEL: s_copysign_out_f32_mag_bf16_sign_f32:3386; GFX9: ; %bb.0:3387; GFX9-NEXT: s_lshl_b32 s0, s0, 163388; GFX9-NEXT: s_brev_b32 s2, -23389; GFX9-NEXT: v_mov_b32_e32 v0, s03390; GFX9-NEXT: v_mov_b32_e32 v1, s13391; GFX9-NEXT: v_bfi_b32 v0, s2, v0, v13392; GFX9-NEXT: v_readfirstlane_b32 s0, v03393; GFX9-NEXT: ; return to shader part epilog3394;3395; GFX10-LABEL: s_copysign_out_f32_mag_bf16_sign_f32:3396; GFX10: ; %bb.0:3397; GFX10-NEXT: v_mov_b32_e32 v0, s13398; GFX10-NEXT: s_lshl_b32 s0, s0, 163399; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v03400; GFX10-NEXT: v_readfirstlane_b32 s0, v03401; GFX10-NEXT: ; return to shader part epilog3402;3403; GFX11-LABEL: s_copysign_out_f32_mag_bf16_sign_f32:3404; GFX11: ; %bb.0:3405; GFX11-NEXT: v_mov_b32_e32 v0, s13406; GFX11-NEXT: s_lshl_b32 s0, s0, 163407; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)3408; GFX11-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v03409; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)3410; GFX11-NEXT: v_readfirstlane_b32 s0, v03411; GFX11-NEXT: ; return to shader part epilog3412 %mag.ext = fpext bfloat %mag to float3413 %out = call float @llvm.copysign.f32(float %mag.ext, float %sign)3414 %cast = bitcast float %out to i323415 ret i32 %cast3416}3417 3418define amdgpu_ps <2 x i32> @s_copysign_out_f64_mag_bf16_sign_f64(bfloat inreg %mag, double inreg %sign) {3419; GCN-LABEL: s_copysign_out_f64_mag_bf16_sign_f64:3420; GCN: ; %bb.0:3421; GCN-NEXT: v_cvt_f64_f32_e32 v[0:1], s03422; GCN-NEXT: s_brev_b32 s0, -23423; GCN-NEXT: v_mov_b32_e32 v2, s23424; GCN-NEXT: v_bfi_b32 v1, s0, v1, v23425; GCN-NEXT: v_readfirstlane_b32 s1, v13426; GCN-NEXT: v_readfirstlane_b32 s0, v03427; GCN-NEXT: ; return to shader part epilog3428;3429; GFX7-LABEL: s_copysign_out_f64_mag_bf16_sign_f64:3430; GFX7: ; %bb.0:3431; GFX7-NEXT: v_cvt_f64_f32_e32 v[0:1], s03432; GFX7-NEXT: s_brev_b32 s0, -23433; GFX7-NEXT: v_mov_b32_e32 v2, s23434; GFX7-NEXT: v_bfi_b32 v1, s0, v1, v23435; GFX7-NEXT: v_readfirstlane_b32 s1, v13436; GFX7-NEXT: v_readfirstlane_b32 s0, v03437; GFX7-NEXT: ; return to shader part epilog3438;3439; GFX8-LABEL: s_copysign_out_f64_mag_bf16_sign_f64:3440; GFX8: ; %bb.0:3441; GFX8-NEXT: s_lshl_b32 s0, s0, 163442; GFX8-NEXT: v_cvt_f64_f32_e32 v[0:1], s03443; GFX8-NEXT: s_brev_b32 s0, -23444; GFX8-NEXT: v_mov_b32_e32 v2, s23445; GFX8-NEXT: v_bfi_b32 v1, s0, v1, v23446; GFX8-NEXT: v_readfirstlane_b32 s1, v13447; GFX8-NEXT: v_readfirstlane_b32 s0, v03448; GFX8-NEXT: ; return to shader part epilog3449;3450; GFX9-LABEL: s_copysign_out_f64_mag_bf16_sign_f64:3451; GFX9: ; %bb.0:3452; GFX9-NEXT: s_lshl_b32 s0, s0, 163453; GFX9-NEXT: v_cvt_f64_f32_e32 v[0:1], s03454; GFX9-NEXT: s_brev_b32 s0, -23455; GFX9-NEXT: v_mov_b32_e32 v2, s23456; GFX9-NEXT: v_bfi_b32 v1, s0, v1, v23457; GFX9-NEXT: v_readfirstlane_b32 s1, v13458; GFX9-NEXT: v_readfirstlane_b32 s0, v03459; GFX9-NEXT: ; return to shader part epilog3460;3461; GFX10-LABEL: s_copysign_out_f64_mag_bf16_sign_f64:3462; GFX10: ; %bb.0:3463; GFX10-NEXT: s_lshl_b32 s0, s0, 163464; GFX10-NEXT: v_cvt_f64_f32_e32 v[0:1], s03465; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, s23466; GFX10-NEXT: v_readfirstlane_b32 s0, v03467; GFX10-NEXT: v_readfirstlane_b32 s1, v13468; GFX10-NEXT: ; return to shader part epilog3469;3470; GFX11-LABEL: s_copysign_out_f64_mag_bf16_sign_f64:3471; GFX11: ; %bb.0:3472; GFX11-NEXT: s_lshl_b32 s0, s0, 163473; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)3474; GFX11-NEXT: v_cvt_f64_f32_e32 v[0:1], s03475; GFX11-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, s23476; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)3477; GFX11-NEXT: v_readfirstlane_b32 s0, v03478; GFX11-NEXT: v_readfirstlane_b32 s1, v13479; GFX11-NEXT: ; return to shader part epilog3480 %mag.ext = fpext bfloat %mag to double3481 %out = call double @llvm.copysign.f64(double %mag.ext, double %sign)3482 %cast = bitcast double %out to <2 x i32>3483 ret <2 x i32> %cast3484}3485 3486define amdgpu_ps i32 @s_copysign_out_f32_mag_f32_sign_bf16(float inreg %mag, bfloat inreg %sign) {3487; GCN-LABEL: s_copysign_out_f32_mag_f32_sign_bf16:3488; GCN: ; %bb.0:3489; GCN-NEXT: s_brev_b32 s2, -23490; GCN-NEXT: v_mov_b32_e32 v0, s03491; GCN-NEXT: v_mov_b32_e32 v1, s13492; GCN-NEXT: v_bfi_b32 v0, s2, v0, v13493; GCN-NEXT: v_readfirstlane_b32 s0, v03494; GCN-NEXT: ; return to shader part epilog3495;3496; GFX7-LABEL: s_copysign_out_f32_mag_f32_sign_bf16:3497; GFX7: ; %bb.0:3498; GFX7-NEXT: s_brev_b32 s2, -23499; GFX7-NEXT: v_mov_b32_e32 v0, s03500; GFX7-NEXT: v_mov_b32_e32 v1, s13501; GFX7-NEXT: v_bfi_b32 v0, s2, v0, v13502; GFX7-NEXT: v_readfirstlane_b32 s0, v03503; GFX7-NEXT: ; return to shader part epilog3504;3505; GFX8-LABEL: s_copysign_out_f32_mag_f32_sign_bf16:3506; GFX8: ; %bb.0:3507; GFX8-NEXT: v_lshlrev_b32_e64 v0, 16, s13508; GFX8-NEXT: s_brev_b32 s1, -23509; GFX8-NEXT: v_mov_b32_e32 v1, s03510; GFX8-NEXT: v_bfi_b32 v0, s1, v1, v03511; GFX8-NEXT: v_readfirstlane_b32 s0, v03512; GFX8-NEXT: ; return to shader part epilog3513;3514; GFX9-LABEL: s_copysign_out_f32_mag_f32_sign_bf16:3515; GFX9: ; %bb.0:3516; GFX9-NEXT: v_lshlrev_b32_e64 v0, 16, s13517; GFX9-NEXT: s_brev_b32 s1, -23518; GFX9-NEXT: v_mov_b32_e32 v1, s03519; GFX9-NEXT: v_bfi_b32 v0, s1, v1, v03520; GFX9-NEXT: v_readfirstlane_b32 s0, v03521; GFX9-NEXT: ; return to shader part epilog3522;3523; GFX10-LABEL: s_copysign_out_f32_mag_f32_sign_bf16:3524; GFX10: ; %bb.0:3525; GFX10-NEXT: v_lshlrev_b32_e64 v0, 16, s13526; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v03527; GFX10-NEXT: v_readfirstlane_b32 s0, v03528; GFX10-NEXT: ; return to shader part epilog3529;3530; GFX11TRUE16-LABEL: s_copysign_out_f32_mag_f32_sign_bf16:3531; GFX11TRUE16: ; %bb.0:3532; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.h, s13533; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3534; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v03535; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v03536; GFX11TRUE16-NEXT: ; return to shader part epilog3537;3538; GFX11FAKE16-LABEL: s_copysign_out_f32_mag_f32_sign_bf16:3539; GFX11FAKE16: ; %bb.0:3540; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v0, 16, s13541; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3542; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v03543; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v03544; GFX11FAKE16-NEXT: ; return to shader part epilog3545 %sign.ext = fpext bfloat %sign to float3546 %out = call float @llvm.copysign.f32(float %mag, float %sign.ext)3547 %cast = bitcast float %out to i323548 ret i32 %cast3549}3550 3551define amdgpu_ps <2 x i32> @s_copysign_out_f64_mag_f64_sign_bf16(double inreg %mag, bfloat inreg %sign) {3552; GCN-LABEL: s_copysign_out_f64_mag_f64_sign_bf16:3553; GCN: ; %bb.0:3554; GCN-NEXT: s_brev_b32 s3, -23555; GCN-NEXT: v_mov_b32_e32 v0, s13556; GCN-NEXT: v_mov_b32_e32 v1, s23557; GCN-NEXT: v_bfi_b32 v0, s3, v0, v13558; GCN-NEXT: v_readfirstlane_b32 s1, v03559; GCN-NEXT: ; return to shader part epilog3560;3561; GFX7-LABEL: s_copysign_out_f64_mag_f64_sign_bf16:3562; GFX7: ; %bb.0:3563; GFX7-NEXT: s_brev_b32 s3, -23564; GFX7-NEXT: v_mov_b32_e32 v0, s13565; GFX7-NEXT: v_mov_b32_e32 v1, s23566; GFX7-NEXT: v_bfi_b32 v0, s3, v0, v13567; GFX7-NEXT: v_readfirstlane_b32 s1, v03568; GFX7-NEXT: ; return to shader part epilog3569;3570; GFX8-LABEL: s_copysign_out_f64_mag_f64_sign_bf16:3571; GFX8: ; %bb.0:3572; GFX8-NEXT: v_lshlrev_b32_e64 v0, 16, s23573; GFX8-NEXT: s_brev_b32 s2, -23574; GFX8-NEXT: v_mov_b32_e32 v1, s13575; GFX8-NEXT: v_bfi_b32 v0, s2, v1, v03576; GFX8-NEXT: v_readfirstlane_b32 s1, v03577; GFX8-NEXT: ; return to shader part epilog3578;3579; GFX9-LABEL: s_copysign_out_f64_mag_f64_sign_bf16:3580; GFX9: ; %bb.0:3581; GFX9-NEXT: v_lshlrev_b32_e64 v0, 16, s23582; GFX9-NEXT: s_brev_b32 s2, -23583; GFX9-NEXT: v_mov_b32_e32 v1, s13584; GFX9-NEXT: v_bfi_b32 v0, s2, v1, v03585; GFX9-NEXT: v_readfirstlane_b32 s1, v03586; GFX9-NEXT: ; return to shader part epilog3587;3588; GFX10-LABEL: s_copysign_out_f64_mag_f64_sign_bf16:3589; GFX10: ; %bb.0:3590; GFX10-NEXT: v_lshlrev_b32_e64 v0, 16, s23591; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v03592; GFX10-NEXT: v_readfirstlane_b32 s1, v03593; GFX10-NEXT: ; return to shader part epilog3594;3595; GFX11TRUE16-LABEL: s_copysign_out_f64_mag_f64_sign_bf16:3596; GFX11TRUE16: ; %bb.0:3597; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.h, s23598; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3599; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v03600; GFX11TRUE16-NEXT: v_readfirstlane_b32 s1, v03601; GFX11TRUE16-NEXT: ; return to shader part epilog3602;3603; GFX11FAKE16-LABEL: s_copysign_out_f64_mag_f64_sign_bf16:3604; GFX11FAKE16: ; %bb.0:3605; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v0, 16, s23606; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3607; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v03608; GFX11FAKE16-NEXT: v_readfirstlane_b32 s1, v03609; GFX11FAKE16-NEXT: ; return to shader part epilog3610 %sign.ext = fpext bfloat %sign to double3611 %out = call double @llvm.copysign.f64(double %mag, double %sign.ext)3612 %cast = bitcast double %out to <2 x i32>3613 ret <2 x i32> %cast3614}3615 3616define amdgpu_ps i16 @s_copysign_out_bf16_mag_bf16_sign_f32(bfloat inreg %mag, float inreg %sign) {3617; GCN-LABEL: s_copysign_out_bf16_mag_bf16_sign_f32:3618; GCN: ; %bb.0:3619; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s03620; GCN-NEXT: s_and_b32 s0, s1, 0x800000003621; GCN-NEXT: s_lshr_b32 s0, s0, 163622; GCN-NEXT: v_bfe_u32 v0, v0, 16, 153623; GCN-NEXT: v_or_b32_e32 v0, s0, v03624; GCN-NEXT: v_readfirstlane_b32 s0, v03625; GCN-NEXT: ; return to shader part epilog3626;3627; GFX7-LABEL: s_copysign_out_bf16_mag_bf16_sign_f32:3628; GFX7: ; %bb.0:3629; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s03630; GFX7-NEXT: s_and_b32 s0, s1, 0x800000003631; GFX7-NEXT: s_lshr_b32 s0, s0, 163632; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 153633; GFX7-NEXT: v_or_b32_e32 v0, s0, v03634; GFX7-NEXT: v_readfirstlane_b32 s0, v03635; GFX7-NEXT: ; return to shader part epilog3636;3637; GFX8-LABEL: s_copysign_out_bf16_mag_bf16_sign_f32:3638; GFX8: ; %bb.0:3639; GFX8-NEXT: v_lshrrev_b32_e64 v0, 16, s13640; GFX8-NEXT: s_movk_i32 s1, 0x7fff3641; GFX8-NEXT: v_mov_b32_e32 v1, s03642; GFX8-NEXT: v_bfi_b32 v0, s1, v1, v03643; GFX8-NEXT: v_readfirstlane_b32 s0, v03644; GFX8-NEXT: ; return to shader part epilog3645;3646; GFX9-LABEL: s_copysign_out_bf16_mag_bf16_sign_f32:3647; GFX9: ; %bb.0:3648; GFX9-NEXT: v_lshrrev_b32_e64 v0, 16, s13649; GFX9-NEXT: s_movk_i32 s1, 0x7fff3650; GFX9-NEXT: v_mov_b32_e32 v1, s03651; GFX9-NEXT: v_bfi_b32 v0, s1, v1, v03652; GFX9-NEXT: v_readfirstlane_b32 s0, v03653; GFX9-NEXT: ; return to shader part epilog3654;3655; GFX10-LABEL: s_copysign_out_bf16_mag_bf16_sign_f32:3656; GFX10: ; %bb.0:3657; GFX10-NEXT: v_lshrrev_b32_e64 v0, 16, s13658; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v03659; GFX10-NEXT: v_readfirstlane_b32 s0, v03660; GFX10-NEXT: ; return to shader part epilog3661;3662; GFX11TRUE16-LABEL: s_copysign_out_bf16_mag_bf16_sign_f32:3663; GFX11TRUE16: ; %bb.0:3664; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s03665; GFX11TRUE16-NEXT: v_lshrrev_b32_e64 v1, 16, s13666; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3667; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v13668; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v03669; GFX11TRUE16-NEXT: ; return to shader part epilog3670;3671; GFX11FAKE16-LABEL: s_copysign_out_bf16_mag_bf16_sign_f32:3672; GFX11FAKE16: ; %bb.0:3673; GFX11FAKE16-NEXT: v_lshrrev_b32_e64 v0, 16, s13674; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3675; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v03676; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v03677; GFX11FAKE16-NEXT: ; return to shader part epilog3678 %sign.trunc = fptrunc float %sign to bfloat3679 %out = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign.trunc)3680 %cast = bitcast bfloat %out to i163681 ret i16 %cast3682}3683 3684define amdgpu_ps i16 @s_copysign_out_bf16_mag_bf16_sign_f64(bfloat inreg %mag, double inreg %sign) {3685; GCN-LABEL: s_copysign_out_bf16_mag_bf16_sign_f64:3686; GCN: ; %bb.0:3687; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s03688; GCN-NEXT: s_and_b32 s0, s2, 0x800000003689; GCN-NEXT: s_lshr_b32 s0, s0, 163690; GCN-NEXT: v_bfe_u32 v0, v0, 16, 153691; GCN-NEXT: v_or_b32_e32 v0, s0, v03692; GCN-NEXT: v_readfirstlane_b32 s0, v03693; GCN-NEXT: ; return to shader part epilog3694;3695; GFX7-LABEL: s_copysign_out_bf16_mag_bf16_sign_f64:3696; GFX7: ; %bb.0:3697; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s03698; GFX7-NEXT: s_and_b32 s0, s2, 0x800000003699; GFX7-NEXT: s_lshr_b32 s0, s0, 163700; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 153701; GFX7-NEXT: v_or_b32_e32 v0, s0, v03702; GFX7-NEXT: v_readfirstlane_b32 s0, v03703; GFX7-NEXT: ; return to shader part epilog3704;3705; GFX8-LABEL: s_copysign_out_bf16_mag_bf16_sign_f64:3706; GFX8: ; %bb.0:3707; GFX8-NEXT: v_lshrrev_b32_e64 v0, 16, s23708; GFX8-NEXT: s_movk_i32 s1, 0x7fff3709; GFX8-NEXT: v_mov_b32_e32 v1, s03710; GFX8-NEXT: v_bfi_b32 v0, s1, v1, v03711; GFX8-NEXT: v_readfirstlane_b32 s0, v03712; GFX8-NEXT: ; return to shader part epilog3713;3714; GFX9-LABEL: s_copysign_out_bf16_mag_bf16_sign_f64:3715; GFX9: ; %bb.0:3716; GFX9-NEXT: v_lshrrev_b32_e64 v0, 16, s23717; GFX9-NEXT: s_movk_i32 s1, 0x7fff3718; GFX9-NEXT: v_mov_b32_e32 v1, s03719; GFX9-NEXT: v_bfi_b32 v0, s1, v1, v03720; GFX9-NEXT: v_readfirstlane_b32 s0, v03721; GFX9-NEXT: ; return to shader part epilog3722;3723; GFX10-LABEL: s_copysign_out_bf16_mag_bf16_sign_f64:3724; GFX10: ; %bb.0:3725; GFX10-NEXT: v_lshrrev_b32_e64 v0, 16, s23726; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v03727; GFX10-NEXT: v_readfirstlane_b32 s0, v03728; GFX10-NEXT: ; return to shader part epilog3729;3730; GFX11TRUE16-LABEL: s_copysign_out_bf16_mag_bf16_sign_f64:3731; GFX11TRUE16: ; %bb.0:3732; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s03733; GFX11TRUE16-NEXT: v_lshrrev_b32_e64 v1, 16, s23734; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3735; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v13736; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v03737; GFX11TRUE16-NEXT: ; return to shader part epilog3738;3739; GFX11FAKE16-LABEL: s_copysign_out_bf16_mag_bf16_sign_f64:3740; GFX11FAKE16: ; %bb.0:3741; GFX11FAKE16-NEXT: v_lshrrev_b32_e64 v0, 16, s23742; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3743; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v03744; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v03745; GFX11FAKE16-NEXT: ; return to shader part epilog3746 %sign.trunc = fptrunc double %sign to bfloat3747 %out = call bfloat @llvm.copysign.bf16(bfloat %mag, bfloat %sign.trunc)3748 %cast = bitcast bfloat %out to i163749 ret i16 %cast3750}3751 3752define amdgpu_ps i16 @s_copysign_out_bf16_mag_f32_sign_bf16(float inreg %mag, bfloat inreg %sign) {3753; GCN-LABEL: s_copysign_out_bf16_mag_f32_sign_bf16:3754; GCN: ; %bb.0:3755; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s03756; GCN-NEXT: s_and_b32 s0, s1, 0x800000003757; GCN-NEXT: s_lshr_b32 s0, s0, 163758; GCN-NEXT: v_bfe_u32 v0, v0, 16, 153759; GCN-NEXT: v_or_b32_e32 v0, s0, v03760; GCN-NEXT: v_readfirstlane_b32 s0, v03761; GCN-NEXT: ; return to shader part epilog3762;3763; GFX7-LABEL: s_copysign_out_bf16_mag_f32_sign_bf16:3764; GFX7: ; %bb.0:3765; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s03766; GFX7-NEXT: s_and_b32 s0, s1, 0x800000003767; GFX7-NEXT: s_lshr_b32 s0, s0, 163768; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 153769; GFX7-NEXT: v_or_b32_e32 v0, s0, v03770; GFX7-NEXT: v_readfirstlane_b32 s0, v03771; GFX7-NEXT: ; return to shader part epilog3772;3773; GFX8-LABEL: s_copysign_out_bf16_mag_f32_sign_bf16:3774; GFX8: ; %bb.0:3775; GFX8-NEXT: s_bfe_u32 s2, s0, 0x100103776; GFX8-NEXT: s_add_i32 s2, s2, s03777; GFX8-NEXT: s_or_b32 s4, s0, 0x4000003778; GFX8-NEXT: s_add_i32 s6, s2, 0x7fff3779; GFX8-NEXT: v_cmp_u_f32_e64 s[2:3], s0, s03780; GFX8-NEXT: s_and_b64 s[2:3], s[2:3], exec3781; GFX8-NEXT: s_cselect_b32 s0, s4, s63782; GFX8-NEXT: s_lshr_b32 s0, s0, 163783; GFX8-NEXT: s_movk_i32 s5, 0x7fff3784; GFX8-NEXT: v_mov_b32_e32 v0, s03785; GFX8-NEXT: v_mov_b32_e32 v1, s13786; GFX8-NEXT: v_bfi_b32 v0, s5, v0, v13787; GFX8-NEXT: v_readfirstlane_b32 s0, v03788; GFX8-NEXT: ; return to shader part epilog3789;3790; GFX9-LABEL: s_copysign_out_bf16_mag_f32_sign_bf16:3791; GFX9: ; %bb.0:3792; GFX9-NEXT: s_bfe_u32 s2, s0, 0x100103793; GFX9-NEXT: s_add_i32 s2, s2, s03794; GFX9-NEXT: s_or_b32 s4, s0, 0x4000003795; GFX9-NEXT: s_add_i32 s6, s2, 0x7fff3796; GFX9-NEXT: v_cmp_u_f32_e64 s[2:3], s0, s03797; GFX9-NEXT: s_and_b64 s[2:3], s[2:3], exec3798; GFX9-NEXT: s_cselect_b32 s0, s4, s63799; GFX9-NEXT: s_lshr_b32 s0, s0, 163800; GFX9-NEXT: s_movk_i32 s5, 0x7fff3801; GFX9-NEXT: v_mov_b32_e32 v0, s03802; GFX9-NEXT: v_mov_b32_e32 v1, s13803; GFX9-NEXT: v_bfi_b32 v0, s5, v0, v13804; GFX9-NEXT: v_readfirstlane_b32 s0, v03805; GFX9-NEXT: ; return to shader part epilog3806;3807; GFX10-LABEL: s_copysign_out_bf16_mag_f32_sign_bf16:3808; GFX10: ; %bb.0:3809; GFX10-NEXT: s_bfe_u32 s2, s0, 0x100103810; GFX10-NEXT: v_cmp_u_f32_e64 s3, s0, s03811; GFX10-NEXT: s_add_i32 s2, s2, s03812; GFX10-NEXT: s_bitset1_b32 s0, 223813; GFX10-NEXT: s_addk_i32 s2, 0x7fff3814; GFX10-NEXT: v_mov_b32_e32 v0, s13815; GFX10-NEXT: s_and_b32 s3, s3, exec_lo3816; GFX10-NEXT: s_cselect_b32 s0, s0, s23817; GFX10-NEXT: s_lshr_b32 s0, s0, 163818; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, s0, v03819; GFX10-NEXT: v_readfirstlane_b32 s0, v03820; GFX10-NEXT: ; return to shader part epilog3821;3822; GFX11TRUE16-LABEL: s_copysign_out_bf16_mag_f32_sign_bf16:3823; GFX11TRUE16: ; %bb.0:3824; GFX11TRUE16-NEXT: s_bfe_u32 s2, s0, 0x100103825; GFX11TRUE16-NEXT: v_cmp_u_f32_e64 s3, s0, s03826; GFX11TRUE16-NEXT: s_add_i32 s2, s2, s03827; GFX11TRUE16-NEXT: s_bitset1_b32 s0, 223828; GFX11TRUE16-NEXT: s_addk_i32 s2, 0x7fff3829; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, s13830; GFX11TRUE16-NEXT: s_and_b32 s3, s3, exec_lo3831; GFX11TRUE16-NEXT: s_cselect_b32 s0, s0, s23832; GFX11TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)3833; GFX11TRUE16-NEXT: s_lshr_b32 s0, s0, 163834; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.l, s03835; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)3836; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v13837; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v03838; GFX11TRUE16-NEXT: ; return to shader part epilog3839;3840; GFX11FAKE16-LABEL: s_copysign_out_bf16_mag_f32_sign_bf16:3841; GFX11FAKE16: ; %bb.0:3842; GFX11FAKE16-NEXT: s_bfe_u32 s2, s0, 0x100103843; GFX11FAKE16-NEXT: v_cmp_u_f32_e64 s3, s0, s03844; GFX11FAKE16-NEXT: s_add_i32 s2, s2, s03845; GFX11FAKE16-NEXT: s_bitset1_b32 s0, 223846; GFX11FAKE16-NEXT: s_addk_i32 s2, 0x7fff3847; GFX11FAKE16-NEXT: v_mov_b32_e32 v0, s13848; GFX11FAKE16-NEXT: s_and_b32 s3, s3, exec_lo3849; GFX11FAKE16-NEXT: s_cselect_b32 s0, s0, s23850; GFX11FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1)3851; GFX11FAKE16-NEXT: s_lshr_b32 s0, s0, 163852; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)3853; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, s0, v03854; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)3855; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v03856; GFX11FAKE16-NEXT: ; return to shader part epilog3857 %mag.trunc = fptrunc float %mag to bfloat3858 %out = call bfloat @llvm.copysign.bf16(bfloat %mag.trunc, bfloat %sign)3859 %cast = bitcast bfloat %out to i163860 ret i16 %cast3861}3862 3863define <2 x float> @v_copysign_out_v2f32_mag_v2bf16_sign_v2f32(<2 x bfloat> %mag, <2 x float> %sign) {3864; GCN-LABEL: v_copysign_out_v2f32_mag_v2bf16_sign_v2f32:3865; GCN: ; %bb.0:3866; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3867; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v03868; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v13869; GCN-NEXT: s_brev_b32 s4, -23870; GCN-NEXT: v_and_b32_e32 v1, 0x7fff0000, v13871; GCN-NEXT: v_and_b32_e32 v0, 0x7fff0000, v03872; GCN-NEXT: v_bfi_b32 v0, s4, v0, v23873; GCN-NEXT: v_bfi_b32 v1, s4, v1, v33874; GCN-NEXT: s_setpc_b64 s[30:31]3875;3876; GFX7-LABEL: v_copysign_out_v2f32_mag_v2bf16_sign_v2f32:3877; GFX7: ; %bb.0:3878; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3879; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v03880; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v13881; GFX7-NEXT: v_and_b32_e32 v1, 0x7fff0000, v13882; GFX7-NEXT: v_and_b32_e32 v0, 0x7fff0000, v03883; GFX7-NEXT: s_brev_b32 s4, -23884; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v23885; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v33886; GFX7-NEXT: s_setpc_b64 s[30:31]3887;3888; GFX8-LABEL: v_copysign_out_v2f32_mag_v2bf16_sign_v2f32:3889; GFX8: ; %bb.0:3890; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3891; GFX8-NEXT: v_and_b32_e32 v3, 0x7fff0000, v03892; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v03893; GFX8-NEXT: s_brev_b32 s4, -23894; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v13895; GFX8-NEXT: v_bfi_b32 v1, s4, v3, v23896; GFX8-NEXT: s_setpc_b64 s[30:31]3897;3898; GFX9-LABEL: v_copysign_out_v2f32_mag_v2bf16_sign_v2f32:3899; GFX9: ; %bb.0:3900; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3901; GFX9-NEXT: v_and_b32_e32 v3, 0x7fff0000, v03902; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v03903; GFX9-NEXT: s_brev_b32 s4, -23904; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v13905; GFX9-NEXT: v_bfi_b32 v1, s4, v3, v23906; GFX9-NEXT: s_setpc_b64 s[30:31]3907;3908; GFX10-LABEL: v_copysign_out_v2f32_mag_v2bf16_sign_v2f32:3909; GFX10: ; %bb.0:3910; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3911; GFX10-NEXT: v_lshlrev_b32_e32 v3, 16, v03912; GFX10-NEXT: v_and_b32_e32 v4, 0x7fff0000, v03913; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, v3, v13914; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v4, v23915; GFX10-NEXT: s_setpc_b64 s[30:31]3916;3917; GFX11-LABEL: v_copysign_out_v2f32_mag_v2bf16_sign_v2f32:3918; GFX11: ; %bb.0:3919; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3920; GFX11-NEXT: v_lshlrev_b32_e32 v3, 16, v03921; GFX11-NEXT: v_and_b32_e32 v4, 0x7fff0000, v03922; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)3923; GFX11-NEXT: v_bfi_b32 v0, 0x7fffffff, v3, v13924; GFX11-NEXT: v_bfi_b32 v1, 0x7fffffff, v4, v23925; GFX11-NEXT: s_setpc_b64 s[30:31]3926 %mag.ext = fpext <2 x bfloat> %mag to <2 x float>3927 %out = call <2 x float> @llvm.copysign.v2f32(<2 x float> %mag.ext, <2 x float> %sign)3928 ret <2 x float> %out3929}3930 3931define <2 x float> @v_copysign_out_v2f32_mag_v2f32_sign_v2bf16(<2 x float> %mag, <2 x bfloat> %sign) {3932; GCN-LABEL: v_copysign_out_v2f32_mag_v2f32_sign_v2bf16:3933; GCN: ; %bb.0:3934; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3935; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v33936; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v23937; GCN-NEXT: s_brev_b32 s4, -23938; GCN-NEXT: v_bfi_b32 v0, s4, v0, v23939; GCN-NEXT: v_bfi_b32 v1, s4, v1, v33940; GCN-NEXT: s_setpc_b64 s[30:31]3941;3942; GFX7-LABEL: v_copysign_out_v2f32_mag_v2f32_sign_v2bf16:3943; GFX7: ; %bb.0:3944; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3945; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v33946; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v23947; GFX7-NEXT: s_brev_b32 s4, -23948; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v23949; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v33950; GFX7-NEXT: s_setpc_b64 s[30:31]3951;3952; GFX8-LABEL: v_copysign_out_v2f32_mag_v2f32_sign_v2bf16:3953; GFX8: ; %bb.0:3954; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3955; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v23956; GFX8-NEXT: v_lshlrev_b32_e32 v2, 16, v23957; GFX8-NEXT: s_brev_b32 s4, -23958; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v23959; GFX8-NEXT: v_lshlrev_b32_e32 v2, 16, v33960; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v23961; GFX8-NEXT: s_setpc_b64 s[30:31]3962;3963; GFX9-LABEL: v_copysign_out_v2f32_mag_v2f32_sign_v2bf16:3964; GFX9: ; %bb.0:3965; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3966; GFX9-NEXT: v_lshrrev_b32_e32 v3, 16, v23967; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v23968; GFX9-NEXT: s_brev_b32 s4, -23969; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v23970; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v33971; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v23972; GFX9-NEXT: s_setpc_b64 s[30:31]3973;3974; GFX10-LABEL: v_copysign_out_v2f32_mag_v2f32_sign_v2bf16:3975; GFX10: ; %bb.0:3976; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3977; GFX10-NEXT: v_lshrrev_b32_e32 v3, 16, v23978; GFX10-NEXT: v_lshlrev_b32_e32 v2, 16, v23979; GFX10-NEXT: v_lshlrev_b32_e32 v3, 16, v33980; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v23981; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v33982; GFX10-NEXT: s_setpc_b64 s[30:31]3983;3984; GFX11TRUE16-LABEL: v_copysign_out_v2f32_mag_v2f32_sign_v2bf16:3985; GFX11TRUE16: ; %bb.0:3986; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3987; GFX11TRUE16-NEXT: v_mov_b16_e32 v3.h, v2.l3988; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v23989; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)3990; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v33991; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]3992;3993; GFX11FAKE16-LABEL: v_copysign_out_v2f32_mag_v2f32_sign_v2bf16:3994; GFX11FAKE16: ; %bb.0:3995; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3996; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v23997; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v2, 16, v23998; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)3999; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v3, 16, v34000; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v24001; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)4002; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v34003; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]4004 %sign.ext = fpext <2 x bfloat> %sign to <2 x float>4005 %out = call <2 x float> @llvm.copysign.v2f32(<2 x float> %mag, <2 x float> %sign.ext)4006 ret <2 x float> %out4007}4008 4009define <2 x double> @v_copysign_out_v2f64_mag_v2f64_sign_v2bf16(<2 x double> %mag, <2 x bfloat> %sign) {4010; GCN-LABEL: v_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4011; GCN: ; %bb.0:4012; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4013; GCN-NEXT: s_brev_b32 s4, -24014; GCN-NEXT: v_bfi_b32 v1, s4, v1, v44015; GCN-NEXT: v_bfi_b32 v3, s4, v3, v54016; GCN-NEXT: s_setpc_b64 s[30:31]4017;4018; GFX7-LABEL: v_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4019; GFX7: ; %bb.0:4020; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4021; GFX7-NEXT: s_brev_b32 s4, -24022; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v44023; GFX7-NEXT: v_bfi_b32 v3, s4, v3, v54024; GFX7-NEXT: s_setpc_b64 s[30:31]4025;4026; GFX8-LABEL: v_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4027; GFX8: ; %bb.0:4028; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4029; GFX8-NEXT: v_lshlrev_b32_e32 v5, 16, v44030; GFX8-NEXT: v_lshrrev_b32_e32 v4, 16, v44031; GFX8-NEXT: s_brev_b32 s4, -24032; GFX8-NEXT: v_lshlrev_b32_e32 v4, 16, v44033; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v54034; GFX8-NEXT: v_bfi_b32 v3, s4, v3, v44035; GFX8-NEXT: s_setpc_b64 s[30:31]4036;4037; GFX9-LABEL: v_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4038; GFX9: ; %bb.0:4039; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4040; GFX9-NEXT: v_lshlrev_b32_e32 v5, 16, v44041; GFX9-NEXT: v_lshrrev_b32_e32 v4, 16, v44042; GFX9-NEXT: s_brev_b32 s4, -24043; GFX9-NEXT: v_lshlrev_b32_e32 v4, 16, v44044; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v54045; GFX9-NEXT: v_bfi_b32 v3, s4, v3, v44046; GFX9-NEXT: s_setpc_b64 s[30:31]4047;4048; GFX10-LABEL: v_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4049; GFX10: ; %bb.0:4050; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4051; GFX10-NEXT: v_lshrrev_b32_e32 v5, 16, v44052; GFX10-NEXT: v_lshlrev_b32_e32 v4, 16, v44053; GFX10-NEXT: v_lshlrev_b32_e32 v5, 16, v54054; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v44055; GFX10-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v54056; GFX10-NEXT: s_setpc_b64 s[30:31]4057;4058; GFX11TRUE16-LABEL: v_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4059; GFX11TRUE16: ; %bb.0:4060; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4061; GFX11TRUE16-NEXT: v_mov_b16_e32 v5.h, v4.l4062; GFX11TRUE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v44063; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2)4064; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v54065; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]4066;4067; GFX11FAKE16-LABEL: v_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4068; GFX11FAKE16: ; %bb.0:4069; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4070; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v44071; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v4, 16, v44072; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4073; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v5, 16, v54074; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v44075; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)4076; GFX11FAKE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v54077; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]4078 %sign.ext = fpext <2 x bfloat> %sign to <2 x double>4079 %out = call <2 x double> @llvm.copysign.v2f64(<2 x double> %mag, <2 x double> %sign.ext)4080 ret <2 x double> %out4081}4082 4083define <2 x bfloat> @v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16(<2 x float> %mag, <2 x bfloat> %sign) {4084; GCN-LABEL: v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4085; GCN: ; %bb.0:4086; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4087; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v24088; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v34089; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v04090; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v14091; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v24092; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v34093; GCN-NEXT: v_bfe_u32 v1, v1, 16, 154094; GCN-NEXT: v_bfe_u32 v0, v0, 16, 154095; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v34096; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v24097; GCN-NEXT: v_or_b32_e32 v1, v1, v34098; GCN-NEXT: v_or_b32_e32 v0, v0, v24099; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v04100; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v14101; GCN-NEXT: s_setpc_b64 s[30:31]4102;4103; GFX7-LABEL: v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4104; GFX7: ; %bb.0:4105; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4106; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v24107; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v34108; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v24109; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v34110; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v04111; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v14112; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v34113; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 154114; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v24115; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 154116; GFX7-NEXT: v_or_b32_e32 v1, v1, v34117; GFX7-NEXT: v_or_b32_e32 v0, v0, v24118; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v04119; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v14120; GFX7-NEXT: s_setpc_b64 s[30:31]4121;4122; GFX8-LABEL: v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4123; GFX8: ; %bb.0:4124; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4125; GFX8-NEXT: v_bfe_u32 v4, v0, 16, 14126; GFX8-NEXT: v_add_u32_e32 v4, vcc, v4, v04127; GFX8-NEXT: v_add_u32_e32 v4, vcc, 0x7fff, v44128; GFX8-NEXT: v_or_b32_e32 v3, 0x400000, v04129; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v0, v04130; GFX8-NEXT: v_cndmask_b32_e32 v0, v4, v3, vcc4131; GFX8-NEXT: v_bfe_u32 v4, v1, 16, 14132; GFX8-NEXT: v_add_u32_e32 v4, vcc, v4, v14133; GFX8-NEXT: v_add_u32_e32 v4, vcc, 0x7fff, v44134; GFX8-NEXT: v_or_b32_e32 v3, 0x400000, v14135; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v1, v14136; GFX8-NEXT: v_cndmask_b32_e32 v1, v4, v3, vcc4137; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v14138; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 164139; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff4140; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v24141; GFX8-NEXT: s_setpc_b64 s[30:31]4142;4143; GFX9-LABEL: v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4144; GFX9: ; %bb.0:4145; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4146; GFX9-NEXT: v_bfe_u32 v3, v0, 16, 14147; GFX9-NEXT: s_movk_i32 s4, 0x7fff4148; GFX9-NEXT: v_add3_u32 v3, v3, v0, s44149; GFX9-NEXT: v_or_b32_e32 v4, 0x400000, v04150; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v0, v04151; GFX9-NEXT: v_cndmask_b32_e32 v0, v3, v4, vcc4152; GFX9-NEXT: v_bfe_u32 v3, v1, 16, 14153; GFX9-NEXT: v_add3_u32 v3, v3, v1, s44154; GFX9-NEXT: v_or_b32_e32 v4, 0x400000, v14155; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v1, v14156; GFX9-NEXT: v_cndmask_b32_e32 v1, v3, v4, vcc4157; GFX9-NEXT: s_mov_b32 s4, 0x70603024158; GFX9-NEXT: v_perm_b32 v0, v1, v0, s44159; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff4160; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v24161; GFX9-NEXT: s_setpc_b64 s[30:31]4162;4163; GFX10-LABEL: v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4164; GFX10: ; %bb.0:4165; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4166; GFX10-NEXT: v_bfe_u32 v3, v0, 16, 14167; GFX10-NEXT: v_bfe_u32 v4, v1, 16, 14168; GFX10-NEXT: v_or_b32_e32 v5, 0x400000, v04169; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v04170; GFX10-NEXT: v_or_b32_e32 v6, 0x400000, v14171; GFX10-NEXT: v_add3_u32 v3, v3, v0, 0x7fff4172; GFX10-NEXT: v_add3_u32 v4, v4, v1, 0x7fff4173; GFX10-NEXT: v_cndmask_b32_e32 v0, v3, v5, vcc_lo4174; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v14175; GFX10-NEXT: v_cndmask_b32_e32 v1, v4, v6, vcc_lo4176; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x70603024177; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v24178; GFX10-NEXT: s_setpc_b64 s[30:31]4179;4180; GFX11TRUE16-LABEL: v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4181; GFX11TRUE16: ; %bb.0:4182; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4183; GFX11TRUE16-NEXT: v_bfe_u32 v3, v0, 16, 14184; GFX11TRUE16-NEXT: v_bfe_u32 v4, v1, 16, 14185; GFX11TRUE16-NEXT: v_or_b32_e32 v5, 0x400000, v04186; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v04187; GFX11TRUE16-NEXT: v_or_b32_e32 v6, 0x400000, v14188; GFX11TRUE16-NEXT: v_add3_u32 v3, v3, v0, 0x7fff4189; GFX11TRUE16-NEXT: v_add3_u32 v4, v4, v1, 0x7fff4190; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)4191; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v0, v3, v5, vcc_lo4192; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v14193; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v1, v4, v6, vcc_lo4194; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)4195; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.h4196; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v1, v24197; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]4198;4199; GFX11FAKE16-LABEL: v_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4200; GFX11FAKE16: ; %bb.0:4201; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4202; GFX11FAKE16-NEXT: v_bfe_u32 v3, v0, 16, 14203; GFX11FAKE16-NEXT: v_bfe_u32 v4, v1, 16, 14204; GFX11FAKE16-NEXT: v_or_b32_e32 v5, 0x400000, v04205; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v04206; GFX11FAKE16-NEXT: v_or_b32_e32 v6, 0x400000, v14207; GFX11FAKE16-NEXT: v_add3_u32 v3, v3, v0, 0x7fff4208; GFX11FAKE16-NEXT: v_add3_u32 v4, v4, v1, 0x7fff4209; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)4210; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v0, v3, v5, vcc_lo4211; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v14212; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v1, v4, v6, vcc_lo4213; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)4214; GFX11FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x70603024215; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v24216; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]4217 %mag.trunc = fptrunc <2 x float> %mag to <2 x bfloat>4218 %out = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag.trunc, <2 x bfloat> %sign)4219 ret <2 x bfloat> %out4220}4221 4222define <2 x bfloat> @v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16(<2 x double> %mag, <2 x bfloat> %sign) {4223; GCN-LABEL: v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:4224; GCN: ; %bb.0:4225; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4226; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v44227; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v54228; GCN-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]4229; GCN-NEXT: v_cvt_f32_f64_e32 v1, v[2:3]4230; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v44231; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v54232; GCN-NEXT: v_bfe_u32 v1, v1, 16, 154233; GCN-NEXT: v_bfe_u32 v0, v0, 16, 154234; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v34235; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v24236; GCN-NEXT: v_or_b32_e32 v1, v1, v34237; GCN-NEXT: v_or_b32_e32 v0, v0, v24238; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v04239; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v14240; GCN-NEXT: s_setpc_b64 s[30:31]4241;4242; GFX7-LABEL: v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:4243; GFX7: ; %bb.0:4244; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4245; GFX7-NEXT: v_cvt_f32_f64_e32 v2, v[2:3]4246; GFX7-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]4247; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v54248; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v44249; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v54250; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v44251; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v34252; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 154253; GFX7-NEXT: v_or_b32_e32 v1, v2, v14254; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v44255; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 154256; GFX7-NEXT: v_or_b32_e32 v0, v0, v24257; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v04258; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v14259; GFX7-NEXT: s_setpc_b64 s[30:31]4260;4261; GFX8-LABEL: v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:4262; GFX8: ; %bb.0:4263; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4264; GFX8-NEXT: v_cvt_f32_f64_e32 v7, v[0:1]4265; GFX8-NEXT: v_cvt_f32_f64_e32 v8, v[2:3]4266; GFX8-NEXT: v_cvt_f64_f32_e32 v[5:6], v74267; GFX8-NEXT: v_and_b32_e32 v9, 1, v74268; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v94269; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[0:1]|, |v[5:6]|4270; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[0:1], v[5:6]4271; GFX8-NEXT: v_cndmask_b32_e64 v5, -1, 1, s[6:7]4272; GFX8-NEXT: v_add_u32_e64 v5, s[6:7], v7, v54273; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]4274; GFX8-NEXT: v_cndmask_b32_e32 v7, v5, v7, vcc4275; GFX8-NEXT: v_bfe_u32 v5, v7, 16, 14276; GFX8-NEXT: v_add_u32_e32 v9, vcc, v5, v74277; GFX8-NEXT: v_cvt_f64_f32_e32 v[5:6], v84278; GFX8-NEXT: s_movk_i32 s4, 0x7fff4279; GFX8-NEXT: v_add_u32_e32 v9, vcc, s4, v94280; GFX8-NEXT: v_cmp_u_f64_e64 s[4:5], v[0:1], v[0:1]4281; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[2:3]|, |v[5:6]|4282; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[2:3], v[5:6]4283; GFX8-NEXT: v_or_b32_e32 v7, 0x400000, v74284; GFX8-NEXT: v_and_b32_e32 v1, 1, v84285; GFX8-NEXT: v_cndmask_b32_e64 v0, v9, v7, s[4:5]4286; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v14287; GFX8-NEXT: v_cndmask_b32_e64 v1, -1, 1, s[6:7]4288; GFX8-NEXT: v_add_u32_e64 v1, s[6:7], v8, v14289; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]4290; GFX8-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc4291; GFX8-NEXT: v_bfe_u32 v5, v1, 16, 14292; GFX8-NEXT: v_add_u32_e32 v5, vcc, v5, v14293; GFX8-NEXT: v_add_u32_e32 v5, vcc, 0x7fff, v54294; GFX8-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[2:3]4295; GFX8-NEXT: v_or_b32_e32 v1, 0x400000, v14296; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff4297; GFX8-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc4298; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v14299; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 164300; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v44301; GFX8-NEXT: s_setpc_b64 s[30:31]4302;4303; GFX9-LABEL: v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:4304; GFX9: ; %bb.0:4305; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4306; GFX9-NEXT: v_cvt_f32_f64_e32 v9, v[0:1]4307; GFX9-NEXT: v_cvt_f32_f64_e32 v10, v[2:3]4308; GFX9-NEXT: s_movk_i32 s8, 0x7fff4309; GFX9-NEXT: v_cvt_f64_f32_e32 v[5:6], v94310; GFX9-NEXT: v_cvt_f64_f32_e32 v[7:8], v104311; GFX9-NEXT: v_and_b32_e32 v11, 1, v94312; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v114313; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[0:1]|, |v[5:6]|4314; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[0:1], v[5:6]4315; GFX9-NEXT: v_cndmask_b32_e64 v5, -1, 1, s[6:7]4316; GFX9-NEXT: v_add_u32_e32 v5, v9, v54317; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]4318; GFX9-NEXT: v_cmp_u_f64_e64 s[4:5], v[0:1], v[0:1]4319; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[2:3]|, |v[7:8]|4320; GFX9-NEXT: v_cndmask_b32_e32 v5, v5, v9, vcc4321; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[2:3], v[7:8]4322; GFX9-NEXT: v_bfe_u32 v6, v5, 16, 14323; GFX9-NEXT: v_add3_u32 v6, v6, v5, s84324; GFX9-NEXT: v_or_b32_e32 v5, 0x400000, v54325; GFX9-NEXT: v_and_b32_e32 v1, 1, v104326; GFX9-NEXT: v_cndmask_b32_e64 v0, v6, v5, s[4:5]4327; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v14328; GFX9-NEXT: v_cndmask_b32_e64 v1, -1, 1, s[6:7]4329; GFX9-NEXT: v_add_u32_e32 v1, v10, v14330; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]4331; GFX9-NEXT: v_cndmask_b32_e32 v1, v1, v10, vcc4332; GFX9-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[2:3]4333; GFX9-NEXT: v_bfe_u32 v5, v1, 16, 14334; GFX9-NEXT: v_add3_u32 v5, v5, v1, s84335; GFX9-NEXT: v_or_b32_e32 v1, 0x400000, v14336; GFX9-NEXT: s_mov_b32 s4, 0x70603024337; GFX9-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc4338; GFX9-NEXT: v_perm_b32 v0, v1, v0, s44339; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff4340; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v44341; GFX9-NEXT: s_setpc_b64 s[30:31]4342;4343; GFX10-LABEL: v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:4344; GFX10: ; %bb.0:4345; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4346; GFX10-NEXT: v_cvt_f32_f64_e32 v9, v[0:1]4347; GFX10-NEXT: v_cvt_f32_f64_e32 v10, v[2:3]4348; GFX10-NEXT: v_cvt_f64_f32_e32 v[5:6], v94349; GFX10-NEXT: v_cvt_f64_f32_e32 v[7:8], v104350; GFX10-NEXT: v_and_b32_e32 v11, 1, v94351; GFX10-NEXT: v_and_b32_e32 v12, 1, v104352; GFX10-NEXT: v_cmp_eq_u32_e64 s6, 1, v124353; GFX10-NEXT: v_cmp_gt_f64_e64 s5, |v[0:1]|, |v[5:6]|4354; GFX10-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[0:1], v[5:6]4355; GFX10-NEXT: v_cmp_nlg_f64_e64 s4, v[2:3], v[7:8]4356; GFX10-NEXT: v_cndmask_b32_e64 v5, -1, 1, s54357; GFX10-NEXT: v_cmp_gt_f64_e64 s5, |v[2:3]|, |v[7:8]|4358; GFX10-NEXT: v_add_nc_u32_e32 v5, v9, v54359; GFX10-NEXT: v_cndmask_b32_e64 v6, -1, 1, s54360; GFX10-NEXT: v_cmp_eq_u32_e64 s5, 1, v114361; GFX10-NEXT: v_add_nc_u32_e32 v6, v10, v64362; GFX10-NEXT: s_or_b32 vcc_lo, vcc_lo, s54363; GFX10-NEXT: v_cndmask_b32_e32 v5, v5, v9, vcc_lo4364; GFX10-NEXT: s_or_b32 vcc_lo, s4, s64365; GFX10-NEXT: v_cndmask_b32_e32 v6, v6, v10, vcc_lo4366; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]4367; GFX10-NEXT: v_bfe_u32 v7, v5, 16, 14368; GFX10-NEXT: v_or_b32_e32 v9, 0x400000, v54369; GFX10-NEXT: v_bfe_u32 v8, v6, 16, 14370; GFX10-NEXT: v_add3_u32 v5, v7, v5, 0x7fff4371; GFX10-NEXT: v_or_b32_e32 v7, 0x400000, v64372; GFX10-NEXT: v_add3_u32 v6, v8, v6, 0x7fff4373; GFX10-NEXT: v_cndmask_b32_e32 v0, v5, v9, vcc_lo4374; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]4375; GFX10-NEXT: v_cndmask_b32_e32 v1, v6, v7, vcc_lo4376; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x70603024377; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v44378; GFX10-NEXT: s_setpc_b64 s[30:31]4379;4380; GFX11TRUE16-LABEL: v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:4381; GFX11TRUE16: ; %bb.0:4382; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4383; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v9, v[0:1]4384; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v10, v[2:3]4385; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4386; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[5:6], v94387; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[7:8], v104388; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)4389; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s1, |v[0:1]|, |v[5:6]|4390; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[0:1], v[5:6]4391; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e64 s0, v[2:3], v[7:8]4392; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_2)4393; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v5, -1, 1, s14394; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s1, |v[2:3]|, |v[7:8]|4395; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v5, v9, v54396; GFX11TRUE16-NEXT: v_and_b32_e32 v6, 1, v104397; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_4)4398; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s2, 1, v64399; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v7, -1, 1, s14400; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)4401; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v6, v10, v74402; GFX11TRUE16-NEXT: v_and_b32_e32 v11, 1, v94403; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s1, 1, v114404; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, vcc_lo, s14405; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v5, v5, v9, vcc_lo4406; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, s0, s24407; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v6, v6, v10, vcc_lo4408; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]4409; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)4410; GFX11TRUE16-NEXT: v_bfe_u32 v7, v5, 16, 14411; GFX11TRUE16-NEXT: v_bfe_u32 v8, v6, 16, 14412; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)4413; GFX11TRUE16-NEXT: v_add3_u32 v7, v7, v5, 0x7fff4414; GFX11TRUE16-NEXT: v_or_b32_e32 v5, 0x400000, v54415; GFX11TRUE16-NEXT: v_add3_u32 v8, v8, v6, 0x7fff4416; GFX11TRUE16-NEXT: v_or_b32_e32 v6, 0x400000, v64417; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3)4418; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v0, v7, v5, vcc_lo4419; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]4420; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v1, v8, v6, vcc_lo4421; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)4422; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.h4423; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v1, v44424; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]4425;4426; GFX11FAKE16-LABEL: v_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:4427; GFX11FAKE16: ; %bb.0:4428; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4429; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v9, v[0:1]4430; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v10, v[2:3]4431; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4432; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[5:6], v94433; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[7:8], v104434; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)4435; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s1, |v[0:1]|, |v[5:6]|4436; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[0:1], v[5:6]4437; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e64 s0, v[2:3], v[7:8]4438; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_2)4439; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v5, -1, 1, s14440; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s1, |v[2:3]|, |v[7:8]|4441; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v5, v9, v54442; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)4443; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v6, -1, 1, s14444; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v6, v10, v64445; GFX11FAKE16-NEXT: v_and_b32_e32 v11, 1, v94446; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)4447; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s1, 1, v114448; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, vcc_lo, s14449; GFX11FAKE16-NEXT: v_dual_cndmask_b32 v5, v5, v9 :: v_dual_and_b32 v12, 1, v104450; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s2, 1, v124451; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2)4452; GFX11FAKE16-NEXT: v_bfe_u32 v7, v5, 16, 14453; GFX11FAKE16-NEXT: v_or_b32_e32 v9, 0x400000, v54454; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, s0, s24455; GFX11FAKE16-NEXT: v_add3_u32 v5, v7, v5, 0x7fff4456; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v6, v6, v10, vcc_lo4457; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]4458; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)4459; GFX11FAKE16-NEXT: v_bfe_u32 v8, v6, 16, 14460; GFX11FAKE16-NEXT: v_or_b32_e32 v7, 0x400000, v64461; GFX11FAKE16-NEXT: v_add3_u32 v6, v8, v6, 0x7fff4462; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v0, v5, v9, vcc_lo4463; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]4464; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)4465; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v1, v6, v7, vcc_lo4466; GFX11FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x70603024467; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)4468; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v44469; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]4470 %mag.trunc = fptrunc <2 x double> %mag to <2 x bfloat>4471 %result = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag.trunc, <2 x bfloat> %sign)4472 ret <2 x bfloat> %result4473}4474 4475define <2 x bfloat> @v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32(<2 x bfloat> %mag, <2 x float> %sign) {4476; GCN-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:4477; GCN: ; %bb.0:4478; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4479; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v04480; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v14481; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v24482; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v34483; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v24484; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v34485; GCN-NEXT: v_bfe_u32 v1, v1, 16, 154486; GCN-NEXT: v_bfe_u32 v0, v0, 16, 154487; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v34488; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v24489; GCN-NEXT: v_or_b32_e32 v1, v1, v34490; GCN-NEXT: v_or_b32_e32 v0, v0, v24491; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v04492; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v14493; GCN-NEXT: s_setpc_b64 s[30:31]4494;4495; GFX7-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:4496; GFX7: ; %bb.0:4497; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4498; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v24499; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v34500; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v04501; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v14502; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v24503; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v34504; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v34505; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 154506; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v24507; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 154508; GFX7-NEXT: v_or_b32_e32 v1, v1, v34509; GFX7-NEXT: v_or_b32_e32 v0, v0, v24510; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v04511; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v14512; GFX7-NEXT: s_setpc_b64 s[30:31]4513;4514; GFX8-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:4515; GFX8: ; %bb.0:4516; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4517; GFX8-NEXT: v_bfe_u32 v3, v1, 16, 14518; GFX8-NEXT: v_add_u32_e32 v3, vcc, v3, v14519; GFX8-NEXT: v_add_u32_e32 v3, vcc, 0x7fff, v34520; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v1, v14521; GFX8-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc4522; GFX8-NEXT: v_bfe_u32 v3, v2, 16, 14523; GFX8-NEXT: v_add_u32_e32 v3, vcc, v3, v24524; GFX8-NEXT: v_add_u32_e32 v3, vcc, 0x7fff, v34525; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v2, v24526; GFX8-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc4527; GFX8-NEXT: v_lshrrev_b32_e32 v2, 16, v24528; GFX8-NEXT: v_alignbit_b32 v1, v2, v1, 164529; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff4530; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v14531; GFX8-NEXT: s_setpc_b64 s[30:31]4532;4533; GFX9-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:4534; GFX9: ; %bb.0:4535; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4536; GFX9-NEXT: v_bfe_u32 v3, v1, 16, 14537; GFX9-NEXT: s_movk_i32 s4, 0x7fff4538; GFX9-NEXT: v_add3_u32 v3, v3, v1, s44539; GFX9-NEXT: v_or_b32_e32 v4, 0x400000, v14540; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v1, v14541; GFX9-NEXT: v_cndmask_b32_e32 v1, v3, v4, vcc4542; GFX9-NEXT: v_bfe_u32 v3, v2, 16, 14543; GFX9-NEXT: v_add3_u32 v3, v3, v2, s44544; GFX9-NEXT: v_or_b32_e32 v4, 0x400000, v24545; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v2, v24546; GFX9-NEXT: v_cndmask_b32_e32 v2, v3, v4, vcc4547; GFX9-NEXT: s_mov_b32 s4, 0x70603024548; GFX9-NEXT: v_perm_b32 v1, v2, v1, s44549; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff4550; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v14551; GFX9-NEXT: s_setpc_b64 s[30:31]4552;4553; GFX10-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:4554; GFX10: ; %bb.0:4555; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4556; GFX10-NEXT: v_bfe_u32 v3, v1, 16, 14557; GFX10-NEXT: v_bfe_u32 v4, v2, 16, 14558; GFX10-NEXT: v_or_b32_e32 v5, 0x400000, v14559; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v14560; GFX10-NEXT: v_or_b32_e32 v6, 0x400000, v24561; GFX10-NEXT: v_add3_u32 v3, v3, v1, 0x7fff4562; GFX10-NEXT: v_add3_u32 v4, v4, v2, 0x7fff4563; GFX10-NEXT: v_cndmask_b32_e32 v1, v3, v5, vcc_lo4564; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v24565; GFX10-NEXT: v_cndmask_b32_e32 v2, v4, v6, vcc_lo4566; GFX10-NEXT: v_perm_b32 v1, v2, v1, 0x70603024567; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v14568; GFX10-NEXT: s_setpc_b64 s[30:31]4569;4570; GFX11TRUE16-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:4571; GFX11TRUE16: ; %bb.0:4572; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4573; GFX11TRUE16-NEXT: v_bfe_u32 v3, v1, 16, 14574; GFX11TRUE16-NEXT: v_bfe_u32 v4, v2, 16, 14575; GFX11TRUE16-NEXT: v_or_b32_e32 v5, 0x400000, v14576; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v14577; GFX11TRUE16-NEXT: v_or_b32_e32 v6, 0x400000, v24578; GFX11TRUE16-NEXT: v_add3_u32 v3, v3, v1, 0x7fff4579; GFX11TRUE16-NEXT: v_add3_u32 v4, v4, v2, 0x7fff4580; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)4581; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v1, v3, v5, vcc_lo4582; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v24583; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v2, v4, v6, vcc_lo4584; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)4585; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.l, v1.h4586; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v24587; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]4588;4589; GFX11FAKE16-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:4590; GFX11FAKE16: ; %bb.0:4591; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4592; GFX11FAKE16-NEXT: v_bfe_u32 v3, v1, 16, 14593; GFX11FAKE16-NEXT: v_bfe_u32 v4, v2, 16, 14594; GFX11FAKE16-NEXT: v_or_b32_e32 v5, 0x400000, v14595; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v14596; GFX11FAKE16-NEXT: v_or_b32_e32 v6, 0x400000, v24597; GFX11FAKE16-NEXT: v_add3_u32 v3, v3, v1, 0x7fff4598; GFX11FAKE16-NEXT: v_add3_u32 v4, v4, v2, 0x7fff4599; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)4600; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v1, v3, v5, vcc_lo4601; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v24602; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v2, v4, v6, vcc_lo4603; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)4604; GFX11FAKE16-NEXT: v_perm_b32 v1, v2, v1, 0x70603024605; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v14606; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]4607 %sign.trunc = fptrunc <2 x float> %sign to <2 x bfloat>4608 %out = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag, <2 x bfloat> %sign.trunc)4609 ret <2 x bfloat> %out4610}4611 4612define <2 x bfloat> @v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64(<2 x bfloat> %mag, <2 x double> %sign) {4613; GCN-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:4614; GCN: ; %bb.0:4615; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4616; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v04617; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v14618; GCN-NEXT: v_and_b32_e32 v2, 0x80000000, v54619; GCN-NEXT: v_and_b32_e32 v3, 0x80000000, v34620; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v24621; GCN-NEXT: v_bfe_u32 v1, v1, 16, 154622; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v34623; GCN-NEXT: v_bfe_u32 v0, v0, 16, 154624; GCN-NEXT: v_or_b32_e32 v1, v1, v24625; GCN-NEXT: v_or_b32_e32 v0, v0, v34626; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v14627; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v04628; GCN-NEXT: s_setpc_b64 s[30:31]4629;4630; GFX7-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:4631; GFX7: ; %bb.0:4632; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4633; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v14634; GFX7-NEXT: v_and_b32_e32 v2, 0x80000000, v54635; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v24636; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 154637; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v04638; GFX7-NEXT: v_or_b32_e32 v1, v1, v24639; GFX7-NEXT: v_and_b32_e32 v2, 0x80000000, v34640; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v24641; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 154642; GFX7-NEXT: v_or_b32_e32 v0, v0, v24643; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v14644; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v04645; GFX7-NEXT: s_setpc_b64 s[30:31]4646;4647; GFX8-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:4648; GFX8: ; %bb.0:4649; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4650; GFX8-NEXT: v_lshlrev_b32_e32 v1, 16, v44651; GFX8-NEXT: v_and_b32_e32 v2, 0x8000, v24652; GFX8-NEXT: v_or_b32_e32 v1, v2, v14653; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff4654; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v14655; GFX8-NEXT: s_setpc_b64 s[30:31]4656;4657; GFX9-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:4658; GFX9: ; %bb.0:4659; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4660; GFX9-NEXT: s_mov_b32 s4, 0x50401004661; GFX9-NEXT: v_perm_b32 v1, v4, v2, s44662; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff4663; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v14664; GFX9-NEXT: s_setpc_b64 s[30:31]4665;4666; GFX10-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:4667; GFX10: ; %bb.0:4668; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4669; GFX10-NEXT: v_perm_b32 v1, v4, v2, 0x50401004670; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v14671; GFX10-NEXT: s_setpc_b64 s[30:31]4672;4673; GFX11TRUE16-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:4674; GFX11TRUE16: ; %bb.0:4675; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4676; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.h, v4.l4677; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)4678; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v24679; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]4680;4681; GFX11FAKE16-LABEL: v_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:4682; GFX11FAKE16: ; %bb.0:4683; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)4684; GFX11FAKE16-NEXT: v_perm_b32 v1, v4, v2, 0x50401004685; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)4686; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v14687; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]4688 %sign.trunc = fptrunc <2 x double> %sign to <2 x bfloat>4689 %out = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag, <2 x bfloat> %sign.trunc)4690 ret <2 x bfloat> %out4691}4692 4693define amdgpu_ps <2 x i32> @s_copysign_out_v2f32_mag_v2bf16_sign_v2f32(<2 x bfloat> inreg %mag, <2 x float> inreg %sign) {4694; GCN-LABEL: s_copysign_out_v2f32_mag_v2bf16_sign_v2f32:4695; GCN: ; %bb.0:4696; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s14697; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s04698; GCN-NEXT: s_brev_b32 s0, -24699; GCN-NEXT: v_mov_b32_e32 v2, s34700; GCN-NEXT: v_mov_b32_e32 v3, s24701; GCN-NEXT: v_and_b32_e32 v1, 0x7fff0000, v14702; GCN-NEXT: v_and_b32_e32 v0, 0x7fff0000, v04703; GCN-NEXT: v_bfi_b32 v0, s0, v0, v24704; GCN-NEXT: v_bfi_b32 v1, s0, v1, v34705; GCN-NEXT: v_readfirstlane_b32 s0, v14706; GCN-NEXT: v_readfirstlane_b32 s1, v04707; GCN-NEXT: ; return to shader part epilog4708;4709; GFX7-LABEL: s_copysign_out_v2f32_mag_v2bf16_sign_v2f32:4710; GFX7: ; %bb.0:4711; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s14712; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s04713; GFX7-NEXT: v_and_b32_e32 v0, 0x7fff0000, v04714; GFX7-NEXT: s_brev_b32 s0, -24715; GFX7-NEXT: v_mov_b32_e32 v2, s34716; GFX7-NEXT: v_and_b32_e32 v1, 0x7fff0000, v14717; GFX7-NEXT: v_bfi_b32 v0, s0, v0, v24718; GFX7-NEXT: v_mov_b32_e32 v2, s24719; GFX7-NEXT: v_bfi_b32 v1, s0, v1, v24720; GFX7-NEXT: v_readfirstlane_b32 s0, v14721; GFX7-NEXT: v_readfirstlane_b32 s1, v04722; GFX7-NEXT: ; return to shader part epilog4723;4724; GFX8-LABEL: s_copysign_out_v2f32_mag_v2bf16_sign_v2f32:4725; GFX8: ; %bb.0:4726; GFX8-NEXT: s_lshl_b32 s3, s0, 164727; GFX8-NEXT: s_and_b32 s0, s0, 0x7fff00004728; GFX8-NEXT: s_brev_b32 s4, -24729; GFX8-NEXT: v_mov_b32_e32 v0, s04730; GFX8-NEXT: v_mov_b32_e32 v1, s24731; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v14732; GFX8-NEXT: v_mov_b32_e32 v1, s34733; GFX8-NEXT: v_mov_b32_e32 v2, s14734; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v24735; GFX8-NEXT: v_readfirstlane_b32 s0, v14736; GFX8-NEXT: v_readfirstlane_b32 s1, v04737; GFX8-NEXT: ; return to shader part epilog4738;4739; GFX9-LABEL: s_copysign_out_v2f32_mag_v2bf16_sign_v2f32:4740; GFX9: ; %bb.0:4741; GFX9-NEXT: s_lshl_b32 s3, s0, 164742; GFX9-NEXT: s_and_b32 s0, s0, 0x7fff00004743; GFX9-NEXT: s_brev_b32 s4, -24744; GFX9-NEXT: v_mov_b32_e32 v0, s04745; GFX9-NEXT: v_mov_b32_e32 v1, s24746; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v14747; GFX9-NEXT: v_mov_b32_e32 v1, s34748; GFX9-NEXT: v_mov_b32_e32 v2, s14749; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v24750; GFX9-NEXT: v_readfirstlane_b32 s0, v14751; GFX9-NEXT: v_readfirstlane_b32 s1, v04752; GFX9-NEXT: ; return to shader part epilog4753;4754; GFX10-LABEL: s_copysign_out_v2f32_mag_v2bf16_sign_v2f32:4755; GFX10: ; %bb.0:4756; GFX10-NEXT: v_mov_b32_e32 v0, s14757; GFX10-NEXT: v_mov_b32_e32 v1, s24758; GFX10-NEXT: s_lshl_b32 s1, s0, 164759; GFX10-NEXT: s_and_b32 s0, s0, 0x7fff00004760; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v04761; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, s0, v14762; GFX10-NEXT: v_readfirstlane_b32 s0, v04763; GFX10-NEXT: v_readfirstlane_b32 s1, v14764; GFX10-NEXT: ; return to shader part epilog4765;4766; GFX11-LABEL: s_copysign_out_v2f32_mag_v2bf16_sign_v2f32:4767; GFX11: ; %bb.0:4768; GFX11-NEXT: v_dual_mov_b32 v0, s1 :: v_dual_mov_b32 v1, s24769; GFX11-NEXT: s_lshl_b32 s1, s0, 164770; GFX11-NEXT: s_and_b32 s0, s0, 0x7fff00004771; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)4772; GFX11-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v04773; GFX11-NEXT: v_bfi_b32 v1, 0x7fffffff, s0, v14774; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4775; GFX11-NEXT: v_readfirstlane_b32 s0, v04776; GFX11-NEXT: v_readfirstlane_b32 s1, v14777; GFX11-NEXT: ; return to shader part epilog4778 %mag.ext = fpext <2 x bfloat> %mag to <2 x float>4779 %out = call <2 x float> @llvm.copysign.v2f32(<2 x float> %mag.ext, <2 x float> %sign)4780 %cast = bitcast <2 x float> %out to <2 x i32>4781 ret <2 x i32> %cast4782}4783 4784define amdgpu_ps <2 x i32> @s_copysign_out_v2f32_mag_v2f32_sign_v2bf16(<2 x float> inreg %mag, <2 x bfloat> inreg %sign) {4785; GCN-LABEL: s_copysign_out_v2f32_mag_v2f32_sign_v2bf16:4786; GCN: ; %bb.0:4787; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s24788; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s34789; GCN-NEXT: s_brev_b32 s2, -24790; GCN-NEXT: v_mov_b32_e32 v2, s14791; GCN-NEXT: v_mov_b32_e32 v3, s04792; GCN-NEXT: v_bfi_b32 v1, s2, v2, v14793; GCN-NEXT: v_bfi_b32 v0, s2, v3, v04794; GCN-NEXT: v_readfirstlane_b32 s0, v04795; GCN-NEXT: v_readfirstlane_b32 s1, v14796; GCN-NEXT: ; return to shader part epilog4797;4798; GFX7-LABEL: s_copysign_out_v2f32_mag_v2f32_sign_v2bf16:4799; GFX7: ; %bb.0:4800; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s24801; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s34802; GFX7-NEXT: s_brev_b32 s2, -24803; GFX7-NEXT: v_mov_b32_e32 v2, s14804; GFX7-NEXT: v_bfi_b32 v1, s2, v2, v14805; GFX7-NEXT: v_mov_b32_e32 v2, s04806; GFX7-NEXT: v_bfi_b32 v0, s2, v2, v04807; GFX7-NEXT: v_readfirstlane_b32 s0, v04808; GFX7-NEXT: v_readfirstlane_b32 s1, v14809; GFX7-NEXT: ; return to shader part epilog4810;4811; GFX8-LABEL: s_copysign_out_v2f32_mag_v2f32_sign_v2bf16:4812; GFX8: ; %bb.0:4813; GFX8-NEXT: s_lshr_b32 s3, s2, 164814; GFX8-NEXT: v_lshlrev_b32_e64 v0, 16, s24815; GFX8-NEXT: s_brev_b32 s2, -24816; GFX8-NEXT: v_mov_b32_e32 v1, s04817; GFX8-NEXT: v_bfi_b32 v0, s2, v1, v04818; GFX8-NEXT: v_lshlrev_b32_e64 v1, 16, s34819; GFX8-NEXT: v_mov_b32_e32 v2, s14820; GFX8-NEXT: v_bfi_b32 v1, s2, v2, v14821; GFX8-NEXT: v_readfirstlane_b32 s0, v04822; GFX8-NEXT: v_readfirstlane_b32 s1, v14823; GFX8-NEXT: ; return to shader part epilog4824;4825; GFX9-LABEL: s_copysign_out_v2f32_mag_v2f32_sign_v2bf16:4826; GFX9: ; %bb.0:4827; GFX9-NEXT: s_lshr_b32 s3, s2, 164828; GFX9-NEXT: v_lshlrev_b32_e64 v0, 16, s24829; GFX9-NEXT: s_brev_b32 s2, -24830; GFX9-NEXT: v_mov_b32_e32 v1, s04831; GFX9-NEXT: v_bfi_b32 v0, s2, v1, v04832; GFX9-NEXT: v_lshlrev_b32_e64 v1, 16, s34833; GFX9-NEXT: v_mov_b32_e32 v2, s14834; GFX9-NEXT: v_bfi_b32 v1, s2, v2, v14835; GFX9-NEXT: v_readfirstlane_b32 s0, v04836; GFX9-NEXT: v_readfirstlane_b32 s1, v14837; GFX9-NEXT: ; return to shader part epilog4838;4839; GFX10-LABEL: s_copysign_out_v2f32_mag_v2f32_sign_v2bf16:4840; GFX10: ; %bb.0:4841; GFX10-NEXT: s_lshr_b32 s3, s2, 164842; GFX10-NEXT: v_lshlrev_b32_e64 v0, 16, s24843; GFX10-NEXT: v_lshlrev_b32_e64 v1, 16, s34844; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v04845; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, s1, v14846; GFX10-NEXT: v_readfirstlane_b32 s0, v04847; GFX10-NEXT: v_readfirstlane_b32 s1, v14848; GFX10-NEXT: ; return to shader part epilog4849;4850; GFX11TRUE16-LABEL: s_copysign_out_v2f32_mag_v2f32_sign_v2bf16:4851; GFX11TRUE16: ; %bb.0:4852; GFX11TRUE16-NEXT: s_lshr_b32 s3, s2, 164853; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.h, s24854; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.h, s34855; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4856; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v04857; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, s1, v14858; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4859; GFX11TRUE16-NEXT: v_readfirstlane_b32 s0, v04860; GFX11TRUE16-NEXT: v_readfirstlane_b32 s1, v14861; GFX11TRUE16-NEXT: ; return to shader part epilog4862;4863; GFX11FAKE16-LABEL: s_copysign_out_v2f32_mag_v2f32_sign_v2bf16:4864; GFX11FAKE16: ; %bb.0:4865; GFX11FAKE16-NEXT: s_lshr_b32 s3, s2, 164866; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v0, 16, s24867; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v1, 16, s34868; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4869; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s0, v04870; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, s1, v14871; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4872; GFX11FAKE16-NEXT: v_readfirstlane_b32 s0, v04873; GFX11FAKE16-NEXT: v_readfirstlane_b32 s1, v14874; GFX11FAKE16-NEXT: ; return to shader part epilog4875 %sign.ext = fpext <2 x bfloat> %sign to <2 x float>4876 %out = call <2 x float> @llvm.copysign.v2f32(<2 x float> %mag, <2 x float> %sign.ext)4877 %cast = bitcast <2 x float> %out to <2 x i32>4878 ret <2 x i32> %cast4879}4880 4881define amdgpu_ps <4 x i32> @s_copysign_out_v2f64_mag_v2f64_sign_v2bf16(<2 x double> inreg %mag, <2 x bfloat> inreg %sign) {4882; GCN-LABEL: s_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4883; GCN: ; %bb.0:4884; GCN-NEXT: s_brev_b32 s6, -24885; GCN-NEXT: v_mov_b32_e32 v0, s34886; GCN-NEXT: v_mov_b32_e32 v1, s54887; GCN-NEXT: v_mov_b32_e32 v2, s14888; GCN-NEXT: v_mov_b32_e32 v3, s44889; GCN-NEXT: v_bfi_b32 v0, s6, v0, v14890; GCN-NEXT: v_bfi_b32 v1, s6, v2, v34891; GCN-NEXT: v_readfirstlane_b32 s1, v14892; GCN-NEXT: v_readfirstlane_b32 s3, v04893; GCN-NEXT: ; return to shader part epilog4894;4895; GFX7-LABEL: s_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4896; GFX7: ; %bb.0:4897; GFX7-NEXT: s_brev_b32 s6, -24898; GFX7-NEXT: v_mov_b32_e32 v0, s34899; GFX7-NEXT: v_mov_b32_e32 v1, s54900; GFX7-NEXT: v_bfi_b32 v0, s6, v0, v14901; GFX7-NEXT: v_mov_b32_e32 v1, s14902; GFX7-NEXT: v_mov_b32_e32 v2, s44903; GFX7-NEXT: v_bfi_b32 v1, s6, v1, v24904; GFX7-NEXT: v_readfirstlane_b32 s1, v14905; GFX7-NEXT: v_readfirstlane_b32 s3, v04906; GFX7-NEXT: ; return to shader part epilog4907;4908; GFX8-LABEL: s_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4909; GFX8: ; %bb.0:4910; GFX8-NEXT: v_lshlrev_b32_e64 v0, 16, s44911; GFX8-NEXT: s_brev_b32 s5, -24912; GFX8-NEXT: v_mov_b32_e32 v1, s14913; GFX8-NEXT: s_lshr_b32 s1, s4, 164914; GFX8-NEXT: v_bfi_b32 v0, s5, v1, v04915; GFX8-NEXT: v_lshlrev_b32_e64 v1, 16, s14916; GFX8-NEXT: v_mov_b32_e32 v2, s34917; GFX8-NEXT: v_bfi_b32 v1, s5, v2, v14918; GFX8-NEXT: v_readfirstlane_b32 s1, v04919; GFX8-NEXT: v_readfirstlane_b32 s3, v14920; GFX8-NEXT: ; return to shader part epilog4921;4922; GFX9-LABEL: s_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4923; GFX9: ; %bb.0:4924; GFX9-NEXT: v_lshlrev_b32_e64 v0, 16, s44925; GFX9-NEXT: s_brev_b32 s5, -24926; GFX9-NEXT: v_mov_b32_e32 v1, s14927; GFX9-NEXT: s_lshr_b32 s1, s4, 164928; GFX9-NEXT: v_bfi_b32 v0, s5, v1, v04929; GFX9-NEXT: v_lshlrev_b32_e64 v1, 16, s14930; GFX9-NEXT: v_mov_b32_e32 v2, s34931; GFX9-NEXT: v_bfi_b32 v1, s5, v2, v14932; GFX9-NEXT: v_readfirstlane_b32 s1, v04933; GFX9-NEXT: v_readfirstlane_b32 s3, v14934; GFX9-NEXT: ; return to shader part epilog4935;4936; GFX10-LABEL: s_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4937; GFX10: ; %bb.0:4938; GFX10-NEXT: v_lshlrev_b32_e64 v0, 16, s44939; GFX10-NEXT: s_lshr_b32 s4, s4, 164940; GFX10-NEXT: v_lshlrev_b32_e64 v1, 16, s44941; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v04942; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, s3, v14943; GFX10-NEXT: v_readfirstlane_b32 s1, v04944; GFX10-NEXT: v_readfirstlane_b32 s3, v14945; GFX10-NEXT: ; return to shader part epilog4946;4947; GFX11TRUE16-LABEL: s_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4948; GFX11TRUE16: ; %bb.0:4949; GFX11TRUE16-NEXT: s_lshr_b32 s5, s4, 164950; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.h, s44951; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.h, s54952; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4953; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v04954; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, s3, v14955; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4956; GFX11TRUE16-NEXT: v_readfirstlane_b32 s1, v04957; GFX11TRUE16-NEXT: v_readfirstlane_b32 s3, v14958; GFX11TRUE16-NEXT: ; return to shader part epilog4959;4960; GFX11FAKE16-LABEL: s_copysign_out_v2f64_mag_v2f64_sign_v2bf16:4961; GFX11FAKE16: ; %bb.0:4962; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v0, 16, s44963; GFX11FAKE16-NEXT: s_lshr_b32 s4, s4, 164964; GFX11FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_2)4965; GFX11FAKE16-NEXT: v_lshlrev_b32_e64 v1, 16, s44966; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, s1, v04967; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)4968; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, s3, v14969; GFX11FAKE16-NEXT: v_readfirstlane_b32 s1, v04970; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)4971; GFX11FAKE16-NEXT: v_readfirstlane_b32 s3, v14972; GFX11FAKE16-NEXT: ; return to shader part epilog4973 %sign.ext = fpext <2 x bfloat> %sign to <2 x double>4974 %out = call <2 x double> @llvm.copysign.v2f64(<2 x double> %mag, <2 x double> %sign.ext)4975 %cast = bitcast <2 x double> %out to <4 x i32>4976 ret <4 x i32> %cast4977}4978 4979define amdgpu_ps i32 @s_copysign_out_v2bf16_mag_v2f32_sign_v2bf16(<2 x float> inreg %mag, <2 x bfloat> inreg %sign) {4980; GCN-LABEL: s_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:4981; GCN: ; %bb.0:4982; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s34983; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s24984; GCN-NEXT: v_mul_f32_e64 v2, 1.0, s14985; GCN-NEXT: v_mul_f32_e64 v3, 1.0, s04986; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v04987; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v14988; GCN-NEXT: v_bfe_u32 v3, v3, 16, 154989; GCN-NEXT: v_bfe_u32 v2, v2, 16, 154990; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v14991; GCN-NEXT: v_and_b32_e32 v0, 0x8000, v04992; GCN-NEXT: v_or_b32_e32 v1, v3, v14993; GCN-NEXT: v_or_b32_e32 v0, v2, v04994; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v04995; GCN-NEXT: v_or_b32_e32 v0, v1, v04996; GCN-NEXT: v_readfirstlane_b32 s0, v04997; GCN-NEXT: ; return to shader part epilog4998;4999; GFX7-LABEL: s_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:5000; GFX7: ; %bb.0:5001; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s35002; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v05003; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s25004; GFX7-NEXT: v_mul_f32_e64 v2, 1.0, s15005; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v15006; GFX7-NEXT: v_mul_f32_e64 v3, 1.0, s05007; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v05008; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 155009; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v15010; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 155011; GFX7-NEXT: v_or_b32_e32 v0, v2, v05012; GFX7-NEXT: v_or_b32_e32 v1, v3, v15013; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v05014; GFX7-NEXT: v_or_b32_e32 v0, v1, v05015; GFX7-NEXT: v_readfirstlane_b32 s0, v05016; GFX7-NEXT: ; return to shader part epilog5017;5018; GFX8-LABEL: s_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:5019; GFX8: ; %bb.0:5020; GFX8-NEXT: s_bfe_u32 s4, s0, 0x100105021; GFX8-NEXT: s_add_i32 s4, s4, s05022; GFX8-NEXT: s_or_b32 s3, s0, 0x4000005023; GFX8-NEXT: s_add_i32 s6, s4, 0x7fff5024; GFX8-NEXT: v_cmp_u_f32_e64 s[4:5], s0, s05025; GFX8-NEXT: s_and_b64 s[4:5], s[4:5], exec5026; GFX8-NEXT: s_cselect_b32 s0, s3, s65027; GFX8-NEXT: s_bfe_u32 s4, s1, 0x100105028; GFX8-NEXT: s_add_i32 s4, s4, s15029; GFX8-NEXT: s_or_b32 s3, s1, 0x4000005030; GFX8-NEXT: s_add_i32 s6, s4, 0x7fff5031; GFX8-NEXT: v_cmp_u_f32_e64 s[4:5], s1, s15032; GFX8-NEXT: s_and_b64 s[4:5], s[4:5], exec5033; GFX8-NEXT: s_cselect_b32 s1, s3, s65034; GFX8-NEXT: s_lshr_b32 s1, s1, 165035; GFX8-NEXT: s_lshr_b64 s[0:1], s[0:1], 165036; GFX8-NEXT: s_mov_b32 s1, 0x7fff7fff5037; GFX8-NEXT: v_mov_b32_e32 v0, s05038; GFX8-NEXT: v_mov_b32_e32 v1, s25039; GFX8-NEXT: v_bfi_b32 v0, s1, v0, v15040; GFX8-NEXT: v_readfirstlane_b32 s0, v05041; GFX8-NEXT: ; return to shader part epilog5042;5043; GFX9-LABEL: s_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:5044; GFX9: ; %bb.0:5045; GFX9-NEXT: s_bfe_u32 s4, s1, 0x100105046; GFX9-NEXT: s_add_i32 s4, s4, s15047; GFX9-NEXT: s_or_b32 s3, s1, 0x4000005048; GFX9-NEXT: s_add_i32 s6, s4, 0x7fff5049; GFX9-NEXT: v_cmp_u_f32_e64 s[4:5], s1, s15050; GFX9-NEXT: s_and_b64 s[4:5], s[4:5], exec5051; GFX9-NEXT: s_cselect_b32 s1, s3, s65052; GFX9-NEXT: s_lshr_b32 s3, s1, 165053; GFX9-NEXT: s_bfe_u32 s1, s0, 0x100105054; GFX9-NEXT: s_add_i32 s1, s1, s05055; GFX9-NEXT: s_or_b32 s4, s0, 0x4000005056; GFX9-NEXT: s_add_i32 s5, s1, 0x7fff5057; GFX9-NEXT: v_cmp_u_f32_e64 s[0:1], s0, s05058; GFX9-NEXT: s_and_b64 s[0:1], s[0:1], exec5059; GFX9-NEXT: s_cselect_b32 s0, s4, s55060; GFX9-NEXT: s_lshr_b32 s0, s0, 165061; GFX9-NEXT: s_pack_ll_b32_b16 s0, s0, s35062; GFX9-NEXT: s_mov_b32 s1, 0x7fff7fff5063; GFX9-NEXT: v_mov_b32_e32 v0, s05064; GFX9-NEXT: v_mov_b32_e32 v1, s25065; GFX9-NEXT: v_bfi_b32 v0, s1, v0, v15066; GFX9-NEXT: v_readfirstlane_b32 s0, v05067; GFX9-NEXT: ; return to shader part epilog5068;5069; GFX10-LABEL: s_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:5070; GFX10: ; %bb.0:5071; GFX10-NEXT: s_bfe_u32 s3, s1, 0x100105072; GFX10-NEXT: v_cmp_u_f32_e64 s4, s1, s15073; GFX10-NEXT: s_add_i32 s3, s3, s15074; GFX10-NEXT: s_bitset1_b32 s1, 225075; GFX10-NEXT: s_addk_i32 s3, 0x7fff5076; GFX10-NEXT: v_mov_b32_e32 v0, s25077; GFX10-NEXT: s_and_b32 s4, s4, exec_lo5078; GFX10-NEXT: s_cselect_b32 s1, s1, s35079; GFX10-NEXT: s_bfe_u32 s3, s0, 0x100105080; GFX10-NEXT: v_cmp_u_f32_e64 s4, s0, s05081; GFX10-NEXT: s_add_i32 s3, s3, s05082; GFX10-NEXT: s_lshr_b32 s1, s1, 165083; GFX10-NEXT: s_bitset1_b32 s0, 225084; GFX10-NEXT: s_addk_i32 s3, 0x7fff5085; GFX10-NEXT: s_and_b32 s4, s4, exec_lo5086; GFX10-NEXT: s_cselect_b32 s0, s0, s35087; GFX10-NEXT: s_lshr_b32 s0, s0, 165088; GFX10-NEXT: s_pack_ll_b32_b16 s0, s0, s15089; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05090; GFX10-NEXT: v_readfirstlane_b32 s0, v05091; GFX10-NEXT: ; return to shader part epilog5092;5093; GFX11-LABEL: s_copysign_out_v2bf16_mag_v2f32_sign_v2bf16:5094; GFX11: ; %bb.0:5095; GFX11-NEXT: s_bfe_u32 s3, s1, 0x100105096; GFX11-NEXT: v_cmp_u_f32_e64 s4, s1, s15097; GFX11-NEXT: s_add_i32 s3, s3, s15098; GFX11-NEXT: s_bitset1_b32 s1, 225099; GFX11-NEXT: s_addk_i32 s3, 0x7fff5100; GFX11-NEXT: v_mov_b32_e32 v0, s25101; GFX11-NEXT: s_and_b32 s4, s4, exec_lo5102; GFX11-NEXT: s_cselect_b32 s1, s1, s35103; GFX11-NEXT: s_bfe_u32 s3, s0, 0x100105104; GFX11-NEXT: v_cmp_u_f32_e64 s4, s0, s05105; GFX11-NEXT: s_add_i32 s3, s3, s05106; GFX11-NEXT: s_lshr_b32 s1, s1, 165107; GFX11-NEXT: s_bitset1_b32 s0, 225108; GFX11-NEXT: s_addk_i32 s3, 0x7fff5109; GFX11-NEXT: s_and_b32 s4, s4, exec_lo5110; GFX11-NEXT: s_cselect_b32 s0, s0, s35111; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)5112; GFX11-NEXT: s_lshr_b32 s0, s0, 165113; GFX11-NEXT: s_pack_ll_b32_b16 s0, s0, s15114; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)5115; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05116; GFX11-NEXT: v_readfirstlane_b32 s0, v05117; GFX11-NEXT: ; return to shader part epilog5118 %mag.trunc = fptrunc <2 x float> %mag to <2 x bfloat>5119 %out = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag.trunc, <2 x bfloat> %sign)5120 %cast = bitcast <2 x bfloat> %out to i325121 ret i32 %cast5122}5123 5124define amdgpu_ps i32 @s_copysign_out_v2bf16_mag_v2f64_sign_v2bf16(<2 x double> inreg %mag, <2 x bfloat> inreg %sign) {5125; GCN-LABEL: s_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:5126; GCN: ; %bb.0:5127; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s55128; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s45129; GCN-NEXT: v_cvt_f32_f64_e32 v2, s[2:3]5130; GCN-NEXT: v_cvt_f32_f64_e32 v3, s[0:1]5131; GCN-NEXT: v_lshrrev_b32_e32 v0, 16, v05132; GCN-NEXT: v_lshrrev_b32_e32 v1, 16, v15133; GCN-NEXT: v_bfe_u32 v3, v3, 16, 155134; GCN-NEXT: v_bfe_u32 v2, v2, 16, 155135; GCN-NEXT: v_and_b32_e32 v1, 0x8000, v15136; GCN-NEXT: v_and_b32_e32 v0, 0x8000, v05137; GCN-NEXT: v_or_b32_e32 v1, v3, v15138; GCN-NEXT: v_or_b32_e32 v0, v2, v05139; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v05140; GCN-NEXT: v_or_b32_e32 v0, v1, v05141; GCN-NEXT: v_readfirstlane_b32 s0, v05142; GCN-NEXT: ; return to shader part epilog5143;5144; GFX7-LABEL: s_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:5145; GFX7: ; %bb.0:5146; GFX7-NEXT: v_cvt_f32_f64_e32 v2, s[0:1]5147; GFX7-NEXT: v_cvt_f32_f64_e32 v3, s[2:3]5148; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s45149; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s55150; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v15151; GFX7-NEXT: v_lshrrev_b32_e32 v0, 16, v05152; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v15153; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 155154; GFX7-NEXT: v_or_b32_e32 v1, v2, v15155; GFX7-NEXT: v_and_b32_e32 v0, 0x8000, v05156; GFX7-NEXT: v_bfe_u32 v2, v3, 16, 155157; GFX7-NEXT: v_or_b32_e32 v0, v2, v05158; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v05159; GFX7-NEXT: v_or_b32_e32 v0, v1, v05160; GFX7-NEXT: v_readfirstlane_b32 s0, v05161; GFX7-NEXT: ; return to shader part epilog5162;5163; GFX8-LABEL: s_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:5164; GFX8: ; %bb.0:5165; GFX8-NEXT: v_cvt_f32_f64_e32 v2, s[0:1]5166; GFX8-NEXT: v_cvt_f32_f64_e32 v3, s[2:3]5167; GFX8-NEXT: v_cmp_u_f64_e64 s[6:7], s[0:1], s[0:1]5168; GFX8-NEXT: v_cvt_f64_f32_e32 v[0:1], v25169; GFX8-NEXT: v_readfirstlane_b32 s5, v25170; GFX8-NEXT: s_bitcmp1_b32 s5, 05171; GFX8-NEXT: s_cselect_b64 s[10:11], -1, 05172; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, s[0:1], v[0:1]5173; GFX8-NEXT: v_cmp_gt_f64_e64 s[8:9], |s[0:1]|, |v[0:1]|5174; GFX8-NEXT: v_cvt_f64_f32_e32 v[0:1], v35175; GFX8-NEXT: v_cmp_nlg_f64_e64 s[0:1], s[2:3], v[0:1]5176; GFX8-NEXT: v_cmp_gt_f64_e64 s[12:13], |s[2:3]|, |v[0:1]|5177; GFX8-NEXT: s_or_b64 s[10:11], vcc, s[10:11]5178; GFX8-NEXT: s_and_b64 s[8:9], s[8:9], exec5179; GFX8-NEXT: s_cselect_b32 s8, 1, -15180; GFX8-NEXT: s_add_i32 s14, s5, s85181; GFX8-NEXT: s_and_b64 s[8:9], s[10:11], exec5182; GFX8-NEXT: s_cselect_b32 s5, s5, s145183; GFX8-NEXT: s_bfe_u32 s8, s5, 0x100105184; GFX8-NEXT: s_add_i32 s8, s8, s55185; GFX8-NEXT: s_addk_i32 s8, 0x7fff5186; GFX8-NEXT: s_bitset1_b32 s5, 225187; GFX8-NEXT: s_and_b64 s[6:7], s[6:7], exec5188; GFX8-NEXT: s_cselect_b32 s6, s5, s85189; GFX8-NEXT: v_readfirstlane_b32 s5, v35190; GFX8-NEXT: s_bitcmp1_b32 s5, 05191; GFX8-NEXT: s_cselect_b64 s[8:9], -1, 05192; GFX8-NEXT: s_or_b64 s[0:1], s[0:1], s[8:9]5193; GFX8-NEXT: s_and_b64 s[8:9], s[12:13], exec5194; GFX8-NEXT: v_cmp_u_f64_e64 s[2:3], s[2:3], s[2:3]5195; GFX8-NEXT: s_cselect_b32 s7, 1, -15196; GFX8-NEXT: s_add_i32 s7, s5, s75197; GFX8-NEXT: s_and_b64 s[0:1], s[0:1], exec5198; GFX8-NEXT: s_cselect_b32 s0, s5, s75199; GFX8-NEXT: s_bfe_u32 s1, s0, 0x100105200; GFX8-NEXT: s_add_i32 s1, s1, s05201; GFX8-NEXT: s_add_i32 s5, s1, 0x7fff5202; GFX8-NEXT: s_or_b32 s7, s0, 0x4000005203; GFX8-NEXT: s_and_b64 s[0:1], s[2:3], exec5204; GFX8-NEXT: s_cselect_b32 s0, s7, s55205; GFX8-NEXT: s_lshr_b32 s7, s0, 165206; GFX8-NEXT: s_lshr_b64 s[0:1], s[6:7], 165207; GFX8-NEXT: s_mov_b32 s1, 0x7fff7fff5208; GFX8-NEXT: v_mov_b32_e32 v0, s05209; GFX8-NEXT: v_mov_b32_e32 v1, s45210; GFX8-NEXT: v_bfi_b32 v0, s1, v0, v15211; GFX8-NEXT: v_readfirstlane_b32 s0, v05212; GFX8-NEXT: ; return to shader part epilog5213;5214; GFX9-LABEL: s_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:5215; GFX9: ; %bb.0:5216; GFX9-NEXT: v_cvt_f32_f64_e32 v2, s[2:3]5217; GFX9-NEXT: v_cvt_f32_f64_e32 v3, s[0:1]5218; GFX9-NEXT: v_cmp_u_f64_e64 s[8:9], s[2:3], s[2:3]5219; GFX9-NEXT: v_cvt_f64_f32_e32 v[0:1], v25220; GFX9-NEXT: v_readfirstlane_b32 s5, v25221; GFX9-NEXT: s_bitcmp1_b32 s5, 05222; GFX9-NEXT: s_cselect_b64 s[10:11], -1, 05223; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, s[2:3], v[0:1]5224; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |s[2:3]|, |v[0:1]|5225; GFX9-NEXT: v_cvt_f64_f32_e32 v[0:1], v35226; GFX9-NEXT: v_cmp_nlg_f64_e64 s[2:3], s[0:1], v[0:1]5227; GFX9-NEXT: s_or_b64 s[10:11], vcc, s[10:11]5228; GFX9-NEXT: s_and_b64 s[6:7], s[6:7], exec5229; GFX9-NEXT: s_cselect_b32 s6, 1, -15230; GFX9-NEXT: s_add_i32 s12, s5, s65231; GFX9-NEXT: s_and_b64 s[6:7], s[10:11], exec5232; GFX9-NEXT: s_cselect_b32 s5, s5, s125233; GFX9-NEXT: s_bfe_u32 s6, s5, 0x100105234; GFX9-NEXT: s_or_b32 s10, s5, 0x4000005235; GFX9-NEXT: s_add_i32 s5, s6, s55236; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |s[0:1]|, |v[0:1]|5237; GFX9-NEXT: s_addk_i32 s5, 0x7fff5238; GFX9-NEXT: s_and_b64 s[8:9], s[8:9], exec5239; GFX9-NEXT: s_cselect_b32 s5, s10, s55240; GFX9-NEXT: s_lshr_b32 s5, s5, 165241; GFX9-NEXT: v_readfirstlane_b32 s10, v35242; GFX9-NEXT: s_bitcmp1_b32 s10, 05243; GFX9-NEXT: s_cselect_b64 s[8:9], -1, 05244; GFX9-NEXT: s_or_b64 s[2:3], s[2:3], s[8:9]5245; GFX9-NEXT: s_and_b64 s[6:7], s[6:7], exec5246; GFX9-NEXT: v_cmp_u_f64_e64 s[0:1], s[0:1], s[0:1]5247; GFX9-NEXT: s_cselect_b32 s6, 1, -15248; GFX9-NEXT: s_add_i32 s6, s10, s65249; GFX9-NEXT: s_and_b64 s[2:3], s[2:3], exec5250; GFX9-NEXT: s_cselect_b32 s2, s10, s65251; GFX9-NEXT: s_bfe_u32 s3, s2, 0x100105252; GFX9-NEXT: s_add_i32 s3, s3, s25253; GFX9-NEXT: s_addk_i32 s3, 0x7fff5254; GFX9-NEXT: s_bitset1_b32 s2, 225255; GFX9-NEXT: s_and_b64 s[0:1], s[0:1], exec5256; GFX9-NEXT: s_cselect_b32 s0, s2, s35257; GFX9-NEXT: s_lshr_b32 s0, s0, 165258; GFX9-NEXT: s_pack_ll_b32_b16 s0, s0, s55259; GFX9-NEXT: s_mov_b32 s1, 0x7fff7fff5260; GFX9-NEXT: v_mov_b32_e32 v0, s05261; GFX9-NEXT: v_mov_b32_e32 v1, s45262; GFX9-NEXT: v_bfi_b32 v0, s1, v0, v15263; GFX9-NEXT: v_readfirstlane_b32 s0, v05264; GFX9-NEXT: ; return to shader part epilog5265;5266; GFX10-LABEL: s_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:5267; GFX10: ; %bb.0:5268; GFX10-NEXT: v_cvt_f32_f64_e32 v4, s[2:3]5269; GFX10-NEXT: v_cvt_f32_f64_e32 v5, s[0:1]5270; GFX10-NEXT: v_cvt_f64_f32_e32 v[0:1], v45271; GFX10-NEXT: v_cvt_f64_f32_e32 v[2:3], v55272; GFX10-NEXT: v_readfirstlane_b32 s6, v45273; GFX10-NEXT: s_bitcmp1_b32 s6, 05274; GFX10-NEXT: s_cselect_b32 s7, -1, 05275; GFX10-NEXT: v_cmp_nlg_f64_e32 vcc_lo, s[2:3], v[0:1]5276; GFX10-NEXT: v_cmp_gt_f64_e64 s5, |s[2:3]|, |v[0:1]|5277; GFX10-NEXT: v_cmp_u_f64_e64 s3, s[2:3], s[2:3]5278; GFX10-NEXT: v_cmp_nlg_f64_e64 s2, s[0:1], v[2:3]5279; GFX10-NEXT: v_cmp_gt_f64_e64 s8, |s[0:1]|, |v[2:3]|5280; GFX10-NEXT: v_cmp_u_f64_e64 s0, s[0:1], s[0:1]5281; GFX10-NEXT: v_mov_b32_e32 v0, s45282; GFX10-NEXT: s_or_b32 s7, vcc_lo, s75283; GFX10-NEXT: s_and_b32 s5, s5, exec_lo5284; GFX10-NEXT: s_cselect_b32 s5, 1, -15285; GFX10-NEXT: s_add_i32 s5, s6, s55286; GFX10-NEXT: s_and_b32 s7, s7, exec_lo5287; GFX10-NEXT: s_cselect_b32 s5, s6, s55288; GFX10-NEXT: v_readfirstlane_b32 s6, v55289; GFX10-NEXT: s_bfe_u32 s1, s5, 0x100105290; GFX10-NEXT: s_add_i32 s1, s1, s55291; GFX10-NEXT: s_bitset1_b32 s5, 225292; GFX10-NEXT: s_addk_i32 s1, 0x7fff5293; GFX10-NEXT: s_and_b32 s3, s3, exec_lo5294; GFX10-NEXT: s_cselect_b32 s1, s5, s15295; GFX10-NEXT: s_lshr_b32 s1, s1, 165296; GFX10-NEXT: s_bitcmp1_b32 s6, 05297; GFX10-NEXT: s_cselect_b32 s3, -1, 05298; GFX10-NEXT: s_or_b32 s2, s2, s35299; GFX10-NEXT: s_and_b32 s3, s8, exec_lo5300; GFX10-NEXT: s_cselect_b32 s3, 1, -15301; GFX10-NEXT: s_add_i32 s3, s6, s35302; GFX10-NEXT: s_and_b32 s2, s2, exec_lo5303; GFX10-NEXT: s_cselect_b32 s2, s6, s35304; GFX10-NEXT: s_bfe_u32 s3, s2, 0x100105305; GFX10-NEXT: s_add_i32 s3, s3, s25306; GFX10-NEXT: s_bitset1_b32 s2, 225307; GFX10-NEXT: s_addk_i32 s3, 0x7fff5308; GFX10-NEXT: s_and_b32 s0, s0, exec_lo5309; GFX10-NEXT: s_cselect_b32 s0, s2, s35310; GFX10-NEXT: s_lshr_b32 s0, s0, 165311; GFX10-NEXT: s_pack_ll_b32_b16 s0, s0, s15312; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05313; GFX10-NEXT: v_readfirstlane_b32 s0, v05314; GFX10-NEXT: ; return to shader part epilog5315;5316; GFX11-LABEL: s_copysign_out_v2bf16_mag_v2f64_sign_v2bf16:5317; GFX11: ; %bb.0:5318; GFX11-NEXT: v_cvt_f32_f64_e32 v4, s[2:3]5319; GFX11-NEXT: v_cvt_f32_f64_e32 v5, s[0:1]5320; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)5321; GFX11-NEXT: v_cvt_f64_f32_e32 v[0:1], v45322; GFX11-NEXT: v_cvt_f64_f32_e32 v[2:3], v55323; GFX11-NEXT: v_readfirstlane_b32 s7, v45324; GFX11-NEXT: s_bitcmp1_b32 s7, 05325; GFX11-NEXT: v_cmp_nlg_f64_e32 vcc_lo, s[2:3], v[0:1]5326; GFX11-NEXT: v_cmp_gt_f64_e64 s5, |s[2:3]|, |v[0:1]|5327; GFX11-NEXT: v_cmp_u_f64_e64 s3, s[2:3], s[2:3]5328; GFX11-NEXT: v_cmp_nlg_f64_e64 s2, s[0:1], v[2:3]5329; GFX11-NEXT: v_cmp_gt_f64_e64 s6, |s[0:1]|, |v[2:3]|5330; GFX11-NEXT: v_cmp_u_f64_e64 s0, s[0:1], s[0:1]5331; GFX11-NEXT: s_cselect_b32 s1, -1, 05332; GFX11-NEXT: v_mov_b32_e32 v0, s45333; GFX11-NEXT: s_or_b32 s1, vcc_lo, s15334; GFX11-NEXT: s_and_b32 s5, s5, exec_lo5335; GFX11-NEXT: s_cselect_b32 s5, 1, -15336; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_4) | instid1(SALU_CYCLE_1)5337; GFX11-NEXT: s_add_i32 s5, s7, s55338; GFX11-NEXT: s_and_b32 s1, s1, exec_lo5339; GFX11-NEXT: s_cselect_b32 s1, s7, s55340; GFX11-NEXT: v_readfirstlane_b32 s7, v55341; GFX11-NEXT: s_bfe_u32 s5, s1, 0x100105342; GFX11-NEXT: s_add_i32 s5, s5, s15343; GFX11-NEXT: s_bitset1_b32 s1, 225344; GFX11-NEXT: s_addk_i32 s5, 0x7fff5345; GFX11-NEXT: s_and_b32 s3, s3, exec_lo5346; GFX11-NEXT: s_cselect_b32 s1, s1, s55347; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_2) | instid1(SALU_CYCLE_1)5348; GFX11-NEXT: s_lshr_b32 s1, s1, 165349; GFX11-NEXT: s_bitcmp1_b32 s7, 05350; GFX11-NEXT: s_cselect_b32 s3, -1, 05351; GFX11-NEXT: s_or_b32 s2, s2, s35352; GFX11-NEXT: s_and_b32 s3, s6, exec_lo5353; GFX11-NEXT: s_cselect_b32 s3, 1, -15354; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_2) | instid1(SALU_CYCLE_1)5355; GFX11-NEXT: s_add_i32 s3, s7, s35356; GFX11-NEXT: s_and_b32 s2, s2, exec_lo5357; GFX11-NEXT: s_cselect_b32 s2, s7, s35358; GFX11-NEXT: s_bfe_u32 s3, s2, 0x100105359; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_4) | instid1(SALU_CYCLE_1)5360; GFX11-NEXT: s_add_i32 s3, s3, s25361; GFX11-NEXT: s_bitset1_b32 s2, 225362; GFX11-NEXT: s_addk_i32 s3, 0x7fff5363; GFX11-NEXT: s_and_b32 s0, s0, exec_lo5364; GFX11-NEXT: s_cselect_b32 s0, s2, s35365; GFX11-NEXT: s_lshr_b32 s0, s0, 165366; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)5367; GFX11-NEXT: s_pack_ll_b32_b16 s0, s0, s15368; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05369; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)5370; GFX11-NEXT: v_readfirstlane_b32 s0, v05371; GFX11-NEXT: ; return to shader part epilog5372 %mag.trunc = fptrunc <2 x double> %mag to <2 x bfloat>5373 %result = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag.trunc, <2 x bfloat> %sign)5374 %cast = bitcast <2 x bfloat> %result to i325375 ret i32 %cast5376}5377 5378define amdgpu_ps i32 @s_copysign_out_v2bf16_mag_v2bf16_sign_v2f32(<2 x bfloat> inreg %mag, <2 x float> inreg %sign) {5379; GCN-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:5380; GCN: ; %bb.0:5381; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s15382; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s05383; GCN-NEXT: v_mul_f32_e64 v2, 1.0, s35384; GCN-NEXT: v_mul_f32_e64 v3, 1.0, s25385; GCN-NEXT: v_lshrrev_b32_e32 v2, 16, v25386; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v35387; GCN-NEXT: v_bfe_u32 v1, v1, 16, 155388; GCN-NEXT: v_bfe_u32 v0, v0, 16, 155389; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v35390; GCN-NEXT: v_and_b32_e32 v2, 0x8000, v25391; GCN-NEXT: v_or_b32_e32 v1, v1, v35392; GCN-NEXT: v_or_b32_e32 v0, v0, v25393; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v05394; GCN-NEXT: v_or_b32_e32 v0, v1, v05395; GCN-NEXT: v_readfirstlane_b32 s0, v05396; GCN-NEXT: ; return to shader part epilog5397;5398; GFX7-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:5399; GFX7: ; %bb.0:5400; GFX7-NEXT: v_mul_f32_e64 v2, 1.0, s35401; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s15402; GFX7-NEXT: v_lshrrev_b32_e32 v2, 16, v25403; GFX7-NEXT: v_mul_f32_e64 v3, 1.0, s25404; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s05405; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v35406; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v25407; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 155408; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v35409; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 155410; GFX7-NEXT: v_or_b32_e32 v0, v0, v25411; GFX7-NEXT: v_or_b32_e32 v1, v1, v35412; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v05413; GFX7-NEXT: v_or_b32_e32 v0, v1, v05414; GFX7-NEXT: v_readfirstlane_b32 s0, v05415; GFX7-NEXT: ; return to shader part epilog5416;5417; GFX8-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:5418; GFX8: ; %bb.0:5419; GFX8-NEXT: s_bfe_u32 s3, s1, 0x100105420; GFX8-NEXT: s_add_i32 s3, s3, s15421; GFX8-NEXT: s_addk_i32 s3, 0x7fff5422; GFX8-NEXT: v_cmp_u_f32_e64 s[4:5], s1, s15423; GFX8-NEXT: s_and_b64 s[4:5], s[4:5], exec5424; GFX8-NEXT: s_cselect_b32 s4, s1, s35425; GFX8-NEXT: s_bfe_u32 s1, s2, 0x100105426; GFX8-NEXT: s_add_i32 s1, s1, s25427; GFX8-NEXT: s_addk_i32 s1, 0x7fff5428; GFX8-NEXT: v_cmp_u_f32_e64 s[6:7], s2, s25429; GFX8-NEXT: s_and_b64 s[6:7], s[6:7], exec5430; GFX8-NEXT: s_cselect_b32 s1, s2, s15431; GFX8-NEXT: s_lshr_b32 s5, s1, 165432; GFX8-NEXT: s_lshr_b64 s[2:3], s[4:5], 165433; GFX8-NEXT: s_mov_b32 s1, 0x7fff7fff5434; GFX8-NEXT: v_mov_b32_e32 v0, s05435; GFX8-NEXT: v_mov_b32_e32 v1, s25436; GFX8-NEXT: v_bfi_b32 v0, s1, v0, v15437; GFX8-NEXT: v_readfirstlane_b32 s0, v05438; GFX8-NEXT: ; return to shader part epilog5439;5440; GFX9-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:5441; GFX9: ; %bb.0:5442; GFX9-NEXT: s_bfe_u32 s3, s2, 0x100105443; GFX9-NEXT: s_add_i32 s3, s3, s25444; GFX9-NEXT: s_or_b32 s4, s2, 0x4000005445; GFX9-NEXT: s_add_i32 s5, s3, 0x7fff5446; GFX9-NEXT: v_cmp_u_f32_e64 s[2:3], s2, s25447; GFX9-NEXT: s_and_b64 s[2:3], s[2:3], exec5448; GFX9-NEXT: s_cselect_b32 s2, s4, s55449; GFX9-NEXT: s_lshr_b32 s4, s2, 165450; GFX9-NEXT: s_bfe_u32 s2, s1, 0x100105451; GFX9-NEXT: s_add_i32 s2, s2, s15452; GFX9-NEXT: s_or_b32 s5, s1, 0x4000005453; GFX9-NEXT: s_add_i32 s6, s2, 0x7fff5454; GFX9-NEXT: v_cmp_u_f32_e64 s[2:3], s1, s15455; GFX9-NEXT: s_and_b64 s[2:3], s[2:3], exec5456; GFX9-NEXT: s_cselect_b32 s1, s5, s65457; GFX9-NEXT: s_lshr_b32 s1, s1, 165458; GFX9-NEXT: s_pack_ll_b32_b16 s1, s1, s45459; GFX9-NEXT: s_mov_b32 s2, 0x7fff7fff5460; GFX9-NEXT: v_mov_b32_e32 v0, s05461; GFX9-NEXT: v_mov_b32_e32 v1, s15462; GFX9-NEXT: v_bfi_b32 v0, s2, v0, v15463; GFX9-NEXT: v_readfirstlane_b32 s0, v05464; GFX9-NEXT: ; return to shader part epilog5465;5466; GFX10-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:5467; GFX10: ; %bb.0:5468; GFX10-NEXT: s_bfe_u32 s3, s2, 0x100105469; GFX10-NEXT: v_cmp_u_f32_e64 s4, s2, s25470; GFX10-NEXT: s_add_i32 s3, s3, s25471; GFX10-NEXT: s_bitset1_b32 s2, 225472; GFX10-NEXT: s_addk_i32 s3, 0x7fff5473; GFX10-NEXT: s_and_b32 s4, s4, exec_lo5474; GFX10-NEXT: s_cselect_b32 s2, s2, s35475; GFX10-NEXT: s_bfe_u32 s3, s1, 0x100105476; GFX10-NEXT: v_cmp_u_f32_e64 s4, s1, s15477; GFX10-NEXT: s_add_i32 s3, s3, s15478; GFX10-NEXT: s_lshr_b32 s2, s2, 165479; GFX10-NEXT: s_bitset1_b32 s1, 225480; GFX10-NEXT: s_addk_i32 s3, 0x7fff5481; GFX10-NEXT: s_and_b32 s4, s4, exec_lo5482; GFX10-NEXT: s_cselect_b32 s1, s1, s35483; GFX10-NEXT: s_lshr_b32 s1, s1, 165484; GFX10-NEXT: s_pack_ll_b32_b16 s1, s1, s25485; GFX10-NEXT: v_mov_b32_e32 v0, s15486; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05487; GFX10-NEXT: v_readfirstlane_b32 s0, v05488; GFX10-NEXT: ; return to shader part epilog5489;5490; GFX11-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f32:5491; GFX11: ; %bb.0:5492; GFX11-NEXT: s_bfe_u32 s3, s2, 0x100105493; GFX11-NEXT: v_cmp_u_f32_e64 s4, s2, s25494; GFX11-NEXT: s_add_i32 s3, s3, s25495; GFX11-NEXT: s_bitset1_b32 s2, 225496; GFX11-NEXT: s_addk_i32 s3, 0x7fff5497; GFX11-NEXT: s_and_b32 s4, s4, exec_lo5498; GFX11-NEXT: s_cselect_b32 s2, s2, s35499; GFX11-NEXT: s_bfe_u32 s3, s1, 0x100105500; GFX11-NEXT: v_cmp_u_f32_e64 s4, s1, s15501; GFX11-NEXT: s_add_i32 s3, s3, s15502; GFX11-NEXT: s_lshr_b32 s2, s2, 165503; GFX11-NEXT: s_bitset1_b32 s1, 225504; GFX11-NEXT: s_addk_i32 s3, 0x7fff5505; GFX11-NEXT: s_and_b32 s4, s4, exec_lo5506; GFX11-NEXT: s_cselect_b32 s1, s1, s35507; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)5508; GFX11-NEXT: s_lshr_b32 s1, s1, 165509; GFX11-NEXT: s_pack_ll_b32_b16 s1, s1, s25510; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)5511; GFX11-NEXT: v_mov_b32_e32 v0, s15512; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05513; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)5514; GFX11-NEXT: v_readfirstlane_b32 s0, v05515; GFX11-NEXT: ; return to shader part epilog5516 %sign.trunc = fptrunc <2 x float> %sign to <2 x bfloat>5517 %out = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag, <2 x bfloat> %sign.trunc)5518 %cast = bitcast <2 x bfloat> %out to i325519 ret i32 %cast5520}5521 5522define amdgpu_ps i32 @s_copysign_out_v2bf16_mag_v2bf16_sign_v2f64(<2 x bfloat> inreg %mag, <2 x double> inreg %sign) {5523; GCN-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:5524; GCN: ; %bb.0:5525; GCN-NEXT: v_mul_f32_e64 v0, 1.0, s15526; GCN-NEXT: v_mul_f32_e64 v1, 1.0, s05527; GCN-NEXT: s_and_b32 s0, s3, 0x800000005528; GCN-NEXT: s_and_b32 s1, s5, 0x800000005529; GCN-NEXT: s_lshr_b32 s0, s0, 165530; GCN-NEXT: v_bfe_u32 v1, v1, 16, 155531; GCN-NEXT: s_lshr_b32 s1, s1, 165532; GCN-NEXT: v_bfe_u32 v0, v0, 16, 155533; GCN-NEXT: v_or_b32_e32 v1, s0, v15534; GCN-NEXT: v_or_b32_e32 v0, s1, v05535; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v05536; GCN-NEXT: v_or_b32_e32 v0, v1, v05537; GCN-NEXT: v_readfirstlane_b32 s0, v05538; GCN-NEXT: ; return to shader part epilog5539;5540; GFX7-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:5541; GFX7: ; %bb.0:5542; GFX7-NEXT: v_mul_f32_e64 v1, 1.0, s05543; GFX7-NEXT: s_and_b32 s0, s3, 0x800000005544; GFX7-NEXT: s_lshr_b32 s0, s0, 165545; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 155546; GFX7-NEXT: v_mul_f32_e64 v0, 1.0, s15547; GFX7-NEXT: v_or_b32_e32 v1, s0, v15548; GFX7-NEXT: s_and_b32 s0, s5, 0x800000005549; GFX7-NEXT: s_lshr_b32 s0, s0, 165550; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 155551; GFX7-NEXT: v_or_b32_e32 v0, s0, v05552; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v05553; GFX7-NEXT: v_or_b32_e32 v0, v1, v05554; GFX7-NEXT: v_readfirstlane_b32 s0, v05555; GFX7-NEXT: ; return to shader part epilog5556;5557; GFX8-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:5558; GFX8: ; %bb.0:5559; GFX8-NEXT: s_lshl_b32 s1, s4, 165560; GFX8-NEXT: s_and_b32 s2, s2, 0x80005561; GFX8-NEXT: s_or_b32 s1, s2, s15562; GFX8-NEXT: s_mov_b32 s2, 0x7fff7fff5563; GFX8-NEXT: v_mov_b32_e32 v0, s05564; GFX8-NEXT: v_mov_b32_e32 v1, s15565; GFX8-NEXT: v_bfi_b32 v0, s2, v0, v15566; GFX8-NEXT: v_readfirstlane_b32 s0, v05567; GFX8-NEXT: ; return to shader part epilog5568;5569; GFX9-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:5570; GFX9: ; %bb.0:5571; GFX9-NEXT: s_pack_ll_b32_b16 s1, s2, s45572; GFX9-NEXT: s_mov_b32 s2, 0x7fff7fff5573; GFX9-NEXT: v_mov_b32_e32 v0, s05574; GFX9-NEXT: v_mov_b32_e32 v1, s15575; GFX9-NEXT: v_bfi_b32 v0, s2, v0, v15576; GFX9-NEXT: v_readfirstlane_b32 s0, v05577; GFX9-NEXT: ; return to shader part epilog5578;5579; GFX10-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:5580; GFX10: ; %bb.0:5581; GFX10-NEXT: s_pack_ll_b32_b16 s1, s2, s45582; GFX10-NEXT: v_mov_b32_e32 v0, s15583; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05584; GFX10-NEXT: v_readfirstlane_b32 s0, v05585; GFX10-NEXT: ; return to shader part epilog5586;5587; GFX11-LABEL: s_copysign_out_v2bf16_mag_v2bf16_sign_v2f64:5588; GFX11: ; %bb.0:5589; GFX11-NEXT: s_pack_ll_b32_b16 s1, s2, s45590; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)5591; GFX11-NEXT: v_mov_b32_e32 v0, s15592; GFX11-NEXT: v_bfi_b32 v0, 0x7fff7fff, s0, v05593; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)5594; GFX11-NEXT: v_readfirstlane_b32 s0, v05595; GFX11-NEXT: ; return to shader part epilog5596 %sign.trunc = fptrunc <2 x double> %sign to <2 x bfloat>5597 %out = call <2 x bfloat> @llvm.copysign.v2bf16(<2 x bfloat> %mag, <2 x bfloat> %sign.trunc)5598 %cast = bitcast <2 x bfloat> %out to i325599 ret i32 %cast5600}5601 5602 5603define <3 x float> @v_copysign_out_v3f32_mag_v3bf16_sign_v3f32(<3 x bfloat> %mag, <3 x float> %sign) {5604; GCN-LABEL: v_copysign_out_v3f32_mag_v3bf16_sign_v3f32:5605; GCN: ; %bb.0:5606; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5607; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v05608; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v15609; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v25610; GCN-NEXT: s_brev_b32 s4, -25611; GCN-NEXT: v_and_b32_e32 v2, 0x7fff0000, v25612; GCN-NEXT: v_and_b32_e32 v1, 0x7fff0000, v15613; GCN-NEXT: v_and_b32_e32 v0, 0x7fff0000, v05614; GCN-NEXT: v_bfi_b32 v0, s4, v0, v35615; GCN-NEXT: v_bfi_b32 v1, s4, v1, v45616; GCN-NEXT: v_bfi_b32 v2, s4, v2, v55617; GCN-NEXT: s_setpc_b64 s[30:31]5618;5619; GFX7-LABEL: v_copysign_out_v3f32_mag_v3bf16_sign_v3f32:5620; GFX7: ; %bb.0:5621; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5622; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v05623; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v15624; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v25625; GFX7-NEXT: v_and_b32_e32 v2, 0x7fff0000, v25626; GFX7-NEXT: v_and_b32_e32 v1, 0x7fff0000, v15627; GFX7-NEXT: v_and_b32_e32 v0, 0x7fff0000, v05628; GFX7-NEXT: s_brev_b32 s4, -25629; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v35630; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v45631; GFX7-NEXT: v_bfi_b32 v2, s4, v2, v55632; GFX7-NEXT: s_setpc_b64 s[30:31]5633;5634; GFX8-LABEL: v_copysign_out_v3f32_mag_v3bf16_sign_v3f32:5635; GFX8: ; %bb.0:5636; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5637; GFX8-NEXT: v_lshlrev_b32_e32 v5, 16, v15638; GFX8-NEXT: v_and_b32_e32 v1, 0x7fff0000, v05639; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v05640; GFX8-NEXT: s_brev_b32 s4, -25641; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v25642; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v35643; GFX8-NEXT: v_bfi_b32 v2, s4, v5, v45644; GFX8-NEXT: s_setpc_b64 s[30:31]5645;5646; GFX9-LABEL: v_copysign_out_v3f32_mag_v3bf16_sign_v3f32:5647; GFX9: ; %bb.0:5648; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5649; GFX9-NEXT: v_lshlrev_b32_e32 v5, 16, v15650; GFX9-NEXT: v_and_b32_e32 v1, 0x7fff0000, v05651; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v05652; GFX9-NEXT: s_brev_b32 s4, -25653; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v25654; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v35655; GFX9-NEXT: v_bfi_b32 v2, s4, v5, v45656; GFX9-NEXT: s_setpc_b64 s[30:31]5657;5658; GFX10-LABEL: v_copysign_out_v3f32_mag_v3bf16_sign_v3f32:5659; GFX10: ; %bb.0:5660; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5661; GFX10-NEXT: v_lshlrev_b32_e32 v5, 16, v05662; GFX10-NEXT: v_and_b32_e32 v6, 0x7fff0000, v05663; GFX10-NEXT: v_lshlrev_b32_e32 v7, 16, v15664; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, v5, v25665; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v6, v35666; GFX10-NEXT: v_bfi_b32 v2, 0x7fffffff, v7, v45667; GFX10-NEXT: s_setpc_b64 s[30:31]5668;5669; GFX11-LABEL: v_copysign_out_v3f32_mag_v3bf16_sign_v3f32:5670; GFX11: ; %bb.0:5671; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5672; GFX11-NEXT: v_lshlrev_b32_e32 v5, 16, v05673; GFX11-NEXT: v_and_b32_e32 v6, 0x7fff0000, v05674; GFX11-NEXT: v_lshlrev_b32_e32 v7, 16, v15675; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)5676; GFX11-NEXT: v_bfi_b32 v0, 0x7fffffff, v5, v25677; GFX11-NEXT: v_bfi_b32 v1, 0x7fffffff, v6, v35678; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3)5679; GFX11-NEXT: v_bfi_b32 v2, 0x7fffffff, v7, v45680; GFX11-NEXT: s_setpc_b64 s[30:31]5681 %mag.ext = fpext <3 x bfloat> %mag to <3 x float>5682 %out = call <3 x float> @llvm.copysign.v3f32(<3 x float> %mag.ext, <3 x float> %sign)5683 ret <3 x float> %out5684}5685 5686define <3 x float> @v_copysign_out_v3f32_mag_v3f32_sign_v3bf16(<3 x float> %mag, <3 x bfloat> %sign) {5687; GCN-LABEL: v_copysign_out_v3f32_mag_v3f32_sign_v3bf16:5688; GCN: ; %bb.0:5689; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5690; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v55691; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v45692; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v35693; GCN-NEXT: s_brev_b32 s4, -25694; GCN-NEXT: v_bfi_b32 v0, s4, v0, v35695; GCN-NEXT: v_bfi_b32 v1, s4, v1, v45696; GCN-NEXT: v_bfi_b32 v2, s4, v2, v55697; GCN-NEXT: s_setpc_b64 s[30:31]5698;5699; GFX7-LABEL: v_copysign_out_v3f32_mag_v3f32_sign_v3bf16:5700; GFX7: ; %bb.0:5701; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5702; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v55703; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v45704; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v35705; GFX7-NEXT: s_brev_b32 s4, -25706; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v35707; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v45708; GFX7-NEXT: v_bfi_b32 v2, s4, v2, v55709; GFX7-NEXT: s_setpc_b64 s[30:31]5710;5711; GFX8-LABEL: v_copysign_out_v3f32_mag_v3f32_sign_v3bf16:5712; GFX8: ; %bb.0:5713; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5714; GFX8-NEXT: v_lshrrev_b32_e32 v5, 16, v35715; GFX8-NEXT: v_lshlrev_b32_e32 v3, 16, v35716; GFX8-NEXT: s_brev_b32 s4, -25717; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v35718; GFX8-NEXT: v_lshlrev_b32_e32 v3, 16, v45719; GFX8-NEXT: v_bfi_b32 v2, s4, v2, v35720; GFX8-NEXT: v_lshlrev_b32_e32 v3, 16, v55721; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v35722; GFX8-NEXT: s_setpc_b64 s[30:31]5723;5724; GFX9-LABEL: v_copysign_out_v3f32_mag_v3f32_sign_v3bf16:5725; GFX9: ; %bb.0:5726; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5727; GFX9-NEXT: v_lshrrev_b32_e32 v5, 16, v35728; GFX9-NEXT: v_lshlrev_b32_e32 v3, 16, v35729; GFX9-NEXT: s_brev_b32 s4, -25730; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v35731; GFX9-NEXT: v_lshlrev_b32_e32 v3, 16, v45732; GFX9-NEXT: v_bfi_b32 v2, s4, v2, v35733; GFX9-NEXT: v_lshlrev_b32_e32 v3, 16, v55734; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v35735; GFX9-NEXT: s_setpc_b64 s[30:31]5736;5737; GFX10-LABEL: v_copysign_out_v3f32_mag_v3f32_sign_v3bf16:5738; GFX10: ; %bb.0:5739; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5740; GFX10-NEXT: v_lshrrev_b32_e32 v5, 16, v35741; GFX10-NEXT: v_lshlrev_b32_e32 v3, 16, v35742; GFX10-NEXT: v_lshlrev_b32_e32 v4, 16, v45743; GFX10-NEXT: v_lshlrev_b32_e32 v5, 16, v55744; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v35745; GFX10-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, v45746; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v55747; GFX10-NEXT: s_setpc_b64 s[30:31]5748;5749; GFX11TRUE16-LABEL: v_copysign_out_v3f32_mag_v3f32_sign_v3bf16:5750; GFX11TRUE16: ; %bb.0:5751; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5752; GFX11TRUE16-NEXT: v_mov_b16_e32 v4.h, v3.l5753; GFX11TRUE16-NEXT: v_mov_b16_e32 v5.h, v4.l5754; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v35755; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)5756; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v45757; GFX11TRUE16-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, v55758; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]5759;5760; GFX11FAKE16-LABEL: v_copysign_out_v3f32_mag_v3f32_sign_v3bf16:5761; GFX11FAKE16: ; %bb.0:5762; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5763; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v35764; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v3, 16, v35765; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v4, 16, v45766; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)5767; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v5, 16, v55768; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v35769; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)5770; GFX11FAKE16-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, v45771; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v55772; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]5773 %sign.ext = fpext <3 x bfloat> %sign to <3 x float>5774 %out = call <3 x float> @llvm.copysign.v3f32(<3 x float> %mag, <3 x float> %sign.ext)5775 ret <3 x float> %out5776}5777 5778define <3 x double> @v_copysign_out_v3f64_mag_v3f64_sign_v3bf16(<3 x double> %mag, <3 x bfloat> %sign) {5779; GCN-LABEL: v_copysign_out_v3f64_mag_v3f64_sign_v3bf16:5780; GCN: ; %bb.0:5781; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5782; GCN-NEXT: s_brev_b32 s4, -25783; GCN-NEXT: v_bfi_b32 v1, s4, v1, v65784; GCN-NEXT: v_bfi_b32 v3, s4, v3, v75785; GCN-NEXT: v_bfi_b32 v5, s4, v5, v85786; GCN-NEXT: s_setpc_b64 s[30:31]5787;5788; GFX7-LABEL: v_copysign_out_v3f64_mag_v3f64_sign_v3bf16:5789; GFX7: ; %bb.0:5790; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5791; GFX7-NEXT: s_brev_b32 s4, -25792; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v65793; GFX7-NEXT: v_bfi_b32 v3, s4, v3, v75794; GFX7-NEXT: v_bfi_b32 v5, s4, v5, v85795; GFX7-NEXT: s_setpc_b64 s[30:31]5796;5797; GFX8-LABEL: v_copysign_out_v3f64_mag_v3f64_sign_v3bf16:5798; GFX8: ; %bb.0:5799; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5800; GFX8-NEXT: v_lshlrev_b32_e32 v8, 16, v65801; GFX8-NEXT: v_lshrrev_b32_e32 v6, 16, v65802; GFX8-NEXT: s_brev_b32 s4, -25803; GFX8-NEXT: v_lshlrev_b32_e32 v7, 16, v75804; GFX8-NEXT: v_lshlrev_b32_e32 v6, 16, v65805; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v85806; GFX8-NEXT: v_bfi_b32 v5, s4, v5, v75807; GFX8-NEXT: v_bfi_b32 v3, s4, v3, v65808; GFX8-NEXT: s_setpc_b64 s[30:31]5809;5810; GFX9-LABEL: v_copysign_out_v3f64_mag_v3f64_sign_v3bf16:5811; GFX9: ; %bb.0:5812; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5813; GFX9-NEXT: v_lshlrev_b32_e32 v8, 16, v65814; GFX9-NEXT: v_lshrrev_b32_e32 v6, 16, v65815; GFX9-NEXT: s_brev_b32 s4, -25816; GFX9-NEXT: v_lshlrev_b32_e32 v7, 16, v75817; GFX9-NEXT: v_lshlrev_b32_e32 v6, 16, v65818; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v85819; GFX9-NEXT: v_bfi_b32 v5, s4, v5, v75820; GFX9-NEXT: v_bfi_b32 v3, s4, v3, v65821; GFX9-NEXT: s_setpc_b64 s[30:31]5822;5823; GFX10-LABEL: v_copysign_out_v3f64_mag_v3f64_sign_v3bf16:5824; GFX10: ; %bb.0:5825; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5826; GFX10-NEXT: v_lshrrev_b32_e32 v8, 16, v65827; GFX10-NEXT: v_lshlrev_b32_e32 v6, 16, v65828; GFX10-NEXT: v_lshlrev_b32_e32 v7, 16, v75829; GFX10-NEXT: v_lshlrev_b32_e32 v8, 16, v85830; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v65831; GFX10-NEXT: v_bfi_b32 v5, 0x7fffffff, v5, v75832; GFX10-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v85833; GFX10-NEXT: s_setpc_b64 s[30:31]5834;5835; GFX11TRUE16-LABEL: v_copysign_out_v3f64_mag_v3f64_sign_v3bf16:5836; GFX11TRUE16: ; %bb.0:5837; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5838; GFX11TRUE16-NEXT: v_mov_b16_e32 v7.h, v6.l5839; GFX11TRUE16-NEXT: v_mov_b16_e32 v8.h, v7.l5840; GFX11TRUE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v65841; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)5842; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v75843; GFX11TRUE16-NEXT: v_bfi_b32 v5, 0x7fffffff, v5, v85844; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]5845;5846; GFX11FAKE16-LABEL: v_copysign_out_v3f64_mag_v3f64_sign_v3bf16:5847; GFX11FAKE16: ; %bb.0:5848; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5849; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v8, 16, v65850; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v6, 16, v65851; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v7, 16, v75852; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)5853; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v8, 16, v85854; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v65855; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)5856; GFX11FAKE16-NEXT: v_bfi_b32 v5, 0x7fffffff, v5, v75857; GFX11FAKE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v85858; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]5859 %sign.ext = fpext <3 x bfloat> %sign to <3 x double>5860 %out = call <3 x double> @llvm.copysign.v3f64(<3 x double> %mag, <3 x double> %sign.ext)5861 ret <3 x double> %out5862}5863 5864define <3 x bfloat> @v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16(<3 x float> %mag, <3 x bfloat> %sign) {5865; GCN-LABEL: v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16:5866; GCN: ; %bb.0:5867; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5868; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v35869; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v45870; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v55871; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v05872; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v15873; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v25874; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v35875; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v45876; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v55877; GCN-NEXT: v_bfe_u32 v2, v2, 16, 155878; GCN-NEXT: v_bfe_u32 v1, v1, 16, 155879; GCN-NEXT: v_bfe_u32 v0, v0, 16, 155880; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v55881; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v45882; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v35883; GCN-NEXT: v_or_b32_e32 v2, v2, v55884; GCN-NEXT: v_or_b32_e32 v1, v1, v45885; GCN-NEXT: v_or_b32_e32 v0, v0, v35886; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v05887; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v15888; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v25889; GCN-NEXT: s_setpc_b64 s[30:31]5890;5891; GFX7-LABEL: v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16:5892; GFX7: ; %bb.0:5893; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5894; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v35895; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v45896; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v55897; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v35898; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v45899; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v55900; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v05901; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v15902; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v25903; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v55904; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 155905; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v45906; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 155907; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v35908; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 155909; GFX7-NEXT: v_or_b32_e32 v2, v2, v55910; GFX7-NEXT: v_or_b32_e32 v1, v1, v45911; GFX7-NEXT: v_or_b32_e32 v0, v0, v35912; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v05913; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v15914; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v25915; GFX7-NEXT: s_setpc_b64 s[30:31]5916;5917; GFX8-LABEL: v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16:5918; GFX8: ; %bb.0:5919; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5920; GFX8-NEXT: v_bfe_u32 v6, v2, 16, 15921; GFX8-NEXT: v_add_u32_e32 v6, vcc, v6, v25922; GFX8-NEXT: v_add_u32_e32 v6, vcc, 0x7fff, v65923; GFX8-NEXT: v_or_b32_e32 v5, 0x400000, v25924; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v2, v25925; GFX8-NEXT: v_cndmask_b32_e32 v2, v6, v5, vcc5926; GFX8-NEXT: v_bfe_u32 v6, v0, 16, 15927; GFX8-NEXT: s_movk_i32 s4, 0x7fff5928; GFX8-NEXT: v_add_u32_e32 v6, vcc, v6, v05929; GFX8-NEXT: v_add_u32_e32 v6, vcc, s4, v65930; GFX8-NEXT: v_or_b32_e32 v5, 0x400000, v05931; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v0, v05932; GFX8-NEXT: v_cndmask_b32_e32 v0, v6, v5, vcc5933; GFX8-NEXT: v_bfe_u32 v6, v1, 16, 15934; GFX8-NEXT: v_add_u32_e32 v6, vcc, v6, v15935; GFX8-NEXT: v_add_u32_e32 v6, vcc, 0x7fff, v65936; GFX8-NEXT: v_or_b32_e32 v5, 0x400000, v15937; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v1, v15938; GFX8-NEXT: v_cndmask_b32_e32 v1, v6, v5, vcc5939; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v15940; GFX8-NEXT: v_lshrrev_b32_e32 v2, 16, v25941; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 165942; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff5943; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v35944; GFX8-NEXT: v_bfi_b32 v1, s4, v2, v45945; GFX8-NEXT: s_setpc_b64 s[30:31]5946;5947; GFX9-LABEL: v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16:5948; GFX9: ; %bb.0:5949; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5950; GFX9-NEXT: v_bfe_u32 v5, v2, 16, 15951; GFX9-NEXT: s_movk_i32 s4, 0x7fff5952; GFX9-NEXT: v_add3_u32 v5, v5, v2, s45953; GFX9-NEXT: v_or_b32_e32 v6, 0x400000, v25954; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v2, v25955; GFX9-NEXT: v_cndmask_b32_e32 v2, v5, v6, vcc5956; GFX9-NEXT: v_bfe_u32 v5, v0, 16, 15957; GFX9-NEXT: v_add3_u32 v5, v5, v0, s45958; GFX9-NEXT: v_or_b32_e32 v6, 0x400000, v05959; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v0, v05960; GFX9-NEXT: v_cndmask_b32_e32 v0, v5, v6, vcc5961; GFX9-NEXT: v_bfe_u32 v5, v1, 16, 15962; GFX9-NEXT: v_add3_u32 v5, v5, v1, s45963; GFX9-NEXT: v_or_b32_e32 v6, 0x400000, v15964; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v1, v15965; GFX9-NEXT: v_cndmask_b32_e32 v1, v5, v6, vcc5966; GFX9-NEXT: s_mov_b32 s4, 0x70603025967; GFX9-NEXT: v_perm_b32 v0, v1, v0, s45968; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff5969; GFX9-NEXT: v_alignbit_b32 v1, s4, v2, 165970; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v35971; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v45972; GFX9-NEXT: s_setpc_b64 s[30:31]5973;5974; GFX10-LABEL: v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16:5975; GFX10: ; %bb.0:5976; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)5977; GFX10-NEXT: v_bfe_u32 v5, v0, 16, 15978; GFX10-NEXT: v_bfe_u32 v7, v1, 16, 15979; GFX10-NEXT: v_or_b32_e32 v9, 0x400000, v05980; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v05981; GFX10-NEXT: v_bfe_u32 v6, v2, 16, 15982; GFX10-NEXT: v_add3_u32 v5, v5, v0, 0x7fff5983; GFX10-NEXT: v_or_b32_e32 v10, 0x400000, v15984; GFX10-NEXT: v_add3_u32 v7, v7, v1, 0x7fff5985; GFX10-NEXT: v_or_b32_e32 v8, 0x400000, v25986; GFX10-NEXT: v_add3_u32 v6, v6, v2, 0x7fff5987; GFX10-NEXT: v_cndmask_b32_e32 v0, v5, v9, vcc_lo5988; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v15989; GFX10-NEXT: v_cndmask_b32_e32 v1, v7, v10, vcc_lo5990; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v25991; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x70603025992; GFX10-NEXT: v_cndmask_b32_e32 v2, v6, v8, vcc_lo5993; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v35994; GFX10-NEXT: v_alignbit_b32 v1, s4, v2, 165995; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v45996; GFX10-NEXT: s_setpc_b64 s[30:31]5997;5998; GFX11TRUE16-LABEL: v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16:5999; GFX11TRUE16: ; %bb.0:6000; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6001; GFX11TRUE16-NEXT: v_bfe_u32 v5, v0, 16, 16002; GFX11TRUE16-NEXT: v_bfe_u32 v6, v2, 16, 16003; GFX11TRUE16-NEXT: v_bfe_u32 v8, v1, 16, 16004; GFX11TRUE16-NEXT: v_or_b32_e32 v9, 0x400000, v06005; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v06006; GFX11TRUE16-NEXT: v_add3_u32 v5, v5, v0, 0x7fff6007; GFX11TRUE16-NEXT: v_or_b32_e32 v7, 0x400000, v26008; GFX11TRUE16-NEXT: v_or_b32_e32 v10, 0x400000, v16009; GFX11TRUE16-NEXT: v_add3_u32 v6, v6, v2, 0x7fff6010; GFX11TRUE16-NEXT: v_add3_u32 v8, v8, v1, 0x7fff6011; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v0, v5, v9, vcc_lo6012; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v26013; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_2)6014; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v2, v6, v7, vcc_lo6015; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v16016; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.l, v2.h6017; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v1, v8, v10, vcc_lo6018; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.h6019; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_4)6020; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v1, v36021; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v2, v46022; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]6023;6024; GFX11FAKE16-LABEL: v_copysign_out_v3bf16_mag_v3f32_sign_v3bf16:6025; GFX11FAKE16: ; %bb.0:6026; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6027; GFX11FAKE16-NEXT: v_bfe_u32 v5, v0, 16, 16028; GFX11FAKE16-NEXT: v_bfe_u32 v7, v1, 16, 16029; GFX11FAKE16-NEXT: v_or_b32_e32 v9, 0x400000, v06030; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v06031; GFX11FAKE16-NEXT: v_bfe_u32 v6, v2, 16, 16032; GFX11FAKE16-NEXT: v_add3_u32 v5, v5, v0, 0x7fff6033; GFX11FAKE16-NEXT: v_or_b32_e32 v10, 0x400000, v16034; GFX11FAKE16-NEXT: v_add3_u32 v7, v7, v1, 0x7fff6035; GFX11FAKE16-NEXT: v_or_b32_e32 v8, 0x400000, v26036; GFX11FAKE16-NEXT: v_add3_u32 v6, v6, v2, 0x7fff6037; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v0, v5, v9, vcc_lo6038; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v16039; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v1, v7, v10, vcc_lo6040; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v26041; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)6042; GFX11FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x70603026043; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v2, v6, v8, vcc_lo6044; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v36045; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)6046; GFX11FAKE16-NEXT: v_alignbit_b32 v1, s0, v2, 166047; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v46048; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]6049 %mag.trunc = fptrunc <3 x float> %mag to <3 x bfloat>6050 %out = call <3 x bfloat> @llvm.copysign.v3bf16(<3 x bfloat> %mag.trunc, <3 x bfloat> %sign)6051 ret <3 x bfloat> %out6052}6053 6054define <3 x bfloat> @v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16(<3 x double> %mag, <3 x bfloat> %sign) {6055; GCN-LABEL: v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16:6056; GCN: ; %bb.0:6057; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6058; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v66059; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v76060; GCN-NEXT: v_mul_f32_e32 v8, 1.0, v86061; GCN-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]6062; GCN-NEXT: v_cvt_f32_f64_e32 v1, v[2:3]6063; GCN-NEXT: v_cvt_f32_f64_e32 v2, v[4:5]6064; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v66065; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v76066; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v86067; GCN-NEXT: v_bfe_u32 v2, v2, 16, 156068; GCN-NEXT: v_bfe_u32 v1, v1, 16, 156069; GCN-NEXT: v_bfe_u32 v0, v0, 16, 156070; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v56071; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v46072; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v36073; GCN-NEXT: v_or_b32_e32 v2, v2, v56074; GCN-NEXT: v_or_b32_e32 v1, v1, v46075; GCN-NEXT: v_or_b32_e32 v0, v0, v36076; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v06077; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v16078; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v26079; GCN-NEXT: s_setpc_b64 s[30:31]6080;6081; GFX7-LABEL: v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16:6082; GFX7: ; %bb.0:6083; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6084; GFX7-NEXT: v_cvt_f32_f64_e32 v4, v[4:5]6085; GFX7-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]6086; GFX7-NEXT: v_cvt_f32_f64_e32 v1, v[2:3]6087; GFX7-NEXT: v_mul_f32_e32 v8, 1.0, v86088; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v76089; GFX7-NEXT: v_lshrrev_b32_e32 v8, 16, v86090; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v66091; GFX7-NEXT: v_lshrrev_b32_e32 v7, 16, v76092; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v86093; GFX7-NEXT: v_bfe_u32 v3, v4, 16, 156094; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v66095; GFX7-NEXT: v_or_b32_e32 v2, v3, v26096; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v76097; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 156098; GFX7-NEXT: v_or_b32_e32 v1, v1, v36099; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v66100; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 156101; GFX7-NEXT: v_or_b32_e32 v0, v0, v36102; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v06103; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v16104; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v26105; GFX7-NEXT: s_setpc_b64 s[30:31]6106;6107; GFX8-LABEL: v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16:6108; GFX8: ; %bb.0:6109; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6110; GFX8-NEXT: v_cvt_f32_f64_e32 v10, v[4:5]6111; GFX8-NEXT: s_movk_i32 s8, 0x7fff6112; GFX8-NEXT: v_cvt_f64_f32_e32 v[8:9], v106113; GFX8-NEXT: v_and_b32_e32 v11, 1, v106114; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v116115; GFX8-NEXT: v_cvt_f32_f64_e32 v11, v[0:1]6116; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[4:5]|, |v[8:9]|6117; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[4:5], v[8:9]6118; GFX8-NEXT: v_cndmask_b32_e64 v8, -1, 1, s[6:7]6119; GFX8-NEXT: v_add_u32_e64 v8, s[6:7], v10, v86120; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]6121; GFX8-NEXT: v_cndmask_b32_e32 v10, v8, v10, vcc6122; GFX8-NEXT: v_bfe_u32 v8, v10, 16, 16123; GFX8-NEXT: v_add_u32_e32 v8, vcc, v8, v106124; GFX8-NEXT: v_add_u32_e32 v12, vcc, s8, v86125; GFX8-NEXT: v_cmp_u_f64_e32 vcc, v[4:5], v[4:5]6126; GFX8-NEXT: v_cvt_f64_f32_e32 v[8:9], v116127; GFX8-NEXT: v_or_b32_e32 v10, 0x400000, v106128; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[0:1]|, |v[8:9]|6129; GFX8-NEXT: v_cndmask_b32_e32 v4, v12, v10, vcc6130; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[0:1], v[8:9]6131; GFX8-NEXT: v_lshrrev_b32_e32 v10, 16, v46132; GFX8-NEXT: v_and_b32_e32 v4, 1, v116133; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v46134; GFX8-NEXT: v_cndmask_b32_e64 v4, -1, 1, s[6:7]6135; GFX8-NEXT: v_cvt_f32_f64_e32 v9, v[2:3]6136; GFX8-NEXT: v_add_u32_e64 v4, s[6:7], v11, v46137; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]6138; GFX8-NEXT: v_cndmask_b32_e32 v8, v4, v11, vcc6139; GFX8-NEXT: v_bfe_u32 v4, v8, 16, 16140; GFX8-NEXT: v_add_u32_e32 v11, vcc, v4, v86141; GFX8-NEXT: v_cvt_f64_f32_e32 v[4:5], v96142; GFX8-NEXT: v_add_u32_e32 v11, vcc, s8, v116143; GFX8-NEXT: v_cmp_u_f64_e64 s[4:5], v[0:1], v[0:1]6144; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[2:3]|, |v[4:5]|6145; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[2:3], v[4:5]6146; GFX8-NEXT: v_or_b32_e32 v8, 0x400000, v86147; GFX8-NEXT: v_and_b32_e32 v1, 1, v96148; GFX8-NEXT: v_cndmask_b32_e64 v0, v11, v8, s[4:5]6149; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v16150; GFX8-NEXT: v_cndmask_b32_e64 v1, -1, 1, s[6:7]6151; GFX8-NEXT: v_add_u32_e64 v1, s[6:7], v9, v16152; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]6153; GFX8-NEXT: v_cndmask_b32_e32 v1, v1, v9, vcc6154; GFX8-NEXT: v_bfe_u32 v4, v1, 16, 16155; GFX8-NEXT: v_add_u32_e32 v4, vcc, v4, v16156; GFX8-NEXT: v_add_u32_e32 v4, vcc, 0x7fff, v46157; GFX8-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[2:3]6158; GFX8-NEXT: v_or_b32_e32 v1, 0x400000, v16159; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff6160; GFX8-NEXT: v_cndmask_b32_e32 v1, v4, v1, vcc6161; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v16162; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 166163; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v66164; GFX8-NEXT: v_bfi_b32 v1, s4, v10, v76165; GFX8-NEXT: s_setpc_b64 s[30:31]6166;6167; GFX9-LABEL: v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16:6168; GFX9: ; %bb.0:6169; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6170; GFX9-NEXT: v_cvt_f32_f64_e32 v10, v[4:5]6171; GFX9-NEXT: v_cvt_f32_f64_e32 v11, v[0:1]6172; GFX9-NEXT: s_movk_i32 s8, 0x7fff6173; GFX9-NEXT: v_cvt_f64_f32_e32 v[8:9], v106174; GFX9-NEXT: v_and_b32_e32 v12, 1, v106175; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v126176; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[4:5]|, |v[8:9]|6177; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[4:5], v[8:9]6178; GFX9-NEXT: v_cndmask_b32_e64 v8, -1, 1, s[6:7]6179; GFX9-NEXT: v_add_u32_e32 v8, v10, v86180; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]6181; GFX9-NEXT: v_cndmask_b32_e32 v10, v8, v10, vcc6182; GFX9-NEXT: v_cvt_f64_f32_e32 v[8:9], v116183; GFX9-NEXT: v_cmp_u_f64_e64 s[4:5], v[4:5], v[4:5]6184; GFX9-NEXT: v_bfe_u32 v12, v10, 16, 16185; GFX9-NEXT: v_add3_u32 v12, v12, v10, s86186; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[0:1]|, |v[8:9]|6187; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[0:1], v[8:9]6188; GFX9-NEXT: v_cvt_f32_f64_e32 v8, v[2:3]6189; GFX9-NEXT: v_or_b32_e32 v10, 0x400000, v106190; GFX9-NEXT: v_and_b32_e32 v4, 1, v116191; GFX9-NEXT: v_cndmask_b32_e64 v10, v12, v10, s[4:5]6192; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v46193; GFX9-NEXT: v_cndmask_b32_e64 v4, -1, 1, s[6:7]6194; GFX9-NEXT: v_add_u32_e32 v4, v11, v46195; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]6196; GFX9-NEXT: v_cndmask_b32_e32 v9, v4, v11, vcc6197; GFX9-NEXT: v_cvt_f64_f32_e32 v[4:5], v86198; GFX9-NEXT: v_cmp_u_f64_e64 s[4:5], v[0:1], v[0:1]6199; GFX9-NEXT: v_bfe_u32 v11, v9, 16, 16200; GFX9-NEXT: v_add3_u32 v11, v11, v9, s86201; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[2:3]|, |v[4:5]|6202; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[2:3], v[4:5]6203; GFX9-NEXT: v_or_b32_e32 v9, 0x400000, v96204; GFX9-NEXT: v_and_b32_e32 v1, 1, v86205; GFX9-NEXT: v_cndmask_b32_e64 v0, v11, v9, s[4:5]6206; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v16207; GFX9-NEXT: v_cndmask_b32_e64 v1, -1, 1, s[6:7]6208; GFX9-NEXT: v_add_u32_e32 v1, v8, v16209; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]6210; GFX9-NEXT: v_cndmask_b32_e32 v1, v1, v8, vcc6211; GFX9-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[2:3]6212; GFX9-NEXT: v_bfe_u32 v4, v1, 16, 16213; GFX9-NEXT: v_add3_u32 v4, v4, v1, s86214; GFX9-NEXT: v_or_b32_e32 v1, 0x400000, v16215; GFX9-NEXT: s_mov_b32 s4, 0x70603026216; GFX9-NEXT: v_cndmask_b32_e32 v1, v4, v1, vcc6217; GFX9-NEXT: v_perm_b32 v0, v1, v0, s46218; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff6219; GFX9-NEXT: v_alignbit_b32 v1, s4, v10, 166220; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v66221; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v76222; GFX9-NEXT: s_setpc_b64 s[30:31]6223;6224; GFX10-LABEL: v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16:6225; GFX10: ; %bb.0:6226; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6227; GFX10-NEXT: v_cvt_f32_f64_e32 v14, v[4:5]6228; GFX10-NEXT: v_cvt_f32_f64_e32 v15, v[0:1]6229; GFX10-NEXT: v_cvt_f32_f64_e32 v16, v[2:3]6230; GFX10-NEXT: v_cvt_f64_f32_e32 v[8:9], v146231; GFX10-NEXT: v_cvt_f64_f32_e32 v[10:11], v156232; GFX10-NEXT: v_cvt_f64_f32_e32 v[12:13], v166233; GFX10-NEXT: v_and_b32_e32 v17, 1, v146234; GFX10-NEXT: v_and_b32_e32 v18, 1, v156235; GFX10-NEXT: v_and_b32_e32 v19, 1, v166236; GFX10-NEXT: v_cmp_eq_u32_e64 s6, 1, v176237; GFX10-NEXT: v_cmp_eq_u32_e64 s8, 1, v196238; GFX10-NEXT: v_cmp_gt_f64_e64 s7, |v[4:5]|, |v[8:9]|6239; GFX10-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[4:5], v[8:9]6240; GFX10-NEXT: v_cmp_nlg_f64_e64 s4, v[0:1], v[10:11]6241; GFX10-NEXT: v_cmp_nlg_f64_e64 s5, v[2:3], v[12:13]6242; GFX10-NEXT: v_cndmask_b32_e64 v8, -1, 1, s76243; GFX10-NEXT: v_cmp_gt_f64_e64 s7, |v[0:1]|, |v[10:11]|6244; GFX10-NEXT: s_or_b32 vcc_lo, vcc_lo, s66245; GFX10-NEXT: v_add_nc_u32_e32 v8, v14, v86246; GFX10-NEXT: v_cndmask_b32_e32 v8, v8, v14, vcc_lo6247; GFX10-NEXT: v_or_b32_e32 v14, 0x400000, v86248; GFX10-NEXT: v_cndmask_b32_e64 v9, -1, 1, s76249; GFX10-NEXT: v_cmp_gt_f64_e64 s7, |v[2:3]|, |v[12:13]|6250; GFX10-NEXT: v_bfe_u32 v12, v8, 16, 16251; GFX10-NEXT: v_add_nc_u32_e32 v9, v15, v96252; GFX10-NEXT: v_add3_u32 v8, v12, v8, 0x7fff6253; GFX10-NEXT: v_cndmask_b32_e64 v10, -1, 1, s76254; GFX10-NEXT: v_cmp_eq_u32_e64 s7, 1, v186255; GFX10-NEXT: v_add_nc_u32_e32 v10, v16, v106256; GFX10-NEXT: s_or_b32 vcc_lo, s4, s76257; GFX10-NEXT: v_cndmask_b32_e32 v9, v9, v15, vcc_lo6258; GFX10-NEXT: s_or_b32 vcc_lo, s5, s86259; GFX10-NEXT: v_cndmask_b32_e32 v10, v10, v16, vcc_lo6260; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]6261; GFX10-NEXT: v_bfe_u32 v11, v9, 16, 16262; GFX10-NEXT: v_or_b32_e32 v15, 0x400000, v96263; GFX10-NEXT: v_bfe_u32 v13, v10, 16, 16264; GFX10-NEXT: v_add3_u32 v9, v11, v9, 0x7fff6265; GFX10-NEXT: v_or_b32_e32 v11, 0x400000, v106266; GFX10-NEXT: v_add3_u32 v10, v13, v10, 0x7fff6267; GFX10-NEXT: v_cndmask_b32_e32 v0, v9, v15, vcc_lo6268; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]6269; GFX10-NEXT: v_cndmask_b32_e32 v1, v10, v11, vcc_lo6270; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[4:5], v[4:5]6271; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x70603026272; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v66273; GFX10-NEXT: v_cndmask_b32_e32 v2, v8, v14, vcc_lo6274; GFX10-NEXT: v_alignbit_b32 v1, s4, v2, 166275; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v76276; GFX10-NEXT: s_setpc_b64 s[30:31]6277;6278; GFX11TRUE16-LABEL: v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16:6279; GFX11TRUE16: ; %bb.0:6280; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6281; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v14, v[0:1]6282; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v15, v[4:5]6283; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v16, v[2:3]6284; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)6285; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[8:9], v146286; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[10:11], v156287; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)6288; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[12:13], v166289; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s3, |v[0:1]|, |v[8:9]|6290; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[0:1], v[8:9]6291; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)6292; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e64 s0, v[4:5], v[10:11]6293; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e64 s1, v[2:3], v[12:13]6294; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_2)6295; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v8, -1, 1, s36296; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s3, |v[4:5]|, |v[10:11]|6297; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v8, v14, v86298; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)6299; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v9, -1, 1, s36300; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s3, |v[2:3]|, |v[12:13]|6301; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v9, v15, v96302; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)6303; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v10, -1, 1, s36304; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v10, v16, v106305; GFX11TRUE16-NEXT: v_and_b32_e32 v19, 1, v146306; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)6307; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s3, 1, v196308; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, vcc_lo, s36309; GFX11TRUE16-NEXT: v_dual_cndmask_b32 v8, v8, v14 :: v_dual_and_b32 v17, 1, v156310; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s2, 1, v176311; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_3)6312; GFX11TRUE16-NEXT: v_bfe_u32 v11, v8, 16, 16313; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, s0, s26314; GFX11TRUE16-NEXT: v_dual_cndmask_b32 v9, v9, v15 :: v_dual_and_b32 v18, 1, v166315; GFX11TRUE16-NEXT: v_or_b32_e32 v15, 0x400000, v86316; GFX11TRUE16-NEXT: v_add3_u32 v8, v11, v8, 0x7fff6317; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_4)6318; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s4, 1, v186319; GFX11TRUE16-NEXT: v_bfe_u32 v12, v9, 16, 16320; GFX11TRUE16-NEXT: v_or_b32_e32 v13, 0x400000, v96321; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, s1, s46322; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2)6323; GFX11TRUE16-NEXT: v_add3_u32 v9, v12, v9, 0x7fff6324; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v10, v10, v16, vcc_lo6325; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]6326; GFX11TRUE16-NEXT: v_bfe_u32 v14, v10, 16, 16327; GFX11TRUE16-NEXT: v_or_b32_e32 v11, 0x400000, v106328; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_4) | instid1(VALU_DEP_2)6329; GFX11TRUE16-NEXT: v_add3_u32 v10, v14, v10, 0x7fff6330; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v0, v8, v15, vcc_lo6331; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[4:5], v[4:5]6332; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v1, v9, v13, vcc_lo6333; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]6334; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, v1.h6335; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)6336; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v76337; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v2, v10, v11, vcc_lo6338; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.h6339; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v2, v66340; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]6341;6342; GFX11FAKE16-LABEL: v_copysign_out_v3bf16_mag_v3f64_sign_v3bf16:6343; GFX11FAKE16: ; %bb.0:6344; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6345; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v14, v[4:5]6346; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v15, v[0:1]6347; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v16, v[2:3]6348; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)6349; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[8:9], v146350; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[10:11], v156351; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4)6352; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[12:13], v166353; GFX11FAKE16-NEXT: v_and_b32_e32 v18, 1, v156354; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s3, |v[4:5]|, |v[8:9]|6355; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[4:5], v[8:9]6356; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e64 s0, v[0:1], v[10:11]6357; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e64 s1, v[2:3], v[12:13]6358; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_1)6359; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v8, -1, 1, s36360; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s3, |v[0:1]|, |v[10:11]|6361; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v9, -1, 1, s36362; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s3, |v[2:3]|, |v[12:13]|6363; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)6364; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v9, v15, v96365; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v8, v14, v86366; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v10, -1, 1, s36367; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s3, 1, v186368; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)6369; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v10, v16, v106370; GFX11FAKE16-NEXT: v_and_b32_e32 v17, 1, v146371; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s2, 1, v176372; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, vcc_lo, s26373; GFX11FAKE16-NEXT: v_dual_cndmask_b32 v8, v8, v14 :: v_dual_and_b32 v19, 1, v166374; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, s0, s36375; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v9, v9, v15, vcc_lo6376; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_3)6377; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s4, 1, v196378; GFX11FAKE16-NEXT: v_bfe_u32 v12, v8, 16, 16379; GFX11FAKE16-NEXT: v_or_b32_e32 v14, 0x400000, v86380; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4)6381; GFX11FAKE16-NEXT: v_bfe_u32 v11, v9, 16, 16382; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, s1, s46383; GFX11FAKE16-NEXT: v_or_b32_e32 v15, 0x400000, v96384; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v10, v10, v16, vcc_lo6385; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]6386; GFX11FAKE16-NEXT: v_add3_u32 v9, v11, v9, 0x7fff6387; GFX11FAKE16-NEXT: v_add3_u32 v8, v12, v8, 0x7fff6388; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_2)6389; GFX11FAKE16-NEXT: v_bfe_u32 v13, v10, 16, 16390; GFX11FAKE16-NEXT: v_or_b32_e32 v11, 0x400000, v106391; GFX11FAKE16-NEXT: v_add3_u32 v10, v13, v10, 0x7fff6392; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v0, v9, v15, vcc_lo6393; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]6394; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_2)6395; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v1, v10, v11, vcc_lo6396; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[4:5], v[4:5]6397; GFX11FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x70603026398; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)6399; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v66400; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v2, v8, v14, vcc_lo6401; GFX11FAKE16-NEXT: v_alignbit_b32 v1, s0, v2, 166402; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)6403; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v76404; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]6405 %mag.trunc = fptrunc <3 x double> %mag to <3 x bfloat>6406 %result = call <3 x bfloat> @llvm.copysign.v3bf16(<3 x bfloat> %mag.trunc, <3 x bfloat> %sign)6407 ret <3 x bfloat> %result6408}6409 6410define <3 x bfloat> @v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32(<3 x bfloat> %mag, <3 x float> %sign) {6411; GCN-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32:6412; GCN: ; %bb.0:6413; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6414; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v06415; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v16416; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v26417; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v36418; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v46419; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v56420; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v36421; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v46422; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v56423; GCN-NEXT: v_bfe_u32 v2, v2, 16, 156424; GCN-NEXT: v_bfe_u32 v1, v1, 16, 156425; GCN-NEXT: v_bfe_u32 v0, v0, 16, 156426; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v56427; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v46428; GCN-NEXT: v_and_b32_e32 v3, 0x8000, v36429; GCN-NEXT: v_or_b32_e32 v2, v2, v56430; GCN-NEXT: v_or_b32_e32 v1, v1, v46431; GCN-NEXT: v_or_b32_e32 v0, v0, v36432; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v06433; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v16434; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v26435; GCN-NEXT: s_setpc_b64 s[30:31]6436;6437; GFX7-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32:6438; GFX7: ; %bb.0:6439; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6440; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v36441; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v46442; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v56443; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v06444; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v16445; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v26446; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v36447; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v46448; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v56449; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v56450; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 156451; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v46452; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 156453; GFX7-NEXT: v_and_b32_e32 v3, 0x8000, v36454; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 156455; GFX7-NEXT: v_or_b32_e32 v2, v2, v56456; GFX7-NEXT: v_or_b32_e32 v1, v1, v46457; GFX7-NEXT: v_or_b32_e32 v0, v0, v36458; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v06459; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v16460; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v26461; GFX7-NEXT: s_setpc_b64 s[30:31]6462;6463; GFX8-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32:6464; GFX8: ; %bb.0:6465; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6466; GFX8-NEXT: v_bfe_u32 v5, v4, 16, 16467; GFX8-NEXT: v_add_u32_e32 v5, vcc, v5, v46468; GFX8-NEXT: v_add_u32_e32 v5, vcc, 0x7fff, v56469; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v4, v46470; GFX8-NEXT: v_cndmask_b32_e32 v4, v5, v4, vcc6471; GFX8-NEXT: v_bfe_u32 v5, v2, 16, 16472; GFX8-NEXT: v_add_u32_e32 v5, vcc, v5, v26473; GFX8-NEXT: v_add_u32_e32 v5, vcc, 0x7fff, v56474; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v2, v26475; GFX8-NEXT: v_cndmask_b32_e32 v2, v5, v2, vcc6476; GFX8-NEXT: v_bfe_u32 v5, v3, 16, 16477; GFX8-NEXT: v_add_u32_e32 v5, vcc, v5, v36478; GFX8-NEXT: v_add_u32_e32 v5, vcc, 0x7fff, v56479; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v3, v36480; GFX8-NEXT: v_cndmask_b32_e32 v3, v5, v3, vcc6481; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v36482; GFX8-NEXT: v_lshrrev_b32_e32 v4, 16, v46483; GFX8-NEXT: v_alignbit_b32 v2, v3, v2, 166484; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff6485; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v26486; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v46487; GFX8-NEXT: s_setpc_b64 s[30:31]6488;6489; GFX9-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32:6490; GFX9: ; %bb.0:6491; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6492; GFX9-NEXT: v_bfe_u32 v5, v4, 16, 16493; GFX9-NEXT: s_movk_i32 s4, 0x7fff6494; GFX9-NEXT: v_add3_u32 v5, v5, v4, s46495; GFX9-NEXT: v_or_b32_e32 v6, 0x400000, v46496; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v4, v46497; GFX9-NEXT: v_cndmask_b32_e32 v4, v5, v6, vcc6498; GFX9-NEXT: v_bfe_u32 v5, v2, 16, 16499; GFX9-NEXT: v_add3_u32 v5, v5, v2, s46500; GFX9-NEXT: v_or_b32_e32 v6, 0x400000, v26501; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v2, v26502; GFX9-NEXT: v_cndmask_b32_e32 v2, v5, v6, vcc6503; GFX9-NEXT: v_bfe_u32 v5, v3, 16, 16504; GFX9-NEXT: v_add3_u32 v5, v5, v3, s46505; GFX9-NEXT: v_or_b32_e32 v6, 0x400000, v36506; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v3, v36507; GFX9-NEXT: v_cndmask_b32_e32 v3, v5, v6, vcc6508; GFX9-NEXT: s_mov_b32 s4, 0x70603026509; GFX9-NEXT: v_perm_b32 v2, v3, v2, s46510; GFX9-NEXT: s_mov_b32 s4, 0x7fff7fff6511; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v26512; GFX9-NEXT: v_alignbit_b32 v2, s4, v4, 166513; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v26514; GFX9-NEXT: s_setpc_b64 s[30:31]6515;6516; GFX10-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32:6517; GFX10: ; %bb.0:6518; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6519; GFX10-NEXT: v_bfe_u32 v5, v2, 16, 16520; GFX10-NEXT: v_bfe_u32 v7, v3, 16, 16521; GFX10-NEXT: v_or_b32_e32 v9, 0x400000, v26522; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v26523; GFX10-NEXT: v_bfe_u32 v6, v4, 16, 16524; GFX10-NEXT: v_add3_u32 v5, v5, v2, 0x7fff6525; GFX10-NEXT: v_or_b32_e32 v10, 0x400000, v36526; GFX10-NEXT: v_add3_u32 v7, v7, v3, 0x7fff6527; GFX10-NEXT: v_or_b32_e32 v8, 0x400000, v46528; GFX10-NEXT: v_add3_u32 v6, v6, v4, 0x7fff6529; GFX10-NEXT: v_cndmask_b32_e32 v2, v5, v9, vcc_lo6530; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v36531; GFX10-NEXT: v_cndmask_b32_e32 v3, v7, v10, vcc_lo6532; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v4, v46533; GFX10-NEXT: v_perm_b32 v2, v3, v2, 0x70603026534; GFX10-NEXT: v_cndmask_b32_e32 v4, v6, v8, vcc_lo6535; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v26536; GFX10-NEXT: v_alignbit_b32 v3, s4, v4, 166537; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v36538; GFX10-NEXT: s_setpc_b64 s[30:31]6539;6540; GFX11TRUE16-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32:6541; GFX11TRUE16: ; %bb.0:6542; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6543; GFX11TRUE16-NEXT: v_bfe_u32 v5, v2, 16, 16544; GFX11TRUE16-NEXT: v_bfe_u32 v6, v4, 16, 16545; GFX11TRUE16-NEXT: v_bfe_u32 v8, v3, 16, 16546; GFX11TRUE16-NEXT: v_or_b32_e32 v9, 0x400000, v26547; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v26548; GFX11TRUE16-NEXT: v_add3_u32 v5, v5, v2, 0x7fff6549; GFX11TRUE16-NEXT: v_or_b32_e32 v7, 0x400000, v46550; GFX11TRUE16-NEXT: v_or_b32_e32 v10, 0x400000, v36551; GFX11TRUE16-NEXT: v_add3_u32 v6, v6, v4, 0x7fff6552; GFX11TRUE16-NEXT: v_add3_u32 v8, v8, v3, 0x7fff6553; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v2, v5, v9, vcc_lo6554; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v4, v46555; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_2)6556; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v4, v6, v7, vcc_lo6557; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v36558; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.l, v4.h6559; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v3, v8, v10, vcc_lo6560; GFX11TRUE16-NEXT: v_mov_b16_e32 v3.l, v2.h6561; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)6562; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v26563; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v36564; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]6565;6566; GFX11FAKE16-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f32:6567; GFX11FAKE16: ; %bb.0:6568; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6569; GFX11FAKE16-NEXT: v_bfe_u32 v5, v2, 16, 16570; GFX11FAKE16-NEXT: v_bfe_u32 v7, v3, 16, 16571; GFX11FAKE16-NEXT: v_or_b32_e32 v9, 0x400000, v26572; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v26573; GFX11FAKE16-NEXT: v_bfe_u32 v6, v4, 16, 16574; GFX11FAKE16-NEXT: v_add3_u32 v5, v5, v2, 0x7fff6575; GFX11FAKE16-NEXT: v_or_b32_e32 v10, 0x400000, v36576; GFX11FAKE16-NEXT: v_add3_u32 v7, v7, v3, 0x7fff6577; GFX11FAKE16-NEXT: v_or_b32_e32 v8, 0x400000, v46578; GFX11FAKE16-NEXT: v_add3_u32 v6, v6, v4, 0x7fff6579; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v2, v5, v9, vcc_lo6580; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v36581; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v3, v7, v10, vcc_lo6582; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v4, v46583; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)6584; GFX11FAKE16-NEXT: v_perm_b32 v2, v3, v2, 0x70603026585; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v4, v6, v8, vcc_lo6586; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v26587; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)6588; GFX11FAKE16-NEXT: v_alignbit_b32 v3, s0, v4, 166589; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v36590; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]6591 %sign.trunc = fptrunc <3 x float> %sign to <3 x bfloat>6592 %out = call <3 x bfloat> @llvm.copysign.v3bf16(<3 x bfloat> %mag, <3 x bfloat> %sign.trunc)6593 ret <3 x bfloat> %out6594}6595 6596define <3 x bfloat> @v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64(<3 x bfloat> %mag, <3 x double> %sign) {6597; GCN-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64:6598; GCN: ; %bb.0:6599; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6600; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v06601; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v26602; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v16603; GCN-NEXT: v_and_b32_e32 v3, 0x80000000, v66604; GCN-NEXT: v_and_b32_e32 v5, 0x80000000, v86605; GCN-NEXT: v_and_b32_e32 v4, 0x80000000, v46606; GCN-NEXT: v_lshrrev_b32_e32 v3, 16, v36607; GCN-NEXT: v_bfe_u32 v1, v1, 16, 156608; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v56609; GCN-NEXT: v_bfe_u32 v2, v2, 16, 156610; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v46611; GCN-NEXT: v_bfe_u32 v0, v0, 16, 156612; GCN-NEXT: v_or_b32_e32 v1, v1, v36613; GCN-NEXT: v_or_b32_e32 v2, v2, v56614; GCN-NEXT: v_or_b32_e32 v0, v0, v46615; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v16616; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v06617; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v26618; GCN-NEXT: s_setpc_b64 s[30:31]6619;6620; GFX7-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64:6621; GFX7: ; %bb.0:6622; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6623; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v16624; GFX7-NEXT: v_and_b32_e32 v3, 0x80000000, v66625; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v36626; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 156627; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v26628; GFX7-NEXT: v_or_b32_e32 v1, v1, v36629; GFX7-NEXT: v_and_b32_e32 v3, 0x80000000, v86630; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v36631; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 156632; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v06633; GFX7-NEXT: v_or_b32_e32 v2, v2, v36634; GFX7-NEXT: v_and_b32_e32 v3, 0x80000000, v46635; GFX7-NEXT: v_lshrrev_b32_e32 v3, 16, v36636; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 156637; GFX7-NEXT: v_or_b32_e32 v0, v0, v36638; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v16639; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v06640; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v26641; GFX7-NEXT: s_setpc_b64 s[30:31]6642;6643; GFX8-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64:6644; GFX8: ; %bb.0:6645; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6646; GFX8-NEXT: v_lshrrev_b32_e32 v2, 16, v76647; GFX8-NEXT: s_movk_i32 s4, 0x7fff6648; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v26649; GFX8-NEXT: v_lshrrev_b32_e32 v2, 16, v36650; GFX8-NEXT: v_bfi_b32 v2, s4, v0, v26651; GFX8-NEXT: v_lshrrev_b32_e32 v0, 16, v06652; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v56653; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v36654; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v06655; GFX8-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD6656; GFX8-NEXT: s_setpc_b64 s[30:31]6657;6658; GFX9-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64:6659; GFX9: ; %bb.0:6660; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6661; GFX9-NEXT: v_lshrrev_b32_e32 v2, 16, v76662; GFX9-NEXT: s_movk_i32 s4, 0x7fff6663; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v26664; GFX9-NEXT: v_lshrrev_b32_e32 v2, 16, v36665; GFX9-NEXT: v_bfi_b32 v2, s4, v0, v26666; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v06667; GFX9-NEXT: v_lshrrev_b32_e32 v3, 16, v56668; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v36669; GFX9-NEXT: s_mov_b32 s4, 0x50401006670; GFX9-NEXT: v_perm_b32 v0, v0, v2, s46671; GFX9-NEXT: s_setpc_b64 s[30:31]6672;6673; GFX10-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64:6674; GFX10: ; %bb.0:6675; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6676; GFX10-NEXT: v_lshrrev_b32_e32 v2, 16, v36677; GFX10-NEXT: v_lshrrev_b32_e32 v3, 16, v06678; GFX10-NEXT: v_lshrrev_b32_e32 v4, 16, v56679; GFX10-NEXT: v_bfi_b32 v0, 0x7fff, v0, v26680; GFX10-NEXT: v_bfi_b32 v2, 0x7fff, v3, v46681; GFX10-NEXT: v_lshrrev_b32_e32 v3, 16, v76682; GFX10-NEXT: v_perm_b32 v0, v2, v0, 0x50401006683; GFX10-NEXT: v_bfi_b32 v1, 0x7fff, v1, v36684; GFX10-NEXT: s_setpc_b64 s[30:31]6685;6686; GFX11TRUE16-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64:6687; GFX11TRUE16: ; %bb.0:6688; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6689; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.h6690; GFX11TRUE16-NEXT: v_lshrrev_b32_e32 v4, 16, v56691; GFX11TRUE16-NEXT: v_lshrrev_b32_e32 v3, 16, v36692; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)6693; GFX11TRUE16-NEXT: v_bfi_b32 v2, 0x7fff, v2, v46694; GFX11TRUE16-NEXT: v_lshrrev_b32_e32 v4, 16, v76695; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v36696; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)6697; GFX11TRUE16-NEXT: v_mov_b16_e32 v0.h, v2.l6698; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff, v1, v46699; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]6700;6701; GFX11FAKE16-LABEL: v_copysign_out_v3bf16_mag_v3bf16_sign_v3f64:6702; GFX11FAKE16: ; %bb.0:6703; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6704; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v2, 16, v36705; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v06706; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v56707; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)6708; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff, v0, v26709; GFX11FAKE16-NEXT: v_bfi_b32 v2, 0x7fff, v3, v46710; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v76711; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)6712; GFX11FAKE16-NEXT: v_perm_b32 v0, v2, v0, 0x50401006713; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff, v1, v36714; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]6715 %sign.trunc = fptrunc <3 x double> %sign to <3 x bfloat>6716 %out = call <3 x bfloat> @llvm.copysign.v3bf16(<3 x bfloat> %mag, <3 x bfloat> %sign.trunc)6717 ret <3 x bfloat> %out6718}6719 6720define <4 x float> @v_copysign_out_v4f32_mag_v4bf16_sign_v4f32(<4 x bfloat> %mag, <4 x float> %sign) {6721; GCN-LABEL: v_copysign_out_v4f32_mag_v4bf16_sign_v4f32:6722; GCN: ; %bb.0:6723; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6724; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v06725; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v16726; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v26727; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v36728; GCN-NEXT: s_brev_b32 s4, -26729; GCN-NEXT: v_and_b32_e32 v3, 0x7fff0000, v36730; GCN-NEXT: v_and_b32_e32 v2, 0x7fff0000, v26731; GCN-NEXT: v_and_b32_e32 v1, 0x7fff0000, v16732; GCN-NEXT: v_and_b32_e32 v0, 0x7fff0000, v06733; GCN-NEXT: v_bfi_b32 v0, s4, v0, v46734; GCN-NEXT: v_bfi_b32 v1, s4, v1, v56735; GCN-NEXT: v_bfi_b32 v2, s4, v2, v66736; GCN-NEXT: v_bfi_b32 v3, s4, v3, v76737; GCN-NEXT: s_setpc_b64 s[30:31]6738;6739; GFX7-LABEL: v_copysign_out_v4f32_mag_v4bf16_sign_v4f32:6740; GFX7: ; %bb.0:6741; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6742; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v06743; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v16744; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v26745; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v36746; GFX7-NEXT: v_and_b32_e32 v3, 0x7fff0000, v36747; GFX7-NEXT: v_and_b32_e32 v2, 0x7fff0000, v26748; GFX7-NEXT: v_and_b32_e32 v1, 0x7fff0000, v16749; GFX7-NEXT: v_and_b32_e32 v0, 0x7fff0000, v06750; GFX7-NEXT: s_brev_b32 s4, -26751; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v46752; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v56753; GFX7-NEXT: v_bfi_b32 v2, s4, v2, v66754; GFX7-NEXT: v_bfi_b32 v3, s4, v3, v76755; GFX7-NEXT: s_setpc_b64 s[30:31]6756;6757; GFX8-LABEL: v_copysign_out_v4f32_mag_v4bf16_sign_v4f32:6758; GFX8: ; %bb.0:6759; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6760; GFX8-NEXT: v_and_b32_e32 v6, 0x7fff0000, v16761; GFX8-NEXT: v_lshlrev_b32_e32 v7, 16, v16762; GFX8-NEXT: v_and_b32_e32 v1, 0x7fff0000, v06763; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v06764; GFX8-NEXT: s_brev_b32 s4, -26765; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v26766; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v36767; GFX8-NEXT: v_bfi_b32 v2, s4, v7, v46768; GFX8-NEXT: v_bfi_b32 v3, s4, v6, v56769; GFX8-NEXT: s_setpc_b64 s[30:31]6770;6771; GFX9-LABEL: v_copysign_out_v4f32_mag_v4bf16_sign_v4f32:6772; GFX9: ; %bb.0:6773; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6774; GFX9-NEXT: v_and_b32_e32 v6, 0x7fff0000, v16775; GFX9-NEXT: v_lshlrev_b32_e32 v7, 16, v16776; GFX9-NEXT: v_and_b32_e32 v1, 0x7fff0000, v06777; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v06778; GFX9-NEXT: s_brev_b32 s4, -26779; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v26780; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v36781; GFX9-NEXT: v_bfi_b32 v2, s4, v7, v46782; GFX9-NEXT: v_bfi_b32 v3, s4, v6, v56783; GFX9-NEXT: s_setpc_b64 s[30:31]6784;6785; GFX10-LABEL: v_copysign_out_v4f32_mag_v4bf16_sign_v4f32:6786; GFX10: ; %bb.0:6787; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6788; GFX10-NEXT: v_lshlrev_b32_e32 v6, 16, v06789; GFX10-NEXT: v_and_b32_e32 v7, 0x7fff0000, v06790; GFX10-NEXT: v_lshlrev_b32_e32 v8, 16, v16791; GFX10-NEXT: v_and_b32_e32 v9, 0x7fff0000, v16792; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, v6, v26793; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v7, v36794; GFX10-NEXT: v_bfi_b32 v2, 0x7fffffff, v8, v46795; GFX10-NEXT: v_bfi_b32 v3, 0x7fffffff, v9, v56796; GFX10-NEXT: s_setpc_b64 s[30:31]6797;6798; GFX11-LABEL: v_copysign_out_v4f32_mag_v4bf16_sign_v4f32:6799; GFX11: ; %bb.0:6800; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6801; GFX11-NEXT: v_lshlrev_b32_e32 v6, 16, v06802; GFX11-NEXT: v_and_b32_e32 v7, 0x7fff0000, v06803; GFX11-NEXT: v_lshlrev_b32_e32 v8, 16, v16804; GFX11-NEXT: v_and_b32_e32 v9, 0x7fff0000, v16805; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)6806; GFX11-NEXT: v_bfi_b32 v0, 0x7fffffff, v6, v26807; GFX11-NEXT: v_bfi_b32 v1, 0x7fffffff, v7, v36808; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)6809; GFX11-NEXT: v_bfi_b32 v2, 0x7fffffff, v8, v46810; GFX11-NEXT: v_bfi_b32 v3, 0x7fffffff, v9, v56811; GFX11-NEXT: s_setpc_b64 s[30:31]6812 %mag.ext = fpext <4 x bfloat> %mag to <4 x float>6813 %out = call <4 x float> @llvm.copysign.v4f32(<4 x float> %mag.ext, <4 x float> %sign)6814 ret <4 x float> %out6815}6816 6817define <4 x float> @v_copysign_out_v4f32_mag_v4f32_sign_v4bf16(<4 x float> %mag, <4 x bfloat> %sign) {6818; GCN-LABEL: v_copysign_out_v4f32_mag_v4f32_sign_v4bf16:6819; GCN: ; %bb.0:6820; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6821; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v76822; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v66823; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v56824; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v46825; GCN-NEXT: s_brev_b32 s4, -26826; GCN-NEXT: v_bfi_b32 v0, s4, v0, v46827; GCN-NEXT: v_bfi_b32 v1, s4, v1, v56828; GCN-NEXT: v_bfi_b32 v2, s4, v2, v66829; GCN-NEXT: v_bfi_b32 v3, s4, v3, v76830; GCN-NEXT: s_setpc_b64 s[30:31]6831;6832; GFX7-LABEL: v_copysign_out_v4f32_mag_v4f32_sign_v4bf16:6833; GFX7: ; %bb.0:6834; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6835; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v76836; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v66837; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v56838; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v46839; GFX7-NEXT: s_brev_b32 s4, -26840; GFX7-NEXT: v_bfi_b32 v0, s4, v0, v46841; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v56842; GFX7-NEXT: v_bfi_b32 v2, s4, v2, v66843; GFX7-NEXT: v_bfi_b32 v3, s4, v3, v76844; GFX7-NEXT: s_setpc_b64 s[30:31]6845;6846; GFX8-LABEL: v_copysign_out_v4f32_mag_v4f32_sign_v4bf16:6847; GFX8: ; %bb.0:6848; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6849; GFX8-NEXT: v_lshrrev_b32_e32 v7, 16, v46850; GFX8-NEXT: v_lshlrev_b32_e32 v4, 16, v46851; GFX8-NEXT: s_brev_b32 s4, -26852; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v46853; GFX8-NEXT: v_lshlrev_b32_e32 v4, 16, v56854; GFX8-NEXT: v_lshrrev_b32_e32 v6, 16, v56855; GFX8-NEXT: v_bfi_b32 v2, s4, v2, v46856; GFX8-NEXT: v_lshlrev_b32_e32 v4, 16, v76857; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v46858; GFX8-NEXT: v_lshlrev_b32_e32 v4, 16, v66859; GFX8-NEXT: v_bfi_b32 v3, s4, v3, v46860; GFX8-NEXT: s_setpc_b64 s[30:31]6861;6862; GFX9-LABEL: v_copysign_out_v4f32_mag_v4f32_sign_v4bf16:6863; GFX9: ; %bb.0:6864; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6865; GFX9-NEXT: v_lshrrev_b32_e32 v7, 16, v46866; GFX9-NEXT: v_lshlrev_b32_e32 v4, 16, v46867; GFX9-NEXT: s_brev_b32 s4, -26868; GFX9-NEXT: v_bfi_b32 v0, s4, v0, v46869; GFX9-NEXT: v_lshlrev_b32_e32 v4, 16, v56870; GFX9-NEXT: v_lshrrev_b32_e32 v6, 16, v56871; GFX9-NEXT: v_bfi_b32 v2, s4, v2, v46872; GFX9-NEXT: v_lshlrev_b32_e32 v4, 16, v76873; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v46874; GFX9-NEXT: v_lshlrev_b32_e32 v4, 16, v66875; GFX9-NEXT: v_bfi_b32 v3, s4, v3, v46876; GFX9-NEXT: s_setpc_b64 s[30:31]6877;6878; GFX10-LABEL: v_copysign_out_v4f32_mag_v4f32_sign_v4bf16:6879; GFX10: ; %bb.0:6880; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6881; GFX10-NEXT: v_lshrrev_b32_e32 v6, 16, v46882; GFX10-NEXT: v_lshrrev_b32_e32 v7, 16, v56883; GFX10-NEXT: v_lshlrev_b32_e32 v4, 16, v46884; GFX10-NEXT: v_lshlrev_b32_e32 v5, 16, v56885; GFX10-NEXT: v_lshlrev_b32_e32 v6, 16, v66886; GFX10-NEXT: v_lshlrev_b32_e32 v7, 16, v76887; GFX10-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v46888; GFX10-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, v56889; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v66890; GFX10-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v76891; GFX10-NEXT: s_setpc_b64 s[30:31]6892;6893; GFX11TRUE16-LABEL: v_copysign_out_v4f32_mag_v4f32_sign_v4bf16:6894; GFX11TRUE16: ; %bb.0:6895; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6896; GFX11TRUE16-NEXT: v_mov_b16_e32 v6.h, v4.l6897; GFX11TRUE16-NEXT: v_mov_b16_e32 v7.h, v5.l6898; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v46899; GFX11TRUE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v56900; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)6901; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v66902; GFX11TRUE16-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, v76903; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]6904;6905; GFX11FAKE16-LABEL: v_copysign_out_v4f32_mag_v4f32_sign_v4bf16:6906; GFX11FAKE16: ; %bb.0:6907; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6908; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v46909; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v56910; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v4, 16, v46911; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v5, 16, v56912; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)6913; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v6, 16, v66914; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v7, 16, v76915; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)6916; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fffffff, v0, v46917; GFX11FAKE16-NEXT: v_bfi_b32 v2, 0x7fffffff, v2, v56918; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)6919; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v66920; GFX11FAKE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v76921; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]6922 %sign.ext = fpext <4 x bfloat> %sign to <4 x float>6923 %out = call <4 x float> @llvm.copysign.v4f32(<4 x float> %mag, <4 x float> %sign.ext)6924 ret <4 x float> %out6925}6926 6927define <4 x double> @v_copysign_out_v4f64_mag_v4f64_sign_v4bf16(<4 x double> %mag, <4 x bfloat> %sign) {6928; GCN-LABEL: v_copysign_out_v4f64_mag_v4f64_sign_v4bf16:6929; GCN: ; %bb.0:6930; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6931; GCN-NEXT: s_brev_b32 s4, -26932; GCN-NEXT: v_bfi_b32 v1, s4, v1, v86933; GCN-NEXT: v_bfi_b32 v3, s4, v3, v96934; GCN-NEXT: v_bfi_b32 v5, s4, v5, v106935; GCN-NEXT: v_bfi_b32 v7, s4, v7, v116936; GCN-NEXT: s_setpc_b64 s[30:31]6937;6938; GFX7-LABEL: v_copysign_out_v4f64_mag_v4f64_sign_v4bf16:6939; GFX7: ; %bb.0:6940; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6941; GFX7-NEXT: s_brev_b32 s4, -26942; GFX7-NEXT: v_bfi_b32 v1, s4, v1, v86943; GFX7-NEXT: v_bfi_b32 v3, s4, v3, v96944; GFX7-NEXT: v_bfi_b32 v5, s4, v5, v106945; GFX7-NEXT: v_bfi_b32 v7, s4, v7, v116946; GFX7-NEXT: s_setpc_b64 s[30:31]6947;6948; GFX8-LABEL: v_copysign_out_v4f64_mag_v4f64_sign_v4bf16:6949; GFX8: ; %bb.0:6950; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6951; GFX8-NEXT: v_lshlrev_b32_e32 v10, 16, v86952; GFX8-NEXT: v_lshrrev_b32_e32 v8, 16, v86953; GFX8-NEXT: s_brev_b32 s4, -26954; GFX8-NEXT: v_lshlrev_b32_e32 v8, 16, v86955; GFX8-NEXT: v_bfi_b32 v3, s4, v3, v86956; GFX8-NEXT: v_lshrrev_b32_e32 v8, 16, v96957; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v106958; GFX8-NEXT: v_lshlrev_b32_e32 v10, 16, v96959; GFX8-NEXT: v_lshlrev_b32_e32 v8, 16, v86960; GFX8-NEXT: v_bfi_b32 v5, s4, v5, v106961; GFX8-NEXT: v_bfi_b32 v7, s4, v7, v86962; GFX8-NEXT: s_setpc_b64 s[30:31]6963;6964; GFX9-LABEL: v_copysign_out_v4f64_mag_v4f64_sign_v4bf16:6965; GFX9: ; %bb.0:6966; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6967; GFX9-NEXT: v_lshlrev_b32_e32 v10, 16, v86968; GFX9-NEXT: v_lshrrev_b32_e32 v8, 16, v86969; GFX9-NEXT: s_brev_b32 s4, -26970; GFX9-NEXT: v_lshlrev_b32_e32 v8, 16, v86971; GFX9-NEXT: v_bfi_b32 v3, s4, v3, v86972; GFX9-NEXT: v_lshrrev_b32_e32 v8, 16, v96973; GFX9-NEXT: v_bfi_b32 v1, s4, v1, v106974; GFX9-NEXT: v_lshlrev_b32_e32 v10, 16, v96975; GFX9-NEXT: v_lshlrev_b32_e32 v8, 16, v86976; GFX9-NEXT: v_bfi_b32 v5, s4, v5, v106977; GFX9-NEXT: v_bfi_b32 v7, s4, v7, v86978; GFX9-NEXT: s_setpc_b64 s[30:31]6979;6980; GFX10-LABEL: v_copysign_out_v4f64_mag_v4f64_sign_v4bf16:6981; GFX10: ; %bb.0:6982; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6983; GFX10-NEXT: v_lshrrev_b32_e32 v10, 16, v86984; GFX10-NEXT: v_lshrrev_b32_e32 v11, 16, v96985; GFX10-NEXT: v_lshlrev_b32_e32 v8, 16, v86986; GFX10-NEXT: v_lshlrev_b32_e32 v9, 16, v96987; GFX10-NEXT: v_lshlrev_b32_e32 v10, 16, v106988; GFX10-NEXT: v_lshlrev_b32_e32 v11, 16, v116989; GFX10-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v86990; GFX10-NEXT: v_bfi_b32 v5, 0x7fffffff, v5, v96991; GFX10-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v106992; GFX10-NEXT: v_bfi_b32 v7, 0x7fffffff, v7, v116993; GFX10-NEXT: s_setpc_b64 s[30:31]6994;6995; GFX11TRUE16-LABEL: v_copysign_out_v4f64_mag_v4f64_sign_v4bf16:6996; GFX11TRUE16: ; %bb.0:6997; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)6998; GFX11TRUE16-NEXT: v_mov_b16_e32 v10.h, v8.l6999; GFX11TRUE16-NEXT: v_mov_b16_e32 v11.h, v9.l7000; GFX11TRUE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v87001; GFX11TRUE16-NEXT: v_bfi_b32 v7, 0x7fffffff, v7, v97002; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7003; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v107004; GFX11TRUE16-NEXT: v_bfi_b32 v5, 0x7fffffff, v5, v117005; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]7006;7007; GFX11FAKE16-LABEL: v_copysign_out_v4f64_mag_v4f64_sign_v4bf16:7008; GFX11FAKE16: ; %bb.0:7009; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7010; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v10, 16, v87011; GFX11FAKE16-NEXT: v_lshrrev_b32_e32 v11, 16, v97012; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v8, 16, v87013; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v9, 16, v97014; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7015; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v10, 16, v107016; GFX11FAKE16-NEXT: v_lshlrev_b32_e32 v11, 16, v117017; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7018; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fffffff, v1, v87019; GFX11FAKE16-NEXT: v_bfi_b32 v5, 0x7fffffff, v5, v97020; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7021; GFX11FAKE16-NEXT: v_bfi_b32 v3, 0x7fffffff, v3, v107022; GFX11FAKE16-NEXT: v_bfi_b32 v7, 0x7fffffff, v7, v117023; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]7024 %sign.ext = fpext <4 x bfloat> %sign to <4 x double>7025 %out = call <4 x double> @llvm.copysign.v4f64(<4 x double> %mag, <4 x double> %sign.ext)7026 ret <4 x double> %out7027}7028 7029define <4 x bfloat> @v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16(<4 x float> %mag, <4 x bfloat> %sign) {7030; GCN-LABEL: v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16:7031; GCN: ; %bb.0:7032; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7033; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v47034; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v57035; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v67036; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v77037; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v07038; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v17039; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v27040; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v37041; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v47042; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v57043; GCN-NEXT: v_lshrrev_b32_e32 v6, 16, v67044; GCN-NEXT: v_lshrrev_b32_e32 v7, 16, v77045; GCN-NEXT: v_bfe_u32 v3, v3, 16, 157046; GCN-NEXT: v_bfe_u32 v2, v2, 16, 157047; GCN-NEXT: v_bfe_u32 v1, v1, 16, 157048; GCN-NEXT: v_bfe_u32 v0, v0, 16, 157049; GCN-NEXT: v_and_b32_e32 v7, 0x8000, v77050; GCN-NEXT: v_and_b32_e32 v6, 0x8000, v67051; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v57052; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v47053; GCN-NEXT: v_or_b32_e32 v3, v3, v77054; GCN-NEXT: v_or_b32_e32 v2, v2, v67055; GCN-NEXT: v_or_b32_e32 v1, v1, v57056; GCN-NEXT: v_or_b32_e32 v0, v0, v47057; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v07058; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v17059; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v27060; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v37061; GCN-NEXT: s_setpc_b64 s[30:31]7062;7063; GFX7-LABEL: v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16:7064; GFX7: ; %bb.0:7065; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7066; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v47067; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v57068; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v67069; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v77070; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v47071; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v57072; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v67073; GFX7-NEXT: v_lshrrev_b32_e32 v7, 16, v77074; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v07075; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v17076; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v27077; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v37078; GFX7-NEXT: v_and_b32_e32 v7, 0x8000, v77079; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 157080; GFX7-NEXT: v_and_b32_e32 v6, 0x8000, v67081; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 157082; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v57083; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 157084; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v47085; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 157086; GFX7-NEXT: v_or_b32_e32 v3, v3, v77087; GFX7-NEXT: v_or_b32_e32 v2, v2, v67088; GFX7-NEXT: v_or_b32_e32 v1, v1, v57089; GFX7-NEXT: v_or_b32_e32 v0, v0, v47090; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v07091; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v17092; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v27093; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v37094; GFX7-NEXT: s_setpc_b64 s[30:31]7095;7096; GFX8-LABEL: v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16:7097; GFX8: ; %bb.0:7098; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7099; GFX8-NEXT: v_bfe_u32 v7, v2, 16, 17100; GFX8-NEXT: v_add_u32_e32 v7, vcc, v7, v27101; GFX8-NEXT: v_add_u32_e32 v7, vcc, 0x7fff, v77102; GFX8-NEXT: v_or_b32_e32 v6, 0x400000, v27103; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v2, v27104; GFX8-NEXT: v_cndmask_b32_e32 v2, v7, v6, vcc7105; GFX8-NEXT: v_bfe_u32 v7, v3, 16, 17106; GFX8-NEXT: s_movk_i32 s4, 0x7fff7107; GFX8-NEXT: v_add_u32_e32 v7, vcc, v7, v37108; GFX8-NEXT: v_add_u32_e32 v7, vcc, s4, v77109; GFX8-NEXT: v_or_b32_e32 v6, 0x400000, v37110; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v3, v37111; GFX8-NEXT: v_cndmask_b32_e32 v3, v7, v6, vcc7112; GFX8-NEXT: v_bfe_u32 v7, v0, 16, 17113; GFX8-NEXT: v_add_u32_e32 v7, vcc, v7, v07114; GFX8-NEXT: v_add_u32_e32 v7, vcc, s4, v77115; GFX8-NEXT: v_or_b32_e32 v6, 0x400000, v07116; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v0, v07117; GFX8-NEXT: v_cndmask_b32_e32 v0, v7, v6, vcc7118; GFX8-NEXT: v_bfe_u32 v7, v1, 16, 17119; GFX8-NEXT: v_add_u32_e32 v7, vcc, v7, v17120; GFX8-NEXT: v_add_u32_e32 v7, vcc, 0x7fff, v77121; GFX8-NEXT: v_or_b32_e32 v6, 0x400000, v17122; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v1, v17123; GFX8-NEXT: v_cndmask_b32_e32 v1, v7, v6, vcc7124; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v37125; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v17126; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 167127; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff7128; GFX8-NEXT: v_alignbit_b32 v1, v3, v2, 167129; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v47130; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v57131; GFX8-NEXT: s_setpc_b64 s[30:31]7132;7133; GFX9-LABEL: v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16:7134; GFX9: ; %bb.0:7135; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7136; GFX9-NEXT: v_bfe_u32 v6, v2, 16, 17137; GFX9-NEXT: s_movk_i32 s4, 0x7fff7138; GFX9-NEXT: v_add3_u32 v6, v6, v2, s47139; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v27140; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v2, v27141; GFX9-NEXT: v_cndmask_b32_e32 v2, v6, v7, vcc7142; GFX9-NEXT: v_bfe_u32 v6, v3, 16, 17143; GFX9-NEXT: v_add3_u32 v6, v6, v3, s47144; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v37145; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v3, v37146; GFX9-NEXT: v_cndmask_b32_e32 v3, v6, v7, vcc7147; GFX9-NEXT: v_bfe_u32 v6, v0, 16, 17148; GFX9-NEXT: v_add3_u32 v6, v6, v0, s47149; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v07150; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v0, v07151; GFX9-NEXT: v_cndmask_b32_e32 v0, v6, v7, vcc7152; GFX9-NEXT: v_bfe_u32 v6, v1, 16, 17153; GFX9-NEXT: v_add3_u32 v6, v6, v1, s47154; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v17155; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v1, v17156; GFX9-NEXT: v_cndmask_b32_e32 v1, v6, v7, vcc7157; GFX9-NEXT: s_mov_b32 s4, 0x70603027158; GFX9-NEXT: v_perm_b32 v0, v1, v0, s47159; GFX9-NEXT: s_mov_b32 s5, 0x7fff7fff7160; GFX9-NEXT: v_perm_b32 v1, v3, v2, s47161; GFX9-NEXT: v_bfi_b32 v0, s5, v0, v47162; GFX9-NEXT: v_bfi_b32 v1, s5, v1, v57163; GFX9-NEXT: s_setpc_b64 s[30:31]7164;7165; GFX10-LABEL: v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16:7166; GFX10: ; %bb.0:7167; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7168; GFX10-NEXT: v_bfe_u32 v6, v2, 16, 17169; GFX10-NEXT: v_bfe_u32 v8, v0, 16, 17170; GFX10-NEXT: v_or_b32_e32 v9, 0x400000, v27171; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v27172; GFX10-NEXT: v_bfe_u32 v10, v1, 16, 17173; GFX10-NEXT: v_add3_u32 v6, v6, v2, 0x7fff7174; GFX10-NEXT: v_add3_u32 v8, v8, v0, 0x7fff7175; GFX10-NEXT: v_bfe_u32 v7, v3, 16, 17176; GFX10-NEXT: v_or_b32_e32 v11, 0x400000, v37177; GFX10-NEXT: v_cndmask_b32_e32 v2, v6, v9, vcc_lo7178; GFX10-NEXT: v_or_b32_e32 v6, 0x400000, v07179; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v07180; GFX10-NEXT: v_add3_u32 v9, v10, v1, 0x7fff7181; GFX10-NEXT: v_or_b32_e32 v10, 0x400000, v17182; GFX10-NEXT: v_add3_u32 v7, v7, v3, 0x7fff7183; GFX10-NEXT: v_cndmask_b32_e32 v0, v8, v6, vcc_lo7184; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v17185; GFX10-NEXT: v_cndmask_b32_e32 v1, v9, v10, vcc_lo7186; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v37187; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x70603027188; GFX10-NEXT: v_cndmask_b32_e32 v3, v7, v11, vcc_lo7189; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v47190; GFX10-NEXT: v_perm_b32 v1, v3, v2, 0x70603027191; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v57192; GFX10-NEXT: s_setpc_b64 s[30:31]7193;7194; GFX11TRUE16-LABEL: v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16:7195; GFX11TRUE16: ; %bb.0:7196; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7197; GFX11TRUE16-NEXT: v_bfe_u32 v7, v2, 16, 17198; GFX11TRUE16-NEXT: v_bfe_u32 v6, v3, 16, 17199; GFX11TRUE16-NEXT: v_bfe_u32 v9, v0, 16, 17200; GFX11TRUE16-NEXT: v_or_b32_e32 v10, 0x400000, v27201; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v27202; GFX11TRUE16-NEXT: v_add3_u32 v7, v7, v2, 0x7fff7203; GFX11TRUE16-NEXT: v_or_b32_e32 v8, 0x400000, v37204; GFX11TRUE16-NEXT: v_add3_u32 v6, v6, v3, 0x7fff7205; GFX11TRUE16-NEXT: v_bfe_u32 v11, v1, 16, 17206; GFX11TRUE16-NEXT: v_add3_u32 v9, v9, v0, 0x7fff7207; GFX11TRUE16-NEXT: v_or_b32_e32 v12, 0x400000, v07208; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v2, v7, v10, vcc_lo7209; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v07210; GFX11TRUE16-NEXT: v_add3_u32 v7, v11, v1, 0x7fff7211; GFX11TRUE16-NEXT: v_or_b32_e32 v10, 0x400000, v17212; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v0, v9, v12, vcc_lo7213; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v37214; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v3, v6, v8, vcc_lo7215; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v17216; GFX11TRUE16-NEXT: v_mov_b16_e32 v3.l, v2.h7217; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v1, v7, v10, vcc_lo7218; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.h7219; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_4)7220; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v1, v47221; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v3, v57222; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]7223;7224; GFX11FAKE16-LABEL: v_copysign_out_v4bf16_mag_v4f32_sign_v4bf16:7225; GFX11FAKE16: ; %bb.0:7226; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7227; GFX11FAKE16-NEXT: v_bfe_u32 v6, v2, 16, 17228; GFX11FAKE16-NEXT: v_bfe_u32 v8, v0, 16, 17229; GFX11FAKE16-NEXT: v_or_b32_e32 v9, 0x400000, v27230; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v27231; GFX11FAKE16-NEXT: v_bfe_u32 v7, v3, 16, 17232; GFX11FAKE16-NEXT: v_add3_u32 v6, v6, v2, 0x7fff7233; GFX11FAKE16-NEXT: v_bfe_u32 v10, v1, 16, 17234; GFX11FAKE16-NEXT: v_add3_u32 v8, v8, v0, 0x7fff7235; GFX11FAKE16-NEXT: v_or_b32_e32 v11, 0x400000, v37236; GFX11FAKE16-NEXT: v_add3_u32 v7, v7, v3, 0x7fff7237; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v2, v6, v9, vcc_lo7238; GFX11FAKE16-NEXT: v_or_b32_e32 v6, 0x400000, v07239; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v0, v07240; GFX11FAKE16-NEXT: v_add3_u32 v9, v10, v1, 0x7fff7241; GFX11FAKE16-NEXT: v_or_b32_e32 v10, 0x400000, v17242; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3)7243; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v0, v8, v6, vcc_lo7244; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v1, v17245; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v1, v9, v10, vcc_lo7246; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v37247; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v3, v7, v11, vcc_lo7248; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)7249; GFX11FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x70603027250; GFX11FAKE16-NEXT: v_perm_b32 v1, v3, v2, 0x70603027251; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)7252; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v47253; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v57254; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]7255 %mag.trunc = fptrunc <4 x float> %mag to <4 x bfloat>7256 %out = call <4 x bfloat> @llvm.copysign.v4bf16(<4 x bfloat> %mag.trunc, <4 x bfloat> %sign)7257 ret <4 x bfloat> %out7258}7259 7260define <4 x bfloat> @v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16(<4 x double> %mag, <4 x bfloat> %sign) {7261; GCN-LABEL: v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16:7262; GCN: ; %bb.0:7263; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7264; GCN-NEXT: v_mul_f32_e32 v8, 1.0, v87265; GCN-NEXT: v_mul_f32_e32 v9, 1.0, v97266; GCN-NEXT: v_mul_f32_e32 v10, 1.0, v107267; GCN-NEXT: v_mul_f32_e32 v11, 1.0, v117268; GCN-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]7269; GCN-NEXT: v_cvt_f32_f64_e32 v1, v[2:3]7270; GCN-NEXT: v_cvt_f32_f64_e32 v2, v[4:5]7271; GCN-NEXT: v_cvt_f32_f64_e32 v3, v[6:7]7272; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v87273; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v97274; GCN-NEXT: v_lshrrev_b32_e32 v6, 16, v107275; GCN-NEXT: v_lshrrev_b32_e32 v7, 16, v117276; GCN-NEXT: v_bfe_u32 v3, v3, 16, 157277; GCN-NEXT: v_bfe_u32 v2, v2, 16, 157278; GCN-NEXT: v_bfe_u32 v1, v1, 16, 157279; GCN-NEXT: v_bfe_u32 v0, v0, 16, 157280; GCN-NEXT: v_and_b32_e32 v7, 0x8000, v77281; GCN-NEXT: v_and_b32_e32 v6, 0x8000, v67282; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v57283; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v47284; GCN-NEXT: v_or_b32_e32 v3, v3, v77285; GCN-NEXT: v_or_b32_e32 v2, v2, v67286; GCN-NEXT: v_or_b32_e32 v1, v1, v57287; GCN-NEXT: v_or_b32_e32 v0, v0, v47288; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v07289; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v17290; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v27291; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v37292; GCN-NEXT: s_setpc_b64 s[30:31]7293;7294; GFX7-LABEL: v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16:7295; GFX7: ; %bb.0:7296; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7297; GFX7-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]7298; GFX7-NEXT: v_cvt_f32_f64_e32 v1, v[6:7]7299; GFX7-NEXT: v_cvt_f32_f64_e32 v2, v[2:3]7300; GFX7-NEXT: v_cvt_f32_f64_e32 v3, v[4:5]7301; GFX7-NEXT: v_mul_f32_e32 v11, 1.0, v117302; GFX7-NEXT: v_mul_f32_e32 v10, 1.0, v107303; GFX7-NEXT: v_lshrrev_b32_e32 v11, 16, v117304; GFX7-NEXT: v_mul_f32_e32 v9, 1.0, v97305; GFX7-NEXT: v_lshrrev_b32_e32 v10, 16, v107306; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v117307; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 157308; GFX7-NEXT: v_mul_f32_e32 v8, 1.0, v87309; GFX7-NEXT: v_lshrrev_b32_e32 v9, 16, v97310; GFX7-NEXT: v_or_b32_e32 v4, v1, v47311; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v107312; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 157313; GFX7-NEXT: v_lshrrev_b32_e32 v8, 16, v87314; GFX7-NEXT: v_or_b32_e32 v3, v3, v17315; GFX7-NEXT: v_and_b32_e32 v1, 0x8000, v97316; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 157317; GFX7-NEXT: v_or_b32_e32 v1, v2, v17318; GFX7-NEXT: v_and_b32_e32 v2, 0x8000, v87319; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 157320; GFX7-NEXT: v_or_b32_e32 v0, v0, v27321; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v07322; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v17323; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v37324; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v47325; GFX7-NEXT: s_setpc_b64 s[30:31]7326;7327; GFX8-LABEL: v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16:7328; GFX8: ; %bb.0:7329; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7330; GFX8-NEXT: v_cvt_f32_f64_e32 v12, v[4:5]7331; GFX8-NEXT: s_movk_i32 s8, 0x7fff7332; GFX8-NEXT: v_cvt_f64_f32_e32 v[10:11], v127333; GFX8-NEXT: v_and_b32_e32 v13, 1, v127334; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v137335; GFX8-NEXT: v_cvt_f32_f64_e32 v13, v[6:7]7336; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[4:5]|, |v[10:11]|7337; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[4:5], v[10:11]7338; GFX8-NEXT: v_cndmask_b32_e64 v10, -1, 1, s[6:7]7339; GFX8-NEXT: v_add_u32_e64 v10, s[6:7], v12, v107340; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]7341; GFX8-NEXT: v_cndmask_b32_e32 v12, v10, v12, vcc7342; GFX8-NEXT: v_bfe_u32 v10, v12, 16, 17343; GFX8-NEXT: v_add_u32_e32 v14, vcc, v10, v127344; GFX8-NEXT: v_cvt_f64_f32_e32 v[10:11], v137345; GFX8-NEXT: v_add_u32_e32 v14, vcc, s8, v147346; GFX8-NEXT: v_cmp_u_f64_e64 s[4:5], v[4:5], v[4:5]7347; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[6:7]|, |v[10:11]|7348; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[6:7], v[10:11]7349; GFX8-NEXT: v_or_b32_e32 v12, 0x400000, v127350; GFX8-NEXT: v_and_b32_e32 v4, 1, v137351; GFX8-NEXT: v_cvt_f32_f64_e32 v11, v[0:1]7352; GFX8-NEXT: v_cndmask_b32_e64 v12, v14, v12, s[4:5]7353; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v47354; GFX8-NEXT: v_cndmask_b32_e64 v4, -1, 1, s[6:7]7355; GFX8-NEXT: v_add_u32_e64 v4, s[6:7], v13, v47356; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]7357; GFX8-NEXT: v_cndmask_b32_e32 v10, v4, v13, vcc7358; GFX8-NEXT: v_bfe_u32 v4, v10, 16, 17359; GFX8-NEXT: v_add_u32_e32 v4, vcc, v4, v107360; GFX8-NEXT: v_add_u32_e32 v13, vcc, s8, v47361; GFX8-NEXT: v_cmp_u_f64_e32 vcc, v[6:7], v[6:7]7362; GFX8-NEXT: v_cvt_f64_f32_e32 v[4:5], v117363; GFX8-NEXT: v_or_b32_e32 v10, 0x400000, v107364; GFX8-NEXT: v_and_b32_e32 v7, 1, v117365; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v77366; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[0:1]|, |v[4:5]|7367; GFX8-NEXT: v_cndmask_b32_e32 v6, v13, v10, vcc7368; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[0:1], v[4:5]7369; GFX8-NEXT: v_cvt_f32_f64_e32 v10, v[2:3]7370; GFX8-NEXT: v_lshrrev_b32_e32 v6, 16, v67371; GFX8-NEXT: v_cndmask_b32_e64 v4, -1, 1, s[6:7]7372; GFX8-NEXT: v_add_u32_e64 v4, s[6:7], v11, v47373; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]7374; GFX8-NEXT: v_cndmask_b32_e32 v7, v4, v11, vcc7375; GFX8-NEXT: v_bfe_u32 v4, v7, 16, 17376; GFX8-NEXT: v_add_u32_e32 v11, vcc, v4, v77377; GFX8-NEXT: v_cvt_f64_f32_e32 v[4:5], v107378; GFX8-NEXT: v_add_u32_e32 v11, vcc, s8, v117379; GFX8-NEXT: v_cmp_u_f64_e64 s[4:5], v[0:1], v[0:1]7380; GFX8-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[2:3]|, |v[4:5]|7381; GFX8-NEXT: v_cmp_nlg_f64_e32 vcc, v[2:3], v[4:5]7382; GFX8-NEXT: v_or_b32_e32 v7, 0x400000, v77383; GFX8-NEXT: v_and_b32_e32 v1, 1, v107384; GFX8-NEXT: v_cndmask_b32_e64 v0, v11, v7, s[4:5]7385; GFX8-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v17386; GFX8-NEXT: v_cndmask_b32_e64 v1, -1, 1, s[6:7]7387; GFX8-NEXT: v_add_u32_e64 v1, s[6:7], v10, v17388; GFX8-NEXT: s_or_b64 vcc, vcc, s[4:5]7389; GFX8-NEXT: v_cndmask_b32_e32 v1, v1, v10, vcc7390; GFX8-NEXT: v_bfe_u32 v4, v1, 16, 17391; GFX8-NEXT: v_add_u32_e32 v4, vcc, v4, v17392; GFX8-NEXT: v_add_u32_e32 v4, vcc, 0x7fff, v47393; GFX8-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[2:3]7394; GFX8-NEXT: v_or_b32_e32 v1, 0x400000, v17395; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff7396; GFX8-NEXT: v_cndmask_b32_e32 v1, v4, v1, vcc7397; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v17398; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 167399; GFX8-NEXT: v_alignbit_b32 v1, v6, v12, 167400; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v87401; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v97402; GFX8-NEXT: s_setpc_b64 s[30:31]7403;7404; GFX9-LABEL: v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16:7405; GFX9: ; %bb.0:7406; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7407; GFX9-NEXT: v_cvt_f32_f64_e32 v12, v[4:5]7408; GFX9-NEXT: s_movk_i32 s8, 0x7fff7409; GFX9-NEXT: v_cvt_f64_f32_e32 v[10:11], v127410; GFX9-NEXT: v_and_b32_e32 v13, 1, v127411; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v137412; GFX9-NEXT: v_cvt_f32_f64_e32 v13, v[6:7]7413; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[4:5]|, |v[10:11]|7414; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[4:5], v[10:11]7415; GFX9-NEXT: v_cndmask_b32_e64 v10, -1, 1, s[6:7]7416; GFX9-NEXT: v_add_u32_e32 v10, v12, v107417; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]7418; GFX9-NEXT: v_cndmask_b32_e32 v12, v10, v12, vcc7419; GFX9-NEXT: v_cvt_f64_f32_e32 v[10:11], v137420; GFX9-NEXT: v_cmp_u_f64_e64 s[4:5], v[4:5], v[4:5]7421; GFX9-NEXT: v_bfe_u32 v14, v12, 16, 17422; GFX9-NEXT: v_add3_u32 v14, v14, v12, s87423; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[6:7]|, |v[10:11]|7424; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[6:7], v[10:11]7425; GFX9-NEXT: v_cvt_f32_f64_e32 v10, v[0:1]7426; GFX9-NEXT: v_or_b32_e32 v12, 0x400000, v127427; GFX9-NEXT: v_and_b32_e32 v4, 1, v137428; GFX9-NEXT: v_cndmask_b32_e64 v12, v14, v12, s[4:5]7429; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v47430; GFX9-NEXT: v_cndmask_b32_e64 v4, -1, 1, s[6:7]7431; GFX9-NEXT: v_add_u32_e32 v4, v13, v47432; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]7433; GFX9-NEXT: v_cndmask_b32_e32 v11, v4, v13, vcc7434; GFX9-NEXT: v_cvt_f64_f32_e32 v[4:5], v107435; GFX9-NEXT: v_cmp_u_f64_e64 s[4:5], v[6:7], v[6:7]7436; GFX9-NEXT: v_bfe_u32 v13, v11, 16, 17437; GFX9-NEXT: v_add3_u32 v13, v13, v11, s87438; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[0:1]|, |v[4:5]|7439; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[0:1], v[4:5]7440; GFX9-NEXT: v_or_b32_e32 v11, 0x400000, v117441; GFX9-NEXT: v_and_b32_e32 v7, 1, v107442; GFX9-NEXT: v_cndmask_b32_e64 v6, v13, v11, s[4:5]7443; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v77444; GFX9-NEXT: v_cvt_f32_f64_e32 v7, v[2:3]7445; GFX9-NEXT: v_cndmask_b32_e64 v4, -1, 1, s[6:7]7446; GFX9-NEXT: v_add_u32_e32 v4, v10, v47447; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]7448; GFX9-NEXT: v_cndmask_b32_e32 v10, v4, v10, vcc7449; GFX9-NEXT: v_cvt_f64_f32_e32 v[4:5], v77450; GFX9-NEXT: v_cmp_u_f64_e64 s[4:5], v[0:1], v[0:1]7451; GFX9-NEXT: v_bfe_u32 v11, v10, 16, 17452; GFX9-NEXT: v_add3_u32 v11, v11, v10, s87453; GFX9-NEXT: v_cmp_gt_f64_e64 s[6:7], |v[2:3]|, |v[4:5]|7454; GFX9-NEXT: v_cmp_nlg_f64_e32 vcc, v[2:3], v[4:5]7455; GFX9-NEXT: v_or_b32_e32 v10, 0x400000, v107456; GFX9-NEXT: v_and_b32_e32 v1, 1, v77457; GFX9-NEXT: v_cndmask_b32_e64 v0, v11, v10, s[4:5]7458; GFX9-NEXT: v_cmp_eq_u32_e64 s[4:5], 1, v17459; GFX9-NEXT: v_cndmask_b32_e64 v1, -1, 1, s[6:7]7460; GFX9-NEXT: v_add_u32_e32 v1, v7, v17461; GFX9-NEXT: s_or_b64 vcc, vcc, s[4:5]7462; GFX9-NEXT: v_cndmask_b32_e32 v1, v1, v7, vcc7463; GFX9-NEXT: v_cmp_u_f64_e32 vcc, v[2:3], v[2:3]7464; GFX9-NEXT: v_bfe_u32 v4, v1, 16, 17465; GFX9-NEXT: v_add3_u32 v4, v4, v1, s87466; GFX9-NEXT: v_or_b32_e32 v1, 0x400000, v17467; GFX9-NEXT: s_mov_b32 s4, 0x70603027468; GFX9-NEXT: s_mov_b32 s5, 0x7fff7fff7469; GFX9-NEXT: v_cndmask_b32_e32 v1, v4, v1, vcc7470; GFX9-NEXT: v_perm_b32 v0, v1, v0, s47471; GFX9-NEXT: v_perm_b32 v1, v6, v12, s47472; GFX9-NEXT: v_bfi_b32 v0, s5, v0, v87473; GFX9-NEXT: v_bfi_b32 v1, s5, v1, v97474; GFX9-NEXT: s_setpc_b64 s[30:31]7475;7476; GFX10-LABEL: v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16:7477; GFX10: ; %bb.0:7478; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7479; GFX10-NEXT: v_cvt_f32_f64_e32 v18, v[4:5]7480; GFX10-NEXT: v_cvt_f32_f64_e32 v19, v[6:7]7481; GFX10-NEXT: v_cvt_f32_f64_e32 v20, v[0:1]7482; GFX10-NEXT: v_cvt_f32_f64_e32 v21, v[2:3]7483; GFX10-NEXT: v_cvt_f64_f32_e32 v[10:11], v187484; GFX10-NEXT: v_cvt_f64_f32_e32 v[12:13], v197485; GFX10-NEXT: v_cvt_f64_f32_e32 v[14:15], v207486; GFX10-NEXT: v_cvt_f64_f32_e32 v[16:17], v217487; GFX10-NEXT: v_and_b32_e32 v22, 1, v187488; GFX10-NEXT: v_and_b32_e32 v23, 1, v197489; GFX10-NEXT: v_and_b32_e32 v24, 1, v207490; GFX10-NEXT: v_and_b32_e32 v25, 1, v217491; GFX10-NEXT: v_cmp_eq_u32_e64 s6, 1, v227492; GFX10-NEXT: v_cmp_eq_u32_e64 s8, 1, v237493; GFX10-NEXT: v_cmp_eq_u32_e64 s9, 1, v247494; GFX10-NEXT: v_cmp_gt_f64_e64 s10, |v[4:5]|, |v[10:11]|7495; GFX10-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[4:5], v[10:11]7496; GFX10-NEXT: v_cmp_nlg_f64_e64 s4, v[6:7], v[12:13]7497; GFX10-NEXT: v_cmp_nlg_f64_e64 s5, v[0:1], v[14:15]7498; GFX10-NEXT: v_cmp_nlg_f64_e64 s7, v[2:3], v[16:17]7499; GFX10-NEXT: v_cndmask_b32_e64 v10, -1, 1, s107500; GFX10-NEXT: v_cmp_gt_f64_e64 s10, |v[6:7]|, |v[12:13]|7501; GFX10-NEXT: s_or_b32 vcc_lo, vcc_lo, s67502; GFX10-NEXT: v_add_nc_u32_e32 v10, v18, v107503; GFX10-NEXT: v_cndmask_b32_e32 v10, v10, v18, vcc_lo7504; GFX10-NEXT: s_or_b32 vcc_lo, s4, s87505; GFX10-NEXT: v_cndmask_b32_e64 v11, -1, 1, s107506; GFX10-NEXT: v_cmp_gt_f64_e64 s10, |v[0:1]|, |v[14:15]|7507; GFX10-NEXT: v_bfe_u32 v14, v10, 16, 17508; GFX10-NEXT: v_or_b32_e32 v15, 0x400000, v107509; GFX10-NEXT: v_add_nc_u32_e32 v11, v19, v117510; GFX10-NEXT: v_add3_u32 v10, v14, v10, 0x7fff7511; GFX10-NEXT: v_cndmask_b32_e32 v11, v11, v19, vcc_lo7512; GFX10-NEXT: s_or_b32 vcc_lo, s5, s97513; GFX10-NEXT: v_cndmask_b32_e64 v12, -1, 1, s107514; GFX10-NEXT: v_cmp_gt_f64_e64 s10, |v[2:3]|, |v[16:17]|7515; GFX10-NEXT: v_bfe_u32 v16, v11, 16, 17516; GFX10-NEXT: v_or_b32_e32 v17, 0x400000, v117517; GFX10-NEXT: v_add_nc_u32_e32 v12, v20, v127518; GFX10-NEXT: v_add3_u32 v11, v16, v11, 0x7fff7519; GFX10-NEXT: v_cndmask_b32_e32 v12, v12, v20, vcc_lo7520; GFX10-NEXT: v_bfe_u32 v18, v12, 16, 17521; GFX10-NEXT: v_or_b32_e32 v19, 0x400000, v127522; GFX10-NEXT: v_add3_u32 v12, v18, v12, 0x7fff7523; GFX10-NEXT: v_cndmask_b32_e64 v13, -1, 1, s107524; GFX10-NEXT: v_cmp_eq_u32_e64 s10, 1, v257525; GFX10-NEXT: v_add_nc_u32_e32 v13, v21, v137526; GFX10-NEXT: s_or_b32 vcc_lo, s7, s107527; GFX10-NEXT: v_cndmask_b32_e32 v13, v13, v21, vcc_lo7528; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[4:5], v[4:5]7529; GFX10-NEXT: v_bfe_u32 v20, v13, 16, 17530; GFX10-NEXT: v_or_b32_e32 v21, 0x400000, v137531; GFX10-NEXT: v_add3_u32 v13, v20, v13, 0x7fff7532; GFX10-NEXT: v_cndmask_b32_e32 v4, v10, v15, vcc_lo7533; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]7534; GFX10-NEXT: v_cndmask_b32_e32 v0, v12, v19, vcc_lo7535; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]7536; GFX10-NEXT: v_cndmask_b32_e32 v1, v13, v21, vcc_lo7537; GFX10-NEXT: v_cmp_u_f64_e32 vcc_lo, v[6:7], v[6:7]7538; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x70603027539; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v87540; GFX10-NEXT: v_cndmask_b32_e32 v2, v11, v17, vcc_lo7541; GFX10-NEXT: v_perm_b32 v1, v2, v4, 0x70603027542; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v97543; GFX10-NEXT: s_setpc_b64 s[30:31]7544;7545; GFX11TRUE16-LABEL: v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16:7546; GFX11TRUE16: ; %bb.0:7547; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7548; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v18, v[6:7]7549; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v19, v[4:5]7550; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v20, v[2:3]7551; GFX11TRUE16-NEXT: v_cvt_f32_f64_e32 v21, v[0:1]7552; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7553; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[10:11], v187554; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[12:13], v197555; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7556; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[14:15], v207557; GFX11TRUE16-NEXT: v_cvt_f64_f32_e32 v[16:17], v217558; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4)7559; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s6, |v[6:7]|, |v[10:11]|7560; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[6:7], v[10:11]7561; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e64 s0, v[4:5], v[12:13]7562; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e64 s1, v[2:3], v[14:15]7563; GFX11TRUE16-NEXT: v_cmp_nlg_f64_e64 s2, v[0:1], v[16:17]7564; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v10, -1, 1, s67565; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s6, |v[4:5]|, |v[12:13]|7566; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)7567; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v10, v18, v107568; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v11, -1, 1, s67569; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s6, |v[2:3]|, |v[14:15]|7570; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)7571; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v11, v19, v117572; GFX11TRUE16-NEXT: v_and_b32_e32 v22, 1, v187573; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s3, 1, v227574; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, vcc_lo, s37575; GFX11TRUE16-NEXT: v_dual_cndmask_b32 v10, v10, v18 :: v_dual_and_b32 v23, 1, v197576; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)7577; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s4, 1, v237578; GFX11TRUE16-NEXT: v_bfe_u32 v14, v10, 16, 17579; GFX11TRUE16-NEXT: v_or_b32_e32 v15, 0x400000, v107580; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, s0, s47581; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_3)7582; GFX11TRUE16-NEXT: v_add3_u32 v10, v14, v10, 0x7fff7583; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v11, v11, v19, vcc_lo7584; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v12, -1, 1, s67585; GFX11TRUE16-NEXT: v_cmp_gt_f64_e64 s6, |v[0:1]|, |v[16:17]|7586; GFX11TRUE16-NEXT: v_bfe_u32 v16, v11, 16, 17587; GFX11TRUE16-NEXT: v_or_b32_e32 v17, 0x400000, v117588; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3)7589; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v12, v20, v127590; GFX11TRUE16-NEXT: v_add3_u32 v11, v16, v11, 0x7fff7591; GFX11TRUE16-NEXT: v_cndmask_b32_e64 v13, -1, 1, s67592; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)7593; GFX11TRUE16-NEXT: v_add_nc_u32_e32 v13, v21, v137594; GFX11TRUE16-NEXT: v_and_b32_e32 v24, 1, v207595; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s5, 1, v247596; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, s1, s57597; GFX11TRUE16-NEXT: v_dual_cndmask_b32 v12, v12, v20 :: v_dual_and_b32 v25, 1, v217598; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)7599; GFX11TRUE16-NEXT: v_cmp_eq_u32_e64 s6, 1, v257600; GFX11TRUE16-NEXT: v_bfe_u32 v18, v12, 16, 17601; GFX11TRUE16-NEXT: v_or_b32_e32 v20, 0x400000, v127602; GFX11TRUE16-NEXT: s_or_b32 vcc_lo, s2, s67603; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2)7604; GFX11TRUE16-NEXT: v_add3_u32 v12, v18, v12, 0x7fff7605; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v13, v13, v21, vcc_lo7606; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[4:5], v[4:5]7607; GFX11TRUE16-NEXT: v_bfe_u32 v19, v13, 16, 17608; GFX11TRUE16-NEXT: v_or_b32_e32 v21, 0x400000, v137609; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3)7610; GFX11TRUE16-NEXT: v_add3_u32 v13, v19, v13, 0x7fff7611; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v4, v11, v17, vcc_lo7612; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]7613; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v0, v13, v21, vcc_lo7614; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[6:7], v[6:7]7615; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v1, v10, v15, vcc_lo7616; GFX11TRUE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]7617; GFX11TRUE16-NEXT: v_mov_b16_e32 v1.l, v4.h7618; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)7619; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v97620; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v2, v12, v20, vcc_lo7621; GFX11TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.h7622; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v2, v87623; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]7624;7625; GFX11FAKE16-LABEL: v_copysign_out_v4bf16_mag_v4f64_sign_v4bf16:7626; GFX11FAKE16: ; %bb.0:7627; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7628; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v18, v[4:5]7629; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v19, v[6:7]7630; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v20, v[0:1]7631; GFX11FAKE16-NEXT: v_cvt_f32_f64_e32 v21, v[2:3]7632; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7633; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[10:11], v187634; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[12:13], v197635; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)7636; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[14:15], v207637; GFX11FAKE16-NEXT: v_cvt_f64_f32_e32 v[16:17], v217638; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4)7639; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s6, |v[4:5]|, |v[10:11]|7640; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e32 vcc_lo, v[4:5], v[10:11]7641; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e64 s0, v[6:7], v[12:13]7642; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e64 s1, v[0:1], v[14:15]7643; GFX11FAKE16-NEXT: v_cmp_nlg_f64_e64 s2, v[2:3], v[16:17]7644; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v10, -1, 1, s67645; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s6, |v[6:7]|, |v[12:13]|7646; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)7647; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v10, v18, v107648; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v11, -1, 1, s67649; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s6, |v[0:1]|, |v[14:15]|7650; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)7651; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v11, v19, v117652; GFX11FAKE16-NEXT: v_and_b32_e32 v22, 1, v187653; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s3, 1, v227654; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, vcc_lo, s37655; GFX11FAKE16-NEXT: v_dual_cndmask_b32 v10, v10, v18 :: v_dual_and_b32 v23, 1, v197656; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)7657; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s4, 1, v237658; GFX11FAKE16-NEXT: v_bfe_u32 v14, v10, 16, 17659; GFX11FAKE16-NEXT: v_or_b32_e32 v15, 0x400000, v107660; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, s0, s47661; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_3)7662; GFX11FAKE16-NEXT: v_add3_u32 v10, v14, v10, 0x7fff7663; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v11, v11, v19, vcc_lo7664; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v12, -1, 1, s67665; GFX11FAKE16-NEXT: v_cmp_gt_f64_e64 s6, |v[2:3]|, |v[16:17]|7666; GFX11FAKE16-NEXT: v_bfe_u32 v16, v11, 16, 17667; GFX11FAKE16-NEXT: v_or_b32_e32 v17, 0x400000, v117668; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3)7669; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v12, v20, v127670; GFX11FAKE16-NEXT: v_add3_u32 v11, v16, v11, 0x7fff7671; GFX11FAKE16-NEXT: v_cndmask_b32_e64 v13, -1, 1, s67672; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)7673; GFX11FAKE16-NEXT: v_add_nc_u32_e32 v13, v21, v137674; GFX11FAKE16-NEXT: v_and_b32_e32 v24, 1, v207675; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s5, 1, v247676; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, s1, s57677; GFX11FAKE16-NEXT: v_dual_cndmask_b32 v12, v12, v20 :: v_dual_and_b32 v25, 1, v217678; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)7679; GFX11FAKE16-NEXT: v_cmp_eq_u32_e64 s6, 1, v257680; GFX11FAKE16-NEXT: v_bfe_u32 v18, v12, 16, 17681; GFX11FAKE16-NEXT: v_or_b32_e32 v19, 0x400000, v127682; GFX11FAKE16-NEXT: s_or_b32 vcc_lo, s2, s67683; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2)7684; GFX11FAKE16-NEXT: v_add3_u32 v12, v18, v12, 0x7fff7685; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v13, v13, v21, vcc_lo7686; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[4:5], v[4:5]7687; GFX11FAKE16-NEXT: v_bfe_u32 v20, v13, 16, 17688; GFX11FAKE16-NEXT: v_or_b32_e32 v21, 0x400000, v137689; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2)7690; GFX11FAKE16-NEXT: v_add3_u32 v13, v20, v13, 0x7fff7691; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v4, v10, v15, vcc_lo7692; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[0:1], v[0:1]7693; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v0, v12, v19, vcc_lo7694; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[2:3], v[2:3]7695; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v1, v13, v21, vcc_lo7696; GFX11FAKE16-NEXT: v_cmp_u_f64_e32 vcc_lo, v[6:7], v[6:7]7697; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)7698; GFX11FAKE16-NEXT: v_perm_b32 v0, v1, v0, 0x70603027699; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v87700; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v2, v11, v17, vcc_lo7701; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)7702; GFX11FAKE16-NEXT: v_perm_b32 v1, v2, v4, 0x70603027703; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v97704; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]7705 %mag.trunc = fptrunc <4 x double> %mag to <4 x bfloat>7706 %result = call <4 x bfloat> @llvm.copysign.v4bf16(<4 x bfloat> %mag.trunc, <4 x bfloat> %sign)7707 ret <4 x bfloat> %result7708}7709 7710define <4 x bfloat> @v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32(<4 x bfloat> %mag, <4 x float> %sign) {7711; GCN-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32:7712; GCN: ; %bb.0:7713; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7714; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v07715; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v17716; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v27717; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v37718; GCN-NEXT: v_mul_f32_e32 v4, 1.0, v47719; GCN-NEXT: v_mul_f32_e32 v5, 1.0, v57720; GCN-NEXT: v_mul_f32_e32 v6, 1.0, v67721; GCN-NEXT: v_mul_f32_e32 v7, 1.0, v77722; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v47723; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v57724; GCN-NEXT: v_lshrrev_b32_e32 v6, 16, v67725; GCN-NEXT: v_lshrrev_b32_e32 v7, 16, v77726; GCN-NEXT: v_bfe_u32 v3, v3, 16, 157727; GCN-NEXT: v_bfe_u32 v2, v2, 16, 157728; GCN-NEXT: v_bfe_u32 v1, v1, 16, 157729; GCN-NEXT: v_bfe_u32 v0, v0, 16, 157730; GCN-NEXT: v_and_b32_e32 v7, 0x8000, v77731; GCN-NEXT: v_and_b32_e32 v6, 0x8000, v67732; GCN-NEXT: v_and_b32_e32 v5, 0x8000, v57733; GCN-NEXT: v_and_b32_e32 v4, 0x8000, v47734; GCN-NEXT: v_or_b32_e32 v3, v3, v77735; GCN-NEXT: v_or_b32_e32 v2, v2, v67736; GCN-NEXT: v_or_b32_e32 v1, v1, v57737; GCN-NEXT: v_or_b32_e32 v0, v0, v47738; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v07739; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v17740; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v27741; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v37742; GCN-NEXT: s_setpc_b64 s[30:31]7743;7744; GFX7-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32:7745; GFX7: ; %bb.0:7746; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7747; GFX7-NEXT: v_mul_f32_e32 v4, 1.0, v47748; GFX7-NEXT: v_mul_f32_e32 v5, 1.0, v57749; GFX7-NEXT: v_mul_f32_e32 v6, 1.0, v67750; GFX7-NEXT: v_mul_f32_e32 v7, 1.0, v77751; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v07752; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v17753; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v27754; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v37755; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v47756; GFX7-NEXT: v_lshrrev_b32_e32 v5, 16, v57757; GFX7-NEXT: v_lshrrev_b32_e32 v6, 16, v67758; GFX7-NEXT: v_lshrrev_b32_e32 v7, 16, v77759; GFX7-NEXT: v_and_b32_e32 v7, 0x8000, v77760; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 157761; GFX7-NEXT: v_and_b32_e32 v6, 0x8000, v67762; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 157763; GFX7-NEXT: v_and_b32_e32 v5, 0x8000, v57764; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 157765; GFX7-NEXT: v_and_b32_e32 v4, 0x8000, v47766; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 157767; GFX7-NEXT: v_or_b32_e32 v3, v3, v77768; GFX7-NEXT: v_or_b32_e32 v2, v2, v67769; GFX7-NEXT: v_or_b32_e32 v1, v1, v57770; GFX7-NEXT: v_or_b32_e32 v0, v0, v47771; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v07772; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v17773; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v27774; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v37775; GFX7-NEXT: s_setpc_b64 s[30:31]7776;7777; GFX8-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32:7778; GFX8: ; %bb.0:7779; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7780; GFX8-NEXT: v_bfe_u32 v6, v4, 16, 17781; GFX8-NEXT: v_add_u32_e32 v6, vcc, v6, v47782; GFX8-NEXT: v_add_u32_e32 v6, vcc, 0x7fff, v67783; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v4, v47784; GFX8-NEXT: v_cndmask_b32_e32 v4, v6, v4, vcc7785; GFX8-NEXT: v_bfe_u32 v6, v5, 16, 17786; GFX8-NEXT: s_movk_i32 s4, 0x7fff7787; GFX8-NEXT: v_add_u32_e32 v6, vcc, v6, v57788; GFX8-NEXT: v_add_u32_e32 v6, vcc, s4, v67789; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v5, v57790; GFX8-NEXT: v_cndmask_b32_e32 v5, v6, v5, vcc7791; GFX8-NEXT: v_bfe_u32 v6, v2, 16, 17792; GFX8-NEXT: v_add_u32_e32 v6, vcc, v6, v27793; GFX8-NEXT: v_add_u32_e32 v6, vcc, s4, v67794; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v2, v27795; GFX8-NEXT: v_cndmask_b32_e32 v2, v6, v2, vcc7796; GFX8-NEXT: v_bfe_u32 v6, v3, 16, 17797; GFX8-NEXT: v_add_u32_e32 v6, vcc, v6, v37798; GFX8-NEXT: v_add_u32_e32 v6, vcc, 0x7fff, v67799; GFX8-NEXT: v_cmp_u_f32_e32 vcc, v3, v37800; GFX8-NEXT: v_cndmask_b32_e32 v3, v6, v3, vcc7801; GFX8-NEXT: v_lshrrev_b32_e32 v3, 16, v37802; GFX8-NEXT: v_lshrrev_b32_e32 v5, 16, v57803; GFX8-NEXT: v_alignbit_b32 v2, v3, v2, 167804; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff7805; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v27806; GFX8-NEXT: v_alignbit_b32 v2, v5, v4, 167807; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v27808; GFX8-NEXT: s_setpc_b64 s[30:31]7809;7810; GFX9-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32:7811; GFX9: ; %bb.0:7812; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7813; GFX9-NEXT: v_bfe_u32 v6, v4, 16, 17814; GFX9-NEXT: s_movk_i32 s4, 0x7fff7815; GFX9-NEXT: v_add3_u32 v6, v6, v4, s47816; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v47817; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v4, v47818; GFX9-NEXT: v_cndmask_b32_e32 v4, v6, v7, vcc7819; GFX9-NEXT: v_bfe_u32 v6, v5, 16, 17820; GFX9-NEXT: v_add3_u32 v6, v6, v5, s47821; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v57822; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v5, v57823; GFX9-NEXT: v_cndmask_b32_e32 v5, v6, v7, vcc7824; GFX9-NEXT: v_bfe_u32 v6, v2, 16, 17825; GFX9-NEXT: v_add3_u32 v6, v6, v2, s47826; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v27827; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v2, v27828; GFX9-NEXT: v_cndmask_b32_e32 v2, v6, v7, vcc7829; GFX9-NEXT: v_bfe_u32 v6, v3, 16, 17830; GFX9-NEXT: v_add3_u32 v6, v6, v3, s47831; GFX9-NEXT: v_or_b32_e32 v7, 0x400000, v37832; GFX9-NEXT: v_cmp_u_f32_e32 vcc, v3, v37833; GFX9-NEXT: v_cndmask_b32_e32 v3, v6, v7, vcc7834; GFX9-NEXT: s_mov_b32 s4, 0x70603027835; GFX9-NEXT: v_perm_b32 v2, v3, v2, s47836; GFX9-NEXT: s_mov_b32 s5, 0x7fff7fff7837; GFX9-NEXT: v_bfi_b32 v0, s5, v0, v27838; GFX9-NEXT: v_perm_b32 v2, v5, v4, s47839; GFX9-NEXT: v_bfi_b32 v1, s5, v1, v27840; GFX9-NEXT: s_setpc_b64 s[30:31]7841;7842; GFX10-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32:7843; GFX10: ; %bb.0:7844; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7845; GFX10-NEXT: v_bfe_u32 v6, v4, 16, 17846; GFX10-NEXT: v_bfe_u32 v8, v2, 16, 17847; GFX10-NEXT: v_or_b32_e32 v9, 0x400000, v47848; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v4, v47849; GFX10-NEXT: v_bfe_u32 v10, v3, 16, 17850; GFX10-NEXT: v_add3_u32 v6, v6, v4, 0x7fff7851; GFX10-NEXT: v_add3_u32 v8, v8, v2, 0x7fff7852; GFX10-NEXT: v_bfe_u32 v7, v5, 16, 17853; GFX10-NEXT: v_or_b32_e32 v11, 0x400000, v57854; GFX10-NEXT: v_cndmask_b32_e32 v4, v6, v9, vcc_lo7855; GFX10-NEXT: v_or_b32_e32 v6, 0x400000, v27856; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v27857; GFX10-NEXT: v_add3_u32 v9, v10, v3, 0x7fff7858; GFX10-NEXT: v_or_b32_e32 v10, 0x400000, v37859; GFX10-NEXT: v_add3_u32 v7, v7, v5, 0x7fff7860; GFX10-NEXT: v_cndmask_b32_e32 v2, v8, v6, vcc_lo7861; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v37862; GFX10-NEXT: v_cndmask_b32_e32 v3, v9, v10, vcc_lo7863; GFX10-NEXT: v_cmp_u_f32_e32 vcc_lo, v5, v57864; GFX10-NEXT: v_perm_b32 v2, v3, v2, 0x70603027865; GFX10-NEXT: v_cndmask_b32_e32 v5, v7, v11, vcc_lo7866; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v27867; GFX10-NEXT: v_perm_b32 v3, v5, v4, 0x70603027868; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v37869; GFX10-NEXT: s_setpc_b64 s[30:31]7870;7871; GFX11TRUE16-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32:7872; GFX11TRUE16: ; %bb.0:7873; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7874; GFX11TRUE16-NEXT: v_bfe_u32 v7, v4, 16, 17875; GFX11TRUE16-NEXT: v_bfe_u32 v6, v5, 16, 17876; GFX11TRUE16-NEXT: v_bfe_u32 v9, v2, 16, 17877; GFX11TRUE16-NEXT: v_or_b32_e32 v10, 0x400000, v47878; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v4, v47879; GFX11TRUE16-NEXT: v_add3_u32 v7, v7, v4, 0x7fff7880; GFX11TRUE16-NEXT: v_or_b32_e32 v8, 0x400000, v57881; GFX11TRUE16-NEXT: v_add3_u32 v6, v6, v5, 0x7fff7882; GFX11TRUE16-NEXT: v_bfe_u32 v11, v3, 16, 17883; GFX11TRUE16-NEXT: v_add3_u32 v9, v9, v2, 0x7fff7884; GFX11TRUE16-NEXT: v_or_b32_e32 v12, 0x400000, v27885; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v4, v7, v10, vcc_lo7886; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v27887; GFX11TRUE16-NEXT: v_add3_u32 v7, v11, v3, 0x7fff7888; GFX11TRUE16-NEXT: v_or_b32_e32 v10, 0x400000, v37889; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v2, v9, v12, vcc_lo7890; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v5, v57891; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v5, v6, v8, vcc_lo7892; GFX11TRUE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v37893; GFX11TRUE16-NEXT: v_mov_b16_e32 v5.l, v4.h7894; GFX11TRUE16-NEXT: v_cndmask_b32_e32 v3, v7, v10, vcc_lo7895; GFX11TRUE16-NEXT: v_mov_b16_e32 v3.l, v2.h7896; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)7897; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v57898; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v37899; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]7900;7901; GFX11FAKE16-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f32:7902; GFX11FAKE16: ; %bb.0:7903; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7904; GFX11FAKE16-NEXT: v_bfe_u32 v6, v4, 16, 17905; GFX11FAKE16-NEXT: v_bfe_u32 v8, v2, 16, 17906; GFX11FAKE16-NEXT: v_or_b32_e32 v9, 0x400000, v47907; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v4, v47908; GFX11FAKE16-NEXT: v_bfe_u32 v7, v5, 16, 17909; GFX11FAKE16-NEXT: v_add3_u32 v6, v6, v4, 0x7fff7910; GFX11FAKE16-NEXT: v_bfe_u32 v10, v3, 16, 17911; GFX11FAKE16-NEXT: v_add3_u32 v8, v8, v2, 0x7fff7912; GFX11FAKE16-NEXT: v_or_b32_e32 v11, 0x400000, v57913; GFX11FAKE16-NEXT: v_add3_u32 v7, v7, v5, 0x7fff7914; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v4, v6, v9, vcc_lo7915; GFX11FAKE16-NEXT: v_or_b32_e32 v6, 0x400000, v27916; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v27917; GFX11FAKE16-NEXT: v_add3_u32 v9, v10, v3, 0x7fff7918; GFX11FAKE16-NEXT: v_or_b32_e32 v10, 0x400000, v37919; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3)7920; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v2, v8, v6, vcc_lo7921; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v3, v37922; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v3, v9, v10, vcc_lo7923; GFX11FAKE16-NEXT: v_cmp_u_f32_e32 vcc_lo, v5, v57924; GFX11FAKE16-NEXT: v_cndmask_b32_e32 v5, v7, v11, vcc_lo7925; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)7926; GFX11FAKE16-NEXT: v_perm_b32 v2, v3, v2, 0x70603027927; GFX11FAKE16-NEXT: v_perm_b32 v3, v5, v4, 0x70603027928; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)7929; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v27930; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v37931; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]7932 %sign.trunc = fptrunc <4 x float> %sign to <4 x bfloat>7933 %out = call <4 x bfloat> @llvm.copysign.v4bf16(<4 x bfloat> %mag, <4 x bfloat> %sign.trunc)7934 ret <4 x bfloat> %out7935}7936 7937define <4 x bfloat> @v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64(<4 x bfloat> %mag, <4 x double> %sign) {7938; GCN-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64:7939; GCN: ; %bb.0:7940; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7941; GCN-NEXT: v_mul_f32_e32 v0, 1.0, v07942; GCN-NEXT: v_mul_f32_e32 v2, 1.0, v27943; GCN-NEXT: v_mul_f32_e32 v3, 1.0, v37944; GCN-NEXT: v_mul_f32_e32 v1, 1.0, v17945; GCN-NEXT: v_and_b32_e32 v4, 0x80000000, v77946; GCN-NEXT: v_and_b32_e32 v6, 0x80000000, v117947; GCN-NEXT: v_and_b32_e32 v7, 0x80000000, v97948; GCN-NEXT: v_and_b32_e32 v5, 0x80000000, v57949; GCN-NEXT: v_lshrrev_b32_e32 v4, 16, v47950; GCN-NEXT: v_bfe_u32 v1, v1, 16, 157951; GCN-NEXT: v_lshrrev_b32_e32 v6, 16, v67952; GCN-NEXT: v_bfe_u32 v3, v3, 16, 157953; GCN-NEXT: v_lshrrev_b32_e32 v7, 16, v77954; GCN-NEXT: v_bfe_u32 v2, v2, 16, 157955; GCN-NEXT: v_lshrrev_b32_e32 v5, 16, v57956; GCN-NEXT: v_bfe_u32 v0, v0, 16, 157957; GCN-NEXT: v_or_b32_e32 v1, v1, v47958; GCN-NEXT: v_or_b32_e32 v3, v3, v67959; GCN-NEXT: v_or_b32_e32 v2, v2, v77960; GCN-NEXT: v_or_b32_e32 v0, v0, v57961; GCN-NEXT: v_lshlrev_b32_e32 v1, 16, v17962; GCN-NEXT: v_lshlrev_b32_e32 v3, 16, v37963; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v07964; GCN-NEXT: v_lshlrev_b32_e32 v2, 16, v27965; GCN-NEXT: s_setpc_b64 s[30:31]7966;7967; GFX7-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64:7968; GFX7: ; %bb.0:7969; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7970; GFX7-NEXT: v_mul_f32_e32 v1, 1.0, v17971; GFX7-NEXT: v_and_b32_e32 v4, 0x80000000, v77972; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v47973; GFX7-NEXT: v_bfe_u32 v1, v1, 16, 157974; GFX7-NEXT: v_mul_f32_e32 v3, 1.0, v37975; GFX7-NEXT: v_or_b32_e32 v1, v1, v47976; GFX7-NEXT: v_and_b32_e32 v4, 0x80000000, v117977; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v47978; GFX7-NEXT: v_bfe_u32 v3, v3, 16, 157979; GFX7-NEXT: v_mul_f32_e32 v2, 1.0, v27980; GFX7-NEXT: v_or_b32_e32 v3, v3, v47981; GFX7-NEXT: v_and_b32_e32 v4, 0x80000000, v97982; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v47983; GFX7-NEXT: v_bfe_u32 v2, v2, 16, 157984; GFX7-NEXT: v_mul_f32_e32 v0, 1.0, v07985; GFX7-NEXT: v_or_b32_e32 v2, v2, v47986; GFX7-NEXT: v_and_b32_e32 v4, 0x80000000, v57987; GFX7-NEXT: v_lshrrev_b32_e32 v4, 16, v47988; GFX7-NEXT: v_bfe_u32 v0, v0, 16, 157989; GFX7-NEXT: v_or_b32_e32 v0, v0, v47990; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v17991; GFX7-NEXT: v_lshlrev_b32_e32 v3, 16, v37992; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v07993; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v27994; GFX7-NEXT: s_setpc_b64 s[30:31]7995;7996; GFX8-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64:7997; GFX8: ; %bb.0:7998; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)7999; GFX8-NEXT: v_lshlrev_b32_e32 v2, 16, v58000; GFX8-NEXT: v_and_b32_e32 v3, 0x8000, v38001; GFX8-NEXT: v_or_b32_e32 v2, v3, v28002; GFX8-NEXT: s_mov_b32 s4, 0x7fff7fff8003; GFX8-NEXT: v_bfi_b32 v0, s4, v0, v28004; GFX8-NEXT: v_lshlrev_b32_e32 v2, 16, v98005; GFX8-NEXT: v_and_b32_e32 v3, 0x8000, v78006; GFX8-NEXT: v_or_b32_e32 v2, v3, v28007; GFX8-NEXT: v_bfi_b32 v1, s4, v1, v28008; GFX8-NEXT: s_setpc_b64 s[30:31]8009;8010; GFX9-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64:8011; GFX9: ; %bb.0:8012; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8013; GFX9-NEXT: s_mov_b32 s4, 0x50401008014; GFX9-NEXT: v_perm_b32 v2, v5, v3, s48015; GFX9-NEXT: s_mov_b32 s5, 0x7fff7fff8016; GFX9-NEXT: v_bfi_b32 v0, s5, v0, v28017; GFX9-NEXT: v_perm_b32 v2, v9, v7, s48018; GFX9-NEXT: v_bfi_b32 v1, s5, v1, v28019; GFX9-NEXT: s_setpc_b64 s[30:31]8020;8021; GFX10-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64:8022; GFX10: ; %bb.0:8023; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8024; GFX10-NEXT: v_perm_b32 v2, v5, v3, 0x50401008025; GFX10-NEXT: v_perm_b32 v3, v9, v7, 0x50401008026; GFX10-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v28027; GFX10-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v38028; GFX10-NEXT: s_setpc_b64 s[30:31]8029;8030; GFX11TRUE16-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64:8031; GFX11TRUE16: ; %bb.0:8032; GFX11TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8033; GFX11TRUE16-NEXT: v_mov_b16_e32 v3.h, v5.l8034; GFX11TRUE16-NEXT: v_mov_b16_e32 v7.h, v9.l8035; GFX11TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)8036; GFX11TRUE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v38037; GFX11TRUE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v78038; GFX11TRUE16-NEXT: s_setpc_b64 s[30:31]8039;8040; GFX11FAKE16-LABEL: v_copysign_out_v4bf16_mag_v4bf16_sign_v4f64:8041; GFX11FAKE16: ; %bb.0:8042; GFX11FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8043; GFX11FAKE16-NEXT: v_perm_b32 v2, v5, v3, 0x50401008044; GFX11FAKE16-NEXT: v_perm_b32 v3, v9, v7, 0x50401008045; GFX11FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)8046; GFX11FAKE16-NEXT: v_bfi_b32 v0, 0x7fff7fff, v0, v28047; GFX11FAKE16-NEXT: v_bfi_b32 v1, 0x7fff7fff, v1, v38048; GFX11FAKE16-NEXT: s_setpc_b64 s[30:31]8049 %sign.trunc = fptrunc <4 x double> %sign to <4 x bfloat>8050 %out = call <4 x bfloat> @llvm.copysign.v4bf16(<4 x bfloat> %mag, <4 x bfloat> %sign.trunc)8051 ret <4 x bfloat> %out8052}8053 8054attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }8055