brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.7 KiB · e2fb704 Raw
536 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_sub_i16(i16 inreg %a, i16 inreg %b) {10; GFX7-LABEL: s_sub_i16:11; GFX7:       ; %bb.0:12; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13; GFX7-NEXT:    s_sub_i32 s4, s16, s1714; GFX7-NEXT:    v_mov_b32_e32 v0, s415; GFX7-NEXT:    s_setpc_b64 s[30:31]16;17; GFX9-LABEL: s_sub_i16:18; GFX9:       ; %bb.0:19; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)20; GFX9-NEXT:    s_sub_i32 s4, s16, s1721; GFX9-NEXT:    v_mov_b32_e32 v0, s422; GFX9-NEXT:    s_setpc_b64 s[30:31]23;24; GFX8-LABEL: s_sub_i16:25; GFX8:       ; %bb.0:26; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)27; GFX8-NEXT:    s_sub_i32 s4, s16, s1728; GFX8-NEXT:    v_mov_b32_e32 v0, s429; GFX8-NEXT:    s_setpc_b64 s[30:31]30;31; GFX10-LABEL: s_sub_i16:32; GFX10:       ; %bb.0:33; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)34; GFX10-NEXT:    s_sub_i32 s4, s16, s1735; GFX10-NEXT:    v_mov_b32_e32 v0, s436; GFX10-NEXT:    s_setpc_b64 s[30:31]37;38; GFX11-LABEL: s_sub_i16:39; GFX11:       ; %bb.0:40; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)41; GFX11-NEXT:    s_sub_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_sub_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_sub_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 = sub i16 %a, %b57  ret i16 %c58}59 60define i16 @v_sub_i16(i16 %a, i16 %b) {61; GFX7-LABEL: v_sub_i16:62; GFX7:       ; %bb.0:63; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)64; GFX7-NEXT:    v_sub_i32_e32 v0, vcc, v0, v165; GFX7-NEXT:    s_setpc_b64 s[30:31]66;67; GFX9-LABEL: v_sub_i16:68; GFX9:       ; %bb.0:69; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)70; GFX9-NEXT:    v_sub_u16_e32 v0, v0, v171; GFX9-NEXT:    s_setpc_b64 s[30:31]72;73; GFX8-LABEL: v_sub_i16:74; GFX8:       ; %bb.0:75; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)76; GFX8-NEXT:    v_sub_u16_e32 v0, v0, v177; GFX8-NEXT:    s_setpc_b64 s[30:31]78;79; GFX10-LABEL: v_sub_i16:80; GFX10:       ; %bb.0:81; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)82; GFX10-NEXT:    v_sub_nc_u16 v0, v0, v183; GFX10-NEXT:    s_setpc_b64 s[30:31]84;85; GFX11-LABEL: v_sub_i16:86; GFX11:       ; %bb.0:87; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)88; GFX11-NEXT:    v_sub_nc_u16 v0.l, v0.l, v1.l89; GFX11-NEXT:    s_setpc_b64 s[30:31]90;91; GFX12-LABEL: v_sub_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_sub_nc_u16 v0, v0, v199; GFX12-NEXT:    s_setpc_b64 s[30:31]100  %c = sub i16 %a, %b101  ret i16 %c102}103 104define i32 @s_sub_i32(i32 inreg %a, i32 inreg %b) {105; GFX7-LABEL: s_sub_i32:106; GFX7:       ; %bb.0:107; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)108; GFX7-NEXT:    s_sub_i32 s4, s16, s17109; GFX7-NEXT:    v_mov_b32_e32 v0, s4110; GFX7-NEXT:    s_setpc_b64 s[30:31]111;112; GFX9-LABEL: s_sub_i32:113; GFX9:       ; %bb.0:114; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)115; GFX9-NEXT:    s_sub_i32 s4, s16, s17116; GFX9-NEXT:    v_mov_b32_e32 v0, s4117; GFX9-NEXT:    s_setpc_b64 s[30:31]118;119; GFX8-LABEL: s_sub_i32:120; GFX8:       ; %bb.0:121; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)122; GFX8-NEXT:    s_sub_i32 s4, s16, s17123; GFX8-NEXT:    v_mov_b32_e32 v0, s4124; GFX8-NEXT:    s_setpc_b64 s[30:31]125;126; GFX10-LABEL: s_sub_i32:127; GFX10:       ; %bb.0:128; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)129; GFX10-NEXT:    s_sub_i32 s4, s16, s17130; GFX10-NEXT:    v_mov_b32_e32 v0, s4131; GFX10-NEXT:    s_setpc_b64 s[30:31]132;133; GFX11-LABEL: s_sub_i32:134; GFX11:       ; %bb.0:135; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)136; GFX11-NEXT:    s_sub_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_sub_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_sub_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 = sub i32 %a, %b152  ret i32 %c153}154 155define i32 @v_sub_i32(i32 %a, i32 %b) {156; GFX7-LABEL: v_sub_i32:157; GFX7:       ; %bb.0:158; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)159; GFX7-NEXT:    v_sub_i32_e32 v0, vcc, v0, v1160; GFX7-NEXT:    s_setpc_b64 s[30:31]161;162; GFX9-LABEL: v_sub_i32:163; GFX9:       ; %bb.0:164; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)165; GFX9-NEXT:    v_sub_u32_e32 v0, v0, v1166; GFX9-NEXT:    s_setpc_b64 s[30:31]167;168; GFX8-LABEL: v_sub_i32:169; GFX8:       ; %bb.0:170; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)171; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v1172; GFX8-NEXT:    s_setpc_b64 s[30:31]173;174; GFX10-LABEL: v_sub_i32:175; GFX10:       ; %bb.0:176; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)177; GFX10-NEXT:    v_sub_nc_u32_e32 v0, v0, v1178; GFX10-NEXT:    s_setpc_b64 s[30:31]179;180; GFX11-LABEL: v_sub_i32:181; GFX11:       ; %bb.0:182; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)183; GFX11-NEXT:    v_sub_nc_u32_e32 v0, v0, v1184; GFX11-NEXT:    s_setpc_b64 s[30:31]185;186; GFX12-LABEL: v_sub_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_sub_nc_u32_e32 v0, v0, v1194; GFX12-NEXT:    s_setpc_b64 s[30:31]195  %c = sub i32 %a, %b196  ret i32 %c197}198 199; TODO: Add test for s_sub_v2i16. Instruction selector currently fails200; to handle G_UNMERGE_VALUES.201 202define <2 x i16> @v_sub_v2i16(<2 x i16> %a, <2 x i16> %b) {203; GFX7-LABEL: v_sub_v2i16:204; GFX7:       ; %bb.0:205; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)206; GFX7-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2207; GFX7-NEXT:    v_sub_i32_e32 v1, vcc, v1, v3208; GFX7-NEXT:    s_setpc_b64 s[30:31]209;210; GFX9-LABEL: v_sub_v2i16:211; GFX9:       ; %bb.0:212; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)213; GFX9-NEXT:    v_pk_sub_i16 v0, v0, v1214; GFX9-NEXT:    s_setpc_b64 s[30:31]215;216; GFX8-LABEL: v_sub_v2i16:217; GFX8:       ; %bb.0:218; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)219; GFX8-NEXT:    v_sub_u16_e32 v2, v0, v1220; GFX8-NEXT:    v_sub_u16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1221; GFX8-NEXT:    v_or_b32_e32 v0, v2, v0222; GFX8-NEXT:    s_setpc_b64 s[30:31]223;224; GFX10-LABEL: v_sub_v2i16:225; GFX10:       ; %bb.0:226; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)227; GFX10-NEXT:    v_pk_sub_i16 v0, v0, v1228; GFX10-NEXT:    s_setpc_b64 s[30:31]229;230; GFX11-LABEL: v_sub_v2i16:231; GFX11:       ; %bb.0:232; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)233; GFX11-NEXT:    v_pk_sub_i16 v0, v0, v1234; GFX11-NEXT:    s_setpc_b64 s[30:31]235;236; GFX12-LABEL: v_sub_v2i16:237; GFX12:       ; %bb.0:238; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0239; GFX12-NEXT:    s_wait_expcnt 0x0240; GFX12-NEXT:    s_wait_samplecnt 0x0241; GFX12-NEXT:    s_wait_bvhcnt 0x0242; GFX12-NEXT:    s_wait_kmcnt 0x0243; GFX12-NEXT:    v_pk_sub_i16 v0, v0, v1244; GFX12-NEXT:    s_setpc_b64 s[30:31]245  %c = sub <2 x i16> %a, %b246  ret <2 x i16> %c247}248 249define i64 @s_sub_i64(i64 inreg %a, i64 inreg %b) {250; GFX7-LABEL: s_sub_i64:251; GFX7:       ; %bb.0:252; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)253; GFX7-NEXT:    s_sub_u32 s4, s16, s18254; GFX7-NEXT:    s_subb_u32 s5, s17, s19255; GFX7-NEXT:    v_mov_b32_e32 v0, s4256; GFX7-NEXT:    v_mov_b32_e32 v1, s5257; GFX7-NEXT:    s_setpc_b64 s[30:31]258;259; GFX9-LABEL: s_sub_i64:260; GFX9:       ; %bb.0:261; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)262; GFX9-NEXT:    s_sub_u32 s4, s16, s18263; GFX9-NEXT:    s_subb_u32 s5, s17, s19264; GFX9-NEXT:    v_mov_b32_e32 v0, s4265; GFX9-NEXT:    v_mov_b32_e32 v1, s5266; GFX9-NEXT:    s_setpc_b64 s[30:31]267;268; GFX8-LABEL: s_sub_i64:269; GFX8:       ; %bb.0:270; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)271; GFX8-NEXT:    s_sub_u32 s4, s16, s18272; GFX8-NEXT:    s_subb_u32 s5, s17, s19273; GFX8-NEXT:    v_mov_b32_e32 v0, s4274; GFX8-NEXT:    v_mov_b32_e32 v1, s5275; GFX8-NEXT:    s_setpc_b64 s[30:31]276;277; GFX10-LABEL: s_sub_i64:278; GFX10:       ; %bb.0:279; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)280; GFX10-NEXT:    s_sub_u32 s4, s16, s18281; GFX10-NEXT:    s_subb_u32 s5, s17, s19282; GFX10-NEXT:    v_mov_b32_e32 v0, s4283; GFX10-NEXT:    v_mov_b32_e32 v1, s5284; GFX10-NEXT:    s_setpc_b64 s[30:31]285;286; GFX11-LABEL: s_sub_i64:287; GFX11:       ; %bb.0:288; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)289; GFX11-NEXT:    s_sub_u32 s0, s0, s2290; GFX11-NEXT:    s_subb_u32 s1, s1, s3291; GFX11-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1292; GFX11-NEXT:    s_setpc_b64 s[30:31]293;294; GFX12-LABEL: s_sub_i64:295; GFX12:       ; %bb.0:296; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0297; GFX12-NEXT:    s_wait_expcnt 0x0298; GFX12-NEXT:    s_wait_samplecnt 0x0299; GFX12-NEXT:    s_wait_bvhcnt 0x0300; GFX12-NEXT:    s_wait_kmcnt 0x0301; GFX12-NEXT:    s_sub_nc_u64 s[0:1], s[0:1], s[2:3]302; GFX12-NEXT:    s_wait_alu depctr_sa_sdst(0)303; GFX12-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1304; GFX12-NEXT:    s_setpc_b64 s[30:31]305  %c = sub i64 %a, %b306  ret i64 %c307}308 309define i64 @v_sub_i64(i64 %a, i64 %b) {310; GFX7-LABEL: v_sub_i64:311; GFX7:       ; %bb.0:312; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)313; GFX7-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2314; GFX7-NEXT:    v_subb_u32_e32 v1, vcc, v1, v3, vcc315; GFX7-NEXT:    s_setpc_b64 s[30:31]316;317; GFX9-LABEL: v_sub_i64:318; GFX9:       ; %bb.0:319; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)320; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, v0, v2321; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v1, v3, vcc322; GFX9-NEXT:    s_setpc_b64 s[30:31]323;324; GFX8-LABEL: v_sub_i64:325; GFX8:       ; %bb.0:326; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)327; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v2328; GFX8-NEXT:    v_subb_u32_e32 v1, vcc, v1, v3, vcc329; GFX8-NEXT:    s_setpc_b64 s[30:31]330;331; GFX10-LABEL: v_sub_i64:332; GFX10:       ; %bb.0:333; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)334; GFX10-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v2335; GFX10-NEXT:    v_sub_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo336; GFX10-NEXT:    s_setpc_b64 s[30:31]337;338; GFX11-LABEL: v_sub_i64:339; GFX11:       ; %bb.0:340; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)341; GFX11-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v2342; GFX11-NEXT:    v_sub_co_ci_u32_e64 v1, null, v1, v3, vcc_lo343; GFX11-NEXT:    s_setpc_b64 s[30:31]344;345; GFX12-LABEL: v_sub_i64:346; GFX12:       ; %bb.0:347; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0348; GFX12-NEXT:    s_wait_expcnt 0x0349; GFX12-NEXT:    s_wait_samplecnt 0x0350; GFX12-NEXT:    s_wait_bvhcnt 0x0351; GFX12-NEXT:    s_wait_kmcnt 0x0352; GFX12-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v2353; GFX12-NEXT:    s_wait_alu depctr_va_vcc(0)354; GFX12-NEXT:    v_sub_co_ci_u32_e64 v1, null, v1, v3, vcc_lo355; GFX12-NEXT:    s_setpc_b64 s[30:31]356  %c = sub i64 %a, %b357  ret i64 %c358}359 360define void @s_usubo_usube(i64 inreg %a, i64 inreg %b, ptr addrspace(1) %res, ptr addrspace(1) %carry) {361; GFX7-LABEL: s_usubo_usube:362; GFX7:       ; %bb.0:363; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)364; GFX7-NEXT:    s_sub_u32 s4, s16, s18365; GFX7-NEXT:    s_subb_u32 s5, s17, s19366; GFX7-NEXT:    v_mov_b32_e32 v4, s4367; GFX7-NEXT:    s_mov_b32 s6, 0368; GFX7-NEXT:    s_cselect_b32 s8, 1, 0369; GFX7-NEXT:    v_mov_b32_e32 v5, s5370; GFX7-NEXT:    s_mov_b32 s7, 0xf000371; GFX7-NEXT:    s_mov_b64 s[4:5], 0372; GFX7-NEXT:    buffer_store_dwordx2 v[4:5], v[0:1], s[4:7], 0 addr64373; GFX7-NEXT:    v_mov_b32_e32 v0, s8374; GFX7-NEXT:    buffer_store_dword v0, v[2:3], s[4:7], 0 addr64375; GFX7-NEXT:    s_waitcnt vmcnt(0)376; GFX7-NEXT:    s_setpc_b64 s[30:31]377;378; GFX9-LABEL: s_usubo_usube:379; GFX9:       ; %bb.0:380; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)381; GFX9-NEXT:    s_sub_u32 s4, s16, s18382; GFX9-NEXT:    s_subb_u32 s5, s17, s19383; GFX9-NEXT:    v_mov_b32_e32 v4, s4384; GFX9-NEXT:    s_cselect_b32 s6, 1, 0385; GFX9-NEXT:    v_mov_b32_e32 v5, s5386; GFX9-NEXT:    global_store_dwordx2 v[0:1], v[4:5], off387; GFX9-NEXT:    v_mov_b32_e32 v0, s6388; GFX9-NEXT:    global_store_dword v[2:3], v0, off389; GFX9-NEXT:    s_waitcnt vmcnt(0)390; GFX9-NEXT:    s_setpc_b64 s[30:31]391;392; GFX8-LABEL: s_usubo_usube:393; GFX8:       ; %bb.0:394; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)395; GFX8-NEXT:    s_sub_u32 s4, s16, s18396; GFX8-NEXT:    s_subb_u32 s5, s17, s19397; GFX8-NEXT:    v_mov_b32_e32 v4, s4398; GFX8-NEXT:    s_cselect_b32 s6, 1, 0399; GFX8-NEXT:    v_mov_b32_e32 v5, s5400; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[4:5]401; GFX8-NEXT:    v_mov_b32_e32 v0, s6402; GFX8-NEXT:    flat_store_dword v[2:3], v0403; GFX8-NEXT:    s_waitcnt vmcnt(0)404; GFX8-NEXT:    s_setpc_b64 s[30:31]405;406; GFX10-LABEL: s_usubo_usube:407; GFX10:       ; %bb.0:408; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)409; GFX10-NEXT:    s_sub_u32 s4, s16, s18410; GFX10-NEXT:    s_subb_u32 s5, s17, s19411; GFX10-NEXT:    s_cselect_b32 s6, 1, 0412; GFX10-NEXT:    v_mov_b32_e32 v4, s4413; GFX10-NEXT:    v_mov_b32_e32 v5, s5414; GFX10-NEXT:    v_mov_b32_e32 v6, s6415; GFX10-NEXT:    global_store_dwordx2 v[0:1], v[4:5], off416; GFX10-NEXT:    global_store_dword v[2:3], v6, off417; GFX10-NEXT:    s_setpc_b64 s[30:31]418;419; GFX11-LABEL: s_usubo_usube:420; GFX11:       ; %bb.0:421; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)422; GFX11-NEXT:    s_sub_u32 s0, s0, s2423; GFX11-NEXT:    s_subb_u32 s1, s1, s3424; GFX11-NEXT:    s_cselect_b32 s2, 1, 0425; GFX11-NEXT:    v_dual_mov_b32 v5, s1 :: v_dual_mov_b32 v4, s0426; GFX11-NEXT:    v_mov_b32_e32 v6, s2427; GFX11-NEXT:    global_store_b64 v[0:1], v[4:5], off428; GFX11-NEXT:    global_store_b32 v[2:3], v6, off429; GFX11-NEXT:    s_setpc_b64 s[30:31]430;431; GFX12-LABEL: s_usubo_usube:432; GFX12:       ; %bb.0:433; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0434; GFX12-NEXT:    s_wait_expcnt 0x0435; GFX12-NEXT:    s_wait_samplecnt 0x0436; GFX12-NEXT:    s_wait_bvhcnt 0x0437; GFX12-NEXT:    s_wait_kmcnt 0x0438; GFX12-NEXT:    s_sub_co_u32 s0, s0, s2439; GFX12-NEXT:    s_sub_co_ci_u32 s1, s1, s3440; GFX12-NEXT:    s_cselect_b32 s2, 1, 0441; GFX12-NEXT:    s_wait_alu depctr_sa_sdst(0)442; GFX12-NEXT:    v_dual_mov_b32 v5, s1 :: v_dual_mov_b32 v4, s0443; GFX12-NEXT:    v_mov_b32_e32 v6, s2444; GFX12-NEXT:    global_store_b64 v[0:1], v[4:5], off445; GFX12-NEXT:    global_store_b32 v[2:3], v6, off446; GFX12-NEXT:    s_setpc_b64 s[30:31]447  %usubo = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 %b)448  %sub = extractvalue {i64, i1} %usubo, 0449  %of = extractvalue {i64, i1} %usubo, 1450  %of32 = select i1 %of, i32 1, i32 0451  store i64 %sub, ptr addrspace(1) %res452  store i32 %of32, ptr addrspace(1) %carry453  ret void454}455 456define void @v_usubo_usube(i64 %a, i64 %b, ptr addrspace(1) %res, ptr addrspace(1) %carry) {457; GFX7-LABEL: v_usubo_usube:458; GFX7:       ; %bb.0:459; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)460; GFX7-NEXT:    v_sub_i32_e32 v0, vcc, v0, v2461; GFX7-NEXT:    v_subb_u32_e32 v1, vcc, v1, v3, vcc462; GFX7-NEXT:    s_mov_b32 s6, 0463; GFX7-NEXT:    s_mov_b32 s7, 0xf000464; GFX7-NEXT:    s_mov_b64 s[4:5], 0465; GFX7-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc466; GFX7-NEXT:    buffer_store_dwordx2 v[0:1], v[4:5], s[4:7], 0 addr64467; GFX7-NEXT:    buffer_store_dword v2, v[6:7], s[4:7], 0 addr64468; GFX7-NEXT:    s_waitcnt vmcnt(0)469; GFX7-NEXT:    s_setpc_b64 s[30:31]470;471; GFX9-LABEL: v_usubo_usube:472; GFX9:       ; %bb.0:473; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)474; GFX9-NEXT:    v_sub_co_u32_e32 v0, vcc, v0, v2475; GFX9-NEXT:    v_subb_co_u32_e32 v1, vcc, v1, v3, vcc476; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc477; GFX9-NEXT:    global_store_dwordx2 v[4:5], v[0:1], off478; GFX9-NEXT:    global_store_dword v[6:7], v2, off479; GFX9-NEXT:    s_waitcnt vmcnt(0)480; GFX9-NEXT:    s_setpc_b64 s[30:31]481;482; GFX8-LABEL: v_usubo_usube:483; GFX8:       ; %bb.0:484; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)485; GFX8-NEXT:    v_sub_u32_e32 v0, vcc, v0, v2486; GFX8-NEXT:    v_subb_u32_e32 v1, vcc, v1, v3, vcc487; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc488; GFX8-NEXT:    flat_store_dwordx2 v[4:5], v[0:1]489; GFX8-NEXT:    flat_store_dword v[6:7], v2490; GFX8-NEXT:    s_waitcnt vmcnt(0)491; GFX8-NEXT:    s_setpc_b64 s[30:31]492;493; GFX10-LABEL: v_usubo_usube:494; GFX10:       ; %bb.0:495; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)496; GFX10-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v2497; GFX10-NEXT:    v_sub_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo498; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo499; GFX10-NEXT:    global_store_dwordx2 v[4:5], v[0:1], off500; GFX10-NEXT:    global_store_dword v[6:7], v2, off501; GFX10-NEXT:    s_setpc_b64 s[30:31]502;503; GFX11-LABEL: v_usubo_usube:504; GFX11:       ; %bb.0:505; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)506; GFX11-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v2507; GFX11-NEXT:    v_sub_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo508; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo509; GFX11-NEXT:    global_store_b64 v[4:5], v[0:1], off510; GFX11-NEXT:    global_store_b32 v[6:7], v2, off511; GFX11-NEXT:    s_setpc_b64 s[30:31]512;513; GFX12-LABEL: v_usubo_usube:514; GFX12:       ; %bb.0:515; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0516; GFX12-NEXT:    s_wait_expcnt 0x0517; GFX12-NEXT:    s_wait_samplecnt 0x0518; GFX12-NEXT:    s_wait_bvhcnt 0x0519; GFX12-NEXT:    s_wait_kmcnt 0x0520; GFX12-NEXT:    v_sub_co_u32 v0, vcc_lo, v0, v2521; GFX12-NEXT:    s_wait_alu depctr_va_vcc(0)522; GFX12-NEXT:    v_sub_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo523; GFX12-NEXT:    s_wait_alu depctr_va_vcc(0)524; GFX12-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo525; GFX12-NEXT:    global_store_b64 v[4:5], v[0:1], off526; GFX12-NEXT:    global_store_b32 v[6:7], v2, off527; GFX12-NEXT:    s_setpc_b64 s[30:31]528  %usubo = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 %b)529  %sub = extractvalue {i64, i1} %usubo, 0530  %of = extractvalue {i64, i1} %usubo, 1531  %of32 = select i1 %of, i32 1, i32 0532  store i64 %sub, ptr addrspace(1) %res533  store i32 %of32, ptr addrspace(1) %carry534  ret void535}536