3876 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck %s -check-prefixes=GFX103; RUN: llc -mtriple=amdgcn -mcpu=gfx908 < %s | FileCheck %s -check-prefixes=GFX94 5define hidden void @shuffle6766(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {6; GFX10-LABEL: shuffle6766:7; GFX10: ; %bb.0:8; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9; GFX10-NEXT: global_load_dword v0, v[2:3], off10; GFX10-NEXT: s_waitcnt vmcnt(0)11; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x606070612; GFX10-NEXT: global_store_dword v[4:5], v0, off13; GFX10-NEXT: s_setpc_b64 s[30:31]14;15; GFX9-LABEL: shuffle6766:16; GFX9: ; %bb.0:17; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)18; GFX9-NEXT: global_load_dword v0, v[2:3], off19; GFX9-NEXT: s_mov_b32 s4, 0x606070620; GFX9-NEXT: s_waitcnt vmcnt(0)21; GFX9-NEXT: v_perm_b32 v0, v0, v0, s422; GFX9-NEXT: global_store_dword v[4:5], v0, off23; GFX9-NEXT: s_waitcnt vmcnt(0)24; GFX9-NEXT: s_setpc_b64 s[30:31]25 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 426 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 427 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 6, i32 7, i32 6, i32 6>28 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 429 ret void30}31 32define hidden void @shuffle3744(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {33; GFX10-LABEL: shuffle3744:34; GFX10: ; %bb.0:35; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)36; GFX10-NEXT: global_load_dword v6, v[0:1], off37; GFX10-NEXT: global_load_dword v7, v[2:3], off38; GFX10-NEXT: s_waitcnt vmcnt(0)39; GFX10-NEXT: v_perm_b32 v0, v6, v7, 0x30740; GFX10-NEXT: global_store_dword v[4:5], v0, off41; GFX10-NEXT: s_setpc_b64 s[30:31]42;43; GFX9-LABEL: shuffle3744:44; GFX9: ; %bb.0:45; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)46; GFX9-NEXT: global_load_dword v6, v[0:1], off47; GFX9-NEXT: global_load_dword v7, v[2:3], off48; GFX9-NEXT: s_movk_i32 s4, 0x30749; GFX9-NEXT: s_waitcnt vmcnt(0)50; GFX9-NEXT: v_perm_b32 v0, v6, v7, s451; GFX9-NEXT: global_store_dword v[4:5], v0, off52; GFX9-NEXT: s_waitcnt vmcnt(0)53; GFX9-NEXT: s_setpc_b64 s[30:31]54 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 455 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 456 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 3, i32 7, i32 4, i32 4>57 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 458 ret void59}60 61define hidden void @shuffle4445(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {62; GFX10-LABEL: shuffle4445:63; GFX10: ; %bb.0:64; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)65; GFX10-NEXT: global_load_dword v0, v[2:3], off66; GFX10-NEXT: s_waitcnt vmcnt(0)67; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x504040468; GFX10-NEXT: global_store_dword v[4:5], v0, off69; GFX10-NEXT: s_setpc_b64 s[30:31]70;71; GFX9-LABEL: shuffle4445:72; GFX9: ; %bb.0:73; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)74; GFX9-NEXT: global_load_dword v0, v[2:3], off75; GFX9-NEXT: s_mov_b32 s4, 0x504040476; GFX9-NEXT: s_waitcnt vmcnt(0)77; GFX9-NEXT: v_perm_b32 v0, v0, v0, s478; GFX9-NEXT: global_store_dword v[4:5], v0, off79; GFX9-NEXT: s_waitcnt vmcnt(0)80; GFX9-NEXT: s_setpc_b64 s[30:31]81 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 482 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 483 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 4, i32 4, i32 4, i32 5>84 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 485 ret void86}87 88define hidden void @shuffle0101(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {89; GFX10-LABEL: shuffle0101:90; GFX10: ; %bb.0:91; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)92; GFX10-NEXT: global_load_dword v0, v[0:1], off93; GFX10-NEXT: s_waitcnt vmcnt(0)94; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x504050495; GFX10-NEXT: global_store_dword v[4:5], v0, off96; GFX10-NEXT: s_setpc_b64 s[30:31]97;98; GFX9-LABEL: shuffle0101:99; GFX9: ; %bb.0:100; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)101; GFX9-NEXT: global_load_dword v0, v[0:1], off102; GFX9-NEXT: s_mov_b32 s4, 0x5040504103; GFX9-NEXT: s_waitcnt vmcnt(0)104; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4105; GFX9-NEXT: global_store_dword v[4:5], v0, off106; GFX9-NEXT: s_waitcnt vmcnt(0)107; GFX9-NEXT: s_setpc_b64 s[30:31]108 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4109 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 4110 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 0, i32 1, i32 0, i32 1>111 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4112 ret void113}114 115define hidden void @shuffle1004(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {116; GFX10-LABEL: shuffle1004:117; GFX10: ; %bb.0:118; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)119; GFX10-NEXT: global_load_dword v6, v[0:1], off120; GFX10-NEXT: global_load_dword v7, v[2:3], off121; GFX10-NEXT: s_waitcnt vmcnt(0)122; GFX10-NEXT: v_perm_b32 v0, v6, v7, 0x40405123; GFX10-NEXT: global_store_dword v[4:5], v0, off124; GFX10-NEXT: s_setpc_b64 s[30:31]125;126; GFX9-LABEL: shuffle1004:127; GFX9: ; %bb.0:128; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)129; GFX9-NEXT: global_load_dword v6, v[0:1], off130; GFX9-NEXT: global_load_dword v7, v[2:3], off131; GFX9-NEXT: s_mov_b32 s4, 0x40405132; GFX9-NEXT: s_waitcnt vmcnt(0)133; GFX9-NEXT: v_perm_b32 v0, v6, v7, s4134; GFX9-NEXT: global_store_dword v[4:5], v0, off135; GFX9-NEXT: s_waitcnt vmcnt(0)136; GFX9-NEXT: s_setpc_b64 s[30:31]137 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4138 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 4139 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 1, i32 0, i32 0, i32 4>140 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4141 ret void142}143 144 145 146define hidden void @shuffle7533(ptr addrspace(0) %in0, ptr addrspace(0) %in1, ptr addrspace(0) %out0) {147; GFX10-LABEL: shuffle7533:148; GFX10: ; %bb.0:149; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)150; GFX10-NEXT: flat_load_dword v6, v[0:1]151; GFX10-NEXT: flat_load_dword v7, v[2:3]152; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)153; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x3030507154; GFX10-NEXT: flat_store_dword v[4:5], v0155; GFX10-NEXT: s_waitcnt lgkmcnt(0)156; GFX10-NEXT: s_setpc_b64 s[30:31]157;158; GFX9-LABEL: shuffle7533:159; GFX9: ; %bb.0:160; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)161; GFX9-NEXT: flat_load_dword v6, v[0:1]162; GFX9-NEXT: flat_load_dword v7, v[2:3]163; GFX9-NEXT: s_mov_b32 s4, 0x3030507164; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)165; GFX9-NEXT: v_perm_b32 v0, v7, v6, s4166; GFX9-NEXT: flat_store_dword v[4:5], v0167; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)168; GFX9-NEXT: s_setpc_b64 s[30:31]169 %vec0 = load <4 x i8>, ptr addrspace(0) %in0, align 4170 %vec1 = load <4 x i8>, ptr addrspace(0) %in1, align 4171 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 7, i32 5, i32 3, i32 3>172 store <4 x i8> %shuffle0_0, ptr addrspace(0) %out0, align 4173 ret void174}175 176define hidden void @shuffle7767(ptr addrspace(0) %in0, ptr addrspace(0) %in1, ptr addrspace(0) %out0) {177; GFX10-LABEL: shuffle7767:178; GFX10: ; %bb.0:179; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)180; GFX10-NEXT: flat_load_dword v0, v[2:3]181; GFX10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)182; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x7060707183; GFX10-NEXT: flat_store_dword v[4:5], v0184; GFX10-NEXT: s_waitcnt lgkmcnt(0)185; GFX10-NEXT: s_setpc_b64 s[30:31]186;187; GFX9-LABEL: shuffle7767:188; GFX9: ; %bb.0:189; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)190; GFX9-NEXT: flat_load_dword v0, v[2:3]191; GFX9-NEXT: s_mov_b32 s4, 0x7060707192; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)193; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4194; GFX9-NEXT: flat_store_dword v[4:5], v0195; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)196; GFX9-NEXT: s_setpc_b64 s[30:31]197 %vec0 = load <4 x i8>, ptr addrspace(0) %in0, align 4198 %vec1 = load <4 x i8>, ptr addrspace(0) %in1, align 4199 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 7, i32 7, i32 6, i32 7>200 store <4 x i8> %shuffle0_0, ptr addrspace(0) %out0, align 4201 ret void202}203 204define hidden void @shuffle0554(ptr addrspace(3) %in0, ptr addrspace(3) %in1, ptr addrspace(3) %out0) {205; GFX10-LABEL: shuffle0554:206; GFX10: ; %bb.0:207; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)208; GFX10-NEXT: ds_read_b32 v0, v0209; GFX10-NEXT: ds_read_b32 v1, v1210; GFX10-NEXT: s_waitcnt lgkmcnt(0)211; GFX10-NEXT: v_perm_b32 v0, v0, v1, 0x10104212; GFX10-NEXT: ds_write_b32 v2, v0213; GFX10-NEXT: s_waitcnt lgkmcnt(0)214; GFX10-NEXT: s_setpc_b64 s[30:31]215;216; GFX9-LABEL: shuffle0554:217; GFX9: ; %bb.0:218; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)219; GFX9-NEXT: ds_read_b32 v0, v0220; GFX9-NEXT: ds_read_b32 v1, v1221; GFX9-NEXT: s_mov_b32 s4, 0x10104222; GFX9-NEXT: s_waitcnt lgkmcnt(0)223; GFX9-NEXT: v_perm_b32 v0, v0, v1, s4224; GFX9-NEXT: ds_write_b32 v2, v0225; GFX9-NEXT: s_waitcnt lgkmcnt(0)226; GFX9-NEXT: s_setpc_b64 s[30:31]227 %vec0 = load <4 x i8>, ptr addrspace(3) %in0, align 4228 %vec1 = load <4 x i8>, ptr addrspace(3) %in1, align 4229 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 0, i32 5, i32 5, i32 4>230 store <4 x i8> %shuffle0_0, ptr addrspace(3) %out0, align 4231 ret void232}233 234define hidden void @shuffle2127(ptr addrspace(3) %in0, ptr addrspace(3) %in1, ptr addrspace(3) %out0) {235; GFX10-LABEL: shuffle2127:236; GFX10: ; %bb.0:237; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)238; GFX10-NEXT: ds_read_b32 v0, v0239; GFX10-NEXT: ds_read_b32 v1, v1240; GFX10-NEXT: s_waitcnt lgkmcnt(0)241; GFX10-NEXT: v_perm_b32 v0, v0, v1, 0x3060506242; GFX10-NEXT: ds_write_b32 v2, v0243; GFX10-NEXT: s_waitcnt lgkmcnt(0)244; GFX10-NEXT: s_setpc_b64 s[30:31]245;246; GFX9-LABEL: shuffle2127:247; GFX9: ; %bb.0:248; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)249; GFX9-NEXT: ds_read_b32 v0, v0250; GFX9-NEXT: ds_read_b32 v1, v1251; GFX9-NEXT: s_mov_b32 s4, 0x3060506252; GFX9-NEXT: s_waitcnt lgkmcnt(0)253; GFX9-NEXT: v_perm_b32 v0, v0, v1, s4254; GFX9-NEXT: ds_write_b32 v2, v0255; GFX9-NEXT: s_waitcnt lgkmcnt(0)256; GFX9-NEXT: s_setpc_b64 s[30:31]257 %vec0 = load <4 x i8>, ptr addrspace(3) %in0, align 4258 %vec1 = load <4 x i8>, ptr addrspace(3) %in1, align 4259 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 2, i32 1, i32 2, i32 7>260 store <4 x i8> %shuffle0_0, ptr addrspace(3) %out0, align 4261 ret void262}263 264define hidden void @shuffle5047(ptr addrspace(5) %in0, ptr addrspace(5) %in1, ptr addrspace(5) %out0) {265; GFX10-LABEL: shuffle5047:266; GFX10: ; %bb.0:267; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)268; GFX10-NEXT: s_clause 0x1269; GFX10-NEXT: buffer_load_dword v3, v0, s[0:3], 0 offen270; GFX10-NEXT: buffer_load_dword v4, v1, s[0:3], 0 offen271; GFX10-NEXT: s_waitcnt vmcnt(0)272; GFX10-NEXT: v_perm_b32 v0, v4, v3, 0x7040005273; GFX10-NEXT: buffer_store_dword v0, v2, s[0:3], 0 offen274; GFX10-NEXT: s_setpc_b64 s[30:31]275;276; GFX9-LABEL: shuffle5047:277; GFX9: ; %bb.0:278; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)279; GFX9-NEXT: buffer_load_dword v3, v0, s[0:3], 0 offen280; GFX9-NEXT: buffer_load_dword v4, v1, s[0:3], 0 offen281; GFX9-NEXT: s_mov_b32 s4, 0x7040005282; GFX9-NEXT: s_waitcnt vmcnt(0)283; GFX9-NEXT: v_perm_b32 v0, v4, v3, s4284; GFX9-NEXT: buffer_store_dword v0, v2, s[0:3], 0 offen285; GFX9-NEXT: s_waitcnt vmcnt(0)286; GFX9-NEXT: s_setpc_b64 s[30:31]287 %vec0 = load <4 x i8>, ptr addrspace(5) %in0, align 4288 %vec1 = load <4 x i8>, ptr addrspace(5) %in1, align 4289 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 5, i32 0, i32 4, i32 7>290 store <4 x i8> %shuffle0_0, ptr addrspace(5) %out0, align 4291 ret void292}293 294define hidden void @shuffle3546(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {295; GFX10-LABEL: shuffle3546:296; GFX10: ; %bb.0:297; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)298; GFX10-NEXT: global_load_dword v6, v[0:1], off299; GFX10-NEXT: global_load_dword v7, v[2:3], off300; GFX10-NEXT: s_waitcnt vmcnt(0)301; GFX10-NEXT: v_perm_b32 v0, v6, v7, 0x2000107302; GFX10-NEXT: global_store_dword v[4:5], v0, off303; GFX10-NEXT: s_setpc_b64 s[30:31]304;305; GFX9-LABEL: shuffle3546:306; GFX9: ; %bb.0:307; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)308; GFX9-NEXT: global_load_dword v6, v[0:1], off309; GFX9-NEXT: global_load_dword v7, v[2:3], off310; GFX9-NEXT: s_mov_b32 s4, 0x2000107311; GFX9-NEXT: s_waitcnt vmcnt(0)312; GFX9-NEXT: v_perm_b32 v0, v6, v7, s4313; GFX9-NEXT: global_store_dword v[4:5], v0, off314; GFX9-NEXT: s_waitcnt vmcnt(0)315; GFX9-NEXT: s_setpc_b64 s[30:31]316 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4317 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 4318 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 3, i32 5, i32 4, i32 6>319 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4320 ret void321}322 323 324define hidden void @shuffle7330ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {325; GFX10-LABEL: shuffle7330ud2:326; GFX10: ; %bb.0:327; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)328; GFX10-NEXT: global_load_dword v0, v[0:1], off329; GFX10-NEXT: s_waitcnt vmcnt(0)330; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x4070706331; GFX10-NEXT: global_store_dword v[2:3], v0, off332; GFX10-NEXT: s_setpc_b64 s[30:31]333;334; GFX9-LABEL: shuffle7330ud2:335; GFX9: ; %bb.0:336; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)337; GFX9-NEXT: global_load_dword v0, v[0:1], off338; GFX9-NEXT: s_mov_b32 s4, 0x4070706339; GFX9-NEXT: s_waitcnt vmcnt(0)340; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4341; GFX9-NEXT: global_store_dword v[2:3], v0, off342; GFX9-NEXT: s_waitcnt vmcnt(0)343; GFX9-NEXT: s_setpc_b64 s[30:31]344 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4345 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 7, i32 3, i32 3, i32 0>346 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4347 ret void348}349 350define hidden void @shuffle5341ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {351; GFX10-LABEL: shuffle5341ud2:352; GFX10: ; %bb.0:353; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)354; GFX10-NEXT: global_load_dword v0, v[0:1], off355; GFX10-NEXT: s_waitcnt vmcnt(0)356; GFX10-NEXT: v_alignbit_b32 v0, v0, v0, 16357; GFX10-NEXT: global_store_dword v[2:3], v0, off358; GFX10-NEXT: s_setpc_b64 s[30:31]359;360; GFX9-LABEL: shuffle5341ud2:361; GFX9: ; %bb.0:362; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)363; GFX9-NEXT: global_load_dword v0, v[0:1], off364; GFX9-NEXT: s_waitcnt vmcnt(0)365; GFX9-NEXT: v_alignbit_b32 v0, v0, v0, 16366; GFX9-NEXT: global_store_dword v[2:3], v0, off367; GFX9-NEXT: s_waitcnt vmcnt(0)368; GFX9-NEXT: s_setpc_b64 s[30:31]369 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4370 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 5, i32 3, i32 4, i32 1>371 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4372 ret void373}374 375define hidden void @shuffle6106ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {376; GFX10-LABEL: shuffle6106ud2:377; GFX10: ; %bb.0:378; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)379; GFX10-NEXT: global_load_dword v0, v[0:1], off380; GFX10-NEXT: s_waitcnt vmcnt(0)381; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x5040504382; GFX10-NEXT: global_store_dword v[2:3], v0, off383; GFX10-NEXT: s_setpc_b64 s[30:31]384;385; GFX9-LABEL: shuffle6106ud2:386; GFX9: ; %bb.0:387; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)388; GFX9-NEXT: global_load_dword v0, v[0:1], off389; GFX9-NEXT: s_mov_b32 s4, 0x5040504390; GFX9-NEXT: s_waitcnt vmcnt(0)391; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4392; GFX9-NEXT: global_store_dword v[2:3], v0, off393; GFX9-NEXT: s_waitcnt vmcnt(0)394; GFX9-NEXT: s_setpc_b64 s[30:31]395 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4396 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 6, i32 1, i32 0, i32 6>397 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4398 ret void399}400 401 402define hidden void @shuffle4327ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {403; GFX10-LABEL: shuffle4327ud2:404; GFX10: ; %bb.0:405; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)406; GFX10-NEXT: global_load_dword v0, v[0:1], off407; GFX10-NEXT: s_waitcnt vmcnt(0)408; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x7060706409; GFX10-NEXT: global_store_dword v[2:3], v0, off410; GFX10-NEXT: s_setpc_b64 s[30:31]411;412; GFX9-LABEL: shuffle4327ud2:413; GFX9: ; %bb.0:414; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)415; GFX9-NEXT: global_load_dword v0, v[0:1], off416; GFX9-NEXT: s_mov_b32 s4, 0x7060706417; GFX9-NEXT: s_waitcnt vmcnt(0)418; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4419; GFX9-NEXT: global_store_dword v[2:3], v0, off420; GFX9-NEXT: s_waitcnt vmcnt(0)421; GFX9-NEXT: s_setpc_b64 s[30:31]422 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4423 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 4, i32 3, i32 2, i32 7>424 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4425 ret void426}427 428define hidden void @shuffle3263ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {429; GFX10-LABEL: shuffle3263ud2:430; GFX10: ; %bb.0:431; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)432; GFX10-NEXT: global_load_dword v0, v[0:1], off433; GFX10-NEXT: s_waitcnt vmcnt(0)434; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x7060607435; GFX10-NEXT: global_store_dword v[2:3], v0, off436; GFX10-NEXT: s_setpc_b64 s[30:31]437;438; GFX9-LABEL: shuffle3263ud2:439; GFX9: ; %bb.0:440; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)441; GFX9-NEXT: global_load_dword v0, v[0:1], off442; GFX9-NEXT: s_mov_b32 s4, 0x7060607443; GFX9-NEXT: s_waitcnt vmcnt(0)444; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4445; GFX9-NEXT: global_store_dword v[2:3], v0, off446; GFX9-NEXT: s_waitcnt vmcnt(0)447; GFX9-NEXT: s_setpc_b64 s[30:31]448 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4449 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 6, i32 3>450 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4451 ret void452}453 454define hidden void @shuffle2763ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {455; GFX10-LABEL: shuffle2763ud2:456; GFX10: ; %bb.0:457; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)458; GFX10-NEXT: global_load_dword v0, v[0:1], off459; GFX10-NEXT: s_waitcnt vmcnt(0)460; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x7060706461; GFX10-NEXT: global_store_dword v[2:3], v0, off462; GFX10-NEXT: s_setpc_b64 s[30:31]463;464; GFX9-LABEL: shuffle2763ud2:465; GFX9: ; %bb.0:466; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)467; GFX9-NEXT: global_load_dword v0, v[0:1], off468; GFX9-NEXT: s_mov_b32 s4, 0x7060706469; GFX9-NEXT: s_waitcnt vmcnt(0)470; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4471; GFX9-NEXT: global_store_dword v[2:3], v0, off472; GFX9-NEXT: s_waitcnt vmcnt(0)473; GFX9-NEXT: s_setpc_b64 s[30:31]474 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4475 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 2, i32 7, i32 6, i32 3>476 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4477 ret void478}479 480define hidden void @shuffle1327ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {481; GFX10-LABEL: shuffle1327ud2:482; GFX10: ; %bb.0:483; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)484; GFX10-NEXT: global_load_dword v0, v[0:1], off485; GFX10-NEXT: s_waitcnt vmcnt(0)486; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x7060705487; GFX10-NEXT: global_store_dword v[2:3], v0, off488; GFX10-NEXT: s_setpc_b64 s[30:31]489;490; GFX9-LABEL: shuffle1327ud2:491; GFX9: ; %bb.0:492; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)493; GFX9-NEXT: global_load_dword v0, v[0:1], off494; GFX9-NEXT: s_mov_b32 s4, 0x7060705495; GFX9-NEXT: s_waitcnt vmcnt(0)496; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4497; GFX9-NEXT: global_store_dword v[2:3], v0, off498; GFX9-NEXT: s_waitcnt vmcnt(0)499; GFX9-NEXT: s_setpc_b64 s[30:31]500 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4501 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 1, i32 3, i32 2, i32 7>502 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4503 ret void504}505 506define hidden void @shuffle0605ud2(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {507; GFX10-LABEL: shuffle0605ud2:508; GFX10: ; %bb.0:509; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)510; GFX10-NEXT: global_load_dword v0, v[0:1], off511; GFX10-NEXT: s_waitcnt vmcnt(0)512; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x5040504513; GFX10-NEXT: global_store_dword v[2:3], v0, off514; GFX10-NEXT: s_setpc_b64 s[30:31]515;516; GFX9-LABEL: shuffle0605ud2:517; GFX9: ; %bb.0:518; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)519; GFX9-NEXT: global_load_dword v0, v[0:1], off520; GFX9-NEXT: s_mov_b32 s4, 0x5040504521; GFX9-NEXT: s_waitcnt vmcnt(0)522; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4523; GFX9-NEXT: global_store_dword v[2:3], v0, off524; GFX9-NEXT: s_waitcnt vmcnt(0)525; GFX9-NEXT: s_setpc_b64 s[30:31]526 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4527 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 0, i32 6, i32 0, i32 5>528 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out0, align 4529 ret void530}531 532define hidden void @insertUsesOr(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0) {533; GFX10-LABEL: insertUsesOr:534; GFX10: ; %bb.0:535; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)536; GFX10-NEXT: global_load_dword v0, v[0:1], off537; GFX10-NEXT: v_lshlrev_b16 v1, 8, v4538; GFX10-NEXT: s_waitcnt vmcnt(0)539; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD540; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0541; GFX10-NEXT: global_store_dword v[5:6], v0, off542; GFX10-NEXT: s_setpc_b64 s[30:31]543;544; GFX9-LABEL: insertUsesOr:545; GFX9: ; %bb.0:546; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)547; GFX9-NEXT: global_load_dword v0, v[0:1], off548; GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v4549; GFX9-NEXT: s_waitcnt vmcnt(0)550; GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD551; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0552; GFX9-NEXT: global_store_dword v[5:6], v0, off553; GFX9-NEXT: s_waitcnt vmcnt(0)554; GFX9-NEXT: s_setpc_b64 s[30:31]555 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4556 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 4557 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 4>558 %vecins = insertelement <4 x i8> %shuffle0_0, i8 %elt, i32 1559 store <4 x i8> %vecins, ptr addrspace(1) %out0560 ret void561}562 563define hidden void @addUsesOr(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0) {564; GFX10-LABEL: addUsesOr:565; GFX10: ; %bb.0:566; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)567; GFX10-NEXT: global_load_dword v4, v[0:1], off568; GFX10-NEXT: global_load_dword v7, v[2:3], off569; GFX10-NEXT: s_waitcnt vmcnt(1)570; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v4571; GFX10-NEXT: s_waitcnt vmcnt(0)572; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v7573; GFX10-NEXT: v_lshrrev_b32_e32 v2, 16, v4574; GFX10-NEXT: v_lshrrev_b32_e32 v3, 16, v7575; GFX10-NEXT: v_add_nc_u16 v0, v0, v1576; GFX10-NEXT: v_lshrrev_b16 v1, 8, v7577; GFX10-NEXT: v_add_nc_u16 v2, v2, v3578; GFX10-NEXT: v_lshlrev_b16 v0, 8, v0579; GFX10-NEXT: v_add_nc_u16 v1, v4, v1580; GFX10-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD581; GFX10-NEXT: v_lshlrev_b16 v1, 8, v1582; GFX10-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD583; GFX10-NEXT: global_store_dword v[5:6], v0, off584; GFX10-NEXT: s_setpc_b64 s[30:31]585;586; GFX9-LABEL: addUsesOr:587; GFX9: ; %bb.0:588; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)589; GFX9-NEXT: global_load_dword v4, v[0:1], off590; GFX9-NEXT: global_load_dword v7, v[2:3], off591; GFX9-NEXT: s_waitcnt vmcnt(0)592; GFX9-NEXT: v_add_u16_sdwa v0, v4, v7 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_3593; GFX9-NEXT: v_add_u16_sdwa v1, v4, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1594; GFX9-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD595; GFX9-NEXT: v_add_u16_sdwa v0, v4, v7 dst_sel:BYTE_1 dst_unused:UNUSED_PRESERVE src0_sel:DWORD src1_sel:BYTE_1596; GFX9-NEXT: global_store_dword v[5:6], v0, off597; GFX9-NEXT: s_waitcnt vmcnt(0)598; GFX9-NEXT: s_setpc_b64 s[30:31]599 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4600 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 4601 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 7, i32 0, i32 6, i32 3>602 %added = add <4 x i8> %shuffle0_0, %vec1603 store <4 x i8> %added, ptr addrspace(1) %out0604 ret void605}606 607 608define amdgpu_kernel void @shuffle8i8(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out1) #0 {609; GFX10-LABEL: shuffle8i8:610; GFX10: ; %bb.0: ; %bb611; GFX10-NEXT: s_clause 0x1612; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24613; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34614; GFX10-NEXT: v_mov_b32_e32 v2, 0615; GFX10-NEXT: s_waitcnt lgkmcnt(0)616; GFX10-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0617; GFX10-NEXT: s_load_dwordx2 s[8:9], s[2:3], 0x0618; GFX10-NEXT: s_waitcnt lgkmcnt(0)619; GFX10-NEXT: s_bfe_u32 s2, s5, 0x80008620; GFX10-NEXT: s_lshl_b32 s1, s9, 8621; GFX10-NEXT: s_bfe_u32 s9, s9, 0x100010622; GFX10-NEXT: s_bfe_u32 s0, s4, 0x80008623; GFX10-NEXT: s_lshl_b32 s3, s8, 8624; GFX10-NEXT: s_and_b32 s5, s8, 0xff00625; GFX10-NEXT: s_bfe_u32 s8, s4, 0x80010626; GFX10-NEXT: s_and_b32 s4, s4, 0xff627; GFX10-NEXT: s_or_b32 s1, s2, s1628; GFX10-NEXT: s_lshl_b32 s2, s9, 8629; GFX10-NEXT: s_or_b32 s0, s0, s3630; GFX10-NEXT: s_or_b32 s3, s8, s5631; GFX10-NEXT: s_or_b32 s2, s4, s2632; GFX10-NEXT: s_and_b32 s0, s0, 0xffff633; GFX10-NEXT: s_lshl_b32 s1, s1, 16634; GFX10-NEXT: s_and_b32 s2, s2, 0xffff635; GFX10-NEXT: s_lshl_b32 s3, s3, 16636; GFX10-NEXT: s_or_b32 s0, s0, s1637; GFX10-NEXT: s_or_b32 s1, s2, s3638; GFX10-NEXT: v_mov_b32_e32 v0, s0639; GFX10-NEXT: v_mov_b32_e32 v1, s1640; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[6:7]641; GFX10-NEXT: s_endpgm642;643; GFX9-LABEL: shuffle8i8:644; GFX9: ; %bb.0: ; %bb645; GFX9-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24646; GFX9-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x34647; GFX9-NEXT: v_mov_b32_e32 v2, 0648; GFX9-NEXT: s_waitcnt lgkmcnt(0)649; GFX9-NEXT: s_load_dwordx2 s[4:5], s[0:1], 0x0650; GFX9-NEXT: s_load_dwordx2 s[8:9], s[2:3], 0x0651; GFX9-NEXT: s_waitcnt lgkmcnt(0)652; GFX9-NEXT: s_bfe_u32 s0, s4, 0x80008653; GFX9-NEXT: s_lshl_b32 s1, s9, 8654; GFX9-NEXT: s_bfe_u32 s2, s5, 0x80008655; GFX9-NEXT: s_lshl_b32 s3, s8, 8656; GFX9-NEXT: s_or_b32 s1, s2, s1657; GFX9-NEXT: s_or_b32 s0, s0, s3658; GFX9-NEXT: s_bfe_u32 s2, s4, 0x80010659; GFX9-NEXT: s_and_b32 s3, s4, 0xff660; GFX9-NEXT: s_bfe_u32 s4, s9, 0x100010661; GFX9-NEXT: s_and_b32 s5, s8, 0xff00662; GFX9-NEXT: s_lshl_b32 s4, s4, 8663; GFX9-NEXT: s_or_b32 s2, s2, s5664; GFX9-NEXT: s_or_b32 s3, s3, s4665; GFX9-NEXT: s_and_b32 s3, s3, 0xffff666; GFX9-NEXT: s_lshl_b32 s2, s2, 16667; GFX9-NEXT: s_and_b32 s0, s0, 0xffff668; GFX9-NEXT: s_lshl_b32 s1, s1, 16669; GFX9-NEXT: s_or_b32 s2, s3, s2670; GFX9-NEXT: s_or_b32 s0, s0, s1671; GFX9-NEXT: v_mov_b32_e32 v0, s0672; GFX9-NEXT: v_mov_b32_e32 v1, s2673; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[6:7]674; GFX9-NEXT: s_endpgm675bb:676 %vec0 = load <8 x i8>, ptr addrspace(1) %in0677 %vec1 = load <8 x i8>, ptr addrspace(1) %in1678 %shuffle0 = shufflevector <8 x i8> %vec0, <8 x i8> %vec1, <8 x i32> <i32 1, i32 8, i32 5, i32 12, i32 0, i32 14, i32 2, i32 9>679 store <8 x i8> %shuffle0, ptr addrspace(1) %out1680 ret void681}682 683declare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone684declare i32 @llvm.amdgcn.workitem.id.y() nounwind readnone685 686; Not combined to perm due to non-vectorized use, non-divergent687define hidden void @add(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0) {688; GFX10-LABEL: add:689; GFX10: ; %bb.0:690; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)691; GFX10-NEXT: global_load_dword v4, v[0:1], off692; GFX10-NEXT: global_load_dword v7, v[2:3], off693; GFX10-NEXT: s_waitcnt vmcnt(1)694; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v4695; GFX10-NEXT: s_waitcnt vmcnt(0)696; GFX10-NEXT: v_lshrrev_b16 v1, 8, v7697; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v7698; GFX10-NEXT: v_lshrrev_b16 v3, 8, v4699; GFX10-NEXT: v_lshrrev_b32_e32 v4, 16, v7700; GFX10-NEXT: v_add_nc_u16 v0, v0, v1701; GFX10-NEXT: v_add_nc_u16 v2, v7, v2702; GFX10-NEXT: v_add_nc_u16 v3, v3, v7703; GFX10-NEXT: v_add_nc_u16 v1, v1, v4704; GFX10-NEXT: v_lshlrev_b16 v0, 8, v0705; GFX10-NEXT: v_lshlrev_b16 v2, 8, v2706; GFX10-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD707; GFX10-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD708; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD709; GFX10-NEXT: global_store_dword v[5:6], v0, off710; GFX10-NEXT: s_setpc_b64 s[30:31]711;712; GFX9-LABEL: add:713; GFX9: ; %bb.0:714; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)715; GFX9-NEXT: global_load_dword v4, v[0:1], off716; GFX9-NEXT: global_load_dword v7, v[2:3], off717; GFX9-NEXT: s_waitcnt vmcnt(0)718; GFX9-NEXT: v_add_u16_sdwa v0, v4, v7 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_1719; GFX9-NEXT: v_add_u16_sdwa v1, v4, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD720; GFX9-NEXT: v_add_u16_sdwa v2, v7, v7 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3721; GFX9-NEXT: v_add_u16_sdwa v3, v7, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:WORD_1722; GFX9-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD723; GFX9-NEXT: v_or_b32_sdwa v1, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD724; GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD725; GFX9-NEXT: global_store_dword v[5:6], v0, off726; GFX9-NEXT: s_waitcnt vmcnt(0)727; GFX9-NEXT: s_setpc_b64 s[30:31]728 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4729 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 4730 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 1, i32 3, i32 5, i32 4>731 %vecins = add <4 x i8> %shuffle0_0, %vec1732 store <4 x i8> %vecins, ptr addrspace(1) %out0733 ret void734}735 736; Not combined to perm due to non-vectorized use737define hidden void @add_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0) {738; GFX10-LABEL: add_div:739; GFX10: ; %bb.0:740; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)741; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v31742; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v4743; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v4744; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo745; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v4746; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo747; GFX10-NEXT: global_load_dword v4, v[0:1], off748; GFX10-NEXT: global_load_dword v7, v[2:3], off749; GFX10-NEXT: s_waitcnt vmcnt(1)750; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v4751; GFX10-NEXT: s_waitcnt vmcnt(0)752; GFX10-NEXT: v_lshrrev_b16 v1, 8, v7753; GFX10-NEXT: v_add_nc_u16 v0, v0, v1754; GFX10-NEXT: v_lshrrev_b16 v1, 8, v4755; GFX10-NEXT: v_lshlrev_b16 v0, 8, v0756; GFX10-NEXT: v_add_nc_u16 v1, v1, v7757; GFX10-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD758; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0759; GFX10-NEXT: global_store_dword v[5:6], v0, off760; GFX10-NEXT: s_setpc_b64 s[30:31]761;762; GFX9-LABEL: add_div:763; GFX9: ; %bb.0:764; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)765; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v31766; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v4767; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v4768; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc769; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v4770; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc771; GFX9-NEXT: global_load_dword v4, v[0:1], off772; GFX9-NEXT: global_load_dword v7, v[2:3], off773; GFX9-NEXT: s_waitcnt vmcnt(0)774; GFX9-NEXT: v_add_u16_sdwa v0, v4, v7 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_1775; GFX9-NEXT: v_add_u16_sdwa v1, v4, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD776; GFX9-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD777; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0778; GFX9-NEXT: global_store_dword v[5:6], v0, off779; GFX9-NEXT: s_waitcnt vmcnt(0)780; GFX9-NEXT: s_setpc_b64 s[30:31]781 %tid = call i32 @llvm.amdgcn.workitem.id.x()782 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid783 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid784 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 4785 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 4786 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 4>787 %vecins = add <4 x i8> %shuffle0_0, %vec1788 store <4 x i8> %vecins, ptr addrspace(1) %out0789 ret void790}791 792; Not combined to perm due to non-divergent use793define hidden void @add_store(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {794; GFX10-LABEL: add_store:795; GFX10: ; %bb.0:796; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)797; GFX10-NEXT: global_load_dword v4, v[0:1], off798; GFX10-NEXT: global_load_dword v9, v[2:3], off799; GFX10-NEXT: s_waitcnt vmcnt(1)800; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v4801; GFX10-NEXT: s_waitcnt vmcnt(0)802; GFX10-NEXT: v_lshrrev_b16 v1, 8, v9803; GFX10-NEXT: v_lshrrev_b16 v2, 8, v4804; GFX10-NEXT: v_add_nc_u16 v0, v0, v1805; GFX10-NEXT: v_mov_b32_e32 v1, 0xffffff00806; GFX10-NEXT: v_add_nc_u16 v3, v2, v9807; GFX10-NEXT: v_lshlrev_b16 v0, 8, v0808; GFX10-NEXT: v_and_b32_sdwa v1, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD809; GFX10-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD810; GFX10-NEXT: v_or_b32_e32 v1, v2, v1811; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0812; GFX10-NEXT: v_and_b32_e32 v1, 0xffff, v1813; GFX10-NEXT: global_store_dword v[5:6], v0, off814; GFX10-NEXT: global_store_dword v[7:8], v1, off815; GFX10-NEXT: s_setpc_b64 s[30:31]816;817; GFX9-LABEL: add_store:818; GFX9: ; %bb.0:819; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)820; GFX9-NEXT: global_load_dword v4, v[0:1], off821; GFX9-NEXT: global_load_dword v9, v[2:3], off822; GFX9-NEXT: s_movk_i32 s4, 0xff00823; GFX9-NEXT: s_waitcnt vmcnt(1)824; GFX9-NEXT: v_and_b32_sdwa v0, v4, s4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD825; GFX9-NEXT: s_waitcnt vmcnt(0)826; GFX9-NEXT: v_add_u16_sdwa v1, v4, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_1827; GFX9-NEXT: v_add_u16_sdwa v2, v4, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD828; GFX9-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD829; GFX9-NEXT: v_or_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD830; GFX9-NEXT: v_and_b32_e32 v1, 0xffff, v1831; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0832; GFX9-NEXT: global_store_dword v[5:6], v1, off833; GFX9-NEXT: global_store_dword v[7:8], v0, off834; GFX9-NEXT: s_waitcnt vmcnt(0)835; GFX9-NEXT: s_setpc_b64 s[30:31]836 %vec0 = load <4 x i8>, ptr addrspace(1) %in0, align 4837 %vec1 = load <4 x i8>, ptr addrspace(1) %in1, align 4838 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 4>839 %vecins = add <4 x i8> %shuffle0_0, %vec1840 store <4 x i8> %vecins, ptr addrspace(1) %out0841 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out1842 ret void843}844 845; Not combined to perm due to 16 bit or846define hidden void @add_store_div_16(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {847; GFX10-LABEL: add_store_div_16:848; GFX10: ; %bb.0:849; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)850; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v31851; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v4852; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v4853; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo854; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v4855; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo856; GFX10-NEXT: global_load_dword v4, v[0:1], off857; GFX10-NEXT: global_load_dword v9, v[2:3], off858; GFX10-NEXT: s_waitcnt vmcnt(1)859; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v4860; GFX10-NEXT: s_waitcnt vmcnt(0)861; GFX10-NEXT: v_lshrrev_b16 v1, 8, v9862; GFX10-NEXT: v_lshrrev_b16 v2, 8, v4863; GFX10-NEXT: v_add_nc_u16 v0, v0, v1864; GFX10-NEXT: v_mov_b32_e32 v1, 0xffffff00865; GFX10-NEXT: v_add_nc_u16 v3, v2, v9866; GFX10-NEXT: v_lshlrev_b16 v0, 8, v0867; GFX10-NEXT: v_and_b32_sdwa v1, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD868; GFX10-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD869; GFX10-NEXT: v_or_b32_e32 v1, v2, v1870; GFX10-NEXT: v_and_b32_e32 v0, 0xffff, v0871; GFX10-NEXT: v_and_b32_e32 v1, 0xffff, v1872; GFX10-NEXT: global_store_dword v[5:6], v0, off873; GFX10-NEXT: global_store_dword v[7:8], v1, off874; GFX10-NEXT: s_setpc_b64 s[30:31]875;876; GFX9-LABEL: add_store_div_16:877; GFX9: ; %bb.0:878; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)879; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v31880; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v4881; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v4882; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc883; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v4884; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc885; GFX9-NEXT: global_load_dword v4, v[0:1], off886; GFX9-NEXT: global_load_dword v9, v[2:3], off887; GFX9-NEXT: s_movk_i32 s4, 0xff00888; GFX9-NEXT: s_waitcnt vmcnt(1)889; GFX9-NEXT: v_and_b32_sdwa v0, v4, s4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD890; GFX9-NEXT: s_waitcnt vmcnt(0)891; GFX9-NEXT: v_add_u16_sdwa v1, v4, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_1892; GFX9-NEXT: v_add_u16_sdwa v2, v4, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD893; GFX9-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD894; GFX9-NEXT: v_or_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD895; GFX9-NEXT: v_and_b32_e32 v1, 0xffff, v1896; GFX9-NEXT: v_and_b32_e32 v0, 0xffff, v0897; GFX9-NEXT: global_store_dword v[5:6], v1, off898; GFX9-NEXT: global_store_dword v[7:8], v0, off899; GFX9-NEXT: s_waitcnt vmcnt(0)900; GFX9-NEXT: s_setpc_b64 s[30:31]901 %tid = call i32 @llvm.amdgcn.workitem.id.x()902 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid903 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid904 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 4905 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 4906 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 4>907 %vecins = add <4 x i8> %shuffle0_0, %vec1908 store <4 x i8> %vecins, ptr addrspace(1) %out0909 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out1910 ret void911}912 913; Vectorized use, divergent, 32 bit or914define hidden void @add_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {915; GFX10-LABEL: add_store_div:916; GFX10: ; %bb.0:917; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)918; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v31919; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v4920; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v4921; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo922; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v4923; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo924; GFX10-NEXT: global_load_dword v4, v[0:1], off925; GFX10-NEXT: global_load_dword v9, v[2:3], off926; GFX10-NEXT: s_waitcnt vmcnt(1)927; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v4928; GFX10-NEXT: s_waitcnt vmcnt(0)929; GFX10-NEXT: v_lshrrev_b16 v1, 8, v9930; GFX10-NEXT: v_lshrrev_b32_e32 v2, 24, v9931; GFX10-NEXT: v_lshrrev_b16 v3, 8, v4932; GFX10-NEXT: v_lshrrev_b32_e32 v10, 16, v9933; GFX10-NEXT: v_add_nc_u16 v0, v0, v1934; GFX10-NEXT: v_add_nc_u16 v2, v9, v2935; GFX10-NEXT: v_add_nc_u16 v3, v3, v9936; GFX10-NEXT: v_add_nc_u16 v1, v1, v10937; GFX10-NEXT: v_lshlrev_b16 v0, 8, v0938; GFX10-NEXT: v_lshlrev_b16 v2, 8, v2939; GFX10-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD940; GFX10-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD941; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD942; GFX10-NEXT: v_perm_b32 v1, v4, v9, 0x10705943; GFX10-NEXT: global_store_dword v[5:6], v0, off944; GFX10-NEXT: global_store_dword v[7:8], v1, off945; GFX10-NEXT: s_setpc_b64 s[30:31]946;947; GFX9-LABEL: add_store_div:948; GFX9: ; %bb.0:949; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)950; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v31951; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v4952; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v4953; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc954; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v4955; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc956; GFX9-NEXT: global_load_dword v4, v[0:1], off957; GFX9-NEXT: global_load_dword v9, v[2:3], off958; GFX9-NEXT: s_mov_b32 s4, 0x10705959; GFX9-NEXT: s_waitcnt vmcnt(0)960; GFX9-NEXT: v_perm_b32 v0, v4, v9, s4961; GFX9-NEXT: v_add_u16_sdwa v1, v4, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_1962; GFX9-NEXT: v_add_u16_sdwa v2, v4, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD963; GFX9-NEXT: v_add_u16_sdwa v3, v9, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_3964; GFX9-NEXT: v_add_u16_sdwa v4, v9, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:WORD_1965; GFX9-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD966; GFX9-NEXT: v_or_b32_sdwa v2, v4, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD967; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD968; GFX9-NEXT: global_store_dword v[5:6], v1, off969; GFX9-NEXT: global_store_dword v[7:8], v0, off970; GFX9-NEXT: s_waitcnt vmcnt(0)971; GFX9-NEXT: s_setpc_b64 s[30:31]972 %tid = call i32 @llvm.amdgcn.workitem.id.x()973 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid974 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid975 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 4976 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 4977 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 1, i32 3, i32 5, i32 4>978 %vecins = add <4 x i8> %shuffle0_0, %vec1979 store <4 x i8> %vecins, ptr addrspace(1) %out0980 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out1981 ret void982}983 984define hidden void @and_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {985; GFX10-LABEL: and_store_div:986; GFX10: ; %bb.0:987; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)988; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v31989; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v4990; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v4991; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo992; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v4993; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo994; GFX10-NEXT: global_load_dword v4, v[2:3], off995; GFX10-NEXT: global_load_dword v9, v[0:1], off996; GFX10-NEXT: v_mov_b32_e32 v0, 2997; GFX10-NEXT: v_mov_b32_e32 v1, 1998; GFX10-NEXT: s_waitcnt vmcnt(1)999; GFX10-NEXT: v_and_b32_sdwa v2, v4, v0 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1000; GFX10-NEXT: s_waitcnt vmcnt(0)1001; GFX10-NEXT: v_and_b32_sdwa v1, v9, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1002; GFX10-NEXT: v_and_b32_e32 v3, 0x100, v91003; GFX10-NEXT: v_and_b32_sdwa v0, v9, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD1004; GFX10-NEXT: v_or_b32_e32 v1, v1, v21005; GFX10-NEXT: v_or_b32_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1006; GFX10-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1007; GFX10-NEXT: v_perm_b32 v1, v9, v4, 0x50700061008; GFX10-NEXT: global_store_dword v[5:6], v0, off1009; GFX10-NEXT: global_store_dword v[7:8], v1, off1010; GFX10-NEXT: s_setpc_b64 s[30:31]1011;1012; GFX9-LABEL: and_store_div:1013; GFX9: ; %bb.0:1014; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1015; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311016; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41017; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41018; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1019; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41020; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1021; GFX9-NEXT: global_load_dword v4, v[0:1], off1022; GFX9-NEXT: global_load_dword v9, v[2:3], off1023; GFX9-NEXT: s_mov_b32 s4, 0x50700061024; GFX9-NEXT: v_mov_b32_e32 v0, 21025; GFX9-NEXT: v_mov_b32_e32 v1, 11026; GFX9-NEXT: s_waitcnt vmcnt(1)1027; GFX9-NEXT: v_and_b32_sdwa v1, v4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1028; GFX9-NEXT: s_waitcnt vmcnt(0)1029; GFX9-NEXT: v_perm_b32 v2, v4, v9, s41030; GFX9-NEXT: v_and_b32_sdwa v3, v9, v0 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1031; GFX9-NEXT: v_and_b32_e32 v9, 0x100, v41032; GFX9-NEXT: v_and_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD1033; GFX9-NEXT: v_or_b32_e32 v1, v1, v31034; GFX9-NEXT: v_or_b32_sdwa v0, v0, v9 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1035; GFX9-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1036; GFX9-NEXT: global_store_dword v[5:6], v0, off1037; GFX9-NEXT: global_store_dword v[7:8], v2, off1038; GFX9-NEXT: s_waitcnt vmcnt(0)1039; GFX9-NEXT: s_setpc_b64 s[30:31]1040 %tid = call i32 @llvm.amdgcn.workitem.id.x()1041 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1042 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1043 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41044 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41045 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 2, i32 4, i32 3, i32 1>1046 %vecins = and <4 x i8> %shuffle0_0, <i8 1, i8 2, i8 2, i8 1>1047 store <4 x i8> %vecins, ptr addrspace(1) %out01048 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11049 ret void1050}1051 1052define hidden void @ashr_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1053; GFX10-LABEL: ashr_store_div:1054; GFX10: ; %bb.0:1055; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1056; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311057; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41058; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41059; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1060; GFX10-NEXT: global_load_dword v9, v[0:1], off1061; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v2, v41062; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v3, vcc_lo1063; GFX10-NEXT: v_mov_b32_e32 v2, 261064; GFX10-NEXT: global_load_dword v0, v[0:1], off1065; GFX10-NEXT: s_waitcnt vmcnt(1)1066; GFX10-NEXT: v_bfe_i32 v1, v9, 0, 81067; GFX10-NEXT: v_ashrrev_i32_sdwa v2, v2, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1068; GFX10-NEXT: v_ashrrev_i32_e32 v3, 25, v91069; GFX10-NEXT: v_lshlrev_b16 v1, 7, v11070; GFX10-NEXT: v_or_b32_sdwa v2, v3, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1071; GFX10-NEXT: s_waitcnt vmcnt(0)1072; GFX10-NEXT: v_ashrrev_i16 v4, 10, v01073; GFX10-NEXT: v_perm_b32 v0, v9, v0, 0x40107071074; GFX10-NEXT: v_and_b32_e32 v1, 0xffffff00, v11075; GFX10-NEXT: v_or_b32_sdwa v1, v4, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1076; GFX10-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1077; GFX10-NEXT: global_store_dword v[5:6], v1, off1078; GFX10-NEXT: global_store_dword v[7:8], v0, off1079; GFX10-NEXT: s_setpc_b64 s[30:31]1080;1081; GFX9-LABEL: ashr_store_div:1082; GFX9: ; %bb.0:1083; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1084; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311085; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41086; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41087; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1088; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41089; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1090; GFX9-NEXT: global_load_dword v4, v[0:1], off1091; GFX9-NEXT: global_load_dword v9, v[2:3], off1092; GFX9-NEXT: v_mov_b32_e32 v1, 71093; GFX9-NEXT: s_mov_b32 s4, 0x40107071094; GFX9-NEXT: v_mov_b32_e32 v0, 261095; GFX9-NEXT: s_waitcnt vmcnt(1)1096; GFX9-NEXT: v_lshlrev_b16_sdwa v1, v1, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_01097; GFX9-NEXT: s_waitcnt vmcnt(0)1098; GFX9-NEXT: v_perm_b32 v2, v4, v9, s41099; GFX9-NEXT: v_ashrrev_i32_sdwa v0, v0, v4 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1100; GFX9-NEXT: v_ashrrev_i32_e32 v3, 25, v41101; GFX9-NEXT: v_ashrrev_i16_e32 v9, 10, v91102; GFX9-NEXT: v_and_b32_e32 v1, 0xffffff00, v11103; GFX9-NEXT: v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1104; GFX9-NEXT: v_or_b32_sdwa v1, v9, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1105; GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1106; GFX9-NEXT: global_store_dword v[5:6], v0, off1107; GFX9-NEXT: global_store_dword v[7:8], v2, off1108; GFX9-NEXT: s_waitcnt vmcnt(0)1109; GFX9-NEXT: s_setpc_b64 s[30:31]1110 %tid = call i32 @llvm.amdgcn.workitem.id.x()1111 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1112 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1113 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41114 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41115 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 3, i32 3, i32 5, i32 0>1116 %vecins = ashr <4 x i8> %shuffle0_0, <i8 1, i8 2, i8 2, i8 1>1117 store <4 x i8> %vecins, ptr addrspace(1) %out01118 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11119 ret void1120}1121 1122define hidden void @bc_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1123; GFX10-LABEL: bc_store_div:1124; GFX10: ; %bb.0:1125; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1126; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311127; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41128; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41129; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1130; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41131; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1132; GFX10-NEXT: global_load_dword v4, v[0:1], off1133; GFX10-NEXT: global_load_dword v9, v[2:3], off1134; GFX10-NEXT: s_waitcnt vmcnt(0)1135; GFX10-NEXT: v_perm_b32 v0, v9, v4, 0x70601041136; GFX10-NEXT: global_store_dword v[7:8], v0, off1137; GFX10-NEXT: global_store_dword v[5:6], v0, off1138; GFX10-NEXT: s_setpc_b64 s[30:31]1139;1140; GFX9-LABEL: bc_store_div:1141; GFX9: ; %bb.0:1142; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1143; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311144; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41145; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41146; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1147; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41148; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1149; GFX9-NEXT: global_load_dword v4, v[0:1], off1150; GFX9-NEXT: global_load_dword v9, v[2:3], off1151; GFX9-NEXT: s_mov_b32 s4, 0x70601041152; GFX9-NEXT: s_waitcnt vmcnt(0)1153; GFX9-NEXT: v_perm_b32 v0, v9, v4, s41154; GFX9-NEXT: global_store_dword v[7:8], v0, off1155; GFX9-NEXT: global_store_dword v[5:6], v0, off1156; GFX9-NEXT: s_waitcnt vmcnt(0)1157; GFX9-NEXT: s_setpc_b64 s[30:31]1158 %tid = call i32 @llvm.amdgcn.workitem.id.x()1159 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1160 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1161 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41162 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41163 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 4, i32 1, i32 6, i32 7>1164 %insvec = bitcast <4 x i8> %shuffle0_0 to i321165 store i32 %insvec, ptr addrspace(1) %out11166 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out01167 ret void1168}1169 1170 1171define hidden void @eve_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1, ptr addrspace(1) %out2) {1172; GFX10-LABEL: eve_store_div:1173; GFX10: ; %bb.0:1174; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1175; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311176; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41177; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41178; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1179; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41180; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1181; GFX10-NEXT: global_load_dword v4, v[0:1], off1182; GFX10-NEXT: global_load_dword v5, v[2:3], off1183; GFX10-NEXT: s_waitcnt vmcnt(1)1184; GFX10-NEXT: v_lshrrev_b32_e32 v0, 24, v41185; GFX10-NEXT: s_waitcnt vmcnt(0)1186; GFX10-NEXT: v_perm_b32 v1, v5, v4, 0x10203051187; GFX10-NEXT: global_store_byte v[9:10], v0, off1188; GFX10-NEXT: global_store_dword v[7:8], v1, off1189; GFX10-NEXT: s_setpc_b64 s[30:31]1190;1191; GFX9-LABEL: eve_store_div:1192; GFX9: ; %bb.0:1193; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1194; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311195; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41196; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41197; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1198; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41199; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1200; GFX9-NEXT: global_load_dword v4, v[0:1], off1201; GFX9-NEXT: global_load_dword v5, v[2:3], off1202; GFX9-NEXT: s_mov_b32 s4, 0x10203051203; GFX9-NEXT: s_waitcnt vmcnt(1)1204; GFX9-NEXT: v_lshrrev_b32_e32 v1, 24, v41205; GFX9-NEXT: s_waitcnt vmcnt(0)1206; GFX9-NEXT: v_perm_b32 v0, v5, v4, s41207; GFX9-NEXT: global_store_byte v[9:10], v1, off1208; GFX9-NEXT: global_store_dword v[7:8], v0, off1209; GFX9-NEXT: s_waitcnt vmcnt(0)1210; GFX9-NEXT: s_setpc_b64 s[30:31]1211 %tid = call i32 @llvm.amdgcn.workitem.id.x()1212 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1213 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1214 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41215 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41216 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 5, i32 3, i32 2, i32 1>1217 %tmp = extractelement <4 x i8> %shuffle0_0, i32 11218 store i8 %tmp, ptr addrspace(1) %out21219 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11220 ret void1221}1222 1223; Not combined to perm due to multi use of or operands (introduced by insert op)1224define hidden void @ive_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1225; GFX10-LABEL: ive_store_div:1226; GFX10: ; %bb.0:1227; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1228; GFX10-NEXT: v_and_b32_e32 v9, 0x3ff, v311229; GFX10-NEXT: v_lshlrev_b32_e32 v9, 2, v91230; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v91231; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1232; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v91233; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1234; GFX10-NEXT: global_load_dword v9, v[0:1], off1235; GFX10-NEXT: global_load_dword v10, v[2:3], off1236; GFX10-NEXT: v_mov_b32_e32 v0, 161237; GFX10-NEXT: v_mov_b32_e32 v1, 0xff1238; GFX10-NEXT: v_lshlrev_b16 v2, 8, v41239; GFX10-NEXT: s_waitcnt vmcnt(1)1240; GFX10-NEXT: v_lshrrev_b32_sdwa v0, v0, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1241; GFX10-NEXT: s_waitcnt vmcnt(0)1242; GFX10-NEXT: v_and_b32_sdwa v1, v10, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1243; GFX10-NEXT: v_or_b32_sdwa v0, v9, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1244; GFX10-NEXT: v_or_b32_e32 v1, v1, v21245; GFX10-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1246; GFX10-NEXT: v_perm_b32 v1, v10, v9, 0x20007061247; GFX10-NEXT: global_store_dword v[5:6], v0, off1248; GFX10-NEXT: global_store_dword v[7:8], v1, off1249; GFX10-NEXT: s_setpc_b64 s[30:31]1250;1251; GFX9-LABEL: ive_store_div:1252; GFX9: ; %bb.0:1253; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1254; GFX9-NEXT: v_and_b32_e32 v9, 0x3ff, v311255; GFX9-NEXT: v_lshlrev_b32_e32 v9, 2, v91256; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v91257; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1258; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v91259; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1260; GFX9-NEXT: global_load_dword v9, v[0:1], off1261; GFX9-NEXT: global_load_dword v10, v[2:3], off1262; GFX9-NEXT: s_movk_i32 s4, 0xff1263; GFX9-NEXT: v_lshlrev_b16_e32 v0, 8, v41264; GFX9-NEXT: s_mov_b32 s5, 0x20007061265; GFX9-NEXT: s_waitcnt vmcnt(1)1266; GFX9-NEXT: v_lshrrev_b32_e32 v1, 16, v91267; GFX9-NEXT: s_waitcnt vmcnt(0)1268; GFX9-NEXT: v_and_b32_sdwa v2, v10, s4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1269; GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v11270; GFX9-NEXT: v_or_b32_e32 v0, v2, v01271; GFX9-NEXT: v_or_b32_sdwa v1, v9, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1272; GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1273; GFX9-NEXT: v_perm_b32 v3, v10, v9, s51274; GFX9-NEXT: global_store_dword v[5:6], v0, off1275; GFX9-NEXT: global_store_dword v[7:8], v3, off1276; GFX9-NEXT: s_waitcnt vmcnt(0)1277; GFX9-NEXT: s_setpc_b64 s[30:31]1278 %tid = call i32 @llvm.amdgcn.workitem.id.x()1279 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1280 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1281 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41282 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41283 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 6, i32 7, i32 0, i32 2>1284 %vecins = insertelement <4 x i8> %shuffle0_0, i8 %elt, i32 11285 store <4 x i8> %vecins, ptr addrspace(1) %out01286 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11287 ret void1288}1289 1290 1291define hidden void @lhsr_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1292; GFX10-LABEL: lhsr_store_div:1293; GFX10: ; %bb.0:1294; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1295; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311296; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41297; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41298; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1299; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41300; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1301; GFX10-NEXT: global_load_dword v4, v[0:1], off1302; GFX10-NEXT: global_load_dword v9, v[2:3], off1303; GFX10-NEXT: v_mov_b32_e32 v0, 261304; GFX10-NEXT: s_waitcnt vmcnt(1)1305; GFX10-NEXT: v_lshrrev_b16 v1, 1, v41306; GFX10-NEXT: s_waitcnt vmcnt(0)1307; GFX10-NEXT: v_lshrrev_b32_sdwa v0, v0, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1308; GFX10-NEXT: v_lshrrev_b32_e32 v2, 25, v91309; GFX10-NEXT: v_lshrrev_b32_e32 v3, 26, v41310; GFX10-NEXT: v_and_b32_e32 v1, 0x7f00, v11311; GFX10-NEXT: v_or_b32_e32 v0, v2, v01312; GFX10-NEXT: v_or_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1313; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1314; GFX10-NEXT: v_perm_b32 v1, v9, v4, 0x10307071315; GFX10-NEXT: global_store_dword v[5:6], v0, off1316; GFX10-NEXT: global_store_dword v[7:8], v1, off1317; GFX10-NEXT: s_setpc_b64 s[30:31]1318;1319; GFX9-LABEL: lhsr_store_div:1320; GFX9: ; %bb.0:1321; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1322; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311323; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41324; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41325; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1326; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41327; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1328; GFX9-NEXT: global_load_dword v4, v[0:1], off1329; GFX9-NEXT: global_load_dword v9, v[2:3], off1330; GFX9-NEXT: v_mov_b32_e32 v0, 261331; GFX9-NEXT: s_mov_b32 s4, 0x10307071332; GFX9-NEXT: s_waitcnt vmcnt(1)1333; GFX9-NEXT: v_lshrrev_b16_e32 v3, 1, v41334; GFX9-NEXT: s_waitcnt vmcnt(0)1335; GFX9-NEXT: v_lshrrev_b32_sdwa v0, v0, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1336; GFX9-NEXT: v_lshrrev_b32_e32 v2, 25, v91337; GFX9-NEXT: v_perm_b32 v1, v9, v4, s41338; GFX9-NEXT: v_lshrrev_b32_e32 v4, 26, v41339; GFX9-NEXT: v_or_b32_e32 v0, v2, v01340; GFX9-NEXT: v_and_b32_e32 v2, 0x7f00, v31341; GFX9-NEXT: v_or_b32_sdwa v2, v4, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1342; GFX9-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1343; GFX9-NEXT: global_store_dword v[5:6], v0, off1344; GFX9-NEXT: global_store_dword v[7:8], v1, off1345; GFX9-NEXT: s_waitcnt vmcnt(0)1346; GFX9-NEXT: s_setpc_b64 s[30:31]1347 %tid = call i32 @llvm.amdgcn.workitem.id.x()1348 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1349 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1350 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41351 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41352 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 7, i32 7, i32 3, i32 1>1353 %vecins = lshr <4 x i8> %shuffle0_0, <i8 1, i8 2, i8 2, i8 1>1354 store <4 x i8> %vecins, ptr addrspace(1) %out01355 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11356 ret void1357}1358 1359 1360define hidden void @mul_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1361; GFX10-LABEL: mul_store_div:1362; GFX10: ; %bb.0:1363; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1364; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311365; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41366; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41367; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1368; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41369; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1370; GFX10-NEXT: global_load_dword v4, v[0:1], off1371; GFX10-NEXT: global_load_dword v9, v[2:3], off1372; GFX10-NEXT: s_waitcnt vmcnt(1)1373; GFX10-NEXT: v_lshrrev_b16 v0, 8, v41374; GFX10-NEXT: s_waitcnt vmcnt(0)1375; GFX10-NEXT: v_lshrrev_b32_e32 v1, 24, v91376; GFX10-NEXT: v_lshrrev_b16 v2, 8, v91377; GFX10-NEXT: v_lshrrev_b32_e32 v3, 16, v91378; GFX10-NEXT: v_mul_lo_u16 v0, v0, v21379; GFX10-NEXT: v_mul_lo_u16 v1, v3, v11380; GFX10-NEXT: v_mul_lo_u16 v2, v4, v91381; GFX10-NEXT: v_mul_lo_u16 v3, v9, v31382; GFX10-NEXT: v_lshlrev_b16 v0, 8, v01383; GFX10-NEXT: v_lshlrev_b16 v1, 8, v11384; GFX10-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1385; GFX10-NEXT: v_or_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1386; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1387; GFX10-NEXT: v_perm_b32 v1, v4, v9, 0x20005041388; GFX10-NEXT: global_store_dword v[5:6], v0, off1389; GFX10-NEXT: global_store_dword v[7:8], v1, off1390; GFX10-NEXT: s_setpc_b64 s[30:31]1391;1392; GFX9-LABEL: mul_store_div:1393; GFX9: ; %bb.0:1394; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1395; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311396; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41397; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41398; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1399; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41400; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1401; GFX9-NEXT: global_load_dword v4, v[0:1], off1402; GFX9-NEXT: global_load_dword v9, v[2:3], off1403; GFX9-NEXT: s_mov_b32 s4, 0x20005041404; GFX9-NEXT: s_waitcnt vmcnt(0)1405; GFX9-NEXT: v_perm_b32 v0, v4, v9, s41406; GFX9-NEXT: v_mul_lo_u16_e32 v1, v4, v91407; GFX9-NEXT: v_mul_lo_u16_sdwa v2, v4, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:BYTE_11408; GFX9-NEXT: v_mul_lo_u16_sdwa v3, v9, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:BYTE_31409; GFX9-NEXT: v_mul_lo_u16_sdwa v4, v9, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_11410; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1411; GFX9-NEXT: v_or_b32_sdwa v2, v4, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1412; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1413; GFX9-NEXT: global_store_dword v[5:6], v1, off1414; GFX9-NEXT: global_store_dword v[7:8], v0, off1415; GFX9-NEXT: s_waitcnt vmcnt(0)1416; GFX9-NEXT: s_setpc_b64 s[30:31]1417 %tid = call i32 @llvm.amdgcn.workitem.id.x()1418 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1419 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1420 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41421 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41422 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 0, i32 1, i32 4, i32 6>1423 %vecins = mul <4 x i8> %shuffle0_0, %vec11424 store <4 x i8> %vecins, ptr addrspace(1) %out01425 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11426 ret void1427}1428 1429 1430define hidden void @or_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1431; GFX10-LABEL: or_store_div:1432; GFX10: ; %bb.0:1433; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1434; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311435; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41436; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41437; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1438; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41439; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1440; GFX10-NEXT: global_load_dword v4, v[2:3], off1441; GFX10-NEXT: global_load_dword v9, v[0:1], off1442; GFX10-NEXT: v_mov_b32_e32 v0, 161443; GFX10-NEXT: v_bfrev_b32_e32 v2, 4.01444; GFX10-NEXT: s_waitcnt vmcnt(1)1445; GFX10-NEXT: v_lshlrev_b16 v1, 8, v41446; GFX10-NEXT: v_lshrrev_b32_sdwa v0, v0, v4 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1447; GFX10-NEXT: s_waitcnt vmcnt(0)1448; GFX10-NEXT: v_or_b32_sdwa v1, v9, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD1449; GFX10-NEXT: v_or_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD1450; GFX10-NEXT: v_or_b32_e32 v1, 0x201, v11451; GFX10-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1452; GFX10-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1453; GFX10-NEXT: v_perm_b32 v1, v9, v4, 0x20100051454; GFX10-NEXT: global_store_dword v[5:6], v0, off1455; GFX10-NEXT: global_store_dword v[7:8], v1, off1456; GFX10-NEXT: s_setpc_b64 s[30:31]1457;1458; GFX9-LABEL: or_store_div:1459; GFX9: ; %bb.0:1460; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1461; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311462; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41463; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41464; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1465; GFX9-NEXT: global_load_dword v2, v[2:3], off1466; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41467; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1468; GFX9-NEXT: global_load_dword v0, v[0:1], off1469; GFX9-NEXT: s_mov_b32 s4, 0x20100051470; GFX9-NEXT: s_movk_i32 s5, 0x1021471; GFX9-NEXT: s_waitcnt vmcnt(1)1472; GFX9-NEXT: v_lshrrev_b32_e32 v1, 16, v21473; GFX9-NEXT: v_lshlrev_b16_e32 v3, 8, v21474; GFX9-NEXT: v_lshlrev_b16_e32 v1, 8, v11475; GFX9-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD1476; GFX9-NEXT: v_or_b32_sdwa v1, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1477; GFX9-NEXT: s_waitcnt vmcnt(0)1478; GFX9-NEXT: v_perm_b32 v4, v0, v2, s41479; GFX9-NEXT: v_or_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD1480; GFX9-NEXT: v_or_b32_e32 v0, 0x201, v01481; GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1482; GFX9-NEXT: global_store_dword v[5:6], v0, off1483; GFX9-NEXT: global_store_dword v[7:8], v4, off1484; GFX9-NEXT: s_waitcnt vmcnt(0)1485; GFX9-NEXT: s_setpc_b64 s[30:31]1486 %tid = call i32 @llvm.amdgcn.workitem.id.x()1487 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1488 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1489 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41490 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41491 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 1, i32 4, i32 5, i32 6>1492 %vecins = or <4 x i8> %shuffle0_0, <i8 1, i8 2, i8 2, i8 1>1493 store <4 x i8> %vecins, ptr addrspace(1) %out01494 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11495 ret void1496}1497 1498define hidden void @sdiv_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1499; GFX10-LABEL: sdiv_store_div:1500; GFX10: ; %bb.0:1501; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1502; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311503; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41504; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41505; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1506; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41507; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1508; GFX10-NEXT: global_load_dword v4, v[2:3], off1509; GFX10-NEXT: global_load_dword v9, v[0:1], off1510; GFX10-NEXT: s_waitcnt vmcnt(1)1511; GFX10-NEXT: v_cvt_f32_i32_sdwa v1, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_01512; GFX10-NEXT: v_cvt_f32_i32_sdwa v10, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_11513; GFX10-NEXT: s_waitcnt vmcnt(0)1514; GFX10-NEXT: v_cvt_f32_i32_sdwa v2, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21515; GFX10-NEXT: v_cvt_f32_i32_sdwa v12, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21516; GFX10-NEXT: v_cvt_f32_i32_sdwa v14, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31517; GFX10-NEXT: v_rcp_iflag_f32_e32 v15, v11518; GFX10-NEXT: v_rcp_iflag_f32_e32 v16, v101519; GFX10-NEXT: v_cvt_f32_i32_sdwa v19, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31520; GFX10-NEXT: v_rcp_iflag_f32_e32 v17, v121521; GFX10-NEXT: v_xor_b32_sdwa v0, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_01522; GFX10-NEXT: v_rcp_iflag_f32_e32 v18, v141523; GFX10-NEXT: v_xor_b32_sdwa v3, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_11524; GFX10-NEXT: v_xor_b32_sdwa v11, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_21525; GFX10-NEXT: v_xor_b32_sdwa v13, sext(v4), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_31526; GFX10-NEXT: v_ashrrev_i32_e32 v0, 30, v01527; GFX10-NEXT: v_mul_f32_e32 v15, v2, v151528; GFX10-NEXT: v_mul_f32_e32 v16, v19, v161529; GFX10-NEXT: v_ashrrev_i32_e32 v3, 30, v31530; GFX10-NEXT: v_mul_f32_e32 v17, v2, v171531; GFX10-NEXT: v_or_b32_e32 v0, 1, v01532; GFX10-NEXT: v_trunc_f32_e32 v15, v151533; GFX10-NEXT: v_trunc_f32_e32 v16, v161534; GFX10-NEXT: v_mul_f32_e32 v18, v1, v181535; GFX10-NEXT: v_trunc_f32_e32 v17, v171536; GFX10-NEXT: v_ashrrev_i32_e32 v11, 30, v111537; GFX10-NEXT: v_mad_f32 v20, -v15, v1, v21538; GFX10-NEXT: v_mad_f32 v19, -v16, v10, v191539; GFX10-NEXT: v_or_b32_e32 v3, 1, v31540; GFX10-NEXT: v_trunc_f32_e32 v18, v181541; GFX10-NEXT: v_mad_f32 v2, -v17, v12, v21542; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v20|, |v1|1543; GFX10-NEXT: v_ashrrev_i32_e32 v13, 30, v131544; GFX10-NEXT: v_or_b32_e32 v11, 1, v111545; GFX10-NEXT: v_mad_f32 v21, -v18, v14, v11546; GFX10-NEXT: v_cvt_i32_f32_e32 v15, v151547; GFX10-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc_lo1548; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v19|, |v10|1549; GFX10-NEXT: v_or_b32_e32 v13, 1, v131550; GFX10-NEXT: v_cvt_i32_f32_e32 v16, v161551; GFX10-NEXT: v_cvt_i32_f32_e32 v17, v171552; GFX10-NEXT: v_cvt_i32_f32_e32 v18, v181553; GFX10-NEXT: v_cndmask_b32_e32 v1, 0, v3, vcc_lo1554; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v2|, |v12|1555; GFX10-NEXT: v_add_nc_u32_e32 v0, v15, v01556; GFX10-NEXT: v_add_nc_u32_sdwa v1, v16, v1 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1557; GFX10-NEXT: v_cndmask_b32_e32 v2, 0, v11, vcc_lo1558; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v21|, |v14|1559; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1560; GFX10-NEXT: v_add_nc_u32_e32 v2, v17, v21561; GFX10-NEXT: v_cndmask_b32_e32 v3, 0, v13, vcc_lo1562; GFX10-NEXT: v_add_nc_u32_sdwa v3, v18, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1563; GFX10-NEXT: v_or_b32_sdwa v1, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1564; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1565; GFX10-NEXT: v_perm_b32 v1, v9, v4, 0x607061566; GFX10-NEXT: global_store_dword v[5:6], v0, off1567; GFX10-NEXT: global_store_dword v[7:8], v1, off1568; GFX10-NEXT: s_setpc_b64 s[30:31]1569;1570; GFX9-LABEL: sdiv_store_div:1571; GFX9: ; %bb.0:1572; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1573; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311574; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41575; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41576; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1577; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41578; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1579; GFX9-NEXT: global_load_dword v4, v[2:3], off1580; GFX9-NEXT: global_load_dword v9, v[0:1], off1581; GFX9-NEXT: s_mov_b32 s4, 0x607061582; GFX9-NEXT: s_waitcnt vmcnt(1)1583; GFX9-NEXT: v_cvt_f32_i32_sdwa v2, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_01584; GFX9-NEXT: v_cvt_f32_i32_sdwa v12, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_11585; GFX9-NEXT: s_waitcnt vmcnt(0)1586; GFX9-NEXT: v_perm_b32 v0, v9, v4, s41587; GFX9-NEXT: v_xor_b32_sdwa v1, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_01588; GFX9-NEXT: v_cvt_f32_i32_sdwa v3, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21589; GFX9-NEXT: v_xor_b32_sdwa v10, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_11590; GFX9-NEXT: v_cvt_f32_i32_sdwa v11, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31591; GFX9-NEXT: v_xor_b32_sdwa v9, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_21592; GFX9-NEXT: v_cvt_f32_i32_sdwa v13, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21593; GFX9-NEXT: v_xor_b32_sdwa v14, sext(v4), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_31594; GFX9-NEXT: v_cvt_f32_i32_sdwa v4, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31595; GFX9-NEXT: v_rcp_iflag_f32_e32 v15, v21596; GFX9-NEXT: v_rcp_iflag_f32_e32 v16, v121597; GFX9-NEXT: v_rcp_iflag_f32_e32 v17, v131598; GFX9-NEXT: v_rcp_iflag_f32_e32 v18, v41599; GFX9-NEXT: v_mul_f32_e32 v15, v3, v151600; GFX9-NEXT: v_mul_f32_e32 v16, v11, v161601; GFX9-NEXT: v_trunc_f32_e32 v15, v151602; GFX9-NEXT: v_ashrrev_i32_e32 v1, 30, v11603; GFX9-NEXT: v_mul_f32_e32 v17, v3, v171604; GFX9-NEXT: v_mul_f32_e32 v18, v2, v181605; GFX9-NEXT: v_trunc_f32_e32 v16, v161606; GFX9-NEXT: v_mad_f32 v19, -v15, v2, v31607; GFX9-NEXT: v_ashrrev_i32_e32 v10, 30, v101608; GFX9-NEXT: v_or_b32_e32 v1, 1, v11609; GFX9-NEXT: v_trunc_f32_e32 v17, v171610; GFX9-NEXT: v_trunc_f32_e32 v18, v181611; GFX9-NEXT: v_mad_f32 v11, -v16, v12, v111612; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v19|, |v2|1613; GFX9-NEXT: v_ashrrev_i32_e32 v9, 30, v91614; GFX9-NEXT: v_or_b32_e32 v10, 1, v101615; GFX9-NEXT: v_cvt_i32_f32_e32 v15, v151616; GFX9-NEXT: v_cvt_i32_f32_e32 v16, v161617; GFX9-NEXT: v_mad_f32 v3, -v17, v13, v31618; GFX9-NEXT: v_cvt_i32_f32_e32 v17, v171619; GFX9-NEXT: v_mad_f32 v2, -v18, v4, v21620; GFX9-NEXT: v_cvt_i32_f32_e32 v18, v181621; GFX9-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc1622; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v11|, |v12|1623; GFX9-NEXT: v_ashrrev_i32_e32 v14, 30, v141624; GFX9-NEXT: v_or_b32_e32 v9, 1, v91625; GFX9-NEXT: v_cndmask_b32_e32 v10, 0, v10, vcc1626; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v3|, |v13|1627; GFX9-NEXT: v_or_b32_e32 v14, 1, v141628; GFX9-NEXT: v_cndmask_b32_e32 v3, 0, v9, vcc1629; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, |v4|1630; GFX9-NEXT: v_cndmask_b32_e32 v2, 0, v14, vcc1631; GFX9-NEXT: v_add_u32_e32 v1, v15, v11632; GFX9-NEXT: v_add_u32_sdwa v4, v16, v10 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1633; GFX9-NEXT: v_add_u32_e32 v3, v17, v31634; GFX9-NEXT: v_add_u32_sdwa v2, v18, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1635; GFX9-NEXT: v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1636; GFX9-NEXT: v_or_b32_sdwa v2, v3, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1637; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1638; GFX9-NEXT: global_store_dword v[5:6], v1, off1639; GFX9-NEXT: global_store_dword v[7:8], v0, off1640; GFX9-NEXT: s_waitcnt vmcnt(0)1641; GFX9-NEXT: s_setpc_b64 s[30:31]1642 %tid = call i32 @llvm.amdgcn.workitem.id.x()1643 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1644 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1645 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41646 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41647 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 2, i32 3, i32 2, i32 4>1648 %vecins = sdiv <4 x i8> %shuffle0_0, %vec11649 store <4 x i8> %vecins, ptr addrspace(1) %out01650 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11651 ret void1652}1653 1654 1655define hidden void @sext_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1656; GFX10-LABEL: sext_store_div:1657; GFX10: ; %bb.0:1658; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1659; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311660; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41661; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41662; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1663; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41664; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1665; GFX10-NEXT: global_load_dword v4, v[2:3], off1666; GFX10-NEXT: global_load_dword v9, v[0:1], off1667; GFX10-NEXT: s_waitcnt vmcnt(1)1668; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v41669; GFX10-NEXT: s_waitcnt vmcnt(0)1670; GFX10-NEXT: v_lshrrev_b32_e32 v1, 16, v91671; GFX10-NEXT: v_ashrrev_i16 v2, 8, v41672; GFX10-NEXT: v_ashrrev_i16 v0, 8, v01673; GFX10-NEXT: v_ashrrev_i16 v3, 8, v11674; GFX10-NEXT: v_perm_b32 v1, v0, v2, 0x50401001675; GFX10-NEXT: v_perm_b32 v0, v3, v3, 0x50401001676; GFX10-NEXT: v_perm_b32 v2, v9, v4, 0x30107071677; GFX10-NEXT: global_store_dwordx2 v[7:8], v[0:1], off1678; GFX10-NEXT: global_store_dword v[5:6], v2, off1679; GFX10-NEXT: s_setpc_b64 s[30:31]1680;1681; GFX9-LABEL: sext_store_div:1682; GFX9: ; %bb.0:1683; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1684; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311685; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41686; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41687; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1688; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41689; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1690; GFX9-NEXT: global_load_dword v4, v[0:1], off1691; GFX9-NEXT: global_load_dword v9, v[2:3], off1692; GFX9-NEXT: v_mov_b32_e32 v0, 81693; GFX9-NEXT: s_mov_b32 s5, 0x50401001694; GFX9-NEXT: s_mov_b32 s4, 0x30107071695; GFX9-NEXT: s_waitcnt vmcnt(0)1696; GFX9-NEXT: v_ashrrev_i16_e32 v1, 8, v91697; GFX9-NEXT: v_ashrrev_i16_sdwa v3, v0, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_11698; GFX9-NEXT: v_ashrrev_i16_sdwa v0, v0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_11699; GFX9-NEXT: v_perm_b32 v1, v3, v1, s51700; GFX9-NEXT: v_perm_b32 v0, v0, v0, s51701; GFX9-NEXT: v_perm_b32 v2, v4, v9, s41702; GFX9-NEXT: global_store_dwordx2 v[7:8], v[0:1], off1703; GFX9-NEXT: global_store_dword v[5:6], v2, off1704; GFX9-NEXT: s_waitcnt vmcnt(0)1705; GFX9-NEXT: s_setpc_b64 s[30:31]1706 %tid = call i32 @llvm.amdgcn.workitem.id.x()1707 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1708 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1709 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41710 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41711 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 3, i32 3, i32 5, i32 7>1712 %insvec = sext <4 x i8> %shuffle0_0 to <4 x i16>1713 store <4 x i16> %insvec, ptr addrspace(1) %out11714 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out01715 ret void1716}1717 1718 1719define hidden void @shl_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1720; GFX10-LABEL: shl_store_div:1721; GFX10: ; %bb.0:1722; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1723; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311724; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41725; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41726; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1727; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41728; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1729; GFX10-NEXT: global_load_dword v4, v[0:1], off1730; GFX10-NEXT: global_load_dword v9, v[2:3], off1731; GFX10-NEXT: s_waitcnt vmcnt(1)1732; GFX10-NEXT: v_lshlrev_b16 v0, 2, v41733; GFX10-NEXT: s_waitcnt vmcnt(0)1734; GFX10-NEXT: v_lshlrev_b16 v1, 1, v91735; GFX10-NEXT: v_and_b32_e32 v2, 0xfffffc00, v01736; GFX10-NEXT: v_and_b32_e32 v3, 0xfe, v11737; GFX10-NEXT: v_and_b32_e32 v1, 0xfffffe00, v11738; GFX10-NEXT: v_and_b32_e32 v0, 0xfc, v01739; GFX10-NEXT: v_or_b32_e32 v2, v3, v21740; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1741; GFX10-NEXT: v_perm_b32 v1, v9, v4, 0x50001041742; GFX10-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1743; GFX10-NEXT: global_store_dword v[5:6], v0, off1744; GFX10-NEXT: global_store_dword v[7:8], v1, off1745; GFX10-NEXT: s_setpc_b64 s[30:31]1746;1747; GFX9-LABEL: shl_store_div:1748; GFX9: ; %bb.0:1749; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1750; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311751; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41752; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41753; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1754; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41755; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1756; GFX9-NEXT: global_load_dword v4, v[0:1], off1757; GFX9-NEXT: global_load_dword v9, v[2:3], off1758; GFX9-NEXT: s_mov_b32 s4, 0x50001041759; GFX9-NEXT: s_waitcnt vmcnt(1)1760; GFX9-NEXT: v_lshlrev_b16_e32 v1, 2, v41761; GFX9-NEXT: s_waitcnt vmcnt(0)1762; GFX9-NEXT: v_lshlrev_b16_e32 v2, 1, v91763; GFX9-NEXT: v_perm_b32 v0, v9, v4, s41764; GFX9-NEXT: v_and_b32_e32 v3, 0xfffffc00, v11765; GFX9-NEXT: v_and_b32_e32 v4, 0xfe, v21766; GFX9-NEXT: v_and_b32_e32 v2, 0xfffffe00, v21767; GFX9-NEXT: v_and_b32_e32 v1, 0xfc, v11768; GFX9-NEXT: v_or_b32_e32 v3, v4, v31769; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD1770; GFX9-NEXT: v_or_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1771; GFX9-NEXT: global_store_dword v[5:6], v1, off1772; GFX9-NEXT: global_store_dword v[7:8], v0, off1773; GFX9-NEXT: s_waitcnt vmcnt(0)1774; GFX9-NEXT: s_setpc_b64 s[30:31]1775 %tid = call i32 @llvm.amdgcn.workitem.id.x()1776 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1777 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1778 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41779 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41780 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 4, i32 1, i32 0, i32 5>1781 %vecins = shl <4 x i8> %shuffle0_0, <i8 1, i8 2, i8 2, i8 1>1782 store <4 x i8> %vecins, ptr addrspace(1) %out01783 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out11784 ret void1785}1786 1787 1788define hidden void @sitofp_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1789; GFX10-LABEL: sitofp_store_div:1790; GFX10: ; %bb.0:1791; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1792; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311793; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41794; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41795; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1796; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41797; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1798; GFX10-NEXT: global_load_dword v4, v[0:1], off1799; GFX10-NEXT: global_load_dword v9, v[2:3], off1800; GFX10-NEXT: s_waitcnt vmcnt(1)1801; GFX10-NEXT: v_ashrrev_i16 v0, 8, v41802; GFX10-NEXT: s_waitcnt vmcnt(0)1803; GFX10-NEXT: v_ashrrev_i16 v10, 8, v91804; GFX10-NEXT: v_cvt_f32_i32_sdwa v3, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21805; GFX10-NEXT: v_cvt_f32_i32_sdwa v1, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21806; GFX10-NEXT: v_perm_b32 v4, v9, v4, 0x60102051807; GFX10-NEXT: v_cvt_f32_i32_sdwa v2, sext(v0) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_01808; GFX10-NEXT: v_cvt_f32_i32_sdwa v0, sext(v10) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_01809; GFX10-NEXT: global_store_dwordx4 v[7:8], v[0:3], off1810; GFX10-NEXT: global_store_dword v[5:6], v4, off1811; GFX10-NEXT: s_setpc_b64 s[30:31]1812;1813; GFX9-LABEL: sitofp_store_div:1814; GFX9: ; %bb.0:1815; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1816; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311817; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41818; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41819; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1820; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41821; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1822; GFX9-NEXT: global_load_dword v4, v[0:1], off1823; GFX9-NEXT: global_load_dword v9, v[2:3], off1824; GFX9-NEXT: s_mov_b32 s4, 0x60102051825; GFX9-NEXT: s_waitcnt vmcnt(1)1826; GFX9-NEXT: v_ashrrev_i16_e32 v0, 8, v41827; GFX9-NEXT: s_waitcnt vmcnt(0)1828; GFX9-NEXT: v_ashrrev_i16_e32 v10, 8, v91829; GFX9-NEXT: v_cvt_f32_i32_sdwa v3, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21830; GFX9-NEXT: v_cvt_f32_i32_sdwa v1, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21831; GFX9-NEXT: v_cvt_f32_i32_sdwa v2, sext(v0) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_01832; GFX9-NEXT: v_cvt_f32_i32_sdwa v0, sext(v10) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_01833; GFX9-NEXT: v_perm_b32 v4, v9, v4, s41834; GFX9-NEXT: global_store_dwordx4 v[7:8], v[0:3], off1835; GFX9-NEXT: global_store_dword v[5:6], v4, off1836; GFX9-NEXT: s_waitcnt vmcnt(0)1837; GFX9-NEXT: s_setpc_b64 s[30:31]1838 %tid = call i32 @llvm.amdgcn.workitem.id.x()1839 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid1840 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid1841 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 41842 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 41843 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 5, i32 2, i32 1, i32 6>1844 %insvec = sitofp <4 x i8> %shuffle0_0 to <4 x float>1845 store <4 x float> %insvec, ptr addrspace(1) %out11846 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out01847 ret void1848}1849 1850 1851define hidden void @srem_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {1852; GFX10-LABEL: srem_store_div:1853; GFX10: ; %bb.0:1854; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1855; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v311856; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v41857; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v41858; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo1859; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v41860; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo1861; GFX10-NEXT: global_load_dword v4, v[2:3], off1862; GFX10-NEXT: global_load_dword v9, v[0:1], off1863; GFX10-NEXT: s_waitcnt vmcnt(1)1864; GFX10-NEXT: v_cvt_f32_i32_sdwa v2, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_01865; GFX10-NEXT: v_cvt_f32_i32_sdwa v13, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_11866; GFX10-NEXT: v_cvt_f32_i32_sdwa v3, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21867; GFX10-NEXT: s_waitcnt vmcnt(0)1868; GFX10-NEXT: v_cvt_f32_i32_sdwa v12, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31869; GFX10-NEXT: v_cvt_f32_i32_sdwa v15, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31870; GFX10-NEXT: v_rcp_iflag_f32_e32 v17, v21871; GFX10-NEXT: v_rcp_iflag_f32_e32 v18, v131872; GFX10-NEXT: v_rcp_iflag_f32_e32 v19, v31873; GFX10-NEXT: v_xor_b32_sdwa v1, sext(v4), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_01874; GFX10-NEXT: v_rcp_iflag_f32_e32 v20, v151875; GFX10-NEXT: v_xor_b32_sdwa v11, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_11876; GFX10-NEXT: v_cvt_f32_i32_sdwa v21, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21877; GFX10-NEXT: v_xor_b32_sdwa v14, sext(v4), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_21878; GFX10-NEXT: v_ashrrev_i32_e32 v1, 30, v11879; GFX10-NEXT: v_xor_b32_sdwa v16, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_31880; GFX10-NEXT: v_mul_f32_e32 v17, v3, v171881; GFX10-NEXT: v_mul_f32_e32 v18, v12, v181882; GFX10-NEXT: v_mul_f32_e32 v19, v15, v191883; GFX10-NEXT: v_ashrrev_i32_e32 v11, 30, v111884; GFX10-NEXT: v_or_b32_e32 v1, 1, v11885; GFX10-NEXT: v_trunc_f32_e32 v17, v171886; GFX10-NEXT: v_trunc_f32_e32 v18, v181887; GFX10-NEXT: v_mul_f32_e32 v20, v21, v201888; GFX10-NEXT: v_trunc_f32_e32 v19, v191889; GFX10-NEXT: v_ashrrev_i32_e32 v14, 30, v141890; GFX10-NEXT: v_mad_f32 v22, -v17, v2, v31891; GFX10-NEXT: v_mad_f32 v12, -v18, v13, v121892; GFX10-NEXT: v_or_b32_e32 v11, 1, v111893; GFX10-NEXT: v_trunc_f32_e32 v20, v201894; GFX10-NEXT: v_mad_f32 v23, -v19, v3, v151895; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v22|, |v2|1896; GFX10-NEXT: v_ashrrev_i32_e32 v16, 30, v161897; GFX10-NEXT: v_or_b32_e32 v14, 1, v141898; GFX10-NEXT: v_mad_f32 v21, -v20, v15, v211899; GFX10-NEXT: v_cvt_i32_f32_e32 v17, v171900; GFX10-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo1901; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v12|, |v13|1902; GFX10-NEXT: v_or_b32_e32 v16, 1, v161903; GFX10-NEXT: v_cvt_i32_f32_e32 v18, v181904; GFX10-NEXT: v_cvt_i32_f32_e32 v19, v191905; GFX10-NEXT: v_cvt_i32_f32_e32 v20, v201906; GFX10-NEXT: v_cndmask_b32_e32 v2, 0, v11, vcc_lo1907; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v23|, |v3|1908; GFX10-NEXT: v_lshrrev_b32_e32 v0, 16, v41909; GFX10-NEXT: v_lshrrev_b32_e32 v10, 8, v41910; GFX10-NEXT: v_lshrrev_b32_e32 v12, 24, v41911; GFX10-NEXT: v_add_nc_u32_e32 v1, v17, v11912; GFX10-NEXT: v_cndmask_b32_e32 v3, 0, v14, vcc_lo1913; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v21|, |v15|1914; GFX10-NEXT: v_add_nc_u32_e32 v2, v18, v21915; GFX10-NEXT: v_mul_lo_u32 v1, v1, v41916; GFX10-NEXT: v_add_nc_u32_e32 v3, v19, v31917; GFX10-NEXT: v_cndmask_b32_e32 v11, 0, v16, vcc_lo1918; GFX10-NEXT: v_mul_lo_u32 v2, v2, v101919; GFX10-NEXT: v_mul_lo_u32 v3, v3, v01920; GFX10-NEXT: v_add_nc_u32_e32 v11, v20, v111921; GFX10-NEXT: v_sub_nc_u32_e32 v0, v0, v11922; GFX10-NEXT: v_sub_nc_u32_sdwa v1, v9, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD1923; GFX10-NEXT: v_mul_lo_u32 v10, v11, v121924; GFX10-NEXT: v_sub_nc_u32_e32 v2, v12, v31925; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1926; GFX10-NEXT: v_sub_nc_u32_sdwa v3, v9, v10 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD1927; GFX10-NEXT: v_or_b32_sdwa v1, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD1928; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD1929; GFX10-NEXT: v_perm_b32 v1, v4, v9, 0x20703061930; GFX10-NEXT: global_store_dword v[5:6], v0, off1931; GFX10-NEXT: global_store_dword v[7:8], v1, off1932; GFX10-NEXT: s_setpc_b64 s[30:31]1933;1934; GFX9-LABEL: srem_store_div:1935; GFX9: ; %bb.0:1936; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1937; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v311938; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v41939; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v41940; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1941; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v41942; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc1943; GFX9-NEXT: global_load_dword v4, v[2:3], off1944; GFX9-NEXT: global_load_dword v9, v[0:1], off1945; GFX9-NEXT: s_mov_b32 s4, 0x20703061946; GFX9-NEXT: s_waitcnt vmcnt(1)1947; GFX9-NEXT: v_cvt_f32_i32_sdwa v3, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_01948; GFX9-NEXT: v_cvt_f32_i32_sdwa v10, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21949; GFX9-NEXT: v_cvt_f32_i32_sdwa v14, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_11950; GFX9-NEXT: s_waitcnt vmcnt(0)1951; GFX9-NEXT: v_cvt_f32_i32_sdwa v13, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31952; GFX9-NEXT: v_rcp_iflag_f32_e32 v17, v31953; GFX9-NEXT: v_cvt_f32_i32_sdwa v16, sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_31954; GFX9-NEXT: v_xor_b32_sdwa v15, sext(v4), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_21955; GFX9-NEXT: v_perm_b32 v1, v4, v9, s41956; GFX9-NEXT: v_mul_f32_e32 v17, v10, v171957; GFX9-NEXT: v_trunc_f32_e32 v17, v171958; GFX9-NEXT: v_mad_f32 v19, -v17, v3, v101959; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v19|, |v3|1960; GFX9-NEXT: v_rcp_iflag_f32_e32 v3, v141961; GFX9-NEXT: v_rcp_iflag_f32_e32 v19, v101962; GFX9-NEXT: v_xor_b32_sdwa v2, sext(v4), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_01963; GFX9-NEXT: v_xor_b32_sdwa v12, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:BYTE_11964; GFX9-NEXT: v_mul_f32_e32 v3, v13, v31965; GFX9-NEXT: v_trunc_f32_e32 v3, v31966; GFX9-NEXT: v_mad_f32 v13, -v3, v14, v131967; GFX9-NEXT: v_cmp_ge_f32_e64 s[4:5], |v13|, |v14|1968; GFX9-NEXT: v_ashrrev_i32_e32 v14, 30, v151969; GFX9-NEXT: v_mul_f32_e32 v15, v16, v191970; GFX9-NEXT: v_trunc_f32_e32 v15, v151971; GFX9-NEXT: v_mad_f32 v19, -v15, v10, v161972; GFX9-NEXT: v_cvt_f32_i32_sdwa v13, sext(v9) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_21973; GFX9-NEXT: v_cmp_ge_f32_e64 s[6:7], |v19|, |v10|1974; GFX9-NEXT: v_rcp_iflag_f32_e32 v10, v161975; GFX9-NEXT: v_ashrrev_i32_e32 v2, 30, v21976; GFX9-NEXT: v_xor_b32_sdwa v19, sext(v9), sext(v4) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_2 src1_sel:BYTE_31977; GFX9-NEXT: v_cvt_i32_f32_e32 v17, v171978; GFX9-NEXT: v_mul_f32_e32 v10, v13, v101979; GFX9-NEXT: v_trunc_f32_e32 v10, v101980; GFX9-NEXT: v_cvt_i32_f32_e32 v3, v31981; GFX9-NEXT: v_cvt_i32_f32_e32 v15, v151982; GFX9-NEXT: v_mad_f32 v13, -v10, v16, v131983; GFX9-NEXT: v_cvt_i32_f32_e32 v10, v101984; GFX9-NEXT: v_or_b32_e32 v2, 1, v21985; GFX9-NEXT: v_ashrrev_i32_e32 v12, 30, v121986; GFX9-NEXT: v_ashrrev_i32_e32 v19, 30, v191987; GFX9-NEXT: v_or_b32_e32 v12, 1, v121988; GFX9-NEXT: v_or_b32_e32 v14, 1, v141989; GFX9-NEXT: v_or_b32_e32 v19, 1, v191990; GFX9-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc1991; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v13|, |v16|1992; GFX9-NEXT: v_cndmask_b32_e64 v12, 0, v12, s[4:5]1993; GFX9-NEXT: v_cndmask_b32_e64 v14, 0, v14, s[6:7]1994; GFX9-NEXT: v_cndmask_b32_e32 v13, 0, v19, vcc1995; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v41996; GFX9-NEXT: v_lshrrev_b32_e32 v11, 8, v41997; GFX9-NEXT: v_lshrrev_b32_e32 v18, 24, v41998; GFX9-NEXT: v_add_u32_e32 v2, v17, v21999; GFX9-NEXT: v_add_u32_e32 v3, v3, v122000; GFX9-NEXT: v_add_u32_e32 v12, v15, v142001; GFX9-NEXT: v_add_u32_e32 v10, v10, v132002; GFX9-NEXT: v_mul_lo_u32 v2, v2, v42003; GFX9-NEXT: v_mul_lo_u32 v3, v3, v112004; GFX9-NEXT: v_mul_lo_u32 v4, v12, v02005; GFX9-NEXT: v_mul_lo_u32 v10, v10, v182006; GFX9-NEXT: v_sub_u32_e32 v0, v0, v22007; GFX9-NEXT: v_sub_u32_sdwa v2, v9, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD2008; GFX9-NEXT: v_sub_u32_e32 v3, v18, v42009; GFX9-NEXT: v_sub_u32_sdwa v4, v9, v10 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2010; GFX9-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2011; GFX9-NEXT: v_or_b32_sdwa v2, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2012; GFX9-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2013; GFX9-NEXT: global_store_dword v[5:6], v0, off2014; GFX9-NEXT: global_store_dword v[7:8], v1, off2015; GFX9-NEXT: s_waitcnt vmcnt(0)2016; GFX9-NEXT: s_setpc_b64 s[30:31]2017 %tid = call i32 @llvm.amdgcn.workitem.id.x()2018 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2019 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2020 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42021 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42022 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 6, i32 3, i32 7, i32 2>2023 %vecins = srem <4 x i8> %shuffle0_0, %vec12024 store <4 x i8> %vecins, ptr addrspace(1) %out02025 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out12026 ret void2027}2028 2029 2030define hidden void @sub_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {2031; GFX10-LABEL: sub_store_div:2032; GFX10: ; %bb.0:2033; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2034; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312035; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42036; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42037; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2038; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42039; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2040; GFX10-NEXT: global_load_dword v2, v[2:3], off2041; GFX10-NEXT: global_load_dword v0, v[0:1], off2042; GFX10-NEXT: s_waitcnt vmcnt(1)2043; GFX10-NEXT: v_lshrrev_b32_e32 v1, 16, v22044; GFX10-NEXT: v_lshrrev_b16 v3, 8, v22045; GFX10-NEXT: v_lshrrev_b32_e32 v4, 24, v22046; GFX10-NEXT: s_waitcnt vmcnt(0)2047; GFX10-NEXT: v_sub_nc_u16 v3, v0, v32048; GFX10-NEXT: v_sub_nc_u16 v9, v1, v42049; GFX10-NEXT: v_sub_nc_u16 v10, v4, v22050; GFX10-NEXT: v_sub_nc_u16 v1, v4, v12051; GFX10-NEXT: v_perm_b32 v0, v2, v0, 0x60700072052; GFX10-NEXT: v_lshlrev_b16 v3, 8, v32053; GFX10-NEXT: v_lshlrev_b16 v4, 8, v92054; GFX10-NEXT: v_or_b32_sdwa v3, v10, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2055; GFX10-NEXT: v_or_b32_sdwa v1, v1, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2056; GFX10-NEXT: v_or_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2057; GFX10-NEXT: global_store_dword v[5:6], v1, off2058; GFX10-NEXT: global_store_dword v[7:8], v0, off2059; GFX10-NEXT: s_setpc_b64 s[30:31]2060;2061; GFX9-LABEL: sub_store_div:2062; GFX9: ; %bb.0:2063; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2064; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312065; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42066; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42067; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2068; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42069; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2070; GFX9-NEXT: global_load_dword v4, v[0:1], off2071; GFX9-NEXT: global_load_dword v9, v[2:3], off2072; GFX9-NEXT: s_mov_b32 s4, 0x60700072073; GFX9-NEXT: s_waitcnt vmcnt(0)2074; GFX9-NEXT: v_perm_b32 v0, v9, v4, s42075; GFX9-NEXT: v_sub_u16_sdwa v1, v4, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_12076; GFX9-NEXT: v_sub_u16_sdwa v2, v9, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD2077; GFX9-NEXT: v_sub_u16_sdwa v3, v9, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:BYTE_32078; GFX9-NEXT: v_sub_u16_sdwa v4, v9, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:WORD_12079; GFX9-NEXT: v_or_b32_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2080; GFX9-NEXT: v_or_b32_sdwa v2, v4, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2081; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2082; GFX9-NEXT: global_store_dword v[5:6], v1, off2083; GFX9-NEXT: global_store_dword v[7:8], v0, off2084; GFX9-NEXT: s_waitcnt vmcnt(0)2085; GFX9-NEXT: s_setpc_b64 s[30:31]2086 %tid = call i32 @llvm.amdgcn.workitem.id.x()2087 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2088 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2089 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42090 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42091 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 7, i32 0, i32 7, i32 6>2092 %vecins = sub <4 x i8> %shuffle0_0, %vec12093 store <4 x i8> %vecins, ptr addrspace(1) %out02094 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out12095 ret void2096}2097 2098 2099define hidden void @sv_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1, ptr addrspace(1) %out2) {2100; GFX10-LABEL: sv_store_div:2101; GFX10: ; %bb.0:2102; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2103; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312104; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42105; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42106; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2107; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42108; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2109; GFX10-NEXT: global_load_dword v4, v[0:1], off2110; GFX10-NEXT: global_load_dword v5, v[2:3], off2111; GFX10-NEXT: s_waitcnt vmcnt(0)2112; GFX10-NEXT: v_perm_b32 v0, v4, v5, 0x507052113; GFX10-NEXT: global_store_dword v[7:8], v0, off2114; GFX10-NEXT: s_setpc_b64 s[30:31]2115;2116; GFX9-LABEL: sv_store_div:2117; GFX9: ; %bb.0:2118; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2119; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312120; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42121; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42122; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2123; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42124; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2125; GFX9-NEXT: global_load_dword v4, v[0:1], off2126; GFX9-NEXT: global_load_dword v5, v[2:3], off2127; GFX9-NEXT: s_mov_b32 s4, 0x507052128; GFX9-NEXT: s_waitcnt vmcnt(0)2129; GFX9-NEXT: v_perm_b32 v0, v4, v5, s42130; GFX9-NEXT: global_store_dword v[7:8], v0, off2131; GFX9-NEXT: s_waitcnt vmcnt(0)2132; GFX9-NEXT: s_setpc_b64 s[30:31]2133 %tid = call i32 @llvm.amdgcn.workitem.id.x()2134 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2135 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2136 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42137 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42138 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 1, i32 3, i32 1, i32 4>2139 %insvec = shufflevector <4 x i8> %shuffle0_0, <4 x i8> %vec1, <4 x i32> <i32 6, i32 3, i32 7, i32 0>2140 store <4 x i8> %insvec, ptr addrspace(1) %out12141 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out12142 ret void2143}2144 2145 2146define hidden void @trunc_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {2147; GFX10-LABEL: trunc_store_div:2148; GFX10: ; %bb.0:2149; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2150; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312151; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42152; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42153; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2154; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42155; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2156; GFX10-NEXT: global_load_dword v4, v[0:1], off2157; GFX10-NEXT: global_load_dword v9, v[2:3], off2158; GFX10-NEXT: v_mov_b32_e32 v0, 12159; GFX10-NEXT: s_waitcnt vmcnt(1)2160; GFX10-NEXT: v_and_b32_sdwa v1, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2161; GFX10-NEXT: s_waitcnt vmcnt(0)2162; GFX10-NEXT: v_and_b32_sdwa v0, v9, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD2163; GFX10-NEXT: v_lshlrev_b16 v1, 1, v12164; GFX10-NEXT: v_lshlrev_b16 v2, 2, v02165; GFX10-NEXT: v_or_b32_e32 v0, v0, v12166; GFX10-NEXT: v_lshlrev_b16 v1, 3, v42167; GFX10-NEXT: v_or_b32_e32 v0, v0, v22168; GFX10-NEXT: v_or_b32_e32 v0, v0, v12169; GFX10-NEXT: v_perm_b32 v1, v9, v4, 0x502052170; GFX10-NEXT: v_and_b32_e32 v0, 15, v02171; GFX10-NEXT: global_store_byte v[7:8], v0, off2172; GFX10-NEXT: global_store_dword v[5:6], v1, off2173; GFX10-NEXT: s_setpc_b64 s[30:31]2174;2175; GFX9-LABEL: trunc_store_div:2176; GFX9: ; %bb.0:2177; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2178; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312179; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42180; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42181; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2182; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42183; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2184; GFX9-NEXT: global_load_dword v4, v[0:1], off2185; GFX9-NEXT: global_load_dword v9, v[2:3], off2186; GFX9-NEXT: v_mov_b32_e32 v0, 12187; GFX9-NEXT: s_mov_b32 s4, 0x502052188; GFX9-NEXT: s_waitcnt vmcnt(1)2189; GFX9-NEXT: v_lshlrev_b16_e32 v3, 3, v42190; GFX9-NEXT: s_waitcnt vmcnt(0)2191; GFX9-NEXT: v_and_b32_sdwa v2, v9, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD2192; GFX9-NEXT: v_and_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2193; GFX9-NEXT: v_lshlrev_b16_e32 v0, 1, v02194; GFX9-NEXT: v_perm_b32 v1, v9, v4, s42195; GFX9-NEXT: v_lshlrev_b16_e32 v4, 2, v22196; GFX9-NEXT: v_or_b32_e32 v0, v2, v02197; GFX9-NEXT: v_or_b32_e32 v0, v0, v42198; GFX9-NEXT: v_or_b32_e32 v0, v0, v32199; GFX9-NEXT: v_and_b32_e32 v0, 15, v02200; GFX9-NEXT: global_store_byte v[7:8], v0, off2201; GFX9-NEXT: global_store_dword v[5:6], v1, off2202; GFX9-NEXT: s_waitcnt vmcnt(0)2203; GFX9-NEXT: s_setpc_b64 s[30:31]2204 %tid = call i32 @llvm.amdgcn.workitem.id.x()2205 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2206 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2207 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42208 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42209 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 5, i32 2, i32 5, i32 0>2210 %insvec = trunc <4 x i8> %shuffle0_0 to <4 x i1>2211 store <4 x i1> %insvec, ptr addrspace(1) %out12212 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out02213 ret void2214}2215 2216define hidden void @udiv(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {2217; GFX10-LABEL: udiv:2218; GFX10: ; %bb.0:2219; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2220; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312221; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42222; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42223; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2224; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42225; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2226; GFX10-NEXT: global_load_dword v2, v[2:3], off2227; GFX10-NEXT: global_load_dword v0, v[0:1], off2228; GFX10-NEXT: s_waitcnt vmcnt(1)2229; GFX10-NEXT: v_cvt_f32_ubyte0_e32 v1, v22230; GFX10-NEXT: v_cvt_f32_ubyte1_e32 v3, v22231; GFX10-NEXT: v_cvt_f32_ubyte3_e32 v9, v22232; GFX10-NEXT: s_waitcnt vmcnt(0)2233; GFX10-NEXT: v_cvt_f32_ubyte3_e32 v14, v02234; GFX10-NEXT: v_cvt_f32_ubyte2_e32 v4, v22235; GFX10-NEXT: v_rcp_iflag_f32_e32 v10, v12236; GFX10-NEXT: v_rcp_iflag_f32_e32 v11, v32237; GFX10-NEXT: v_rcp_iflag_f32_e32 v13, v92238; GFX10-NEXT: v_cvt_f32_ubyte0_e32 v15, v02239; GFX10-NEXT: v_rcp_iflag_f32_e32 v12, v42240; GFX10-NEXT: v_perm_b32 v0, v0, v2, 0x402072241; GFX10-NEXT: v_mul_f32_e32 v10, v14, v102242; GFX10-NEXT: v_mul_f32_e32 v11, v4, v112243; GFX10-NEXT: v_mul_f32_e32 v13, v1, v132244; GFX10-NEXT: v_mul_f32_e32 v12, v15, v122245; GFX10-NEXT: v_trunc_f32_e32 v10, v102246; GFX10-NEXT: v_trunc_f32_e32 v11, v112247; GFX10-NEXT: v_trunc_f32_e32 v13, v132248; GFX10-NEXT: v_trunc_f32_e32 v12, v122249; GFX10-NEXT: v_mad_f32 v14, -v10, v1, v142250; GFX10-NEXT: v_cvt_u32_f32_e32 v10, v102251; GFX10-NEXT: v_mad_f32 v16, -v11, v3, v42252; GFX10-NEXT: v_mad_f32 v17, -v13, v9, v12253; GFX10-NEXT: v_cvt_u32_f32_e32 v11, v112254; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v14|, v12255; GFX10-NEXT: v_cvt_u32_f32_e32 v13, v132256; GFX10-NEXT: v_mad_f32 v15, -v12, v4, v152257; GFX10-NEXT: v_cvt_u32_f32_e32 v12, v122258; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v10, vcc_lo2259; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v16|, v32260; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v11, vcc_lo2261; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v17|, v92262; GFX10-NEXT: v_lshlrev_b16 v3, 8, v32263; GFX10-NEXT: v_add_co_ci_u32_e32 v9, vcc_lo, 0, v13, vcc_lo2264; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v15|, v42265; GFX10-NEXT: v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2266; GFX10-NEXT: v_lshlrev_b16 v9, 8, v92267; GFX10-NEXT: v_add_co_ci_u32_e32 v4, vcc_lo, 0, v12, vcc_lo2268; GFX10-NEXT: v_or_b32_sdwa v3, v4, v9 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2269; GFX10-NEXT: v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2270; GFX10-NEXT: global_store_dword v[5:6], v1, off2271; GFX10-NEXT: global_store_dword v[7:8], v0, off2272; GFX10-NEXT: s_setpc_b64 s[30:31]2273;2274; GFX9-LABEL: udiv:2275; GFX9: ; %bb.0:2276; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2277; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312278; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42279; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42280; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2281; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42282; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2283; GFX9-NEXT: global_load_dword v4, v[2:3], off2284; GFX9-NEXT: global_load_dword v9, v[0:1], off2285; GFX9-NEXT: s_mov_b32 s4, 0x402072286; GFX9-NEXT: s_waitcnt vmcnt(1)2287; GFX9-NEXT: v_cvt_f32_ubyte0_e32 v2, v42288; GFX9-NEXT: v_rcp_iflag_f32_e32 v11, v22289; GFX9-NEXT: v_cvt_f32_ubyte1_e32 v3, v42290; GFX9-NEXT: v_rcp_iflag_f32_e32 v12, v32291; GFX9-NEXT: s_waitcnt vmcnt(0)2292; GFX9-NEXT: v_cvt_f32_ubyte3_e32 v1, v92293; GFX9-NEXT: v_cvt_f32_ubyte2_e32 v10, v42294; GFX9-NEXT: v_rcp_iflag_f32_e32 v13, v102295; GFX9-NEXT: v_mul_f32_e32 v11, v1, v112296; GFX9-NEXT: v_perm_b32 v0, v9, v4, s42297; GFX9-NEXT: v_cvt_f32_ubyte3_e32 v4, v42298; GFX9-NEXT: v_trunc_f32_e32 v11, v112299; GFX9-NEXT: v_rcp_iflag_f32_e32 v14, v42300; GFX9-NEXT: v_mul_f32_e32 v12, v10, v122301; GFX9-NEXT: v_mad_f32 v1, -v11, v2, v12302; GFX9-NEXT: v_cvt_u32_f32_e32 v11, v112303; GFX9-NEXT: v_cvt_f32_ubyte0_e32 v9, v92304; GFX9-NEXT: v_trunc_f32_e32 v12, v122305; GFX9-NEXT: v_mul_f32_e32 v13, v9, v132306; GFX9-NEXT: v_mad_f32 v15, -v12, v3, v102307; GFX9-NEXT: v_cvt_u32_f32_e32 v12, v122308; GFX9-NEXT: v_trunc_f32_e32 v13, v132309; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v1|, v22310; GFX9-NEXT: v_mul_f32_e32 v14, v2, v142311; GFX9-NEXT: v_mad_f32 v9, -v13, v10, v92312; GFX9-NEXT: v_cvt_u32_f32_e32 v13, v132313; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v11, vcc2314; GFX9-NEXT: v_trunc_f32_e32 v14, v142315; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v15|, v32316; GFX9-NEXT: v_mad_f32 v16, -v14, v4, v22317; GFX9-NEXT: v_cvt_u32_f32_e32 v14, v142318; GFX9-NEXT: v_addc_co_u32_e32 v2, vcc, 0, v12, vcc2319; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v9|, v102320; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v13, vcc2321; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v16|, v42322; GFX9-NEXT: v_addc_co_u32_e32 v4, vcc, 0, v14, vcc2323; GFX9-NEXT: v_lshlrev_b16_e32 v2, 8, v22324; GFX9-NEXT: v_lshlrev_b16_e32 v4, 8, v42325; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2326; GFX9-NEXT: v_or_b32_sdwa v2, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2327; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2328; GFX9-NEXT: global_store_dword v[5:6], v1, off2329; GFX9-NEXT: global_store_dword v[7:8], v0, off2330; GFX9-NEXT: s_waitcnt vmcnt(0)2331; GFX9-NEXT: s_setpc_b64 s[30:31]2332 %tid = call i32 @llvm.amdgcn.workitem.id.x()2333 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2334 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2335 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42336 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42337 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 3, i32 6, i32 0, i32 4>2338 %vecins = udiv <4 x i8> %shuffle0_0, %vec12339 store <4 x i8> %vecins, ptr addrspace(1) %out02340 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out12341 ret void2342}2343 2344 2345define hidden void @uitofp_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {2346; GFX10-LABEL: uitofp_store_div:2347; GFX10: ; %bb.0:2348; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2349; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312350; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42351; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42352; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2353; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42354; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2355; GFX10-NEXT: global_load_dword v4, v[2:3], off2356; GFX10-NEXT: global_load_dword v9, v[0:1], off2357; GFX10-NEXT: s_waitcnt vmcnt(1)2358; GFX10-NEXT: v_cvt_f32_ubyte1_e32 v3, v42359; GFX10-NEXT: s_waitcnt vmcnt(0)2360; GFX10-NEXT: v_cvt_f32_ubyte2_e32 v2, v92361; GFX10-NEXT: v_cvt_f32_ubyte1_e32 v1, v92362; GFX10-NEXT: v_cvt_f32_ubyte0_e32 v0, v42363; GFX10-NEXT: v_perm_b32 v4, v4, v9, 0x50201042364; GFX10-NEXT: global_store_dwordx4 v[7:8], v[0:3], off2365; GFX10-NEXT: global_store_dword v[5:6], v4, off2366; GFX10-NEXT: s_setpc_b64 s[30:31]2367;2368; GFX9-LABEL: uitofp_store_div:2369; GFX9: ; %bb.0:2370; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2371; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312372; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42373; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42374; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2375; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42376; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2377; GFX9-NEXT: global_load_dword v4, v[0:1], off2378; GFX9-NEXT: global_load_dword v9, v[2:3], off2379; GFX9-NEXT: s_mov_b32 s4, 0x50201042380; GFX9-NEXT: s_waitcnt vmcnt(1)2381; GFX9-NEXT: v_cvt_f32_ubyte2_e32 v2, v42382; GFX9-NEXT: s_waitcnt vmcnt(0)2383; GFX9-NEXT: v_cvt_f32_ubyte1_e32 v3, v92384; GFX9-NEXT: v_cvt_f32_ubyte1_e32 v1, v42385; GFX9-NEXT: v_cvt_f32_ubyte0_e32 v0, v92386; GFX9-NEXT: v_perm_b32 v10, v9, v4, s42387; GFX9-NEXT: global_store_dwordx4 v[7:8], v[0:3], off2388; GFX9-NEXT: global_store_dword v[5:6], v10, off2389; GFX9-NEXT: s_waitcnt vmcnt(0)2390; GFX9-NEXT: s_setpc_b64 s[30:31]2391 %tid = call i32 @llvm.amdgcn.workitem.id.x()2392 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2393 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2394 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42395 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42396 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 4, i32 1, i32 2, i32 5>2397 %insvec = uitofp <4 x i8> %shuffle0_0 to <4 x float>2398 store <4 x float> %insvec, ptr addrspace(1) %out12399 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out02400 ret void2401}2402 2403 2404define hidden void @urem_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {2405; GFX10-LABEL: urem_store_div:2406; GFX10: ; %bb.0:2407; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2408; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312409; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42410; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42411; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2412; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42413; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2414; GFX10-NEXT: global_load_dword v2, v[2:3], off2415; GFX10-NEXT: global_load_dword v0, v[0:1], off2416; GFX10-NEXT: s_waitcnt vmcnt(1)2417; GFX10-NEXT: v_cvt_f32_ubyte0_e32 v1, v22418; GFX10-NEXT: v_cvt_f32_ubyte1_e32 v3, v22419; GFX10-NEXT: v_cvt_f32_ubyte2_e32 v4, v22420; GFX10-NEXT: v_cvt_f32_ubyte3_e32 v9, v22421; GFX10-NEXT: s_waitcnt vmcnt(0)2422; GFX10-NEXT: v_cvt_f32_ubyte2_e32 v15, v02423; GFX10-NEXT: v_rcp_iflag_f32_e32 v10, v12424; GFX10-NEXT: v_rcp_iflag_f32_e32 v11, v32425; GFX10-NEXT: v_rcp_iflag_f32_e32 v12, v42426; GFX10-NEXT: v_rcp_iflag_f32_e32 v13, v92427; GFX10-NEXT: v_lshrrev_b32_e32 v14, 16, v22428; GFX10-NEXT: v_lshrrev_b32_e32 v16, 8, v22429; GFX10-NEXT: v_lshrrev_b32_e32 v17, 24, v22430; GFX10-NEXT: v_mul_f32_e32 v10, v3, v102431; GFX10-NEXT: v_mul_f32_e32 v11, v3, v112432; GFX10-NEXT: v_mul_f32_e32 v12, v3, v122433; GFX10-NEXT: v_mul_f32_e32 v13, v15, v132434; GFX10-NEXT: v_trunc_f32_e32 v10, v102435; GFX10-NEXT: v_trunc_f32_e32 v11, v112436; GFX10-NEXT: v_trunc_f32_e32 v12, v122437; GFX10-NEXT: v_trunc_f32_e32 v13, v132438; GFX10-NEXT: v_mad_f32 v18, -v10, v1, v32439; GFX10-NEXT: v_cvt_u32_f32_e32 v10, v102440; GFX10-NEXT: v_mad_f32 v19, -v11, v3, v32441; GFX10-NEXT: v_cvt_u32_f32_e32 v11, v112442; GFX10-NEXT: v_mad_f32 v20, -v12, v4, v32443; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v18|, v12444; GFX10-NEXT: v_cvt_u32_f32_e32 v12, v122445; GFX10-NEXT: v_mad_f32 v15, -v13, v9, v152446; GFX10-NEXT: v_cvt_u32_f32_e32 v13, v132447; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v10, vcc_lo2448; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v19|, v32449; GFX10-NEXT: v_mul_lo_u32 v1, v1, v22450; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v11, vcc_lo2451; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v20|, v42452; GFX10-NEXT: v_mul_lo_u32 v3, v3, v162453; GFX10-NEXT: v_sub_nc_u32_e32 v1, v16, v12454; GFX10-NEXT: v_add_co_ci_u32_e32 v4, vcc_lo, 0, v12, vcc_lo2455; GFX10-NEXT: v_cmp_ge_f32_e64 vcc_lo, |v15|, v92456; GFX10-NEXT: v_mul_lo_u32 v4, v4, v142457; GFX10-NEXT: v_sub_nc_u32_sdwa v3, v16, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD2458; GFX10-NEXT: v_add_co_ci_u32_e32 v9, vcc_lo, 0, v13, vcc_lo2459; GFX10-NEXT: v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2460; GFX10-NEXT: v_mul_lo_u32 v9, v9, v172461; GFX10-NEXT: v_sub_nc_u32_e32 v4, v16, v42462; GFX10-NEXT: v_sub_nc_u32_sdwa v9, v0, v9 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2463; GFX10-NEXT: v_perm_b32 v0, v2, v0, 0x20505052464; GFX10-NEXT: v_or_b32_sdwa v3, v4, v9 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2465; GFX10-NEXT: v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2466; GFX10-NEXT: global_store_dword v[5:6], v1, off2467; GFX10-NEXT: global_store_dword v[7:8], v0, off2468; GFX10-NEXT: s_setpc_b64 s[30:31]2469;2470; GFX9-LABEL: urem_store_div:2471; GFX9: ; %bb.0:2472; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2473; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312474; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42475; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42476; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2477; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42478; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2479; GFX9-NEXT: global_load_dword v4, v[2:3], off2480; GFX9-NEXT: global_load_dword v9, v[0:1], off2481; GFX9-NEXT: s_mov_b32 s4, 0x20505052482; GFX9-NEXT: s_waitcnt vmcnt(1)2483; GFX9-NEXT: v_cvt_f32_ubyte0_e32 v2, v42484; GFX9-NEXT: v_rcp_iflag_f32_e32 v15, v22485; GFX9-NEXT: v_cvt_f32_ubyte1_e32 v3, v42486; GFX9-NEXT: v_rcp_iflag_f32_e32 v16, v32487; GFX9-NEXT: v_cvt_f32_ubyte2_e32 v11, v42488; GFX9-NEXT: v_rcp_iflag_f32_e32 v17, v112489; GFX9-NEXT: v_mul_f32_e32 v15, v3, v152490; GFX9-NEXT: v_cvt_f32_ubyte3_e32 v14, v42491; GFX9-NEXT: v_trunc_f32_e32 v15, v152492; GFX9-NEXT: v_rcp_iflag_f32_e32 v18, v142493; GFX9-NEXT: v_mul_f32_e32 v16, v3, v162494; GFX9-NEXT: v_mad_f32 v19, -v15, v2, v32495; GFX9-NEXT: v_cvt_u32_f32_e32 v15, v152496; GFX9-NEXT: v_trunc_f32_e32 v16, v162497; GFX9-NEXT: v_mul_f32_e32 v17, v3, v172498; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v19|, v22499; GFX9-NEXT: v_mad_f32 v2, -v16, v3, v32500; GFX9-NEXT: v_cvt_u32_f32_e32 v16, v162501; GFX9-NEXT: s_waitcnt vmcnt(0)2502; GFX9-NEXT: v_cvt_f32_ubyte2_e32 v13, v92503; GFX9-NEXT: v_trunc_f32_e32 v17, v172504; GFX9-NEXT: v_mul_f32_e32 v18, v13, v182505; GFX9-NEXT: v_mad_f32 v19, -v17, v11, v32506; GFX9-NEXT: v_cvt_u32_f32_e32 v17, v172507; GFX9-NEXT: v_addc_co_u32_e32 v15, vcc, 0, v15, vcc2508; GFX9-NEXT: v_trunc_f32_e32 v18, v182509; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, v32510; GFX9-NEXT: v_mad_f32 v13, -v18, v14, v132511; GFX9-NEXT: v_cvt_u32_f32_e32 v18, v182512; GFX9-NEXT: v_addc_co_u32_e32 v2, vcc, 0, v16, vcc2513; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v19|, v112514; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v17, vcc2515; GFX9-NEXT: v_cmp_ge_f32_e64 vcc, |v13|, v142516; GFX9-NEXT: v_lshrrev_b32_e32 v0, 16, v42517; GFX9-NEXT: v_lshrrev_b32_e32 v10, 8, v42518; GFX9-NEXT: v_lshrrev_b32_e32 v12, 24, v42519; GFX9-NEXT: v_addc_co_u32_e32 v11, vcc, 0, v18, vcc2520; GFX9-NEXT: v_perm_b32 v1, v4, v9, s42521; GFX9-NEXT: v_mul_lo_u32 v4, v15, v42522; GFX9-NEXT: v_mul_lo_u32 v2, v2, v102523; GFX9-NEXT: v_mul_lo_u32 v0, v3, v02524; GFX9-NEXT: v_mul_lo_u32 v3, v11, v122525; GFX9-NEXT: v_sub_u32_e32 v4, v10, v42526; GFX9-NEXT: v_sub_u32_sdwa v2, v10, v2 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD2527; GFX9-NEXT: v_sub_u32_e32 v0, v10, v02528; GFX9-NEXT: v_sub_u32_sdwa v3, v9, v3 dst_sel:BYTE_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2529; GFX9-NEXT: v_or_b32_sdwa v2, v4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2530; GFX9-NEXT: v_or_b32_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2531; GFX9-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2532; GFX9-NEXT: global_store_dword v[5:6], v0, off2533; GFX9-NEXT: global_store_dword v[7:8], v1, off2534; GFX9-NEXT: s_waitcnt vmcnt(0)2535; GFX9-NEXT: s_setpc_b64 s[30:31]2536 %tid = call i32 @llvm.amdgcn.workitem.id.x()2537 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2538 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2539 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42540 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42541 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 5, i32 5, i32 5, i32 2>2542 %vecins = urem <4 x i8> %shuffle0_0, %vec12543 store <4 x i8> %vecins, ptr addrspace(1) %out02544 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out12545 ret void2546}2547 2548 2549define hidden void @xor_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {2550; GFX10-LABEL: xor_store_div:2551; GFX10: ; %bb.0:2552; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2553; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312554; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42555; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42556; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2557; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42558; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2559; GFX10-NEXT: global_load_dword v4, v[0:1], off2560; GFX10-NEXT: global_load_dword v9, v[2:3], off2561; GFX10-NEXT: v_mov_b32_e32 v0, 0xffffff002562; GFX10-NEXT: v_mov_b32_e32 v1, 12563; GFX10-NEXT: v_mov_b32_e32 v2, 22564; GFX10-NEXT: s_waitcnt vmcnt(1)2565; GFX10-NEXT: v_and_b32_sdwa v0, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2566; GFX10-NEXT: s_waitcnt vmcnt(0)2567; GFX10-NEXT: v_and_b32_e32 v3, 0xffffff00, v92568; GFX10-NEXT: v_xor_b32_sdwa v1, v9, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD2569; GFX10-NEXT: v_xor_b32_sdwa v2, v9, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2570; GFX10-NEXT: v_xor_b32_e32 v0, 0x200, v02571; GFX10-NEXT: v_xor_b32_e32 v3, 0x100, v32572; GFX10-NEXT: v_or_b32_e32 v0, v1, v02573; GFX10-NEXT: v_or_b32_sdwa v1, v2, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2574; GFX10-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2575; GFX10-NEXT: v_perm_b32 v1, v9, v4, 0x50603072576; GFX10-NEXT: global_store_dword v[5:6], v0, off2577; GFX10-NEXT: global_store_dword v[7:8], v1, off2578; GFX10-NEXT: s_setpc_b64 s[30:31]2579;2580; GFX9-LABEL: xor_store_div:2581; GFX9: ; %bb.0:2582; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2583; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312584; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42585; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42586; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2587; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42588; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2589; GFX9-NEXT: global_load_dword v4, v[0:1], off2590; GFX9-NEXT: global_load_dword v9, v[2:3], off2591; GFX9-NEXT: s_movk_i32 s4, 0xff002592; GFX9-NEXT: v_mov_b32_e32 v0, 12593; GFX9-NEXT: v_mov_b32_e32 v1, 22594; GFX9-NEXT: s_mov_b32 s5, 0x50603072595; GFX9-NEXT: s_waitcnt vmcnt(1)2596; GFX9-NEXT: v_and_b32_sdwa v2, v4, s4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2597; GFX9-NEXT: s_waitcnt vmcnt(0)2598; GFX9-NEXT: v_and_b32_e32 v3, 0xffffff00, v92599; GFX9-NEXT: v_xor_b32_sdwa v0, v9, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD2600; GFX9-NEXT: v_xor_b32_sdwa v1, v9, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2601; GFX9-NEXT: v_xor_b32_e32 v2, 0x200, v22602; GFX9-NEXT: v_xor_b32_e32 v3, 0x100, v32603; GFX9-NEXT: v_or_b32_e32 v0, v0, v22604; GFX9-NEXT: v_or_b32_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD2605; GFX9-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD2606; GFX9-NEXT: v_perm_b32 v4, v9, v4, s52607; GFX9-NEXT: global_store_dword v[5:6], v0, off2608; GFX9-NEXT: global_store_dword v[7:8], v4, off2609; GFX9-NEXT: s_waitcnt vmcnt(0)2610; GFX9-NEXT: s_setpc_b64 s[30:31]2611 %tid = call i32 @llvm.amdgcn.workitem.id.x()2612 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2613 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2614 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42615 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42616 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 7, i32 3, i32 6, i32 5>2617 %vecins = xor <4 x i8> %shuffle0_0, <i8 1, i8 2, i8 2, i8 1>2618 store <4 x i8> %vecins, ptr addrspace(1) %out02619 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out12620 ret void2621}2622 2623 2624define hidden void @zext_store_div(ptr addrspace(1) %in0, ptr addrspace(1) %in1, i8 %elt, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {2625; GFX10-LABEL: zext_store_div:2626; GFX10: ; %bb.0:2627; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2628; GFX10-NEXT: v_and_b32_e32 v4, 0x3ff, v312629; GFX10-NEXT: v_lshlrev_b32_e32 v4, 2, v42630; GFX10-NEXT: v_add_co_u32 v0, vcc_lo, v0, v42631; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo2632; GFX10-NEXT: v_add_co_u32 v2, vcc_lo, v2, v42633; GFX10-NEXT: v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo2634; GFX10-NEXT: global_load_dword v4, v[0:1], off2635; GFX10-NEXT: global_load_dword v9, v[2:3], off2636; GFX10-NEXT: v_mov_b32_e32 v0, 0xff2637; GFX10-NEXT: s_waitcnt vmcnt(1)2638; GFX10-NEXT: v_lshrrev_b16 v1, 8, v42639; GFX10-NEXT: v_and_b32_e32 v2, 0xff, v42640; GFX10-NEXT: s_waitcnt vmcnt(0)2641; GFX10-NEXT: v_and_b32_e32 v3, 0xff, v92642; GFX10-NEXT: v_and_b32_sdwa v10, v4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2643; GFX10-NEXT: v_perm_b32 v0, v1, v2, 0x50401002644; GFX10-NEXT: v_perm_b32 v2, v4, v9, 0x605042645; GFX10-NEXT: v_perm_b32 v1, v3, v10, 0x50401002646; GFX10-NEXT: global_store_dwordx2 v[7:8], v[0:1], off2647; GFX10-NEXT: global_store_dword v[5:6], v2, off2648; GFX10-NEXT: s_setpc_b64 s[30:31]2649;2650; GFX9-LABEL: zext_store_div:2651; GFX9: ; %bb.0:2652; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2653; GFX9-NEXT: v_and_b32_e32 v4, 0x3ff, v312654; GFX9-NEXT: v_lshlrev_b32_e32 v4, 2, v42655; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, v0, v42656; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc2657; GFX9-NEXT: v_add_co_u32_e32 v2, vcc, v2, v42658; GFX9-NEXT: v_addc_co_u32_e32 v3, vcc, 0, v3, vcc2659; GFX9-NEXT: global_load_dword v4, v[0:1], off2660; GFX9-NEXT: global_load_dword v9, v[2:3], off2661; GFX9-NEXT: s_mov_b32 s4, 0x605042662; GFX9-NEXT: s_movk_i32 s5, 0xff2663; GFX9-NEXT: s_mov_b32 s6, 0x50401002664; GFX9-NEXT: s_waitcnt vmcnt(1)2665; GFX9-NEXT: v_lshrrev_b16_e32 v0, 8, v42666; GFX9-NEXT: s_waitcnt vmcnt(0)2667; GFX9-NEXT: v_perm_b32 v2, v4, v9, s42668; GFX9-NEXT: v_and_b32_e32 v1, 0xff, v42669; GFX9-NEXT: v_and_b32_e32 v3, 0xff, v92670; GFX9-NEXT: v_and_b32_sdwa v4, v4, s5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD2671; GFX9-NEXT: v_perm_b32 v0, v0, v1, s62672; GFX9-NEXT: v_perm_b32 v1, v3, v4, s62673; GFX9-NEXT: global_store_dwordx2 v[7:8], v[0:1], off2674; GFX9-NEXT: global_store_dword v[5:6], v2, off2675; GFX9-NEXT: s_waitcnt vmcnt(0)2676; GFX9-NEXT: s_setpc_b64 s[30:31]2677 %tid = call i32 @llvm.amdgcn.workitem.id.x()2678 %gep0 = getelementptr <4 x i8>, ptr addrspace(1) %in0, i32 %tid2679 %gep1 = getelementptr <4 x i8>, ptr addrspace(1) %in1, i32 %tid2680 %vec0 = load <4 x i8>, ptr addrspace(1) %gep0, align 42681 %vec1 = load <4 x i8>, ptr addrspace(1) %gep1, align 42682 %shuffle0_0 = shufflevector <4 x i8> %vec0, <4 x i8> %vec1, <4 x i32> <i32 0, i32 1, i32 2, i32 4>2683 %insvec = zext <4 x i8> %shuffle0_0 to <4 x i16>2684 store <4 x i16> %insvec, ptr addrspace(1) %out12685 store <4 x i8> %shuffle0_0, ptr addrspace(1) %out02686 ret void2687}2688 2689define void @Source16Bit(i16 %in, <2 x i16> %reg) {2690; GFX10-LABEL: Source16Bit:2691; GFX10: ; %bb.0: ; %entry2692; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2693; GFX10-NEXT: v_perm_b32 v0, v0, v1, 0x30502042694; GFX10-NEXT: global_store_dword v[0:1], v0, off2695; GFX10-NEXT: s_setpc_b64 s[30:31]2696;2697; GFX9-LABEL: Source16Bit:2698; GFX9: ; %bb.0: ; %entry2699; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2700; GFX9-NEXT: s_mov_b32 s4, 0x30502042701; GFX9-NEXT: v_perm_b32 v0, v0, v1, s42702; GFX9-NEXT: global_store_dword v[0:1], v0, off2703; GFX9-NEXT: s_waitcnt vmcnt(0)2704; GFX9-NEXT: s_setpc_b64 s[30:31]2705entry:2706 %elt0 = extractelement <2 x i16> %reg, i32 12707 %e0b0 = and i16 %elt0, 2552708 %e0b1 = and i16 %elt0, -2562709 %e1b0 = and i16 %in, 2552710 %e1b1 = and i16 %in, -2562711 %tmp0 = shl i16 %e0b0, 82712 %byte0 = or i16 %tmp0, %e1b02713 %tmp2 = lshr i16 %e1b1, 82714 %byte1 = or i16 %e0b1, %tmp22715 %ext0 = zext i16 %byte0 to i322716 %ext1 = zext i16 %byte1 to i322717 %shifted = shl i32 %ext1, 162718 %result = or i32 %shifted, %ext02719 store i32 %result, ptr addrspace(1) poison2720 ret void2721}2722 2723define hidden void @extract3744(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {2724; GFX10-LABEL: extract3744:2725; GFX10: ; %bb.0:2726; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2727; GFX10-NEXT: global_load_dword v6, v[0:1], off2728; GFX10-NEXT: global_load_dword v7, v[2:3], off2729; GFX10-NEXT: s_waitcnt vmcnt(0)2730; GFX10-NEXT: v_perm_b32 v0, v6, v7, 0x30704042731; GFX10-NEXT: global_store_dword v[4:5], v0, off2732; GFX10-NEXT: s_setpc_b64 s[30:31]2733;2734; GFX9-LABEL: extract3744:2735; GFX9: ; %bb.0:2736; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2737; GFX9-NEXT: global_load_dword v6, v[0:1], off2738; GFX9-NEXT: global_load_dword v7, v[2:3], off2739; GFX9-NEXT: s_mov_b32 s4, 0x30704042740; GFX9-NEXT: s_waitcnt vmcnt(0)2741; GFX9-NEXT: v_perm_b32 v0, v6, v7, s42742; GFX9-NEXT: global_store_dword v[4:5], v0, off2743; GFX9-NEXT: s_waitcnt vmcnt(0)2744; GFX9-NEXT: s_setpc_b64 s[30:31]2745 %vec1 = load <4 x i8>, ptr addrspace(1) %in0, align 42746 %vec2 = load <4 x i8>, ptr addrspace(1) %in1, align 42747 %v1e0 = extractelement <4 x i8> %vec1, i64 02748 %zv1e0 = zext i8 %v1e0 to i322749 %byte1 = shl i32 %zv1e0, 82750 2751 %v1e3 = extractelement <4 x i8> %vec1, i64 32752 %zv1e3 = zext i8 %v1e3 to i322753 %byte2 = shl i32 %zv1e3, 162754 %v2e3 = extractelement <4 x i8> %vec2, i64 32755 %zv2e3 = zext i8 %v2e3 to i322756 %byte3 = shl i32 %zv2e3, 242757 2758 %tmp0 = or i32 %zv1e0, %byte12759 %tmp1 = or i32 %tmp0, %byte22760 %res = or i32 %tmp1, %byte32761 store i32 %res, ptr addrspace(1) %out0, align 42762 ret void2763}2764 2765declare i32 @llvm.amdgcn.perm(i32, i32, i32)2766 2767define hidden void @extract_perm_3744(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {2768; GFX10-LABEL: extract_perm_3744:2769; GFX10: ; %bb.0:2770; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2771; GFX10-NEXT: global_load_dword v6, v[0:1], off2772; GFX10-NEXT: global_load_dword v7, v[2:3], off2773; GFX10-NEXT: s_waitcnt vmcnt(0)2774; GFX10-NEXT: v_perm_b32 v0, v6, v7, 0x30704042775; GFX10-NEXT: global_store_dword v[4:5], v0, off2776; GFX10-NEXT: s_setpc_b64 s[30:31]2777;2778; GFX9-LABEL: extract_perm_3744:2779; GFX9: ; %bb.0:2780; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2781; GFX9-NEXT: global_load_dword v6, v[0:1], off2782; GFX9-NEXT: global_load_dword v7, v[2:3], off2783; GFX9-NEXT: s_mov_b32 s4, 0x30704042784; GFX9-NEXT: s_waitcnt vmcnt(0)2785; GFX9-NEXT: v_perm_b32 v0, v6, v7, s42786; GFX9-NEXT: global_store_dword v[4:5], v0, off2787; GFX9-NEXT: s_waitcnt vmcnt(0)2788; GFX9-NEXT: s_setpc_b64 s[30:31]2789 %vec1 = load <4 x i8>, ptr addrspace(1) %in0, align 42790 %vec2 = load <4 x i8>, ptr addrspace(1) %in1, align 42791 %cast1 = bitcast <4 x i8> %vec1 to i322792 %cast2 = bitcast <4 x i8> %vec2 to i322793 %lo24 = call i32 @llvm.amdgcn.perm(i32 %cast1, i32 %cast1, i32 201523200)2794 %hi8 = call i32 @llvm.amdgcn.perm(i32 %cast2, i32 %cast2, i32 51121164)2795 %res = or i32 %hi8, %lo242796 store i32 %res, ptr addrspace(1) %out0, align 42797 ret void2798}2799 2800define hidden void @extract1347_v2i16(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {2801; GFX10-LABEL: extract1347_v2i16:2802; GFX10: ; %bb.0:2803; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2804; GFX10-NEXT: global_load_dword v6, v[0:1], off2805; GFX10-NEXT: global_load_dword v7, v[2:3], off2806; GFX10-NEXT: s_waitcnt vmcnt(0)2807; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x10304072808; GFX10-NEXT: global_store_dword v[4:5], v0, off2809; GFX10-NEXT: s_setpc_b64 s[30:31]2810;2811; GFX9-LABEL: extract1347_v2i16:2812; GFX9: ; %bb.0:2813; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2814; GFX9-NEXT: global_load_dword v6, v[0:1], off2815; GFX9-NEXT: global_load_dword v7, v[2:3], off2816; GFX9-NEXT: s_mov_b32 s4, 0x10304072817; GFX9-NEXT: s_waitcnt vmcnt(0)2818; GFX9-NEXT: v_perm_b32 v0, v7, v6, s42819; GFX9-NEXT: global_store_dword v[4:5], v0, off2820; GFX9-NEXT: s_waitcnt vmcnt(0)2821; GFX9-NEXT: s_setpc_b64 s[30:31]2822 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 42823 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 42824 %v1e0 = extractelement <2 x i16> %vec1, i64 02825 %v1e1 = extractelement <2 x i16> %vec1, i64 12826 %v2e0 = extractelement <2 x i16> %vec2, i64 02827 %v2e1 = extractelement <2 x i16> %vec2, i64 12828 2829 %b0t0 = and i16 -256, %v2e12830 %b0t1 = lshr i16 %b0t0, 82831 %byte0 = zext i16 %b0t1 to i322832 2833 %b1t0 = and i16 255, %v2e02834 %b1t1 = zext i16 %b1t0 to i322835 %byte1 = shl i32 %b1t1, 82836 2837 %b2t0 = and i16 -256, %v1e12838 %b2t1 = lshr i16 %b2t0, 82839 %b2t2 = zext i16 %b2t1 to i322840 %byte2 = shl i32 %b2t2, 162841 2842 %b3t0 = and i16 -256, %v1e02843 %b3t1 = lshr i16 %b3t0, 82844 %b3t2 = zext i16 %b3t1 to i322845 %byte3 = shl i32 %b3t2, 242846 2847 %tmp0 = or i32 %byte0, %byte12848 %tmp1 = or i32 %tmp0, %byte22849 %res = or i32 %tmp1, %byte32850 store i32 %res, ptr addrspace(1) %out0, align 42851 ret void2852}2853 2854 2855declare i16 @llvm.fshr.i16(i16, i16, i16)2856 2857define hidden void @fshri16_8(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {2858; GFX10-LABEL: fshri16_8:2859; GFX10: ; %bb.0:2860; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2861; GFX10-NEXT: global_load_dword v6, v[0:1], off2862; GFX10-NEXT: global_load_dword v7, v[2:3], off2863; GFX10-NEXT: s_waitcnt vmcnt(0)2864; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x304072865; GFX10-NEXT: global_store_dword v[4:5], v0, off2866; GFX10-NEXT: s_setpc_b64 s[30:31]2867;2868; GFX9-LABEL: fshri16_8:2869; GFX9: ; %bb.0:2870; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2871; GFX9-NEXT: global_load_dword v6, v[0:1], off2872; GFX9-NEXT: global_load_dword v7, v[2:3], off2873; GFX9-NEXT: s_mov_b32 s4, 0x304072874; GFX9-NEXT: s_waitcnt vmcnt(0)2875; GFX9-NEXT: v_perm_b32 v0, v7, v6, s42876; GFX9-NEXT: global_store_dword v[4:5], v0, off2877; GFX9-NEXT: s_waitcnt vmcnt(0)2878; GFX9-NEXT: s_setpc_b64 s[30:31]2879 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 42880 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 42881 %v1e0 = extractelement <2 x i16> %vec1, i64 02882 %v1e1 = extractelement <2 x i16> %vec1, i64 12883 %v2e0 = extractelement <2 x i16> %vec2, i64 02884 %v2e1 = extractelement <2 x i16> %vec2, i64 12885 2886 %tmp01.0 = call i16 @llvm.fshr.i16(i16 %v2e0, i16 %v2e1, i16 8)2887 %byte01 = zext i16 %tmp01.0 to i322888 2889 %tmp23.0 = call i16 @llvm.fshr.i16(i16 %v1e0, i16 %v1e1, i16 8)2890 %tmp23.1 = zext i16 %tmp23.0 to i322891 %byte23 = shl i32 %tmp23.1, 162892 %res = or i32 %byte01, %byte232893 store i32 %res, ptr addrspace(1) %out0, align 42894 ret void2895}2896 2897define hidden void @fshri16_16(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {2898; GFX10-LABEL: fshri16_16:2899; GFX10: ; %bb.0:2900; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2901; GFX10-NEXT: global_load_dword v6, v[0:1], off2902; GFX10-NEXT: global_load_dword v7, v[2:3], off2903; GFX10-NEXT: s_waitcnt vmcnt(0)2904; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x30207062905; GFX10-NEXT: global_store_dword v[4:5], v0, off2906; GFX10-NEXT: s_setpc_b64 s[30:31]2907;2908; GFX9-LABEL: fshri16_16:2909; GFX9: ; %bb.0:2910; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2911; GFX9-NEXT: global_load_dword v6, v[0:1], off2912; GFX9-NEXT: global_load_dword v7, v[2:3], off2913; GFX9-NEXT: s_mov_b32 s4, 0x30207062914; GFX9-NEXT: s_waitcnt vmcnt(0)2915; GFX9-NEXT: v_perm_b32 v0, v7, v6, s42916; GFX9-NEXT: global_store_dword v[4:5], v0, off2917; GFX9-NEXT: s_waitcnt vmcnt(0)2918; GFX9-NEXT: s_setpc_b64 s[30:31]2919 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 42920 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 42921 %v1e0 = extractelement <2 x i16> %vec1, i64 02922 %v1e1 = extractelement <2 x i16> %vec1, i64 12923 %v2e0 = extractelement <2 x i16> %vec2, i64 02924 %v2e1 = extractelement <2 x i16> %vec2, i64 12925 2926 %tmp01.0 = call i16 @llvm.fshr.i16(i16 %v2e0, i16 %v2e1, i16 16)2927 %byte01 = zext i16 %tmp01.0 to i322928 2929 %tmp23.0 = call i16 @llvm.fshr.i16(i16 %v1e0, i16 %v1e1, i16 16)2930 %tmp23.1 = zext i16 %tmp23.0 to i322931 %byte23 = shl i32 %tmp23.1, 162932 %res = or i32 %byte01, %byte232933 store i32 %res, ptr addrspace(1) %out0, align 42934 ret void2935}2936 2937define hidden void @fshri16_24(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {2938; GFX10-LABEL: fshri16_24:2939; GFX10: ; %bb.0:2940; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2941; GFX10-NEXT: global_load_dword v6, v[0:1], off2942; GFX10-NEXT: global_load_dword v7, v[2:3], off2943; GFX10-NEXT: s_waitcnt vmcnt(0)2944; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x304072945; GFX10-NEXT: global_store_dword v[4:5], v0, off2946; GFX10-NEXT: s_setpc_b64 s[30:31]2947;2948; GFX9-LABEL: fshri16_24:2949; GFX9: ; %bb.0:2950; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2951; GFX9-NEXT: global_load_dword v6, v[0:1], off2952; GFX9-NEXT: global_load_dword v7, v[2:3], off2953; GFX9-NEXT: s_mov_b32 s4, 0x304072954; GFX9-NEXT: s_waitcnt vmcnt(0)2955; GFX9-NEXT: v_perm_b32 v0, v7, v6, s42956; GFX9-NEXT: global_store_dword v[4:5], v0, off2957; GFX9-NEXT: s_waitcnt vmcnt(0)2958; GFX9-NEXT: s_setpc_b64 s[30:31]2959 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 42960 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 42961 %v1e0 = extractelement <2 x i16> %vec1, i64 02962 %v1e1 = extractelement <2 x i16> %vec1, i64 12963 %v2e0 = extractelement <2 x i16> %vec2, i64 02964 %v2e1 = extractelement <2 x i16> %vec2, i64 12965 2966 %tmp01.0 = call i16 @llvm.fshr.i16(i16 %v2e0, i16 %v2e1, i16 24)2967 %byte01 = zext i16 %tmp01.0 to i322968 2969 %tmp23.0 = call i16 @llvm.fshr.i16(i16 %v1e0, i16 %v1e1, i16 24)2970 %tmp23.1 = zext i16 %tmp23.0 to i322971 %byte23 = shl i32 %tmp23.1, 162972 %res = or i32 %byte01, %byte232973 store i32 %res, ptr addrspace(1) %out0, align 42974 ret void2975}2976 2977define hidden void @fshri16_32(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {2978; GFX10-LABEL: fshri16_32:2979; GFX10: ; %bb.0:2980; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2981; GFX10-NEXT: global_load_dword v6, v[0:1], off2982; GFX10-NEXT: global_load_dword v7, v[2:3], off2983; GFX10-NEXT: s_waitcnt vmcnt(0)2984; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x30207062985; GFX10-NEXT: global_store_dword v[4:5], v0, off2986; GFX10-NEXT: s_setpc_b64 s[30:31]2987;2988; GFX9-LABEL: fshri16_32:2989; GFX9: ; %bb.0:2990; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2991; GFX9-NEXT: global_load_dword v6, v[0:1], off2992; GFX9-NEXT: global_load_dword v7, v[2:3], off2993; GFX9-NEXT: s_mov_b32 s4, 0x30207062994; GFX9-NEXT: s_waitcnt vmcnt(0)2995; GFX9-NEXT: v_perm_b32 v0, v7, v6, s42996; GFX9-NEXT: global_store_dword v[4:5], v0, off2997; GFX9-NEXT: s_waitcnt vmcnt(0)2998; GFX9-NEXT: s_setpc_b64 s[30:31]2999 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 43000 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 43001 %v1e0 = extractelement <2 x i16> %vec1, i64 03002 %v1e1 = extractelement <2 x i16> %vec1, i64 13003 %v2e0 = extractelement <2 x i16> %vec2, i64 03004 %v2e1 = extractelement <2 x i16> %vec2, i64 13005 3006 %tmp01.0 = call i16 @llvm.fshr.i16(i16 %v2e0, i16 %v2e1, i16 32)3007 %byte01 = zext i16 %tmp01.0 to i323008 3009 %tmp23.0 = call i16 @llvm.fshr.i16(i16 %v1e0, i16 %v1e1, i16 32)3010 %tmp23.1 = zext i16 %tmp23.0 to i323011 %byte23 = shl i32 %tmp23.1, 163012 %res = or i32 %byte01, %byte233013 store i32 %res, ptr addrspace(1) %out0, align 43014 ret void3015}3016 3017define hidden void @fshri16_88(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3018; GFX10-LABEL: fshri16_88:3019; GFX10: ; %bb.0:3020; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3021; GFX10-NEXT: global_load_dword v6, v[0:1], off3022; GFX10-NEXT: global_load_dword v7, v[2:3], off3023; GFX10-NEXT: s_waitcnt vmcnt(0)3024; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x304073025; GFX10-NEXT: global_store_dword v[4:5], v0, off3026; GFX10-NEXT: s_setpc_b64 s[30:31]3027;3028; GFX9-LABEL: fshri16_88:3029; GFX9: ; %bb.0:3030; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3031; GFX9-NEXT: global_load_dword v6, v[0:1], off3032; GFX9-NEXT: global_load_dword v7, v[2:3], off3033; GFX9-NEXT: s_mov_b32 s4, 0x304073034; GFX9-NEXT: s_waitcnt vmcnt(0)3035; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43036; GFX9-NEXT: global_store_dword v[4:5], v0, off3037; GFX9-NEXT: s_waitcnt vmcnt(0)3038; GFX9-NEXT: s_setpc_b64 s[30:31]3039 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 43040 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 43041 %v1e0 = extractelement <2 x i16> %vec1, i64 03042 %v1e1 = extractelement <2 x i16> %vec1, i64 13043 %v2e0 = extractelement <2 x i16> %vec2, i64 03044 %v2e1 = extractelement <2 x i16> %vec2, i64 13045 3046 %tmp01.0 = call i16 @llvm.fshr.i16(i16 %v2e0, i16 %v2e1, i16 88)3047 %byte01 = zext i16 %tmp01.0 to i323048 3049 %tmp23.0 = call i16 @llvm.fshr.i16(i16 %v1e0, i16 %v1e1, i16 88)3050 %tmp23.1 = zext i16 %tmp23.0 to i323051 %byte23 = shl i32 %tmp23.1, 163052 %res = or i32 %byte01, %byte233053 store i32 %res, ptr addrspace(1) %out0, align 43054 ret void3055}3056 3057declare i16 @llvm.fshl.i16(i16, i16, i16)3058 3059define hidden void @fshli16_1347(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3060; GFX10-LABEL: fshli16_1347:3061; GFX10: ; %bb.0:3062; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3063; GFX10-NEXT: global_load_dword v6, v[0:1], off3064; GFX10-NEXT: global_load_dword v7, v[2:3], off3065; GFX10-NEXT: s_waitcnt vmcnt(0)3066; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x304073067; GFX10-NEXT: global_store_dword v[4:5], v0, off3068; GFX10-NEXT: s_setpc_b64 s[30:31]3069;3070; GFX9-LABEL: fshli16_1347:3071; GFX9: ; %bb.0:3072; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3073; GFX9-NEXT: global_load_dword v6, v[0:1], off3074; GFX9-NEXT: global_load_dword v7, v[2:3], off3075; GFX9-NEXT: s_mov_b32 s4, 0x304073076; GFX9-NEXT: s_waitcnt vmcnt(0)3077; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43078; GFX9-NEXT: global_store_dword v[4:5], v0, off3079; GFX9-NEXT: s_waitcnt vmcnt(0)3080; GFX9-NEXT: s_setpc_b64 s[30:31]3081 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 43082 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 43083 %v1e0 = extractelement <2 x i16> %vec1, i64 03084 %v1e1 = extractelement <2 x i16> %vec1, i64 13085 %v2e0 = extractelement <2 x i16> %vec2, i64 03086 %v2e1 = extractelement <2 x i16> %vec2, i64 13087 3088 %tmp01.0 = call i16 @llvm.fshl.i16(i16 %v2e0, i16 %v2e1, i16 8)3089 %byte01 = zext i16 %tmp01.0 to i323090 3091 %tmp23.0 = call i16 @llvm.fshl.i16(i16 %v1e0, i16 %v1e1, i16 8)3092 %tmp23.1 = zext i16 %tmp23.0 to i323093 %byte23 = shl i32 %tmp23.1, 163094 %res = or i32 %byte01, %byte233095 store i32 %res, ptr addrspace(1) %out0, align 43096 ret void3097}3098 3099define hidden void @fshli16_16(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3100; GFX10-LABEL: fshli16_16:3101; GFX10: ; %bb.0:3102; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3103; GFX10-NEXT: global_load_dword v6, v[0:1], off3104; GFX10-NEXT: global_load_dword v7, v[2:3], off3105; GFX10-NEXT: s_waitcnt vmcnt(0)3106; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x10005043107; GFX10-NEXT: global_store_dword v[4:5], v0, off3108; GFX10-NEXT: s_setpc_b64 s[30:31]3109;3110; GFX9-LABEL: fshli16_16:3111; GFX9: ; %bb.0:3112; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3113; GFX9-NEXT: global_load_dword v6, v[0:1], off3114; GFX9-NEXT: global_load_dword v7, v[2:3], off3115; GFX9-NEXT: s_mov_b32 s4, 0x10005043116; GFX9-NEXT: s_waitcnt vmcnt(0)3117; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43118; GFX9-NEXT: global_store_dword v[4:5], v0, off3119; GFX9-NEXT: s_waitcnt vmcnt(0)3120; GFX9-NEXT: s_setpc_b64 s[30:31]3121 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 43122 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 43123 %v1e0 = extractelement <2 x i16> %vec1, i64 03124 %v1e1 = extractelement <2 x i16> %vec1, i64 13125 %v2e0 = extractelement <2 x i16> %vec2, i64 03126 %v2e1 = extractelement <2 x i16> %vec2, i64 13127 3128 %tmp01.0 = call i16 @llvm.fshl.i16(i16 %v2e0, i16 %v2e1, i16 16)3129 %byte01 = zext i16 %tmp01.0 to i323130 3131 %tmp23.0 = call i16 @llvm.fshl.i16(i16 %v1e0, i16 %v1e1, i16 16)3132 %tmp23.1 = zext i16 %tmp23.0 to i323133 %byte23 = shl i32 %tmp23.1, 163134 %res = or i32 %byte01, %byte233135 store i32 %res, ptr addrspace(1) %out0, align 43136 ret void3137}3138 3139define hidden void @fshli16_24(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3140; GFX10-LABEL: fshli16_24:3141; GFX10: ; %bb.0:3142; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3143; GFX10-NEXT: global_load_dword v6, v[0:1], off3144; GFX10-NEXT: global_load_dword v7, v[2:3], off3145; GFX10-NEXT: s_waitcnt vmcnt(0)3146; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x304073147; GFX10-NEXT: global_store_dword v[4:5], v0, off3148; GFX10-NEXT: s_setpc_b64 s[30:31]3149;3150; GFX9-LABEL: fshli16_24:3151; GFX9: ; %bb.0:3152; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3153; GFX9-NEXT: global_load_dword v6, v[0:1], off3154; GFX9-NEXT: global_load_dword v7, v[2:3], off3155; GFX9-NEXT: s_mov_b32 s4, 0x304073156; GFX9-NEXT: s_waitcnt vmcnt(0)3157; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43158; GFX9-NEXT: global_store_dword v[4:5], v0, off3159; GFX9-NEXT: s_waitcnt vmcnt(0)3160; GFX9-NEXT: s_setpc_b64 s[30:31]3161 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 43162 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 43163 %v1e0 = extractelement <2 x i16> %vec1, i64 03164 %v1e1 = extractelement <2 x i16> %vec1, i64 13165 %v2e0 = extractelement <2 x i16> %vec2, i64 03166 %v2e1 = extractelement <2 x i16> %vec2, i64 13167 3168 %tmp01.0 = call i16 @llvm.fshl.i16(i16 %v2e0, i16 %v2e1, i16 24)3169 %byte01 = zext i16 %tmp01.0 to i323170 3171 %tmp23.0 = call i16 @llvm.fshl.i16(i16 %v1e0, i16 %v1e1, i16 24)3172 %tmp23.1 = zext i16 %tmp23.0 to i323173 %byte23 = shl i32 %tmp23.1, 163174 %res = or i32 %byte01, %byte233175 store i32 %res, ptr addrspace(1) %out0, align 43176 ret void3177}3178 3179define hidden void @fshli16_32(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3180; GFX10-LABEL: fshli16_32:3181; GFX10: ; %bb.0:3182; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3183; GFX10-NEXT: global_load_dword v6, v[0:1], off3184; GFX10-NEXT: global_load_dword v7, v[2:3], off3185; GFX10-NEXT: s_waitcnt vmcnt(0)3186; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x10005043187; GFX10-NEXT: global_store_dword v[4:5], v0, off3188; GFX10-NEXT: s_setpc_b64 s[30:31]3189;3190; GFX9-LABEL: fshli16_32:3191; GFX9: ; %bb.0:3192; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3193; GFX9-NEXT: global_load_dword v6, v[0:1], off3194; GFX9-NEXT: global_load_dword v7, v[2:3], off3195; GFX9-NEXT: s_mov_b32 s4, 0x10005043196; GFX9-NEXT: s_waitcnt vmcnt(0)3197; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43198; GFX9-NEXT: global_store_dword v[4:5], v0, off3199; GFX9-NEXT: s_waitcnt vmcnt(0)3200; GFX9-NEXT: s_setpc_b64 s[30:31]3201 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 43202 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 43203 %v1e0 = extractelement <2 x i16> %vec1, i64 03204 %v1e1 = extractelement <2 x i16> %vec1, i64 13205 %v2e0 = extractelement <2 x i16> %vec2, i64 03206 %v2e1 = extractelement <2 x i16> %vec2, i64 13207 3208 %tmp01.0 = call i16 @llvm.fshl.i16(i16 %v2e0, i16 %v2e1, i16 32)3209 %byte01 = zext i16 %tmp01.0 to i323210 3211 %tmp23.0 = call i16 @llvm.fshl.i16(i16 %v1e0, i16 %v1e1, i16 32)3212 %tmp23.1 = zext i16 %tmp23.0 to i323213 %byte23 = shl i32 %tmp23.1, 163214 %res = or i32 %byte01, %byte233215 store i32 %res, ptr addrspace(1) %out0, align 43216 ret void3217}3218 3219define hidden void @fshli16_88(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3220; GFX10-LABEL: fshli16_88:3221; GFX10: ; %bb.0:3222; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3223; GFX10-NEXT: global_load_dword v6, v[0:1], off3224; GFX10-NEXT: global_load_dword v7, v[2:3], off3225; GFX10-NEXT: s_waitcnt vmcnt(0)3226; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x304073227; GFX10-NEXT: global_store_dword v[4:5], v0, off3228; GFX10-NEXT: s_setpc_b64 s[30:31]3229;3230; GFX9-LABEL: fshli16_88:3231; GFX9: ; %bb.0:3232; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3233; GFX9-NEXT: global_load_dword v6, v[0:1], off3234; GFX9-NEXT: global_load_dword v7, v[2:3], off3235; GFX9-NEXT: s_mov_b32 s4, 0x304073236; GFX9-NEXT: s_waitcnt vmcnt(0)3237; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43238; GFX9-NEXT: global_store_dword v[4:5], v0, off3239; GFX9-NEXT: s_waitcnt vmcnt(0)3240; GFX9-NEXT: s_setpc_b64 s[30:31]3241 %vec1 = load <2 x i16>, ptr addrspace(1) %in0, align 43242 %vec2 = load <2 x i16>, ptr addrspace(1) %in1, align 43243 %v1e0 = extractelement <2 x i16> %vec1, i64 03244 %v1e1 = extractelement <2 x i16> %vec1, i64 13245 %v2e0 = extractelement <2 x i16> %vec2, i64 03246 %v2e1 = extractelement <2 x i16> %vec2, i64 13247 3248 %tmp01.0 = call i16 @llvm.fshl.i16(i16 %v2e0, i16 %v2e1, i16 88)3249 %byte01 = zext i16 %tmp01.0 to i323250 3251 %tmp23.0 = call i16 @llvm.fshl.i16(i16 %v1e0, i16 %v1e1, i16 88)3252 %tmp23.1 = zext i16 %tmp23.0 to i323253 %byte23 = shl i32 %tmp23.1, 163254 %res = or i32 %byte01, %byte233255 store i32 %res, ptr addrspace(1) %out0, align 43256 ret void3257}3258 3259define hidden void @shlbase(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0, i32 %base) {3260; GFX10-LABEL: shlbase:3261; GFX10: ; %bb.0:3262; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3263; GFX10-NEXT: global_load_dword v7, v[0:1], off3264; GFX10-NEXT: global_load_dword v8, v[2:3], off3265; GFX10-NEXT: v_add_nc_u32_e32 v0, 16, v63266; GFX10-NEXT: v_add_nc_u32_e32 v1, 24, v63267; GFX10-NEXT: v_add_nc_u32_e32 v3, 8, v63268; GFX10-NEXT: s_waitcnt vmcnt(1)3269; GFX10-NEXT: v_and_b32_e32 v2, 0xff, v73270; GFX10-NEXT: v_lshlrev_b32_sdwa v0, v0, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_33271; GFX10-NEXT: s_waitcnt vmcnt(0)3272; GFX10-NEXT: v_lshlrev_b32_sdwa v1, v1, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_33273; GFX10-NEXT: v_lshl_or_b32 v2, v2, v3, v23274; GFX10-NEXT: v_or3_b32 v0, v2, v0, v13275; GFX10-NEXT: global_store_dword v[4:5], v0, off3276; GFX10-NEXT: s_setpc_b64 s[30:31]3277;3278; GFX9-LABEL: shlbase:3279; GFX9: ; %bb.0:3280; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3281; GFX9-NEXT: global_load_dword v7, v[0:1], off3282; GFX9-NEXT: global_load_dword v8, v[2:3], off3283; GFX9-NEXT: v_add_u32_e32 v0, 8, v63284; GFX9-NEXT: v_add_u32_e32 v1, 16, v63285; GFX9-NEXT: v_add_u32_e32 v2, 24, v63286; GFX9-NEXT: s_waitcnt vmcnt(1)3287; GFX9-NEXT: v_and_b32_e32 v3, 0xff, v73288; GFX9-NEXT: v_lshlrev_b32_sdwa v1, v1, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_33289; GFX9-NEXT: s_waitcnt vmcnt(0)3290; GFX9-NEXT: v_lshlrev_b32_sdwa v2, v2, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_33291; GFX9-NEXT: v_lshl_or_b32 v0, v3, v0, v33292; GFX9-NEXT: v_or3_b32 v0, v0, v1, v23293; GFX9-NEXT: global_store_dword v[4:5], v0, off3294; GFX9-NEXT: s_waitcnt vmcnt(0)3295; GFX9-NEXT: s_setpc_b64 s[30:31]3296 %vec1 = load <4 x i8>, ptr addrspace(1) %in0, align 43297 %vec2 = load <4 x i8>, ptr addrspace(1) %in1, align 43298 %v1e0 = extractelement <4 x i8> %vec1, i64 03299 %zv1e0 = zext i8 %v1e0 to i323300 %b8 = add i32 %base, 83301 %byte1 = shl i32 %zv1e0, %b83302 3303 %v1e3 = extractelement <4 x i8> %vec1, i64 33304 %zv1e3 = zext i8 %v1e3 to i323305 %b16 = add i32 %base, 163306 %byte2 = shl i32 %zv1e3, %b163307 %v2e3 = extractelement <4 x i8> %vec2, i64 33308 %zv2e3 = zext i8 %v2e3 to i323309 %b24 = add i32 %base, 243310 %byte3 = shl i32 %zv2e3, %b243311 3312 %tmp0 = or i32 %zv1e0, %byte13313 %tmp1 = or i32 %tmp0, %byte23314 %res = or i32 %tmp1, %byte33315 store i32 %res, ptr addrspace(1) %out0, align 43316 ret void3317}3318 3319; TODO -- lower into v_perm3320define hidden void @extractbase(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0, i64 %base) {3321; GFX10-LABEL: extractbase:3322; GFX10: ; %bb.0:3323; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3324; GFX10-NEXT: global_load_dword v7, v[0:1], off3325; GFX10-NEXT: global_load_dword v8, v[2:3], off3326; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v63327; GFX10-NEXT: v_add_nc_u32_e32 v1, 24, v03328; GFX10-NEXT: s_waitcnt vmcnt(1)3329; GFX10-NEXT: v_bfe_u32 v2, v7, v1, 83330; GFX10-NEXT: v_bfe_u32 v0, v7, v0, 83331; GFX10-NEXT: s_waitcnt vmcnt(0)3332; GFX10-NEXT: v_lshrrev_b32_sdwa v1, v1, v8 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD3333; GFX10-NEXT: v_lshlrev_b32_e32 v2, 16, v23334; GFX10-NEXT: v_lshl_or_b32 v0, v0, 8, v03335; GFX10-NEXT: v_or3_b32 v0, v0, v2, v13336; GFX10-NEXT: global_store_dword v[4:5], v0, off3337; GFX10-NEXT: s_setpc_b64 s[30:31]3338;3339; GFX9-LABEL: extractbase:3340; GFX9: ; %bb.0:3341; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3342; GFX9-NEXT: global_load_dword v7, v[0:1], off3343; GFX9-NEXT: global_load_dword v8, v[2:3], off3344; GFX9-NEXT: v_lshlrev_b32_e32 v0, 3, v63345; GFX9-NEXT: v_add_u32_e32 v1, 24, v03346; GFX9-NEXT: s_waitcnt vmcnt(1)3347; GFX9-NEXT: v_bfe_u32 v0, v7, v0, 83348; GFX9-NEXT: v_bfe_u32 v2, v7, v1, 83349; GFX9-NEXT: s_waitcnt vmcnt(0)3350; GFX9-NEXT: v_lshrrev_b32_sdwa v1, v1, v8 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD3351; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v23352; GFX9-NEXT: v_lshl_or_b32 v0, v0, 8, v03353; GFX9-NEXT: v_or3_b32 v0, v0, v2, v13354; GFX9-NEXT: global_store_dword v[4:5], v0, off3355; GFX9-NEXT: s_waitcnt vmcnt(0)3356; GFX9-NEXT: s_setpc_b64 s[30:31]3357 %vec1 = load <4 x i8>, ptr addrspace(1) %in0, align 43358 %vec2 = load <4 x i8>, ptr addrspace(1) %in1, align 43359 %v1b = extractelement <4 x i8> %vec1, i64 %base3360 %zv1b = zext i8 %v1b to i323361 %byte1 = shl i32 %zv1b, 83362 3363 %b3 = add i64 %base, 33364 %v1b3 = extractelement <4 x i8> %vec1, i64 %b33365 %zv1b3 = zext i8 %v1b3 to i323366 %byte2 = shl i32 %zv1b3, 163367 %v2b3 = extractelement <4 x i8> %vec2, i64 %b33368 %zv2b3 = zext i8 %v2b3 to i323369 %byte3 = shl i32 %zv2b3, 243370 3371 %tmp0 = or i32 %zv1b, %byte13372 %tmp1 = or i32 %tmp0, %byte23373 %res = or i32 %tmp1, %byte33374 store i32 %res, ptr addrspace(1) %out0, align 43375 ret void3376}3377 3378define hidden void @extract_hilo(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3379; GFX10-LABEL: extract_hilo:3380; GFX10: ; %bb.0:3381; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3382; GFX10-NEXT: global_load_dword v6, v[2:3], off3383; GFX10-NEXT: global_load_dword v7, v[0:1], off offset:43384; GFX10-NEXT: s_waitcnt vmcnt(0)3385; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x30605053386; GFX10-NEXT: global_store_dword v[4:5], v0, off3387; GFX10-NEXT: s_setpc_b64 s[30:31]3388;3389; GFX9-LABEL: extract_hilo:3390; GFX9: ; %bb.0:3391; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3392; GFX9-NEXT: global_load_dword v6, v[2:3], off3393; GFX9-NEXT: global_load_dword v7, v[0:1], off offset:43394; GFX9-NEXT: s_mov_b32 s4, 0x30605053395; GFX9-NEXT: s_waitcnt vmcnt(0)3396; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43397; GFX9-NEXT: global_store_dword v[4:5], v0, off3398; GFX9-NEXT: s_waitcnt vmcnt(0)3399; GFX9-NEXT: s_setpc_b64 s[30:31]3400 %vec1 = load <8 x i8>, ptr addrspace(1) %in0, align 43401 %vec2 = load <8 x i8>, ptr addrspace(1) %in1, align 43402 %v1e5 = extractelement <8 x i8> %vec1, i64 53403 %zv1e5 = zext i8 %v1e5 to i323404 %byte1 = shl i32 %zv1e5, 83405 3406 %v1e6 = extractelement <8 x i8> %vec1, i64 63407 %zv1e6 = zext i8 %v1e6 to i323408 %byte2 = shl i32 %zv1e6, 163409 %v2e3 = extractelement <8 x i8> %vec2, i64 33410 %zv2e3 = zext i8 %v2e3 to i323411 %byte3 = shl i32 %zv2e3, 243412 3413 %tmp0 = or i32 %zv1e5, %byte13414 %tmp1 = or i32 %tmp0, %byte23415 %res = or i32 %tmp1, %byte33416 store i32 %res, ptr addrspace(1) %out0, align 43417 ret void3418}3419 3420define hidden void @extract_lohi(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3421; GFX10-LABEL: extract_lohi:3422; GFX10: ; %bb.0:3423; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3424; GFX10-NEXT: global_load_dword v6, v[2:3], off offset:43425; GFX10-NEXT: global_load_dword v7, v[0:1], off3426; GFX10-NEXT: s_waitcnt vmcnt(0)3427; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x704043428; GFX10-NEXT: global_store_dword v[4:5], v0, off3429; GFX10-NEXT: s_setpc_b64 s[30:31]3430;3431; GFX9-LABEL: extract_lohi:3432; GFX9: ; %bb.0:3433; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3434; GFX9-NEXT: global_load_dword v6, v[2:3], off offset:43435; GFX9-NEXT: global_load_dword v7, v[0:1], off3436; GFX9-NEXT: s_mov_b32 s4, 0x704043437; GFX9-NEXT: s_waitcnt vmcnt(0)3438; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43439; GFX9-NEXT: global_store_dword v[4:5], v0, off3440; GFX9-NEXT: s_waitcnt vmcnt(0)3441; GFX9-NEXT: s_setpc_b64 s[30:31]3442 %vec1 = load <8 x i8>, ptr addrspace(1) %in0, align 43443 %vec2 = load <8 x i8>, ptr addrspace(1) %in1, align 43444 %v1e0 = extractelement <8 x i8> %vec1, i64 03445 %zv1e0 = zext i8 %v1e0 to i323446 %byte1 = shl i32 %zv1e0, 83447 3448 %v1e3 = extractelement <8 x i8> %vec1, i64 33449 %zv1e3 = zext i8 %v1e3 to i323450 %byte2 = shl i32 %zv1e3, 163451 %v2e4 = extractelement <8 x i8> %vec2, i64 43452 %zv2e4 = zext i8 %v2e4 to i323453 %byte3 = shl i32 %zv2e4, 243454 3455 %tmp0 = or i32 %zv1e0, %byte13456 %tmp1 = or i32 %tmp0, %byte23457 %res = or i32 %tmp1, %byte33458 store i32 %res, ptr addrspace(1) %out0, align 43459 ret void3460}3461 3462define hidden void @extract_hihi(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3463; GFX10-LABEL: extract_hihi:3464; GFX10: ; %bb.0:3465; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3466; GFX10-NEXT: global_load_dword v6, v[2:3], off offset:43467; GFX10-NEXT: global_load_dword v7, v[0:1], off offset:43468; GFX10-NEXT: s_waitcnt vmcnt(0)3469; GFX10-NEXT: v_perm_b32 v0, v7, v6, 0x20705053470; GFX10-NEXT: global_store_dword v[4:5], v0, off3471; GFX10-NEXT: s_setpc_b64 s[30:31]3472;3473; GFX9-LABEL: extract_hihi:3474; GFX9: ; %bb.0:3475; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3476; GFX9-NEXT: global_load_dword v6, v[2:3], off offset:43477; GFX9-NEXT: global_load_dword v7, v[0:1], off offset:43478; GFX9-NEXT: s_mov_b32 s4, 0x20705053479; GFX9-NEXT: s_waitcnt vmcnt(0)3480; GFX9-NEXT: v_perm_b32 v0, v7, v6, s43481; GFX9-NEXT: global_store_dword v[4:5], v0, off3482; GFX9-NEXT: s_waitcnt vmcnt(0)3483; GFX9-NEXT: s_setpc_b64 s[30:31]3484 %vec1 = load <8 x i8>, ptr addrspace(1) %in0, align 43485 %vec2 = load <8 x i8>, ptr addrspace(1) %in1, align 43486 %v1e5 = extractelement <8 x i8> %vec1, i64 53487 %zv1e5 = zext i8 %v1e5 to i323488 %byte1 = shl i32 %zv1e5, 83489 3490 %v1e7 = extractelement <8 x i8> %vec1, i64 73491 %zv1e7 = zext i8 %v1e7 to i323492 %byte2 = shl i32 %zv1e7, 163493 %v2e6 = extractelement <8 x i8> %vec2, i64 63494 %zv2e6 = zext i8 %v2e6 to i323495 %byte3 = shl i32 %zv2e6, 243496 3497 %tmp0 = or i32 %zv1e5, %byte13498 %tmp1 = or i32 %tmp0, %byte23499 %res = or i32 %tmp1, %byte33500 store i32 %res, ptr addrspace(1) %out0, align 43501 ret void3502}3503 3504define hidden void @extract_v8i8(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {3505; GFX10-LABEL: extract_v8i8:3506; GFX10: ; %bb.0:3507; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3508; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off3509; GFX10-NEXT: s_waitcnt vmcnt(0)3510; GFX10-NEXT: v_perm_b32 v0, v1, v0, 0x10704043511; GFX10-NEXT: global_store_dword v[2:3], v0, off3512; GFX10-NEXT: s_setpc_b64 s[30:31]3513;3514; GFX9-LABEL: extract_v8i8:3515; GFX9: ; %bb.0:3516; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3517; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off3518; GFX9-NEXT: s_mov_b32 s4, 0x10704043519; GFX9-NEXT: s_waitcnt vmcnt(0)3520; GFX9-NEXT: v_perm_b32 v0, v1, v0, s43521; GFX9-NEXT: global_store_dword v[2:3], v0, off3522; GFX9-NEXT: s_waitcnt vmcnt(0)3523; GFX9-NEXT: s_setpc_b64 s[30:31]3524 %vec1 = load <8 x i8>, ptr addrspace(1) %in0, align 43525 %v1e4 = extractelement <8 x i8> %vec1, i64 43526 %zv1e4 = zext i8 %v1e4 to i323527 %byte1 = shl i32 %zv1e4, 83528 3529 %v1e7 = extractelement <8 x i8> %vec1, i64 73530 %zv1e7 = zext i8 %v1e7 to i323531 %byte2 = shl i32 %zv1e7, 163532 %v2e1 = extractelement <8 x i8> %vec1, i64 13533 %zv2e1 = zext i8 %v2e1 to i323534 %byte3 = shl i32 %zv2e1, 243535 3536 %tmp0 = or i32 %zv1e4, %byte13537 %tmp1 = or i32 %tmp0, %byte23538 %res = or i32 %tmp1, %byte33539 store i32 %res, ptr addrspace(1) %out0, align 43540 ret void3541}3542 3543define hidden void @extract_v256i8(ptr addrspace(1) %in0, ptr addrspace(1) %out0) {3544; GFX10-LABEL: extract_v256i8:3545; GFX10: ; %bb.0:3546; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3547; GFX10-NEXT: global_load_dword v0, v[0:1], off offset:2523548; GFX10-NEXT: s_waitcnt vmcnt(0)3549; GFX10-NEXT: v_perm_b32 v0, v0, v0, 0x60507073550; GFX10-NEXT: global_store_dword v[2:3], v0, off3551; GFX10-NEXT: s_setpc_b64 s[30:31]3552;3553; GFX9-LABEL: extract_v256i8:3554; GFX9: ; %bb.0:3555; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3556; GFX9-NEXT: global_load_dword v0, v[0:1], off offset:2523557; GFX9-NEXT: s_mov_b32 s4, 0x60507073558; GFX9-NEXT: s_waitcnt vmcnt(0)3559; GFX9-NEXT: v_perm_b32 v0, v0, v0, s43560; GFX9-NEXT: global_store_dword v[2:3], v0, off3561; GFX9-NEXT: s_waitcnt vmcnt(0)3562; GFX9-NEXT: s_setpc_b64 s[30:31]3563 %vec1 = load <256 x i8>, ptr addrspace(1) %in0, align 43564 %v1e4 = extractelement <256 x i8> %vec1, i64 2553565 %zv1e4 = zext i8 %v1e4 to i323566 %byte1 = shl i32 %zv1e4, 83567 3568 %v1e7 = extractelement <256 x i8> %vec1, i64 2533569 %zv1e7 = zext i8 %v1e7 to i323570 %byte2 = shl i32 %zv1e7, 163571 %v2e1 = extractelement <256 x i8> %vec1, i64 2543572 %zv2e1 = zext i8 %v2e1 to i323573 %byte3 = shl i32 %zv2e1, 243574 3575 %tmp0 = or i32 %zv1e4, %byte13576 %tmp1 = or i32 %tmp0, %byte23577 %res = or i32 %tmp1, %byte33578 store i32 %res, ptr addrspace(1) %out0, align 43579 ret void3580}3581 3582; TODO : support this pattern3583define hidden void @extract_3src(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3584; GFX10-LABEL: extract_3src:3585; GFX10: ; %bb.0:3586; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3587; GFX10-NEXT: global_load_dwordx2 v[6:7], v[0:1], off3588; GFX10-NEXT: global_load_dword v8, v[2:3], off offset:43589; GFX10-NEXT: s_waitcnt vmcnt(1)3590; GFX10-NEXT: v_lshlrev_b32_e32 v0, 8, v73591; GFX10-NEXT: s_waitcnt vmcnt(0)3592; GFX10-NEXT: v_lshlrev_b32_e32 v1, 8, v83593; GFX10-NEXT: v_and_b32_e32 v2, 0xff, v63594; GFX10-NEXT: v_and_b32_e32 v0, 0xff0000, v03595; GFX10-NEXT: v_and_b32_e32 v1, 0xff000000, v13596; GFX10-NEXT: v_lshl_or_b32 v2, v2, 8, v23597; GFX10-NEXT: v_or3_b32 v0, v2, v0, v13598; GFX10-NEXT: global_store_dword v[4:5], v0, off3599; GFX10-NEXT: s_setpc_b64 s[30:31]3600;3601; GFX9-LABEL: extract_3src:3602; GFX9: ; %bb.0:3603; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3604; GFX9-NEXT: global_load_dwordx2 v[6:7], v[0:1], off3605; GFX9-NEXT: global_load_dword v8, v[2:3], off offset:43606; GFX9-NEXT: s_waitcnt vmcnt(1)3607; GFX9-NEXT: v_and_b32_e32 v0, 0xff, v63608; GFX9-NEXT: v_lshlrev_b32_e32 v1, 8, v73609; GFX9-NEXT: s_waitcnt vmcnt(0)3610; GFX9-NEXT: v_lshlrev_b32_e32 v2, 8, v83611; GFX9-NEXT: v_and_b32_e32 v1, 0xff0000, v13612; GFX9-NEXT: v_and_b32_e32 v2, 0xff000000, v23613; GFX9-NEXT: v_lshl_or_b32 v0, v0, 8, v03614; GFX9-NEXT: v_or3_b32 v0, v0, v1, v23615; GFX9-NEXT: global_store_dword v[4:5], v0, off3616; GFX9-NEXT: s_waitcnt vmcnt(0)3617; GFX9-NEXT: s_setpc_b64 s[30:31]3618 %vec1 = load <8 x i8>, ptr addrspace(1) %in0, align 43619 %vec2 = load <8 x i8>, ptr addrspace(1) %in1, align 43620 %v1e0 = extractelement <8 x i8> %vec1, i64 03621 %zv1e0 = zext i8 %v1e0 to i323622 %byte1 = shl i32 %zv1e0, 83623 3624 %v1e5 = extractelement <8 x i8> %vec1, i64 53625 %zv1e5 = zext i8 %v1e5 to i323626 %byte2 = shl i32 %zv1e5, 163627 %v2e6 = extractelement <8 x i8> %vec2, i64 63628 %zv2e6 = zext i8 %v2e6 to i323629 %byte3 = shl i32 %zv2e6, 243630 3631 %tmp0 = or i32 %zv1e0, %byte13632 %tmp1 = or i32 %tmp0, %byte23633 %res = or i32 %tmp1, %byte33634 store i32 %res, ptr addrspace(1) %out0, align 43635 ret void3636}3637 3638; Should not result in crash3639define hidden void @extract_v6i16(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {3640; GFX10-LABEL: extract_v6i16:3641; GFX10: ; %bb.0:3642; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3643; GFX10-NEXT: s_clause 0x33644; GFX10-NEXT: global_load_ushort v2, v[0:1], off offset:63645; GFX10-NEXT: global_load_ushort v3, v[0:1], off3646; GFX10-NEXT: global_load_ushort v8, v[0:1], off offset:23647; GFX10-NEXT: global_load_ushort v9, v[0:1], off offset:43648; GFX10-NEXT: s_waitcnt vmcnt(1)3649; GFX10-NEXT: v_lshl_or_b32 v0, v8, 16, v33650; GFX10-NEXT: s_waitcnt vmcnt(0)3651; GFX10-NEXT: v_lshl_or_b32 v1, v2, 16, v93652; GFX10-NEXT: global_store_dword v[4:5], v0, off3653; GFX10-NEXT: global_store_dword v[6:7], v1, off3654; GFX10-NEXT: s_setpc_b64 s[30:31]3655;3656; GFX9-LABEL: extract_v6i16:3657; GFX9: ; %bb.0:3658; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3659; GFX9-NEXT: global_load_ushort v2, v[0:1], off offset:43660; GFX9-NEXT: global_load_ushort v3, v[0:1], off offset:63661; GFX9-NEXT: global_load_ushort v8, v[0:1], off3662; GFX9-NEXT: global_load_ushort v9, v[0:1], off offset:23663; GFX9-NEXT: s_waitcnt vmcnt(2)3664; GFX9-NEXT: v_lshl_or_b32 v0, v3, 16, v23665; GFX9-NEXT: s_waitcnt vmcnt(0)3666; GFX9-NEXT: v_lshl_or_b32 v1, v9, 16, v83667; GFX9-NEXT: global_store_dword v[4:5], v1, off3668; GFX9-NEXT: global_store_dword v[6:7], v0, off3669; GFX9-NEXT: s_waitcnt vmcnt(0)3670; GFX9-NEXT: s_setpc_b64 s[30:31]3671 %vec = load <6 x i16>, ptr addrspace(1) %in0, align 23672 %el0 = extractelement <6 x i16> %vec, i32 03673 %el1 = extractelement <6 x i16> %vec, i32 13674 %el2 = extractelement <6 x i16> %vec, i32 23675 %el3 = extractelement <6 x i16> %vec, i32 33676 %z0 = zext i16 %el0 to i323677 %z1 = zext i16 %el1 to i323678 %s1 = shl nuw i32 %z1, 163679 %o0 = or i32 %s1, %z03680 %z2 = zext i16 %el2 to i323681 %z3 = zext i16 %el3 to i323682 %s3 = shl nuw i32 %z3, 163683 %o1 = or i32 %z2, %s33684 3685 store i32 %o0, ptr addrspace(1) %out0, align 43686 store i32 %o1, ptr addrspace(1) %out1, align 43687 ret void3688}3689 3690 3691; Should not result in crash3692define hidden void @extract_v7i16(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {3693; GFX10-LABEL: extract_v7i16:3694; GFX10: ; %bb.0:3695; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3696; GFX10-NEXT: global_load_dwordx2 v[0:1], v[0:1], off3697; GFX10-NEXT: s_waitcnt vmcnt(0)3698; GFX10-NEXT: global_store_dword v[4:5], v0, off3699; GFX10-NEXT: global_store_dword v[6:7], v1, off3700; GFX10-NEXT: s_setpc_b64 s[30:31]3701;3702; GFX9-LABEL: extract_v7i16:3703; GFX9: ; %bb.0:3704; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3705; GFX9-NEXT: global_load_dwordx2 v[0:1], v[0:1], off3706; GFX9-NEXT: s_waitcnt vmcnt(0)3707; GFX9-NEXT: global_store_dword v[4:5], v0, off3708; GFX9-NEXT: global_store_dword v[6:7], v1, off3709; GFX9-NEXT: s_waitcnt vmcnt(0)3710; GFX9-NEXT: s_setpc_b64 s[30:31]3711 %vec = load <7 x i16>, ptr addrspace(1) %in0, align 23712 %el0 = extractelement <7 x i16> %vec, i32 03713 %el1 = extractelement <7 x i16> %vec, i32 13714 %el2 = extractelement <7 x i16> %vec, i32 23715 %el3 = extractelement <7 x i16> %vec, i32 33716 %z0 = zext i16 %el0 to i323717 %z1 = zext i16 %el1 to i323718 %s1 = shl nuw i32 %z1, 163719 %o0 = or i32 %s1, %z03720 %z2 = zext i16 %el2 to i323721 %z3 = zext i16 %el3 to i323722 %s3 = shl nuw i32 %z3, 163723 %o1 = or i32 %z2, %s33724 3725 store i32 %o0, ptr addrspace(1) %out0, align 43726 store i32 %o1, ptr addrspace(1) %out1, align 43727 ret void3728}3729 3730; Should not result in crash3731define hidden void @extract_v13i8(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {3732; GFX10-LABEL: extract_v13i8:3733; GFX10: ; %bb.0:3734; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3735; GFX10-NEXT: s_clause 0x13736; GFX10-NEXT: global_load_dwordx2 v[2:3], v[0:1], off3737; GFX10-NEXT: global_load_ushort v8, v[0:1], off offset:83738; GFX10-NEXT: s_waitcnt vmcnt(1)3739; GFX10-NEXT: v_bfe_u32 v0, v2, 8, 83740; GFX10-NEXT: s_waitcnt vmcnt(0)3741; GFX10-NEXT: v_and_b32_e32 v1, 0xff, v83742; GFX10-NEXT: v_perm_b32 v0, v0, v2, 0x5040c003743; GFX10-NEXT: v_perm_b32 v1, v1, v3, 0x5040c033744; GFX10-NEXT: global_store_dword v[4:5], v0, off3745; GFX10-NEXT: global_store_dword v[6:7], v1, off3746; GFX10-NEXT: s_setpc_b64 s[30:31]3747;3748; GFX9-LABEL: extract_v13i8:3749; GFX9: ; %bb.0:3750; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3751; GFX9-NEXT: global_load_dwordx2 v[2:3], v[0:1], off3752; GFX9-NEXT: global_load_ushort v8, v[0:1], off offset:83753; GFX9-NEXT: s_mov_b32 s4, 0x5040c003754; GFX9-NEXT: s_mov_b32 s5, 0x5040c033755; GFX9-NEXT: s_waitcnt vmcnt(1)3756; GFX9-NEXT: v_bfe_u32 v0, v2, 8, 83757; GFX9-NEXT: s_waitcnt vmcnt(0)3758; GFX9-NEXT: v_and_b32_e32 v1, 0xff, v83759; GFX9-NEXT: v_perm_b32 v0, v0, v2, s43760; GFX9-NEXT: v_perm_b32 v1, v1, v3, s53761; GFX9-NEXT: global_store_dword v[4:5], v0, off3762; GFX9-NEXT: global_store_dword v[6:7], v1, off3763; GFX9-NEXT: s_waitcnt vmcnt(0)3764; GFX9-NEXT: s_setpc_b64 s[30:31]3765 %vec = load <13 x i8>, ptr addrspace(1) %in0, align 23766 %el0 = extractelement <13 x i8> %vec, i32 03767 %el1 = extractelement <13 x i8> %vec, i32 13768 %el2 = extractelement <13 x i8> %vec, i32 73769 %el3 = extractelement <13 x i8> %vec, i32 83770 %z0 = zext i8 %el0 to i323771 %z1 = zext i8 %el1 to i323772 %s1 = shl nuw i32 %z1, 163773 %o0 = or i32 %s1, %z03774 %z2 = zext i8 %el2 to i323775 %z3 = zext i8 %el3 to i323776 %s3 = shl nuw i32 %z3, 163777 %o1 = or i32 %z2, %s33778 3779 store i32 %o0, ptr addrspace(1) %out0, align 43780 store i32 %o1, ptr addrspace(1) %out1, align 43781 ret void3782}3783 3784; Should not result in crash3785define hidden void @extract_v13i64(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0, ptr addrspace(1) %out1) {3786; GFX10-LABEL: extract_v13i64:3787; GFX10: ; %bb.0:3788; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3789; GFX10-NEXT: s_clause 0x23790; GFX10-NEXT: global_load_dwordx4 v[8:11], v[0:1], off offset:483791; GFX10-NEXT: global_load_dwordx4 v[11:14], v[0:1], off3792; GFX10-NEXT: global_load_dwordx4 v[14:17], v[0:1], off offset:643793; GFX10-NEXT: ; kill: killed $vgpr0 killed $vgpr13794; GFX10-NEXT: s_waitcnt vmcnt(1)3795; GFX10-NEXT: v_perm_b32 v0, v12, v13, 0x10005043796; GFX10-NEXT: s_waitcnt vmcnt(0)3797; GFX10-NEXT: v_perm_b32 v1, v10, v14, 0x10005043798; GFX10-NEXT: global_store_dword v[4:5], v0, off3799; GFX10-NEXT: global_store_dword v[6:7], v1, off3800; GFX10-NEXT: s_setpc_b64 s[30:31]3801;3802; GFX9-LABEL: extract_v13i64:3803; GFX9: ; %bb.0:3804; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3805; GFX9-NEXT: global_load_dwordx4 v[8:11], v[0:1], off offset:483806; GFX9-NEXT: global_load_dwordx4 v[11:14], v[0:1], off3807; GFX9-NEXT: global_load_dwordx4 v[14:17], v[0:1], off offset:643808; GFX9-NEXT: s_mov_b32 s4, 0x10005043809; GFX9-NEXT: ; kill: killed $vgpr0 killed $vgpr13810; GFX9-NEXT: s_waitcnt vmcnt(1)3811; GFX9-NEXT: v_perm_b32 v0, v12, v13, s43812; GFX9-NEXT: s_waitcnt vmcnt(0)3813; GFX9-NEXT: v_perm_b32 v1, v10, v14, s43814; GFX9-NEXT: global_store_dword v[4:5], v0, off3815; GFX9-NEXT: global_store_dword v[6:7], v1, off3816; GFX9-NEXT: s_waitcnt vmcnt(0)3817; GFX9-NEXT: s_setpc_b64 s[30:31]3818 %vec = load <13 x i64>, ptr addrspace(1) %in0, align 23819 %el0 = extractelement <13 x i64> %vec, i32 03820 %el1 = extractelement <13 x i64> %vec, i32 13821 %el2 = extractelement <13 x i64> %vec, i32 73822 %el3 = extractelement <13 x i64> %vec, i32 83823 %el00 = lshr i64 %el0, 323824 %t0 = trunc i64 %el00 to i163825 %z0 = zext i16 %t0 to i323826 %z1 = trunc i64 %el1 to i323827 %s1 = shl nuw i32 %z1, 163828 %o0 = or i32 %s1, %z03829 %t2 = trunc i64 %el2 to i163830 %z2 = zext i16 %t2 to i323831 %z3 = trunc i64 %el3 to i323832 %s3 = shl nuw i32 %z3, 163833 %o1 = or i32 %z2, %s33834 3835 store i32 %o0, ptr addrspace(1) %out0, align 43836 store i32 %o1, ptr addrspace(1) %out1, align 43837 ret void3838}3839 3840 3841; Should combine the lower 16 bits from each i32 in load3842define hidden void @trunc_vector(ptr addrspace(1) %in0, ptr addrspace(1) %in1, ptr addrspace(1) %out0) {3843; GFX10-LABEL: trunc_vector:3844; GFX10: ; %bb.0:3845; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3846; GFX10-NEXT: s_clause 0x13847; GFX10-NEXT: global_load_ushort v2, v[0:1], off3848; GFX10-NEXT: global_load_short_d16_hi v2, v[0:1], off offset:43849; GFX10-NEXT: s_waitcnt vmcnt(0)3850; GFX10-NEXT: global_store_dword v[4:5], v2, off3851; GFX10-NEXT: s_setpc_b64 s[30:31]3852;3853; GFX9-LABEL: trunc_vector:3854; GFX9: ; %bb.0:3855; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3856; GFX9-NEXT: global_load_ushort v2, v[0:1], off3857; GFX9-NEXT: global_load_ushort v3, v[0:1], off offset:43858; GFX9-NEXT: s_mov_b32 s4, 0x50401003859; GFX9-NEXT: s_waitcnt vmcnt(0)3860; GFX9-NEXT: v_perm_b32 v0, v3, v2, s43861; GFX9-NEXT: global_store_dword v[4:5], v0, off3862; GFX9-NEXT: s_waitcnt vmcnt(0)3863; GFX9-NEXT: s_setpc_b64 s[30:31]3864 %vec = load <2 x i32>, ptr addrspace(1) %in0, align 23865 %tvec = trunc <2 x i32> %vec to <2 x i16>3866 %el0 = extractelement <2 x i16> %tvec, i32 03867 %el1 = extractelement <2 x i16> %tvec, i32 13868 %z0 = zext i16 %el0 to i323869 %z1 = zext i16 %el1 to i323870 %s1 = shl nuw i32 %z1, 163871 %o0 = or i32 %s1, %z03872 3873 store i32 %o0, ptr addrspace(1) %out0, align 43874 ret void3875}3876