613 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdpal -mcpu=hawaii < %s | FileCheck -check-prefix=GFX7 %s3; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdpal -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s4; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdpal -mcpu=fiji < %s | FileCheck -check-prefix=GFX8 %s5; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdpal -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s6; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdpal -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefix=GFX11 %s7; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdpal -mcpu=gfx1200 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefix=GFX12 %s8 9define i16 @s_add_i16(i16 inreg %a, i16 inreg %b) {10; GFX7-LABEL: s_add_i16:11; GFX7: ; %bb.0:12; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13; GFX7-NEXT: s_add_i32 s16, s16, s1714; GFX7-NEXT: v_mov_b32_e32 v0, s1615; GFX7-NEXT: s_setpc_b64 s[30:31]16;17; GFX9-LABEL: s_add_i16:18; GFX9: ; %bb.0:19; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)20; GFX9-NEXT: s_add_i32 s16, s16, s1721; GFX9-NEXT: v_mov_b32_e32 v0, s1622; GFX9-NEXT: s_setpc_b64 s[30:31]23;24; GFX8-LABEL: s_add_i16:25; GFX8: ; %bb.0:26; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)27; GFX8-NEXT: s_add_i32 s16, s16, s1728; GFX8-NEXT: v_mov_b32_e32 v0, s1629; GFX8-NEXT: s_setpc_b64 s[30:31]30;31; GFX10-LABEL: s_add_i16:32; GFX10: ; %bb.0:33; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)34; GFX10-NEXT: s_add_i32 s16, s16, s1735; GFX10-NEXT: v_mov_b32_e32 v0, s1636; GFX10-NEXT: s_setpc_b64 s[30:31]37;38; GFX11-LABEL: s_add_i16:39; GFX11: ; %bb.0:40; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)41; GFX11-NEXT: s_add_i32 s0, s0, s142; GFX11-NEXT: v_mov_b32_e32 v0, s043; GFX11-NEXT: s_setpc_b64 s[30:31]44;45; GFX12-LABEL: s_add_i16:46; GFX12: ; %bb.0:47; GFX12-NEXT: s_wait_loadcnt_dscnt 0x048; GFX12-NEXT: s_wait_expcnt 0x049; GFX12-NEXT: s_wait_samplecnt 0x050; GFX12-NEXT: s_wait_bvhcnt 0x051; GFX12-NEXT: s_wait_kmcnt 0x052; GFX12-NEXT: s_add_co_i32 s0, s0, s153; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)54; GFX12-NEXT: v_mov_b32_e32 v0, s055; GFX12-NEXT: s_setpc_b64 s[30:31]56 %c = add i16 %a, %b57 ret i16 %c58}59 60define i16 @v_add_i16(i16 %a, i16 %b) {61; GFX7-LABEL: v_add_i16:62; GFX7: ; %bb.0:63; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)64; GFX7-NEXT: v_add_i32_e32 v0, vcc, v0, v165; GFX7-NEXT: s_setpc_b64 s[30:31]66;67; GFX9-LABEL: v_add_i16:68; GFX9: ; %bb.0:69; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)70; GFX9-NEXT: v_add_u16_e32 v0, v0, v171; GFX9-NEXT: s_setpc_b64 s[30:31]72;73; GFX8-LABEL: v_add_i16:74; GFX8: ; %bb.0:75; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)76; GFX8-NEXT: v_add_u16_e32 v0, v0, v177; GFX8-NEXT: s_setpc_b64 s[30:31]78;79; GFX10-LABEL: v_add_i16:80; GFX10: ; %bb.0:81; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)82; GFX10-NEXT: v_add_nc_u16 v0, v0, v183; GFX10-NEXT: s_setpc_b64 s[30:31]84;85; GFX11-LABEL: v_add_i16:86; GFX11: ; %bb.0:87; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)88; GFX11-NEXT: v_add_nc_u16 v0.l, v0.l, v1.l89; GFX11-NEXT: s_setpc_b64 s[30:31]90;91; GFX12-LABEL: v_add_i16:92; GFX12: ; %bb.0:93; GFX12-NEXT: s_wait_loadcnt_dscnt 0x094; GFX12-NEXT: s_wait_expcnt 0x095; GFX12-NEXT: s_wait_samplecnt 0x096; GFX12-NEXT: s_wait_bvhcnt 0x097; GFX12-NEXT: s_wait_kmcnt 0x098; GFX12-NEXT: v_add_nc_u16 v0, v0, v199; GFX12-NEXT: s_setpc_b64 s[30:31]100 %c = add i16 %a, %b101 ret i16 %c102}103 104define i32 @s_add_i32(i32 inreg %a, i32 inreg %b) {105; GFX7-LABEL: s_add_i32:106; GFX7: ; %bb.0:107; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)108; GFX7-NEXT: s_add_i32 s16, s16, s17109; GFX7-NEXT: v_mov_b32_e32 v0, s16110; GFX7-NEXT: s_setpc_b64 s[30:31]111;112; GFX9-LABEL: s_add_i32:113; GFX9: ; %bb.0:114; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)115; GFX9-NEXT: s_add_i32 s16, s16, s17116; GFX9-NEXT: v_mov_b32_e32 v0, s16117; GFX9-NEXT: s_setpc_b64 s[30:31]118;119; GFX8-LABEL: s_add_i32:120; GFX8: ; %bb.0:121; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)122; GFX8-NEXT: s_add_i32 s16, s16, s17123; GFX8-NEXT: v_mov_b32_e32 v0, s16124; GFX8-NEXT: s_setpc_b64 s[30:31]125;126; GFX10-LABEL: s_add_i32:127; GFX10: ; %bb.0:128; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)129; GFX10-NEXT: s_add_i32 s16, s16, s17130; GFX10-NEXT: v_mov_b32_e32 v0, s16131; GFX10-NEXT: s_setpc_b64 s[30:31]132;133; GFX11-LABEL: s_add_i32:134; GFX11: ; %bb.0:135; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)136; GFX11-NEXT: s_add_i32 s0, s0, s1137; GFX11-NEXT: v_mov_b32_e32 v0, s0138; GFX11-NEXT: s_setpc_b64 s[30:31]139;140; GFX12-LABEL: s_add_i32:141; GFX12: ; %bb.0:142; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0143; GFX12-NEXT: s_wait_expcnt 0x0144; GFX12-NEXT: s_wait_samplecnt 0x0145; GFX12-NEXT: s_wait_bvhcnt 0x0146; GFX12-NEXT: s_wait_kmcnt 0x0147; GFX12-NEXT: s_add_co_i32 s0, s0, s1148; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)149; GFX12-NEXT: v_mov_b32_e32 v0, s0150; GFX12-NEXT: s_setpc_b64 s[30:31]151 %c = add i32 %a, %b152 ret i32 %c153}154 155define i32 @v_add_i32(i32 %a, i32 %b) {156; GFX7-LABEL: v_add_i32:157; GFX7: ; %bb.0:158; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)159; GFX7-NEXT: v_add_i32_e32 v0, vcc, v0, v1160; GFX7-NEXT: s_setpc_b64 s[30:31]161;162; GFX9-LABEL: v_add_i32:163; GFX9: ; %bb.0:164; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)165; GFX9-NEXT: v_add_u32_e32 v0, v0, v1166; GFX9-NEXT: s_setpc_b64 s[30:31]167;168; GFX8-LABEL: v_add_i32:169; GFX8: ; %bb.0:170; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)171; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v1172; GFX8-NEXT: s_setpc_b64 s[30:31]173;174; GFX10-LABEL: v_add_i32:175; GFX10: ; %bb.0:176; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)177; GFX10-NEXT: v_add_nc_u32_e32 v0, v0, v1178; GFX10-NEXT: s_setpc_b64 s[30:31]179;180; GFX11-LABEL: v_add_i32:181; GFX11: ; %bb.0:182; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)183; GFX11-NEXT: v_add_nc_u32_e32 v0, v0, v1184; GFX11-NEXT: s_setpc_b64 s[30:31]185;186; GFX12-LABEL: v_add_i32:187; GFX12: ; %bb.0:188; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0189; GFX12-NEXT: s_wait_expcnt 0x0190; GFX12-NEXT: s_wait_samplecnt 0x0191; GFX12-NEXT: s_wait_bvhcnt 0x0192; GFX12-NEXT: s_wait_kmcnt 0x0193; GFX12-NEXT: v_add_nc_u32_e32 v0, v0, v1194; GFX12-NEXT: s_setpc_b64 s[30:31]195 %c = add i32 %a, %b196 ret i32 %c197}198 199define <2 x i16> @s_add_v2i16(<2 x i16> inreg %a, <2 x i16> inreg %b) {200; GFX7-LABEL: s_add_v2i16:201; GFX7: ; %bb.0:202; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)203; GFX7-NEXT: s_add_i32 s16, s16, s18204; GFX7-NEXT: s_add_i32 s17, s17, s19205; GFX7-NEXT: v_mov_b32_e32 v0, s16206; GFX7-NEXT: v_mov_b32_e32 v1, s17207; GFX7-NEXT: s_setpc_b64 s[30:31]208;209; GFX9-LABEL: s_add_v2i16:210; GFX9: ; %bb.0:211; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)212; GFX9-NEXT: s_lshr_b32 s4, s16, 16213; GFX9-NEXT: s_lshr_b32 s5, s17, 16214; GFX9-NEXT: s_add_i32 s16, s16, s17215; GFX9-NEXT: s_add_i32 s4, s4, s5216; GFX9-NEXT: s_pack_ll_b32_b16 s4, s16, s4217; GFX9-NEXT: v_mov_b32_e32 v0, s4218; GFX9-NEXT: s_setpc_b64 s[30:31]219;220; GFX8-LABEL: s_add_v2i16:221; GFX8: ; %bb.0:222; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)223; GFX8-NEXT: s_lshr_b32 s4, s16, 16224; GFX8-NEXT: s_lshr_b32 s5, s17, 16225; GFX8-NEXT: s_add_i32 s4, s4, s5226; GFX8-NEXT: s_add_i32 s16, s16, s17227; GFX8-NEXT: s_and_b32 s4, 0xffff, s4228; GFX8-NEXT: s_and_b32 s5, 0xffff, s16229; GFX8-NEXT: s_lshl_b32 s4, s4, 16230; GFX8-NEXT: s_or_b32 s4, s5, s4231; GFX8-NEXT: v_mov_b32_e32 v0, s4232; GFX8-NEXT: s_setpc_b64 s[30:31]233;234; GFX10-LABEL: s_add_v2i16:235; GFX10: ; %bb.0:236; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)237; GFX10-NEXT: s_lshr_b32 s4, s16, 16238; GFX10-NEXT: s_lshr_b32 s5, s17, 16239; GFX10-NEXT: s_add_i32 s16, s16, s17240; GFX10-NEXT: s_add_i32 s4, s4, s5241; GFX10-NEXT: s_pack_ll_b32_b16 s4, s16, s4242; GFX10-NEXT: v_mov_b32_e32 v0, s4243; GFX10-NEXT: s_setpc_b64 s[30:31]244;245; GFX11-LABEL: s_add_v2i16:246; GFX11: ; %bb.0:247; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)248; GFX11-NEXT: s_lshr_b32 s2, s0, 16249; GFX11-NEXT: s_lshr_b32 s3, s1, 16250; GFX11-NEXT: s_add_i32 s0, s0, s1251; GFX11-NEXT: s_add_i32 s2, s2, s3252; GFX11-NEXT: s_pack_ll_b32_b16 s0, s0, s2253; GFX11-NEXT: v_mov_b32_e32 v0, s0254; GFX11-NEXT: s_setpc_b64 s[30:31]255;256; GFX12-LABEL: s_add_v2i16:257; GFX12: ; %bb.0:258; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0259; GFX12-NEXT: s_wait_expcnt 0x0260; GFX12-NEXT: s_wait_samplecnt 0x0261; GFX12-NEXT: s_wait_bvhcnt 0x0262; GFX12-NEXT: s_wait_kmcnt 0x0263; GFX12-NEXT: s_lshr_b32 s2, s0, 16264; GFX12-NEXT: s_lshr_b32 s3, s1, 16265; GFX12-NEXT: s_add_co_i32 s0, s0, s1266; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)267; GFX12-NEXT: s_add_co_i32 s2, s2, s3268; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)269; GFX12-NEXT: s_pack_ll_b32_b16 s0, s0, s2270; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)271; GFX12-NEXT: v_mov_b32_e32 v0, s0272; GFX12-NEXT: s_setpc_b64 s[30:31]273 %c = add <2 x i16> %a, %b274 ret <2 x i16> %c275}276 277define <2 x i16> @v_add_v2i16(<2 x i16> %a, <2 x i16> %b) {278; GFX7-LABEL: v_add_v2i16:279; GFX7: ; %bb.0:280; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)281; GFX7-NEXT: v_add_i32_e32 v0, vcc, v0, v2282; GFX7-NEXT: v_add_i32_e32 v1, vcc, v1, v3283; GFX7-NEXT: s_setpc_b64 s[30:31]284;285; GFX9-LABEL: v_add_v2i16:286; GFX9: ; %bb.0:287; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)288; GFX9-NEXT: v_pk_add_u16 v0, v0, v1289; GFX9-NEXT: s_setpc_b64 s[30:31]290;291; GFX8-LABEL: v_add_v2i16:292; GFX8: ; %bb.0:293; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)294; GFX8-NEXT: v_add_u16_e32 v2, v0, v1295; GFX8-NEXT: v_add_u16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1296; GFX8-NEXT: v_or_b32_e32 v0, v2, v0297; GFX8-NEXT: s_setpc_b64 s[30:31]298;299; GFX10-LABEL: v_add_v2i16:300; GFX10: ; %bb.0:301; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)302; GFX10-NEXT: v_pk_add_u16 v0, v0, v1303; GFX10-NEXT: s_setpc_b64 s[30:31]304;305; GFX11-LABEL: v_add_v2i16:306; GFX11: ; %bb.0:307; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)308; GFX11-NEXT: v_pk_add_u16 v0, v0, v1309; GFX11-NEXT: s_setpc_b64 s[30:31]310;311; GFX12-LABEL: v_add_v2i16:312; GFX12: ; %bb.0:313; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0314; GFX12-NEXT: s_wait_expcnt 0x0315; GFX12-NEXT: s_wait_samplecnt 0x0316; GFX12-NEXT: s_wait_bvhcnt 0x0317; GFX12-NEXT: s_wait_kmcnt 0x0318; GFX12-NEXT: v_pk_add_u16 v0, v0, v1319; GFX12-NEXT: s_setpc_b64 s[30:31]320 %c = add <2 x i16> %a, %b321 ret <2 x i16> %c322}323 324define i64 @s_add_i64(i64 inreg %a, i64 inreg %b) {325; GFX7-LABEL: s_add_i64:326; GFX7: ; %bb.0:327; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)328; GFX7-NEXT: s_add_u32 s4, s16, s18329; GFX7-NEXT: s_addc_u32 s5, s17, s19330; GFX7-NEXT: v_mov_b32_e32 v0, s4331; GFX7-NEXT: v_mov_b32_e32 v1, s5332; GFX7-NEXT: s_setpc_b64 s[30:31]333;334; GFX9-LABEL: s_add_i64:335; GFX9: ; %bb.0:336; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)337; GFX9-NEXT: s_add_u32 s4, s16, s18338; GFX9-NEXT: s_addc_u32 s5, s17, s19339; GFX9-NEXT: v_mov_b32_e32 v0, s4340; GFX9-NEXT: v_mov_b32_e32 v1, s5341; GFX9-NEXT: s_setpc_b64 s[30:31]342;343; GFX8-LABEL: s_add_i64:344; GFX8: ; %bb.0:345; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)346; GFX8-NEXT: s_add_u32 s4, s16, s18347; GFX8-NEXT: s_addc_u32 s5, s17, s19348; GFX8-NEXT: v_mov_b32_e32 v0, s4349; GFX8-NEXT: v_mov_b32_e32 v1, s5350; GFX8-NEXT: s_setpc_b64 s[30:31]351;352; GFX10-LABEL: s_add_i64:353; GFX10: ; %bb.0:354; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)355; GFX10-NEXT: s_add_u32 s4, s16, s18356; GFX10-NEXT: s_addc_u32 s5, s17, s19357; GFX10-NEXT: v_mov_b32_e32 v0, s4358; GFX10-NEXT: v_mov_b32_e32 v1, s5359; GFX10-NEXT: s_setpc_b64 s[30:31]360;361; GFX11-LABEL: s_add_i64:362; GFX11: ; %bb.0:363; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)364; GFX11-NEXT: s_add_u32 s0, s0, s2365; GFX11-NEXT: s_addc_u32 s1, s1, s3366; GFX11-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1367; GFX11-NEXT: s_setpc_b64 s[30:31]368;369; GFX12-LABEL: s_add_i64:370; GFX12: ; %bb.0:371; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0372; GFX12-NEXT: s_wait_expcnt 0x0373; GFX12-NEXT: s_wait_samplecnt 0x0374; GFX12-NEXT: s_wait_bvhcnt 0x0375; GFX12-NEXT: s_wait_kmcnt 0x0376; GFX12-NEXT: s_add_nc_u64 s[0:1], s[0:1], s[2:3]377; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)378; GFX12-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1379; GFX12-NEXT: s_setpc_b64 s[30:31]380 %c = add i64 %a, %b381 ret i64 %c382}383 384define i64 @v_add_i64(i64 %a, i64 %b) {385; GFX7-LABEL: v_add_i64:386; GFX7: ; %bb.0:387; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)388; GFX7-NEXT: v_add_i32_e32 v0, vcc, v0, v2389; GFX7-NEXT: v_addc_u32_e32 v1, vcc, v1, v3, vcc390; GFX7-NEXT: s_setpc_b64 s[30:31]391;392; GFX9-LABEL: v_add_i64:393; GFX9: ; %bb.0:394; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)395; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v2396; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, v1, v3, vcc397; GFX9-NEXT: s_setpc_b64 s[30:31]398;399; GFX8-LABEL: v_add_i64:400; GFX8: ; %bb.0:401; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)402; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2403; GFX8-NEXT: v_addc_u32_e32 v1, vcc, v1, v3, vcc404; GFX8-NEXT: s_setpc_b64 s[30:31]405;406; GFX10-LABEL: v_add_i64:407; GFX10: ; %bb.0:408; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)409; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2410; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo411; GFX10-NEXT: s_setpc_b64 s[30:31]412;413; GFX11-LABEL: v_add_i64:414; GFX11: ; %bb.0:415; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)416; GFX11-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2417; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo418; GFX11-NEXT: s_setpc_b64 s[30:31]419;420; GFX12-LABEL: v_add_i64:421; GFX12: ; %bb.0:422; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0423; GFX12-NEXT: s_wait_expcnt 0x0424; GFX12-NEXT: s_wait_samplecnt 0x0425; GFX12-NEXT: s_wait_bvhcnt 0x0426; GFX12-NEXT: s_wait_kmcnt 0x0427; GFX12-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2428; GFX12-NEXT: s_wait_alu depctr_va_vcc(0)429; GFX12-NEXT: v_add_co_ci_u32_e64 v1, null, v1, v3, vcc_lo430; GFX12-NEXT: s_setpc_b64 s[30:31]431 %c = add i64 %a, %b432 ret i64 %c433}434 435define void @s_uaddo_uadde(i64 inreg %a, i64 inreg %b, ptr addrspace(1) %res, ptr addrspace(1) %carry) {436; GFX7-LABEL: s_uaddo_uadde:437; GFX7: ; %bb.0:438; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)439; GFX7-NEXT: s_add_u32 s4, s16, s18440; GFX7-NEXT: s_addc_u32 s5, s17, s19441; GFX7-NEXT: v_mov_b32_e32 v4, s4442; GFX7-NEXT: s_mov_b32 s6, 0443; GFX7-NEXT: s_cselect_b32 s8, 1, 0444; GFX7-NEXT: v_mov_b32_e32 v5, s5445; GFX7-NEXT: s_mov_b32 s7, 0xf000446; GFX7-NEXT: s_mov_b64 s[4:5], 0447; GFX7-NEXT: buffer_store_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64448; GFX7-NEXT: v_mov_b32_e32 v0, s8449; GFX7-NEXT: buffer_store_dword v0, v[2:3], s[4:7], 0 addr64450; GFX7-NEXT: s_waitcnt vmcnt(0)451; GFX7-NEXT: s_setpc_b64 s[30:31]452;453; GFX9-LABEL: s_uaddo_uadde:454; GFX9: ; %bb.0:455; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)456; GFX9-NEXT: s_add_u32 s4, s16, s18457; GFX9-NEXT: s_addc_u32 s5, s17, s19458; GFX9-NEXT: v_mov_b32_e32 v4, s4459; GFX9-NEXT: s_cselect_b32 s6, 1, 0460; GFX9-NEXT: v_mov_b32_e32 v5, s5461; GFX9-NEXT: global_store_dwordx2 v[0:1], v[4:5], off462; GFX9-NEXT: v_mov_b32_e32 v0, s6463; GFX9-NEXT: global_store_dword v[2:3], v0, off464; GFX9-NEXT: s_waitcnt vmcnt(0)465; GFX9-NEXT: s_setpc_b64 s[30:31]466;467; GFX8-LABEL: s_uaddo_uadde:468; GFX8: ; %bb.0:469; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)470; GFX8-NEXT: s_add_u32 s4, s16, s18471; GFX8-NEXT: s_addc_u32 s5, s17, s19472; GFX8-NEXT: v_mov_b32_e32 v4, s4473; GFX8-NEXT: s_cselect_b32 s6, 1, 0474; GFX8-NEXT: v_mov_b32_e32 v5, s5475; GFX8-NEXT: flat_store_dwordx2 v[0:1], v[4:5]476; GFX8-NEXT: v_mov_b32_e32 v0, s6477; GFX8-NEXT: flat_store_dword v[2:3], v0478; GFX8-NEXT: s_waitcnt vmcnt(0)479; GFX8-NEXT: s_setpc_b64 s[30:31]480;481; GFX10-LABEL: s_uaddo_uadde:482; GFX10: ; %bb.0:483; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)484; GFX10-NEXT: s_add_u32 s4, s16, s18485; GFX10-NEXT: s_addc_u32 s5, s17, s19486; GFX10-NEXT: s_cselect_b32 s6, 1, 0487; GFX10-NEXT: v_mov_b32_e32 v4, s4488; GFX10-NEXT: v_mov_b32_e32 v5, s5489; GFX10-NEXT: v_mov_b32_e32 v6, s6490; GFX10-NEXT: global_store_dwordx2 v[0:1], v[4:5], off491; GFX10-NEXT: global_store_dword v[2:3], v6, off492; GFX10-NEXT: s_setpc_b64 s[30:31]493;494; GFX11-LABEL: s_uaddo_uadde:495; GFX11: ; %bb.0:496; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)497; GFX11-NEXT: s_add_u32 s0, s0, s2498; GFX11-NEXT: s_addc_u32 s1, s1, s3499; GFX11-NEXT: s_cselect_b32 s2, 1, 0500; GFX11-NEXT: v_dual_mov_b32 v5, s1 :: v_dual_mov_b32 v4, s0501; GFX11-NEXT: v_mov_b32_e32 v6, s2502; GFX11-NEXT: global_store_b64 v[0:1], v[4:5], off503; GFX11-NEXT: global_store_b32 v[2:3], v6, off504; GFX11-NEXT: s_setpc_b64 s[30:31]505;506; GFX12-LABEL: s_uaddo_uadde:507; GFX12: ; %bb.0:508; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0509; GFX12-NEXT: s_wait_expcnt 0x0510; GFX12-NEXT: s_wait_samplecnt 0x0511; GFX12-NEXT: s_wait_bvhcnt 0x0512; GFX12-NEXT: s_wait_kmcnt 0x0513; GFX12-NEXT: s_add_co_u32 s0, s0, s2514; GFX12-NEXT: s_add_co_ci_u32 s1, s1, s3515; GFX12-NEXT: s_cselect_b32 s2, 1, 0516; GFX12-NEXT: s_wait_alu depctr_sa_sdst(0)517; GFX12-NEXT: v_dual_mov_b32 v5, s1 :: v_dual_mov_b32 v4, s0518; GFX12-NEXT: v_mov_b32_e32 v6, s2519; GFX12-NEXT: global_store_b64 v[0:1], v[4:5], off520; GFX12-NEXT: global_store_b32 v[2:3], v6, off521; GFX12-NEXT: s_setpc_b64 s[30:31]522 %uaddo = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 %b)523 %add = extractvalue {i64, i1} %uaddo, 0524 %of = extractvalue {i64, i1} %uaddo, 1525 %of32 = select i1 %of, i32 1, i32 0526 store i64 %add, ptr addrspace(1) %res527 store i32 %of32, ptr addrspace(1) %carry528 ret void529}530 531define void @v_uaddo_uadde(i64 %a, i64 %b, ptr addrspace(1) %res, ptr addrspace(1) %carry) {532; GFX7-LABEL: v_uaddo_uadde:533; GFX7: ; %bb.0:534; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)535; GFX7-NEXT: v_add_i32_e32 v0, vcc, v0, v2536; GFX7-NEXT: v_addc_u32_e32 v1, vcc, v1, v3, vcc537; GFX7-NEXT: s_mov_b32 s6, 0538; GFX7-NEXT: s_mov_b32 s7, 0xf000539; GFX7-NEXT: s_mov_b64 s[4:5], 0540; GFX7-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc541; GFX7-NEXT: buffer_store_dwordx2 v[0:1], v[4:5], s[4:7], 0 addr64542; GFX7-NEXT: buffer_store_dword v2, v[6:7], s[4:7], 0 addr64543; GFX7-NEXT: s_waitcnt vmcnt(0)544; GFX7-NEXT: s_setpc_b64 s[30:31]545;546; GFX9-LABEL: v_uaddo_uadde:547; GFX9: ; %bb.0:548; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)549; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v2550; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, v1, v3, vcc551; GFX9-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc552; GFX9-NEXT: global_store_dwordx2 v[4:5], v[0:1], off553; GFX9-NEXT: global_store_dword v[6:7], v2, off554; GFX9-NEXT: s_waitcnt vmcnt(0)555; GFX9-NEXT: s_setpc_b64 s[30:31]556;557; GFX8-LABEL: v_uaddo_uadde:558; GFX8: ; %bb.0:559; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)560; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2561; GFX8-NEXT: v_addc_u32_e32 v1, vcc, v1, v3, vcc562; GFX8-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc563; GFX8-NEXT: flat_store_dwordx2 v[4:5], v[0:1]564; GFX8-NEXT: flat_store_dword v[6:7], v2565; GFX8-NEXT: s_waitcnt vmcnt(0)566; GFX8-NEXT: s_setpc_b64 s[30:31]567;568; GFX10-LABEL: v_uaddo_uadde:569; GFX10: ; %bb.0:570; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)571; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2572; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo573; GFX10-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc_lo574; GFX10-NEXT: global_store_dwordx2 v[4:5], v[0:1], off575; GFX10-NEXT: global_store_dword v[6:7], v2, off576; GFX10-NEXT: s_setpc_b64 s[30:31]577;578; GFX11-LABEL: v_uaddo_uadde:579; GFX11: ; %bb.0:580; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)581; GFX11-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2582; GFX11-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo583; GFX11-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc_lo584; GFX11-NEXT: global_store_b64 v[4:5], v[0:1], off585; GFX11-NEXT: global_store_b32 v[6:7], v2, off586; GFX11-NEXT: s_setpc_b64 s[30:31]587;588; GFX12-LABEL: v_uaddo_uadde:589; GFX12: ; %bb.0:590; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0591; GFX12-NEXT: s_wait_expcnt 0x0592; GFX12-NEXT: s_wait_samplecnt 0x0593; GFX12-NEXT: s_wait_bvhcnt 0x0594; GFX12-NEXT: s_wait_kmcnt 0x0595; GFX12-NEXT: v_add_co_u32 v0, vcc_lo, v0, v2596; GFX12-NEXT: s_wait_alu depctr_va_vcc(0)597; GFX12-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo598; GFX12-NEXT: s_wait_alu depctr_va_vcc(0)599; GFX12-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc_lo600; GFX12-NEXT: global_store_b64 v[4:5], v[0:1], off601; GFX12-NEXT: global_store_b32 v[6:7], v2, off602; GFX12-NEXT: s_setpc_b64 s[30:31]603 %uaddo = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 %b)604 %add = extractvalue {i64, i1} %uaddo, 0605 %of = extractvalue {i64, i1} %uaddo, 1606 %of32 = select i1 %of, i32 1, i32 0607 store i64 %add, ptr addrspace(1) %res608 store i32 %of32, ptr addrspace(1) %carry609 ret void610}611 612declare {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 %b)613