1621 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 -mtriple=wasm32-unknown-unknown | FileCheck %s3; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 -mtriple=wasm64-unknown-unknown | FileCheck %s --check-prefix MEM644 5; Test SIMD v128.load{8,16,32,64}_lane instructions.6 7; TODO: Use the offset field by supporting more patterns. Right now only the8; equivalents of LoadPatNoOffset/StorePatNoOffset are supported.9 10;===----------------------------------------------------------------------------11; v128.load8_lane / v128.store8_lane12;===----------------------------------------------------------------------------13 14define <16 x i8> @load_lane_i8_no_offset(ptr %p, <16 x i8> %v) {15; CHECK-LABEL: load_lane_i8_no_offset:16; CHECK: .functype load_lane_i8_no_offset (i32, v128) -> (v128)17; CHECK-NEXT: # %bb.0:18; CHECK-NEXT: local.get 019; CHECK-NEXT: local.get 120; CHECK-NEXT: v128.load8_lane 0, 021; CHECK-NEXT: # fallthrough-return22;23; MEM64-LABEL: load_lane_i8_no_offset:24; MEM64: .functype load_lane_i8_no_offset (i64, v128) -> (v128)25; MEM64-NEXT: # %bb.0:26; MEM64-NEXT: local.get 027; MEM64-NEXT: local.get 128; MEM64-NEXT: v128.load8_lane 0, 029; MEM64-NEXT: # fallthrough-return30 %x = load i8, ptr %p31 %t = insertelement <16 x i8> %v, i8 %x, i32 032 ret <16 x i8> %t33}34 35define <16 x i8> @load_lane_i8_with_folded_offset(ptr %p, <16 x i8> %v) {36; CHECK-LABEL: load_lane_i8_with_folded_offset:37; CHECK: .functype load_lane_i8_with_folded_offset (i32, v128) -> (v128)38; CHECK-NEXT: # %bb.0:39; CHECK-NEXT: local.get 040; CHECK-NEXT: i32.const 2441; CHECK-NEXT: i32.add42; CHECK-NEXT: local.get 143; CHECK-NEXT: v128.load8_lane 0, 044; CHECK-NEXT: # fallthrough-return45;46; MEM64-LABEL: load_lane_i8_with_folded_offset:47; MEM64: .functype load_lane_i8_with_folded_offset (i64, v128) -> (v128)48; MEM64-NEXT: # %bb.0:49; MEM64-NEXT: local.get 050; MEM64-NEXT: i32.wrap_i6451; MEM64-NEXT: i32.const 2452; MEM64-NEXT: i32.add53; MEM64-NEXT: i64.extend_i32_u54; MEM64-NEXT: local.get 155; MEM64-NEXT: v128.load8_lane 0, 056; MEM64-NEXT: # fallthrough-return57 %q = ptrtoint ptr %p to i3258 %r = add nuw i32 %q, 2459 %s = inttoptr i32 %r to ptr60 %x = load i8, ptr %s61 %t = insertelement <16 x i8> %v, i8 %x, i32 062 ret <16 x i8> %t63}64 65define <16 x i8> @load_lane_i8_with_folded_gep_offset(ptr %p, <16 x i8> %v) {66; CHECK-LABEL: load_lane_i8_with_folded_gep_offset:67; CHECK: .functype load_lane_i8_with_folded_gep_offset (i32, v128) -> (v128)68; CHECK-NEXT: # %bb.0:69; CHECK-NEXT: local.get 070; CHECK-NEXT: i32.const 671; CHECK-NEXT: i32.add72; CHECK-NEXT: local.get 173; CHECK-NEXT: v128.load8_lane 0, 074; CHECK-NEXT: # fallthrough-return75;76; MEM64-LABEL: load_lane_i8_with_folded_gep_offset:77; MEM64: .functype load_lane_i8_with_folded_gep_offset (i64, v128) -> (v128)78; MEM64-NEXT: # %bb.0:79; MEM64-NEXT: local.get 080; MEM64-NEXT: i64.const 681; MEM64-NEXT: i64.add82; MEM64-NEXT: local.get 183; MEM64-NEXT: v128.load8_lane 0, 084; MEM64-NEXT: # fallthrough-return85 %s = getelementptr inbounds i8, ptr %p, i32 686 %x = load i8, ptr %s87 %t = insertelement <16 x i8> %v, i8 %x, i32 088 ret <16 x i8> %t89}90 91define <16 x i8> @load_lane_i8_with_unfolded_gep_negative_offset(ptr %p, <16 x i8> %v) {92; CHECK-LABEL: load_lane_i8_with_unfolded_gep_negative_offset:93; CHECK: .functype load_lane_i8_with_unfolded_gep_negative_offset (i32, v128) -> (v128)94; CHECK-NEXT: # %bb.0:95; CHECK-NEXT: local.get 096; CHECK-NEXT: i32.const -697; CHECK-NEXT: i32.add98; CHECK-NEXT: local.get 199; CHECK-NEXT: v128.load8_lane 0, 0100; CHECK-NEXT: # fallthrough-return101;102; MEM64-LABEL: load_lane_i8_with_unfolded_gep_negative_offset:103; MEM64: .functype load_lane_i8_with_unfolded_gep_negative_offset (i64, v128) -> (v128)104; MEM64-NEXT: # %bb.0:105; MEM64-NEXT: local.get 0106; MEM64-NEXT: i64.const -6107; MEM64-NEXT: i64.add108; MEM64-NEXT: local.get 1109; MEM64-NEXT: v128.load8_lane 0, 0110; MEM64-NEXT: # fallthrough-return111 %s = getelementptr inbounds i8, ptr %p, i32 -6112 %x = load i8, ptr %s113 %t = insertelement <16 x i8> %v, i8 %x, i32 0114 ret <16 x i8> %t115}116 117define <16 x i8> @load_lane_i8_with_unfolded_offset(ptr %p, <16 x i8> %v) {118; CHECK-LABEL: load_lane_i8_with_unfolded_offset:119; CHECK: .functype load_lane_i8_with_unfolded_offset (i32, v128) -> (v128)120; CHECK-NEXT: # %bb.0:121; CHECK-NEXT: local.get 0122; CHECK-NEXT: i32.const 24123; CHECK-NEXT: i32.add124; CHECK-NEXT: local.get 1125; CHECK-NEXT: v128.load8_lane 0, 0126; CHECK-NEXT: # fallthrough-return127;128; MEM64-LABEL: load_lane_i8_with_unfolded_offset:129; MEM64: .functype load_lane_i8_with_unfolded_offset (i64, v128) -> (v128)130; MEM64-NEXT: # %bb.0:131; MEM64-NEXT: local.get 0132; MEM64-NEXT: i32.wrap_i64133; MEM64-NEXT: i32.const 24134; MEM64-NEXT: i32.add135; MEM64-NEXT: i64.extend_i32_u136; MEM64-NEXT: local.get 1137; MEM64-NEXT: v128.load8_lane 0, 0138; MEM64-NEXT: # fallthrough-return139 %q = ptrtoint ptr %p to i32140 %r = add nsw i32 %q, 24141 %s = inttoptr i32 %r to ptr142 %x = load i8, ptr %s143 %t = insertelement <16 x i8> %v, i8 %x, i32 0144 ret <16 x i8> %t145}146 147define <16 x i8> @load_lane_i8_with_unfolded_gep_offset(ptr %p, <16 x i8> %v) {148; CHECK-LABEL: load_lane_i8_with_unfolded_gep_offset:149; CHECK: .functype load_lane_i8_with_unfolded_gep_offset (i32, v128) -> (v128)150; CHECK-NEXT: # %bb.0:151; CHECK-NEXT: local.get 0152; CHECK-NEXT: i32.const 6153; CHECK-NEXT: i32.add154; CHECK-NEXT: local.get 1155; CHECK-NEXT: v128.load8_lane 0, 0156; CHECK-NEXT: # fallthrough-return157;158; MEM64-LABEL: load_lane_i8_with_unfolded_gep_offset:159; MEM64: .functype load_lane_i8_with_unfolded_gep_offset (i64, v128) -> (v128)160; MEM64-NEXT: # %bb.0:161; MEM64-NEXT: local.get 0162; MEM64-NEXT: i64.const 6163; MEM64-NEXT: i64.add164; MEM64-NEXT: local.get 1165; MEM64-NEXT: v128.load8_lane 0, 0166; MEM64-NEXT: # fallthrough-return167 %s = getelementptr i8, ptr %p, i32 6168 %x = load i8, ptr %s169 %t = insertelement <16 x i8> %v, i8 %x, i32 0170 ret <16 x i8> %t171}172 173define <16 x i8> @load_lane_i8_from_numeric_address(<16 x i8> %v) {174; CHECK-LABEL: load_lane_i8_from_numeric_address:175; CHECK: .functype load_lane_i8_from_numeric_address (v128) -> (v128)176; CHECK-NEXT: # %bb.0:177; CHECK-NEXT: i32.const 42178; CHECK-NEXT: local.get 0179; CHECK-NEXT: v128.load8_lane 0, 0180; CHECK-NEXT: # fallthrough-return181;182; MEM64-LABEL: load_lane_i8_from_numeric_address:183; MEM64: .functype load_lane_i8_from_numeric_address (v128) -> (v128)184; MEM64-NEXT: # %bb.0:185; MEM64-NEXT: i64.const 42186; MEM64-NEXT: local.get 0187; MEM64-NEXT: v128.load8_lane 0, 0188; MEM64-NEXT: # fallthrough-return189 %s = inttoptr i32 42 to ptr190 %x = load i8, ptr %s191 %t = insertelement <16 x i8> %v, i8 %x, i32 0192 ret <16 x i8> %t193}194 195@gv_i8 = global i8 0196define <16 x i8> @load_lane_i8_from_global_address(<16 x i8> %v) {197; CHECK-LABEL: load_lane_i8_from_global_address:198; CHECK: .functype load_lane_i8_from_global_address (v128) -> (v128)199; CHECK-NEXT: # %bb.0:200; CHECK-NEXT: i32.const gv_i8201; CHECK-NEXT: local.get 0202; CHECK-NEXT: v128.load8_lane 0, 0203; CHECK-NEXT: # fallthrough-return204;205; MEM64-LABEL: load_lane_i8_from_global_address:206; MEM64: .functype load_lane_i8_from_global_address (v128) -> (v128)207; MEM64-NEXT: # %bb.0:208; MEM64-NEXT: i64.const gv_i8209; MEM64-NEXT: local.get 0210; MEM64-NEXT: v128.load8_lane 0, 0211; MEM64-NEXT: # fallthrough-return212 %x = load i8, ptr @gv_i8213 %t = insertelement <16 x i8> %v, i8 %x, i32 0214 ret <16 x i8> %t215}216 217define void @store_lane_i8_no_offset(<16 x i8> %v, ptr %p) {218; CHECK-LABEL: store_lane_i8_no_offset:219; CHECK: .functype store_lane_i8_no_offset (v128, i32) -> ()220; CHECK-NEXT: # %bb.0:221; CHECK-NEXT: local.get 1222; CHECK-NEXT: local.get 0223; CHECK-NEXT: v128.store8_lane 0, 0224; CHECK-NEXT: # fallthrough-return225;226; MEM64-LABEL: store_lane_i8_no_offset:227; MEM64: .functype store_lane_i8_no_offset (v128, i64) -> ()228; MEM64-NEXT: # %bb.0:229; MEM64-NEXT: local.get 1230; MEM64-NEXT: local.get 0231; MEM64-NEXT: v128.store8_lane 0, 0232; MEM64-NEXT: # fallthrough-return233 %x = extractelement <16 x i8> %v, i32 0234 store i8 %x, ptr %p235 ret void236}237 238define void @store_lane_i8_with_folded_offset(<16 x i8> %v, ptr %p) {239; CHECK-LABEL: store_lane_i8_with_folded_offset:240; CHECK: .functype store_lane_i8_with_folded_offset (v128, i32) -> ()241; CHECK-NEXT: # %bb.0:242; CHECK-NEXT: local.get 1243; CHECK-NEXT: local.get 0244; CHECK-NEXT: v128.store8_lane 24, 0245; CHECK-NEXT: # fallthrough-return246;247; MEM64-LABEL: store_lane_i8_with_folded_offset:248; MEM64: .functype store_lane_i8_with_folded_offset (v128, i64) -> ()249; MEM64-NEXT: # %bb.0:250; MEM64-NEXT: local.get 1251; MEM64-NEXT: i32.wrap_i64252; MEM64-NEXT: i32.const 24253; MEM64-NEXT: i32.add254; MEM64-NEXT: i64.extend_i32_u255; MEM64-NEXT: local.get 0256; MEM64-NEXT: v128.store8_lane 0, 0257; MEM64-NEXT: # fallthrough-return258 %q = ptrtoint ptr %p to i32259 %r = add nuw i32 %q, 24260 %s = inttoptr i32 %r to ptr261 %x = extractelement <16 x i8> %v, i32 0262 store i8 %x, ptr %s263 ret void264}265 266define void @store_lane_i8_with_folded_gep_offset(<16 x i8> %v, ptr %p) {267; CHECK-LABEL: store_lane_i8_with_folded_gep_offset:268; CHECK: .functype store_lane_i8_with_folded_gep_offset (v128, i32) -> ()269; CHECK-NEXT: # %bb.0:270; CHECK-NEXT: local.get 1271; CHECK-NEXT: local.get 0272; CHECK-NEXT: v128.store8_lane 6, 0273; CHECK-NEXT: # fallthrough-return274;275; MEM64-LABEL: store_lane_i8_with_folded_gep_offset:276; MEM64: .functype store_lane_i8_with_folded_gep_offset (v128, i64) -> ()277; MEM64-NEXT: # %bb.0:278; MEM64-NEXT: local.get 1279; MEM64-NEXT: local.get 0280; MEM64-NEXT: v128.store8_lane 6, 0281; MEM64-NEXT: # fallthrough-return282 %s = getelementptr inbounds i8, ptr %p, i32 6283 %x = extractelement <16 x i8> %v, i32 0284 store i8 %x, ptr %s285 ret void286}287 288define void @store_lane_i8_with_unfolded_gep_negative_offset(<16 x i8> %v, ptr %p) {289; CHECK-LABEL: store_lane_i8_with_unfolded_gep_negative_offset:290; CHECK: .functype store_lane_i8_with_unfolded_gep_negative_offset (v128, i32) -> ()291; CHECK-NEXT: # %bb.0:292; CHECK-NEXT: local.get 1293; CHECK-NEXT: i32.const -6294; CHECK-NEXT: i32.add295; CHECK-NEXT: local.get 0296; CHECK-NEXT: v128.store8_lane 0, 0297; CHECK-NEXT: # fallthrough-return298;299; MEM64-LABEL: store_lane_i8_with_unfolded_gep_negative_offset:300; MEM64: .functype store_lane_i8_with_unfolded_gep_negative_offset (v128, i64) -> ()301; MEM64-NEXT: # %bb.0:302; MEM64-NEXT: local.get 1303; MEM64-NEXT: i64.const -6304; MEM64-NEXT: i64.add305; MEM64-NEXT: local.get 0306; MEM64-NEXT: v128.store8_lane 0, 0307; MEM64-NEXT: # fallthrough-return308 %s = getelementptr inbounds i8, ptr %p, i32 -6309 %x = extractelement <16 x i8> %v, i32 0310 store i8 %x, ptr %s311 ret void312}313 314define void @store_lane_i8_with_unfolded_offset(<16 x i8> %v, ptr %p) {315; CHECK-LABEL: store_lane_i8_with_unfolded_offset:316; CHECK: .functype store_lane_i8_with_unfolded_offset (v128, i32) -> ()317; CHECK-NEXT: # %bb.0:318; CHECK-NEXT: local.get 1319; CHECK-NEXT: i32.const 24320; CHECK-NEXT: i32.add321; CHECK-NEXT: local.get 0322; CHECK-NEXT: v128.store8_lane 0, 0323; CHECK-NEXT: # fallthrough-return324;325; MEM64-LABEL: store_lane_i8_with_unfolded_offset:326; MEM64: .functype store_lane_i8_with_unfolded_offset (v128, i64) -> ()327; MEM64-NEXT: # %bb.0:328; MEM64-NEXT: local.get 1329; MEM64-NEXT: i32.wrap_i64330; MEM64-NEXT: i32.const 24331; MEM64-NEXT: i32.add332; MEM64-NEXT: i64.extend_i32_u333; MEM64-NEXT: local.get 0334; MEM64-NEXT: v128.store8_lane 0, 0335; MEM64-NEXT: # fallthrough-return336 %q = ptrtoint ptr %p to i32337 %r = add nsw i32 %q, 24338 %s = inttoptr i32 %r to ptr339 %x = extractelement <16 x i8> %v, i32 0340 store i8 %x, ptr %s341 ret void342}343 344define void @store_lane_i8_with_unfolded_gep_offset(<16 x i8> %v, ptr %p) {345; CHECK-LABEL: store_lane_i8_with_unfolded_gep_offset:346; CHECK: .functype store_lane_i8_with_unfolded_gep_offset (v128, i32) -> ()347; CHECK-NEXT: # %bb.0:348; CHECK-NEXT: local.get 1349; CHECK-NEXT: i32.const 6350; CHECK-NEXT: i32.add351; CHECK-NEXT: local.get 0352; CHECK-NEXT: v128.store8_lane 0, 0353; CHECK-NEXT: # fallthrough-return354;355; MEM64-LABEL: store_lane_i8_with_unfolded_gep_offset:356; MEM64: .functype store_lane_i8_with_unfolded_gep_offset (v128, i64) -> ()357; MEM64-NEXT: # %bb.0:358; MEM64-NEXT: local.get 1359; MEM64-NEXT: i64.const 6360; MEM64-NEXT: i64.add361; MEM64-NEXT: local.get 0362; MEM64-NEXT: v128.store8_lane 0, 0363; MEM64-NEXT: # fallthrough-return364 %s = getelementptr i8, ptr %p, i32 6365 %x = extractelement <16 x i8> %v, i32 0366 store i8 %x, ptr %s367 ret void368}369 370define void @store_lane_i8_to_numeric_address(<16 x i8> %v) {371; CHECK-LABEL: store_lane_i8_to_numeric_address:372; CHECK: .functype store_lane_i8_to_numeric_address (v128) -> ()373; CHECK-NEXT: # %bb.0:374; CHECK-NEXT: i32.const 0375; CHECK-NEXT: local.get 0376; CHECK-NEXT: v128.store8_lane 42, 0377; CHECK-NEXT: # fallthrough-return378;379; MEM64-LABEL: store_lane_i8_to_numeric_address:380; MEM64: .functype store_lane_i8_to_numeric_address (v128) -> ()381; MEM64-NEXT: # %bb.0:382; MEM64-NEXT: i64.const 0383; MEM64-NEXT: local.get 0384; MEM64-NEXT: v128.store8_lane 42, 0385; MEM64-NEXT: # fallthrough-return386 %s = inttoptr i32 42 to ptr387 %x = extractelement <16 x i8> %v, i32 0388 store i8 %x, ptr %s389 ret void390}391 392define void @store_lane_i8_from_global_address(<16 x i8> %v) {393; CHECK-LABEL: store_lane_i8_from_global_address:394; CHECK: .functype store_lane_i8_from_global_address (v128) -> ()395; CHECK-NEXT: # %bb.0:396; CHECK-NEXT: i32.const 0397; CHECK-NEXT: local.get 0398; CHECK-NEXT: v128.store8_lane gv_i8, 0399; CHECK-NEXT: # fallthrough-return400;401; MEM64-LABEL: store_lane_i8_from_global_address:402; MEM64: .functype store_lane_i8_from_global_address (v128) -> ()403; MEM64-NEXT: # %bb.0:404; MEM64-NEXT: i64.const 0405; MEM64-NEXT: local.get 0406; MEM64-NEXT: v128.store8_lane gv_i8, 0407; MEM64-NEXT: # fallthrough-return408 %x = extractelement <16 x i8> %v, i32 0409 store i8 %x, ptr @gv_i8410 ret void411}412 413;===----------------------------------------------------------------------------414; v128.load16_lane / v128.store16_lane415;===----------------------------------------------------------------------------416 417define <8 x i16> @load_lane_i16_no_offset(ptr %p, <8 x i16> %v) {418; CHECK-LABEL: load_lane_i16_no_offset:419; CHECK: .functype load_lane_i16_no_offset (i32, v128) -> (v128)420; CHECK-NEXT: # %bb.0:421; CHECK-NEXT: local.get 0422; CHECK-NEXT: local.get 1423; CHECK-NEXT: v128.load16_lane 0, 0424; CHECK-NEXT: # fallthrough-return425;426; MEM64-LABEL: load_lane_i16_no_offset:427; MEM64: .functype load_lane_i16_no_offset (i64, v128) -> (v128)428; MEM64-NEXT: # %bb.0:429; MEM64-NEXT: local.get 0430; MEM64-NEXT: local.get 1431; MEM64-NEXT: v128.load16_lane 0, 0432; MEM64-NEXT: # fallthrough-return433 %x = load i16, ptr %p434 %t = insertelement <8 x i16> %v, i16 %x, i32 0435 ret <8 x i16> %t436}437 438define <8 x i16> @load_lane_i16_with_folded_offset(ptr %p, <8 x i16> %v) {439; CHECK-LABEL: load_lane_i16_with_folded_offset:440; CHECK: .functype load_lane_i16_with_folded_offset (i32, v128) -> (v128)441; CHECK-NEXT: # %bb.0:442; CHECK-NEXT: local.get 0443; CHECK-NEXT: i32.const 24444; CHECK-NEXT: i32.add445; CHECK-NEXT: local.get 1446; CHECK-NEXT: v128.load16_lane 0, 0447; CHECK-NEXT: # fallthrough-return448;449; MEM64-LABEL: load_lane_i16_with_folded_offset:450; MEM64: .functype load_lane_i16_with_folded_offset (i64, v128) -> (v128)451; MEM64-NEXT: # %bb.0:452; MEM64-NEXT: local.get 0453; MEM64-NEXT: i32.wrap_i64454; MEM64-NEXT: i32.const 24455; MEM64-NEXT: i32.add456; MEM64-NEXT: i64.extend_i32_u457; MEM64-NEXT: local.get 1458; MEM64-NEXT: v128.load16_lane 0, 0459; MEM64-NEXT: # fallthrough-return460 %q = ptrtoint ptr %p to i32461 %r = add nuw i32 %q, 24462 %s = inttoptr i32 %r to ptr463 %x = load i16, ptr %s464 %t = insertelement <8 x i16> %v, i16 %x, i32 0465 ret <8 x i16> %t466}467 468define <8 x i16> @load_lane_i16_with_folded_gep_offset(ptr %p, <8 x i16> %v) {469; CHECK-LABEL: load_lane_i16_with_folded_gep_offset:470; CHECK: .functype load_lane_i16_with_folded_gep_offset (i32, v128) -> (v128)471; CHECK-NEXT: # %bb.0:472; CHECK-NEXT: local.get 0473; CHECK-NEXT: i32.const 12474; CHECK-NEXT: i32.add475; CHECK-NEXT: local.get 1476; CHECK-NEXT: v128.load16_lane 0, 0477; CHECK-NEXT: # fallthrough-return478;479; MEM64-LABEL: load_lane_i16_with_folded_gep_offset:480; MEM64: .functype load_lane_i16_with_folded_gep_offset (i64, v128) -> (v128)481; MEM64-NEXT: # %bb.0:482; MEM64-NEXT: local.get 0483; MEM64-NEXT: i64.const 12484; MEM64-NEXT: i64.add485; MEM64-NEXT: local.get 1486; MEM64-NEXT: v128.load16_lane 0, 0487; MEM64-NEXT: # fallthrough-return488 %s = getelementptr inbounds i16, ptr %p, i32 6489 %x = load i16, ptr %s490 %t = insertelement <8 x i16> %v, i16 %x, i32 0491 ret <8 x i16> %t492}493 494define <8 x i16> @load_lane_i16_with_unfolded_gep_negative_offset(ptr %p, <8 x i16> %v) {495; CHECK-LABEL: load_lane_i16_with_unfolded_gep_negative_offset:496; CHECK: .functype load_lane_i16_with_unfolded_gep_negative_offset (i32, v128) -> (v128)497; CHECK-NEXT: # %bb.0:498; CHECK-NEXT: local.get 0499; CHECK-NEXT: i32.const -12500; CHECK-NEXT: i32.add501; CHECK-NEXT: local.get 1502; CHECK-NEXT: v128.load16_lane 0, 0503; CHECK-NEXT: # fallthrough-return504;505; MEM64-LABEL: load_lane_i16_with_unfolded_gep_negative_offset:506; MEM64: .functype load_lane_i16_with_unfolded_gep_negative_offset (i64, v128) -> (v128)507; MEM64-NEXT: # %bb.0:508; MEM64-NEXT: local.get 0509; MEM64-NEXT: i64.const -12510; MEM64-NEXT: i64.add511; MEM64-NEXT: local.get 1512; MEM64-NEXT: v128.load16_lane 0, 0513; MEM64-NEXT: # fallthrough-return514 %s = getelementptr inbounds i16, ptr %p, i32 -6515 %x = load i16, ptr %s516 %t = insertelement <8 x i16> %v, i16 %x, i32 0517 ret <8 x i16> %t518}519 520define <8 x i16> @load_lane_i16_with_unfolded_offset(ptr %p, <8 x i16> %v) {521; CHECK-LABEL: load_lane_i16_with_unfolded_offset:522; CHECK: .functype load_lane_i16_with_unfolded_offset (i32, v128) -> (v128)523; CHECK-NEXT: # %bb.0:524; CHECK-NEXT: local.get 0525; CHECK-NEXT: i32.const 24526; CHECK-NEXT: i32.add527; CHECK-NEXT: local.get 1528; CHECK-NEXT: v128.load16_lane 0, 0529; CHECK-NEXT: # fallthrough-return530;531; MEM64-LABEL: load_lane_i16_with_unfolded_offset:532; MEM64: .functype load_lane_i16_with_unfolded_offset (i64, v128) -> (v128)533; MEM64-NEXT: # %bb.0:534; MEM64-NEXT: local.get 0535; MEM64-NEXT: i32.wrap_i64536; MEM64-NEXT: i32.const 24537; MEM64-NEXT: i32.add538; MEM64-NEXT: i64.extend_i32_u539; MEM64-NEXT: local.get 1540; MEM64-NEXT: v128.load16_lane 0, 0541; MEM64-NEXT: # fallthrough-return542 %q = ptrtoint ptr %p to i32543 %r = add nsw i32 %q, 24544 %s = inttoptr i32 %r to ptr545 %x = load i16, ptr %s546 %t = insertelement <8 x i16> %v, i16 %x, i32 0547 ret <8 x i16> %t548}549 550define <8 x i16> @load_lane_i16_with_unfolded_gep_offset(ptr %p, <8 x i16> %v) {551; CHECK-LABEL: load_lane_i16_with_unfolded_gep_offset:552; CHECK: .functype load_lane_i16_with_unfolded_gep_offset (i32, v128) -> (v128)553; CHECK-NEXT: # %bb.0:554; CHECK-NEXT: local.get 0555; CHECK-NEXT: i32.const 12556; CHECK-NEXT: i32.add557; CHECK-NEXT: local.get 1558; CHECK-NEXT: v128.load16_lane 0, 0559; CHECK-NEXT: # fallthrough-return560;561; MEM64-LABEL: load_lane_i16_with_unfolded_gep_offset:562; MEM64: .functype load_lane_i16_with_unfolded_gep_offset (i64, v128) -> (v128)563; MEM64-NEXT: # %bb.0:564; MEM64-NEXT: local.get 0565; MEM64-NEXT: i64.const 12566; MEM64-NEXT: i64.add567; MEM64-NEXT: local.get 1568; MEM64-NEXT: v128.load16_lane 0, 0569; MEM64-NEXT: # fallthrough-return570 %s = getelementptr i16, ptr %p, i32 6571 %x = load i16, ptr %s572 %t = insertelement <8 x i16> %v, i16 %x, i32 0573 ret <8 x i16> %t574}575 576define <8 x i16> @load_lane_i16_from_numeric_address(<8 x i16> %v) {577; CHECK-LABEL: load_lane_i16_from_numeric_address:578; CHECK: .functype load_lane_i16_from_numeric_address (v128) -> (v128)579; CHECK-NEXT: # %bb.0:580; CHECK-NEXT: i32.const 42581; CHECK-NEXT: local.get 0582; CHECK-NEXT: v128.load16_lane 0, 0583; CHECK-NEXT: # fallthrough-return584;585; MEM64-LABEL: load_lane_i16_from_numeric_address:586; MEM64: .functype load_lane_i16_from_numeric_address (v128) -> (v128)587; MEM64-NEXT: # %bb.0:588; MEM64-NEXT: i64.const 42589; MEM64-NEXT: local.get 0590; MEM64-NEXT: v128.load16_lane 0, 0591; MEM64-NEXT: # fallthrough-return592 %s = inttoptr i32 42 to ptr593 %x = load i16, ptr %s594 %t = insertelement <8 x i16> %v, i16 %x, i32 0595 ret <8 x i16> %t596}597 598@gv_i16 = global i16 0599define <8 x i16> @load_lane_i16_from_global_address(<8 x i16> %v) {600; CHECK-LABEL: load_lane_i16_from_global_address:601; CHECK: .functype load_lane_i16_from_global_address (v128) -> (v128)602; CHECK-NEXT: # %bb.0:603; CHECK-NEXT: i32.const gv_i16604; CHECK-NEXT: local.get 0605; CHECK-NEXT: v128.load16_lane 0, 0606; CHECK-NEXT: # fallthrough-return607;608; MEM64-LABEL: load_lane_i16_from_global_address:609; MEM64: .functype load_lane_i16_from_global_address (v128) -> (v128)610; MEM64-NEXT: # %bb.0:611; MEM64-NEXT: i64.const gv_i16612; MEM64-NEXT: local.get 0613; MEM64-NEXT: v128.load16_lane 0, 0614; MEM64-NEXT: # fallthrough-return615 %x = load i16, ptr @gv_i16616 %t = insertelement <8 x i16> %v, i16 %x, i32 0617 ret <8 x i16> %t618}619 620define void @store_lane_i16_no_offset(<8 x i16> %v, ptr %p) {621; CHECK-LABEL: store_lane_i16_no_offset:622; CHECK: .functype store_lane_i16_no_offset (v128, i32) -> ()623; CHECK-NEXT: # %bb.0:624; CHECK-NEXT: local.get 1625; CHECK-NEXT: local.get 0626; CHECK-NEXT: v128.store16_lane 0, 0627; CHECK-NEXT: # fallthrough-return628;629; MEM64-LABEL: store_lane_i16_no_offset:630; MEM64: .functype store_lane_i16_no_offset (v128, i64) -> ()631; MEM64-NEXT: # %bb.0:632; MEM64-NEXT: local.get 1633; MEM64-NEXT: local.get 0634; MEM64-NEXT: v128.store16_lane 0, 0635; MEM64-NEXT: # fallthrough-return636 %x = extractelement <8 x i16> %v, i32 0637 store i16 %x, ptr %p638 ret void639}640 641define void @store_lane_i16_with_folded_offset(<8 x i16> %v, ptr %p) {642; CHECK-LABEL: store_lane_i16_with_folded_offset:643; CHECK: .functype store_lane_i16_with_folded_offset (v128, i32) -> ()644; CHECK-NEXT: # %bb.0:645; CHECK-NEXT: local.get 1646; CHECK-NEXT: local.get 0647; CHECK-NEXT: v128.store16_lane 24, 0648; CHECK-NEXT: # fallthrough-return649;650; MEM64-LABEL: store_lane_i16_with_folded_offset:651; MEM64: .functype store_lane_i16_with_folded_offset (v128, i64) -> ()652; MEM64-NEXT: # %bb.0:653; MEM64-NEXT: local.get 1654; MEM64-NEXT: i32.wrap_i64655; MEM64-NEXT: i32.const 24656; MEM64-NEXT: i32.add657; MEM64-NEXT: i64.extend_i32_u658; MEM64-NEXT: local.get 0659; MEM64-NEXT: v128.store16_lane 0, 0660; MEM64-NEXT: # fallthrough-return661 %q = ptrtoint ptr %p to i32662 %r = add nuw i32 %q, 24663 %s = inttoptr i32 %r to ptr664 %x = extractelement <8 x i16> %v, i32 0665 store i16 %x, ptr %s666 ret void667}668 669define void @store_lane_i16_with_folded_gep_offset(<8 x i16> %v, ptr %p) {670; CHECK-LABEL: store_lane_i16_with_folded_gep_offset:671; CHECK: .functype store_lane_i16_with_folded_gep_offset (v128, i32) -> ()672; CHECK-NEXT: # %bb.0:673; CHECK-NEXT: local.get 1674; CHECK-NEXT: local.get 0675; CHECK-NEXT: v128.store16_lane 12, 0676; CHECK-NEXT: # fallthrough-return677;678; MEM64-LABEL: store_lane_i16_with_folded_gep_offset:679; MEM64: .functype store_lane_i16_with_folded_gep_offset (v128, i64) -> ()680; MEM64-NEXT: # %bb.0:681; MEM64-NEXT: local.get 1682; MEM64-NEXT: local.get 0683; MEM64-NEXT: v128.store16_lane 12, 0684; MEM64-NEXT: # fallthrough-return685 %s = getelementptr inbounds i16, ptr %p, i32 6686 %x = extractelement <8 x i16> %v, i32 0687 store i16 %x, ptr %s688 ret void689}690 691define void @store_lane_i16_with_unfolded_gep_negative_offset(<8 x i16> %v, ptr %p) {692; CHECK-LABEL: store_lane_i16_with_unfolded_gep_negative_offset:693; CHECK: .functype store_lane_i16_with_unfolded_gep_negative_offset (v128, i32) -> ()694; CHECK-NEXT: # %bb.0:695; CHECK-NEXT: local.get 1696; CHECK-NEXT: i32.const -12697; CHECK-NEXT: i32.add698; CHECK-NEXT: local.get 0699; CHECK-NEXT: v128.store16_lane 0, 0700; CHECK-NEXT: # fallthrough-return701;702; MEM64-LABEL: store_lane_i16_with_unfolded_gep_negative_offset:703; MEM64: .functype store_lane_i16_with_unfolded_gep_negative_offset (v128, i64) -> ()704; MEM64-NEXT: # %bb.0:705; MEM64-NEXT: local.get 1706; MEM64-NEXT: i64.const -12707; MEM64-NEXT: i64.add708; MEM64-NEXT: local.get 0709; MEM64-NEXT: v128.store16_lane 0, 0710; MEM64-NEXT: # fallthrough-return711 %s = getelementptr inbounds i16, ptr %p, i32 -6712 %x = extractelement <8 x i16> %v, i32 0713 store i16 %x, ptr %s714 ret void715}716 717define void @store_lane_i16_with_unfolded_offset(<8 x i16> %v, ptr %p) {718; CHECK-LABEL: store_lane_i16_with_unfolded_offset:719; CHECK: .functype store_lane_i16_with_unfolded_offset (v128, i32) -> ()720; CHECK-NEXT: # %bb.0:721; CHECK-NEXT: local.get 1722; CHECK-NEXT: i32.const 24723; CHECK-NEXT: i32.add724; CHECK-NEXT: local.get 0725; CHECK-NEXT: v128.store16_lane 0, 0726; CHECK-NEXT: # fallthrough-return727;728; MEM64-LABEL: store_lane_i16_with_unfolded_offset:729; MEM64: .functype store_lane_i16_with_unfolded_offset (v128, i64) -> ()730; MEM64-NEXT: # %bb.0:731; MEM64-NEXT: local.get 1732; MEM64-NEXT: i32.wrap_i64733; MEM64-NEXT: i32.const 24734; MEM64-NEXT: i32.add735; MEM64-NEXT: i64.extend_i32_u736; MEM64-NEXT: local.get 0737; MEM64-NEXT: v128.store16_lane 0, 0738; MEM64-NEXT: # fallthrough-return739 %q = ptrtoint ptr %p to i32740 %r = add nsw i32 %q, 24741 %s = inttoptr i32 %r to ptr742 %x = extractelement <8 x i16> %v, i32 0743 store i16 %x, ptr %s744 ret void745}746 747define void @store_lane_i16_with_unfolded_gep_offset(<8 x i16> %v, ptr %p) {748; CHECK-LABEL: store_lane_i16_with_unfolded_gep_offset:749; CHECK: .functype store_lane_i16_with_unfolded_gep_offset (v128, i32) -> ()750; CHECK-NEXT: # %bb.0:751; CHECK-NEXT: local.get 1752; CHECK-NEXT: i32.const 12753; CHECK-NEXT: i32.add754; CHECK-NEXT: local.get 0755; CHECK-NEXT: v128.store16_lane 0, 0756; CHECK-NEXT: # fallthrough-return757;758; MEM64-LABEL: store_lane_i16_with_unfolded_gep_offset:759; MEM64: .functype store_lane_i16_with_unfolded_gep_offset (v128, i64) -> ()760; MEM64-NEXT: # %bb.0:761; MEM64-NEXT: local.get 1762; MEM64-NEXT: i64.const 12763; MEM64-NEXT: i64.add764; MEM64-NEXT: local.get 0765; MEM64-NEXT: v128.store16_lane 0, 0766; MEM64-NEXT: # fallthrough-return767 %s = getelementptr i16, ptr %p, i32 6768 %x = extractelement <8 x i16> %v, i32 0769 store i16 %x, ptr %s770 ret void771}772 773define void @store_lane_i16_to_numeric_address(<8 x i16> %v) {774; CHECK-LABEL: store_lane_i16_to_numeric_address:775; CHECK: .functype store_lane_i16_to_numeric_address (v128) -> ()776; CHECK-NEXT: # %bb.0:777; CHECK-NEXT: i32.const 0778; CHECK-NEXT: local.get 0779; CHECK-NEXT: v128.store16_lane 42, 0780; CHECK-NEXT: # fallthrough-return781;782; MEM64-LABEL: store_lane_i16_to_numeric_address:783; MEM64: .functype store_lane_i16_to_numeric_address (v128) -> ()784; MEM64-NEXT: # %bb.0:785; MEM64-NEXT: i64.const 0786; MEM64-NEXT: local.get 0787; MEM64-NEXT: v128.store16_lane 42, 0788; MEM64-NEXT: # fallthrough-return789 %s = inttoptr i32 42 to ptr790 %x = extractelement <8 x i16> %v, i32 0791 store i16 %x, ptr %s792 ret void793}794 795define void @store_lane_i16_from_global_address(<8 x i16> %v) {796; CHECK-LABEL: store_lane_i16_from_global_address:797; CHECK: .functype store_lane_i16_from_global_address (v128) -> ()798; CHECK-NEXT: # %bb.0:799; CHECK-NEXT: i32.const 0800; CHECK-NEXT: local.get 0801; CHECK-NEXT: v128.store16_lane gv_i16, 0802; CHECK-NEXT: # fallthrough-return803;804; MEM64-LABEL: store_lane_i16_from_global_address:805; MEM64: .functype store_lane_i16_from_global_address (v128) -> ()806; MEM64-NEXT: # %bb.0:807; MEM64-NEXT: i64.const 0808; MEM64-NEXT: local.get 0809; MEM64-NEXT: v128.store16_lane gv_i16, 0810; MEM64-NEXT: # fallthrough-return811 %x = extractelement <8 x i16> %v, i32 0812 store i16 %x, ptr @gv_i16813 ret void814}815 816;===----------------------------------------------------------------------------817; v128.load32_lane / v128.store32_lane818;===----------------------------------------------------------------------------819 820define <4 x i32> @load_lane_i32_no_offset(ptr %p, <4 x i32> %v) {821; CHECK-LABEL: load_lane_i32_no_offset:822; CHECK: .functype load_lane_i32_no_offset (i32, v128) -> (v128)823; CHECK-NEXT: # %bb.0:824; CHECK-NEXT: local.get 0825; CHECK-NEXT: local.get 1826; CHECK-NEXT: v128.load32_lane 0, 0827; CHECK-NEXT: # fallthrough-return828;829; MEM64-LABEL: load_lane_i32_no_offset:830; MEM64: .functype load_lane_i32_no_offset (i64, v128) -> (v128)831; MEM64-NEXT: # %bb.0:832; MEM64-NEXT: local.get 0833; MEM64-NEXT: local.get 1834; MEM64-NEXT: v128.load32_lane 0, 0835; MEM64-NEXT: # fallthrough-return836 %x = load i32, ptr %p837 %t = insertelement <4 x i32> %v, i32 %x, i32 0838 ret <4 x i32> %t839}840 841define <4 x i32> @load_lane_i32_with_folded_offset(ptr %p, <4 x i32> %v) {842; CHECK-LABEL: load_lane_i32_with_folded_offset:843; CHECK: .functype load_lane_i32_with_folded_offset (i32, v128) -> (v128)844; CHECK-NEXT: # %bb.0:845; CHECK-NEXT: local.get 0846; CHECK-NEXT: i32.const 24847; CHECK-NEXT: i32.add848; CHECK-NEXT: local.get 1849; CHECK-NEXT: v128.load32_lane 0, 0850; CHECK-NEXT: # fallthrough-return851;852; MEM64-LABEL: load_lane_i32_with_folded_offset:853; MEM64: .functype load_lane_i32_with_folded_offset (i64, v128) -> (v128)854; MEM64-NEXT: # %bb.0:855; MEM64-NEXT: local.get 0856; MEM64-NEXT: i32.wrap_i64857; MEM64-NEXT: i32.const 24858; MEM64-NEXT: i32.add859; MEM64-NEXT: i64.extend_i32_u860; MEM64-NEXT: local.get 1861; MEM64-NEXT: v128.load32_lane 0, 0862; MEM64-NEXT: # fallthrough-return863 %q = ptrtoint ptr %p to i32864 %r = add nuw i32 %q, 24865 %s = inttoptr i32 %r to ptr866 %x = load i32, ptr %s867 %t = insertelement <4 x i32> %v, i32 %x, i32 0868 ret <4 x i32> %t869}870 871define <4 x i32> @load_lane_i32_with_folded_gep_offset(ptr %p, <4 x i32> %v) {872; CHECK-LABEL: load_lane_i32_with_folded_gep_offset:873; CHECK: .functype load_lane_i32_with_folded_gep_offset (i32, v128) -> (v128)874; CHECK-NEXT: # %bb.0:875; CHECK-NEXT: local.get 0876; CHECK-NEXT: i32.const 24877; CHECK-NEXT: i32.add878; CHECK-NEXT: local.get 1879; CHECK-NEXT: v128.load32_lane 0, 0880; CHECK-NEXT: # fallthrough-return881;882; MEM64-LABEL: load_lane_i32_with_folded_gep_offset:883; MEM64: .functype load_lane_i32_with_folded_gep_offset (i64, v128) -> (v128)884; MEM64-NEXT: # %bb.0:885; MEM64-NEXT: local.get 0886; MEM64-NEXT: i64.const 24887; MEM64-NEXT: i64.add888; MEM64-NEXT: local.get 1889; MEM64-NEXT: v128.load32_lane 0, 0890; MEM64-NEXT: # fallthrough-return891 %s = getelementptr inbounds i32, ptr %p, i32 6892 %x = load i32, ptr %s893 %t = insertelement <4 x i32> %v, i32 %x, i32 0894 ret <4 x i32> %t895}896 897define <4 x i32> @load_lane_i32_with_unfolded_gep_negative_offset(ptr %p, <4 x i32> %v) {898; CHECK-LABEL: load_lane_i32_with_unfolded_gep_negative_offset:899; CHECK: .functype load_lane_i32_with_unfolded_gep_negative_offset (i32, v128) -> (v128)900; CHECK-NEXT: # %bb.0:901; CHECK-NEXT: local.get 0902; CHECK-NEXT: i32.const -24903; CHECK-NEXT: i32.add904; CHECK-NEXT: local.get 1905; CHECK-NEXT: v128.load32_lane 0, 0906; CHECK-NEXT: # fallthrough-return907;908; MEM64-LABEL: load_lane_i32_with_unfolded_gep_negative_offset:909; MEM64: .functype load_lane_i32_with_unfolded_gep_negative_offset (i64, v128) -> (v128)910; MEM64-NEXT: # %bb.0:911; MEM64-NEXT: local.get 0912; MEM64-NEXT: i64.const -24913; MEM64-NEXT: i64.add914; MEM64-NEXT: local.get 1915; MEM64-NEXT: v128.load32_lane 0, 0916; MEM64-NEXT: # fallthrough-return917 %s = getelementptr inbounds i32, ptr %p, i32 -6918 %x = load i32, ptr %s919 %t = insertelement <4 x i32> %v, i32 %x, i32 0920 ret <4 x i32> %t921}922 923define <4 x i32> @load_lane_i32_with_unfolded_offset(ptr %p, <4 x i32> %v) {924; CHECK-LABEL: load_lane_i32_with_unfolded_offset:925; CHECK: .functype load_lane_i32_with_unfolded_offset (i32, v128) -> (v128)926; CHECK-NEXT: # %bb.0:927; CHECK-NEXT: local.get 0928; CHECK-NEXT: i32.const 24929; CHECK-NEXT: i32.add930; CHECK-NEXT: local.get 1931; CHECK-NEXT: v128.load32_lane 0, 0932; CHECK-NEXT: # fallthrough-return933;934; MEM64-LABEL: load_lane_i32_with_unfolded_offset:935; MEM64: .functype load_lane_i32_with_unfolded_offset (i64, v128) -> (v128)936; MEM64-NEXT: # %bb.0:937; MEM64-NEXT: local.get 0938; MEM64-NEXT: i32.wrap_i64939; MEM64-NEXT: i32.const 24940; MEM64-NEXT: i32.add941; MEM64-NEXT: i64.extend_i32_u942; MEM64-NEXT: local.get 1943; MEM64-NEXT: v128.load32_lane 0, 0944; MEM64-NEXT: # fallthrough-return945 %q = ptrtoint ptr %p to i32946 %r = add nsw i32 %q, 24947 %s = inttoptr i32 %r to ptr948 %x = load i32, ptr %s949 %t = insertelement <4 x i32> %v, i32 %x, i32 0950 ret <4 x i32> %t951}952 953define <4 x i32> @load_lane_i32_with_unfolded_gep_offset(ptr %p, <4 x i32> %v) {954; CHECK-LABEL: load_lane_i32_with_unfolded_gep_offset:955; CHECK: .functype load_lane_i32_with_unfolded_gep_offset (i32, v128) -> (v128)956; CHECK-NEXT: # %bb.0:957; CHECK-NEXT: local.get 0958; CHECK-NEXT: i32.const 24959; CHECK-NEXT: i32.add960; CHECK-NEXT: local.get 1961; CHECK-NEXT: v128.load32_lane 0, 0962; CHECK-NEXT: # fallthrough-return963;964; MEM64-LABEL: load_lane_i32_with_unfolded_gep_offset:965; MEM64: .functype load_lane_i32_with_unfolded_gep_offset (i64, v128) -> (v128)966; MEM64-NEXT: # %bb.0:967; MEM64-NEXT: local.get 0968; MEM64-NEXT: i64.const 24969; MEM64-NEXT: i64.add970; MEM64-NEXT: local.get 1971; MEM64-NEXT: v128.load32_lane 0, 0972; MEM64-NEXT: # fallthrough-return973 %s = getelementptr i32, ptr %p, i32 6974 %x = load i32, ptr %s975 %t = insertelement <4 x i32> %v, i32 %x, i32 0976 ret <4 x i32> %t977}978 979define <4 x i32> @load_lane_i32_from_numeric_address(<4 x i32> %v) {980; CHECK-LABEL: load_lane_i32_from_numeric_address:981; CHECK: .functype load_lane_i32_from_numeric_address (v128) -> (v128)982; CHECK-NEXT: # %bb.0:983; CHECK-NEXT: i32.const 42984; CHECK-NEXT: local.get 0985; CHECK-NEXT: v128.load32_lane 0, 0986; CHECK-NEXT: # fallthrough-return987;988; MEM64-LABEL: load_lane_i32_from_numeric_address:989; MEM64: .functype load_lane_i32_from_numeric_address (v128) -> (v128)990; MEM64-NEXT: # %bb.0:991; MEM64-NEXT: i64.const 42992; MEM64-NEXT: local.get 0993; MEM64-NEXT: v128.load32_lane 0, 0994; MEM64-NEXT: # fallthrough-return995 %s = inttoptr i32 42 to ptr996 %x = load i32, ptr %s997 %t = insertelement <4 x i32> %v, i32 %x, i32 0998 ret <4 x i32> %t999}1000 1001@gv_i32 = global i32 01002define <4 x i32> @load_lane_i32_from_global_address(<4 x i32> %v) {1003; CHECK-LABEL: load_lane_i32_from_global_address:1004; CHECK: .functype load_lane_i32_from_global_address (v128) -> (v128)1005; CHECK-NEXT: # %bb.0:1006; CHECK-NEXT: i32.const gv_i321007; CHECK-NEXT: local.get 01008; CHECK-NEXT: v128.load32_lane 0, 01009; CHECK-NEXT: # fallthrough-return1010;1011; MEM64-LABEL: load_lane_i32_from_global_address:1012; MEM64: .functype load_lane_i32_from_global_address (v128) -> (v128)1013; MEM64-NEXT: # %bb.0:1014; MEM64-NEXT: i64.const gv_i321015; MEM64-NEXT: local.get 01016; MEM64-NEXT: v128.load32_lane 0, 01017; MEM64-NEXT: # fallthrough-return1018 %x = load i32, ptr @gv_i321019 %t = insertelement <4 x i32> %v, i32 %x, i32 01020 ret <4 x i32> %t1021}1022 1023define void @store_lane_i32_no_offset(<4 x i32> %v, ptr %p) {1024; CHECK-LABEL: store_lane_i32_no_offset:1025; CHECK: .functype store_lane_i32_no_offset (v128, i32) -> ()1026; CHECK-NEXT: # %bb.0:1027; CHECK-NEXT: local.get 11028; CHECK-NEXT: local.get 01029; CHECK-NEXT: v128.store32_lane 0, 01030; CHECK-NEXT: # fallthrough-return1031;1032; MEM64-LABEL: store_lane_i32_no_offset:1033; MEM64: .functype store_lane_i32_no_offset (v128, i64) -> ()1034; MEM64-NEXT: # %bb.0:1035; MEM64-NEXT: local.get 11036; MEM64-NEXT: local.get 01037; MEM64-NEXT: v128.store32_lane 0, 01038; MEM64-NEXT: # fallthrough-return1039 %x = extractelement <4 x i32> %v, i32 01040 store i32 %x, ptr %p1041 ret void1042}1043 1044define void @store_lane_i32_with_folded_offset(<4 x i32> %v, ptr %p) {1045; CHECK-LABEL: store_lane_i32_with_folded_offset:1046; CHECK: .functype store_lane_i32_with_folded_offset (v128, i32) -> ()1047; CHECK-NEXT: # %bb.0:1048; CHECK-NEXT: local.get 11049; CHECK-NEXT: local.get 01050; CHECK-NEXT: v128.store32_lane 24, 01051; CHECK-NEXT: # fallthrough-return1052;1053; MEM64-LABEL: store_lane_i32_with_folded_offset:1054; MEM64: .functype store_lane_i32_with_folded_offset (v128, i64) -> ()1055; MEM64-NEXT: # %bb.0:1056; MEM64-NEXT: local.get 11057; MEM64-NEXT: i32.wrap_i641058; MEM64-NEXT: i32.const 241059; MEM64-NEXT: i32.add1060; MEM64-NEXT: i64.extend_i32_u1061; MEM64-NEXT: local.get 01062; MEM64-NEXT: v128.store32_lane 0, 01063; MEM64-NEXT: # fallthrough-return1064 %q = ptrtoint ptr %p to i321065 %r = add nuw i32 %q, 241066 %s = inttoptr i32 %r to ptr1067 %x = extractelement <4 x i32> %v, i32 01068 store i32 %x, ptr %s1069 ret void1070}1071 1072define void @store_lane_i32_with_folded_gep_offset(<4 x i32> %v, ptr %p) {1073; CHECK-LABEL: store_lane_i32_with_folded_gep_offset:1074; CHECK: .functype store_lane_i32_with_folded_gep_offset (v128, i32) -> ()1075; CHECK-NEXT: # %bb.0:1076; CHECK-NEXT: local.get 11077; CHECK-NEXT: local.get 01078; CHECK-NEXT: v128.store32_lane 24, 01079; CHECK-NEXT: # fallthrough-return1080;1081; MEM64-LABEL: store_lane_i32_with_folded_gep_offset:1082; MEM64: .functype store_lane_i32_with_folded_gep_offset (v128, i64) -> ()1083; MEM64-NEXT: # %bb.0:1084; MEM64-NEXT: local.get 11085; MEM64-NEXT: local.get 01086; MEM64-NEXT: v128.store32_lane 24, 01087; MEM64-NEXT: # fallthrough-return1088 %s = getelementptr inbounds i32, ptr %p, i32 61089 %x = extractelement <4 x i32> %v, i32 01090 store i32 %x, ptr %s1091 ret void1092}1093 1094define void @store_lane_i32_with_unfolded_gep_negative_offset(<4 x i32> %v, ptr %p) {1095; CHECK-LABEL: store_lane_i32_with_unfolded_gep_negative_offset:1096; CHECK: .functype store_lane_i32_with_unfolded_gep_negative_offset (v128, i32) -> ()1097; CHECK-NEXT: # %bb.0:1098; CHECK-NEXT: local.get 11099; CHECK-NEXT: i32.const -241100; CHECK-NEXT: i32.add1101; CHECK-NEXT: local.get 01102; CHECK-NEXT: v128.store32_lane 0, 01103; CHECK-NEXT: # fallthrough-return1104;1105; MEM64-LABEL: store_lane_i32_with_unfolded_gep_negative_offset:1106; MEM64: .functype store_lane_i32_with_unfolded_gep_negative_offset (v128, i64) -> ()1107; MEM64-NEXT: # %bb.0:1108; MEM64-NEXT: local.get 11109; MEM64-NEXT: i64.const -241110; MEM64-NEXT: i64.add1111; MEM64-NEXT: local.get 01112; MEM64-NEXT: v128.store32_lane 0, 01113; MEM64-NEXT: # fallthrough-return1114 %s = getelementptr inbounds i32, ptr %p, i32 -61115 %x = extractelement <4 x i32> %v, i32 01116 store i32 %x, ptr %s1117 ret void1118}1119 1120define void @store_lane_i32_with_unfolded_offset(<4 x i32> %v, ptr %p) {1121; CHECK-LABEL: store_lane_i32_with_unfolded_offset:1122; CHECK: .functype store_lane_i32_with_unfolded_offset (v128, i32) -> ()1123; CHECK-NEXT: # %bb.0:1124; CHECK-NEXT: local.get 11125; CHECK-NEXT: i32.const 241126; CHECK-NEXT: i32.add1127; CHECK-NEXT: local.get 01128; CHECK-NEXT: v128.store32_lane 0, 01129; CHECK-NEXT: # fallthrough-return1130;1131; MEM64-LABEL: store_lane_i32_with_unfolded_offset:1132; MEM64: .functype store_lane_i32_with_unfolded_offset (v128, i64) -> ()1133; MEM64-NEXT: # %bb.0:1134; MEM64-NEXT: local.get 11135; MEM64-NEXT: i32.wrap_i641136; MEM64-NEXT: i32.const 241137; MEM64-NEXT: i32.add1138; MEM64-NEXT: i64.extend_i32_u1139; MEM64-NEXT: local.get 01140; MEM64-NEXT: v128.store32_lane 0, 01141; MEM64-NEXT: # fallthrough-return1142 %q = ptrtoint ptr %p to i321143 %r = add nsw i32 %q, 241144 %s = inttoptr i32 %r to ptr1145 %x = extractelement <4 x i32> %v, i32 01146 store i32 %x, ptr %s1147 ret void1148}1149 1150define void @store_lane_i32_with_unfolded_gep_offset(<4 x i32> %v, ptr %p) {1151; CHECK-LABEL: store_lane_i32_with_unfolded_gep_offset:1152; CHECK: .functype store_lane_i32_with_unfolded_gep_offset (v128, i32) -> ()1153; CHECK-NEXT: # %bb.0:1154; CHECK-NEXT: local.get 11155; CHECK-NEXT: i32.const 241156; CHECK-NEXT: i32.add1157; CHECK-NEXT: local.get 01158; CHECK-NEXT: v128.store32_lane 0, 01159; CHECK-NEXT: # fallthrough-return1160;1161; MEM64-LABEL: store_lane_i32_with_unfolded_gep_offset:1162; MEM64: .functype store_lane_i32_with_unfolded_gep_offset (v128, i64) -> ()1163; MEM64-NEXT: # %bb.0:1164; MEM64-NEXT: local.get 11165; MEM64-NEXT: i64.const 241166; MEM64-NEXT: i64.add1167; MEM64-NEXT: local.get 01168; MEM64-NEXT: v128.store32_lane 0, 01169; MEM64-NEXT: # fallthrough-return1170 %s = getelementptr i32, ptr %p, i32 61171 %x = extractelement <4 x i32> %v, i32 01172 store i32 %x, ptr %s1173 ret void1174}1175 1176define void @store_lane_i32_to_numeric_address(<4 x i32> %v) {1177; CHECK-LABEL: store_lane_i32_to_numeric_address:1178; CHECK: .functype store_lane_i32_to_numeric_address (v128) -> ()1179; CHECK-NEXT: # %bb.0:1180; CHECK-NEXT: i32.const 01181; CHECK-NEXT: local.get 01182; CHECK-NEXT: v128.store32_lane 42, 01183; CHECK-NEXT: # fallthrough-return1184;1185; MEM64-LABEL: store_lane_i32_to_numeric_address:1186; MEM64: .functype store_lane_i32_to_numeric_address (v128) -> ()1187; MEM64-NEXT: # %bb.0:1188; MEM64-NEXT: i64.const 01189; MEM64-NEXT: local.get 01190; MEM64-NEXT: v128.store32_lane 42, 01191; MEM64-NEXT: # fallthrough-return1192 %s = inttoptr i32 42 to ptr1193 %x = extractelement <4 x i32> %v, i32 01194 store i32 %x, ptr %s1195 ret void1196}1197 1198define void @store_lane_i32_from_global_address(<4 x i32> %v) {1199; CHECK-LABEL: store_lane_i32_from_global_address:1200; CHECK: .functype store_lane_i32_from_global_address (v128) -> ()1201; CHECK-NEXT: # %bb.0:1202; CHECK-NEXT: i32.const 01203; CHECK-NEXT: local.get 01204; CHECK-NEXT: v128.store32_lane gv_i32, 01205; CHECK-NEXT: # fallthrough-return1206;1207; MEM64-LABEL: store_lane_i32_from_global_address:1208; MEM64: .functype store_lane_i32_from_global_address (v128) -> ()1209; MEM64-NEXT: # %bb.0:1210; MEM64-NEXT: i64.const 01211; MEM64-NEXT: local.get 01212; MEM64-NEXT: v128.store32_lane gv_i32, 01213; MEM64-NEXT: # fallthrough-return1214 %x = extractelement <4 x i32> %v, i32 01215 store i32 %x, ptr @gv_i321216 ret void1217}1218 1219;===----------------------------------------------------------------------------1220; v128.load64_lane / v128.store64_lane1221;===----------------------------------------------------------------------------1222 1223define <2 x i64> @load_lane_i64_no_offset(ptr %p, <2 x i64> %v) {1224; CHECK-LABEL: load_lane_i64_no_offset:1225; CHECK: .functype load_lane_i64_no_offset (i32, v128) -> (v128)1226; CHECK-NEXT: # %bb.0:1227; CHECK-NEXT: local.get 01228; CHECK-NEXT: local.get 11229; CHECK-NEXT: v128.load64_lane 0, 01230; CHECK-NEXT: # fallthrough-return1231;1232; MEM64-LABEL: load_lane_i64_no_offset:1233; MEM64: .functype load_lane_i64_no_offset (i64, v128) -> (v128)1234; MEM64-NEXT: # %bb.0:1235; MEM64-NEXT: local.get 01236; MEM64-NEXT: local.get 11237; MEM64-NEXT: v128.load64_lane 0, 01238; MEM64-NEXT: # fallthrough-return1239 %x = load i64, ptr %p1240 %t = insertelement <2 x i64> %v, i64 %x, i32 01241 ret <2 x i64> %t1242}1243 1244define <2 x i64> @load_lane_i64_with_folded_offset(ptr %p, <2 x i64> %v) {1245; CHECK-LABEL: load_lane_i64_with_folded_offset:1246; CHECK: .functype load_lane_i64_with_folded_offset (i32, v128) -> (v128)1247; CHECK-NEXT: # %bb.0:1248; CHECK-NEXT: local.get 01249; CHECK-NEXT: i32.const 241250; CHECK-NEXT: i32.add1251; CHECK-NEXT: local.get 11252; CHECK-NEXT: v128.load64_lane 0, 01253; CHECK-NEXT: # fallthrough-return1254;1255; MEM64-LABEL: load_lane_i64_with_folded_offset:1256; MEM64: .functype load_lane_i64_with_folded_offset (i64, v128) -> (v128)1257; MEM64-NEXT: # %bb.0:1258; MEM64-NEXT: local.get 01259; MEM64-NEXT: i32.wrap_i641260; MEM64-NEXT: i32.const 241261; MEM64-NEXT: i32.add1262; MEM64-NEXT: i64.extend_i32_u1263; MEM64-NEXT: local.get 11264; MEM64-NEXT: v128.load64_lane 0, 01265; MEM64-NEXT: # fallthrough-return1266 %q = ptrtoint ptr %p to i321267 %r = add nuw i32 %q, 241268 %s = inttoptr i32 %r to ptr1269 %x = load i64, ptr %s1270 %t = insertelement <2 x i64> %v, i64 %x, i32 01271 ret <2 x i64> %t1272}1273 1274define <2 x i64> @load_lane_i64_with_folded_gep_offset(ptr %p, <2 x i64> %v) {1275; CHECK-LABEL: load_lane_i64_with_folded_gep_offset:1276; CHECK: .functype load_lane_i64_with_folded_gep_offset (i32, v128) -> (v128)1277; CHECK-NEXT: # %bb.0:1278; CHECK-NEXT: local.get 01279; CHECK-NEXT: i32.const 481280; CHECK-NEXT: i32.add1281; CHECK-NEXT: local.get 11282; CHECK-NEXT: v128.load64_lane 0, 01283; CHECK-NEXT: # fallthrough-return1284;1285; MEM64-LABEL: load_lane_i64_with_folded_gep_offset:1286; MEM64: .functype load_lane_i64_with_folded_gep_offset (i64, v128) -> (v128)1287; MEM64-NEXT: # %bb.0:1288; MEM64-NEXT: local.get 01289; MEM64-NEXT: i64.const 481290; MEM64-NEXT: i64.add1291; MEM64-NEXT: local.get 11292; MEM64-NEXT: v128.load64_lane 0, 01293; MEM64-NEXT: # fallthrough-return1294 %s = getelementptr inbounds i64, ptr %p, i32 61295 %x = load i64, ptr %s1296 %t = insertelement <2 x i64> %v, i64 %x, i32 01297 ret <2 x i64> %t1298}1299 1300define <2 x i64> @load_lane_i64_with_unfolded_gep_negative_offset(ptr %p, <2 x i64> %v) {1301; CHECK-LABEL: load_lane_i64_with_unfolded_gep_negative_offset:1302; CHECK: .functype load_lane_i64_with_unfolded_gep_negative_offset (i32, v128) -> (v128)1303; CHECK-NEXT: # %bb.0:1304; CHECK-NEXT: local.get 01305; CHECK-NEXT: i32.const -481306; CHECK-NEXT: i32.add1307; CHECK-NEXT: local.get 11308; CHECK-NEXT: v128.load64_lane 0, 01309; CHECK-NEXT: # fallthrough-return1310;1311; MEM64-LABEL: load_lane_i64_with_unfolded_gep_negative_offset:1312; MEM64: .functype load_lane_i64_with_unfolded_gep_negative_offset (i64, v128) -> (v128)1313; MEM64-NEXT: # %bb.0:1314; MEM64-NEXT: local.get 01315; MEM64-NEXT: i64.const -481316; MEM64-NEXT: i64.add1317; MEM64-NEXT: local.get 11318; MEM64-NEXT: v128.load64_lane 0, 01319; MEM64-NEXT: # fallthrough-return1320 %s = getelementptr inbounds i64, ptr %p, i32 -61321 %x = load i64, ptr %s1322 %t = insertelement <2 x i64> %v, i64 %x, i32 01323 ret <2 x i64> %t1324}1325 1326define <2 x i64> @load_lane_i64_with_unfolded_offset(ptr %p, <2 x i64> %v) {1327; CHECK-LABEL: load_lane_i64_with_unfolded_offset:1328; CHECK: .functype load_lane_i64_with_unfolded_offset (i32, v128) -> (v128)1329; CHECK-NEXT: # %bb.0:1330; CHECK-NEXT: local.get 01331; CHECK-NEXT: i32.const 241332; CHECK-NEXT: i32.add1333; CHECK-NEXT: local.get 11334; CHECK-NEXT: v128.load64_lane 0, 01335; CHECK-NEXT: # fallthrough-return1336;1337; MEM64-LABEL: load_lane_i64_with_unfolded_offset:1338; MEM64: .functype load_lane_i64_with_unfolded_offset (i64, v128) -> (v128)1339; MEM64-NEXT: # %bb.0:1340; MEM64-NEXT: local.get 01341; MEM64-NEXT: i32.wrap_i641342; MEM64-NEXT: i32.const 241343; MEM64-NEXT: i32.add1344; MEM64-NEXT: i64.extend_i32_u1345; MEM64-NEXT: local.get 11346; MEM64-NEXT: v128.load64_lane 0, 01347; MEM64-NEXT: # fallthrough-return1348 %q = ptrtoint ptr %p to i321349 %r = add nsw i32 %q, 241350 %s = inttoptr i32 %r to ptr1351 %x = load i64, ptr %s1352 %t = insertelement <2 x i64> %v, i64 %x, i32 01353 ret <2 x i64> %t1354}1355 1356define <2 x i64> @load_lane_i64_with_unfolded_gep_offset(ptr %p, <2 x i64> %v) {1357; CHECK-LABEL: load_lane_i64_with_unfolded_gep_offset:1358; CHECK: .functype load_lane_i64_with_unfolded_gep_offset (i32, v128) -> (v128)1359; CHECK-NEXT: # %bb.0:1360; CHECK-NEXT: local.get 01361; CHECK-NEXT: i32.const 481362; CHECK-NEXT: i32.add1363; CHECK-NEXT: local.get 11364; CHECK-NEXT: v128.load64_lane 0, 01365; CHECK-NEXT: # fallthrough-return1366;1367; MEM64-LABEL: load_lane_i64_with_unfolded_gep_offset:1368; MEM64: .functype load_lane_i64_with_unfolded_gep_offset (i64, v128) -> (v128)1369; MEM64-NEXT: # %bb.0:1370; MEM64-NEXT: local.get 01371; MEM64-NEXT: i64.const 481372; MEM64-NEXT: i64.add1373; MEM64-NEXT: local.get 11374; MEM64-NEXT: v128.load64_lane 0, 01375; MEM64-NEXT: # fallthrough-return1376 %s = getelementptr i64, ptr %p, i32 61377 %x = load i64, ptr %s1378 %t = insertelement <2 x i64> %v, i64 %x, i32 01379 ret <2 x i64> %t1380}1381 1382define <2 x i64> @load_lane_i64_from_numeric_address(<2 x i64> %v) {1383; CHECK-LABEL: load_lane_i64_from_numeric_address:1384; CHECK: .functype load_lane_i64_from_numeric_address (v128) -> (v128)1385; CHECK-NEXT: # %bb.0:1386; CHECK-NEXT: i32.const 421387; CHECK-NEXT: local.get 01388; CHECK-NEXT: v128.load64_lane 0, 01389; CHECK-NEXT: # fallthrough-return1390;1391; MEM64-LABEL: load_lane_i64_from_numeric_address:1392; MEM64: .functype load_lane_i64_from_numeric_address (v128) -> (v128)1393; MEM64-NEXT: # %bb.0:1394; MEM64-NEXT: i64.const 421395; MEM64-NEXT: local.get 01396; MEM64-NEXT: v128.load64_lane 0, 01397; MEM64-NEXT: # fallthrough-return1398 %s = inttoptr i32 42 to ptr1399 %x = load i64, ptr %s1400 %t = insertelement <2 x i64> %v, i64 %x, i32 01401 ret <2 x i64> %t1402}1403 1404@gv_i64 = global i64 01405define <2 x i64> @load_lane_i64_from_global_address(<2 x i64> %v) {1406; CHECK-LABEL: load_lane_i64_from_global_address:1407; CHECK: .functype load_lane_i64_from_global_address (v128) -> (v128)1408; CHECK-NEXT: # %bb.0:1409; CHECK-NEXT: i32.const gv_i641410; CHECK-NEXT: local.get 01411; CHECK-NEXT: v128.load64_lane 0, 01412; CHECK-NEXT: # fallthrough-return1413;1414; MEM64-LABEL: load_lane_i64_from_global_address:1415; MEM64: .functype load_lane_i64_from_global_address (v128) -> (v128)1416; MEM64-NEXT: # %bb.0:1417; MEM64-NEXT: i64.const gv_i641418; MEM64-NEXT: local.get 01419; MEM64-NEXT: v128.load64_lane 0, 01420; MEM64-NEXT: # fallthrough-return1421 %x = load i64, ptr @gv_i641422 %t = insertelement <2 x i64> %v, i64 %x, i32 01423 ret <2 x i64> %t1424}1425 1426define void @store_lane_i64_no_offset(<2 x i64> %v, ptr %p) {1427; CHECK-LABEL: store_lane_i64_no_offset:1428; CHECK: .functype store_lane_i64_no_offset (v128, i32) -> ()1429; CHECK-NEXT: # %bb.0:1430; CHECK-NEXT: local.get 11431; CHECK-NEXT: local.get 01432; CHECK-NEXT: v128.store64_lane 0, 01433; CHECK-NEXT: # fallthrough-return1434;1435; MEM64-LABEL: store_lane_i64_no_offset:1436; MEM64: .functype store_lane_i64_no_offset (v128, i64) -> ()1437; MEM64-NEXT: # %bb.0:1438; MEM64-NEXT: local.get 11439; MEM64-NEXT: local.get 01440; MEM64-NEXT: v128.store64_lane 0, 01441; MEM64-NEXT: # fallthrough-return1442 %x = extractelement <2 x i64> %v, i32 01443 store i64 %x, ptr %p1444 ret void1445}1446 1447define void @store_lane_i64_with_folded_offset(<2 x i64> %v, ptr %p) {1448; CHECK-LABEL: store_lane_i64_with_folded_offset:1449; CHECK: .functype store_lane_i64_with_folded_offset (v128, i32) -> ()1450; CHECK-NEXT: # %bb.0:1451; CHECK-NEXT: local.get 11452; CHECK-NEXT: local.get 01453; CHECK-NEXT: v128.store64_lane 24, 01454; CHECK-NEXT: # fallthrough-return1455;1456; MEM64-LABEL: store_lane_i64_with_folded_offset:1457; MEM64: .functype store_lane_i64_with_folded_offset (v128, i64) -> ()1458; MEM64-NEXT: # %bb.0:1459; MEM64-NEXT: local.get 11460; MEM64-NEXT: i32.wrap_i641461; MEM64-NEXT: i32.const 241462; MEM64-NEXT: i32.add1463; MEM64-NEXT: i64.extend_i32_u1464; MEM64-NEXT: local.get 01465; MEM64-NEXT: v128.store64_lane 0, 01466; MEM64-NEXT: # fallthrough-return1467 %q = ptrtoint ptr %p to i321468 %r = add nuw i32 %q, 241469 %s = inttoptr i32 %r to ptr1470 %x = extractelement <2 x i64> %v, i32 01471 store i64 %x, ptr %s1472 ret void1473}1474 1475define void @store_lane_i64_with_folded_gep_offset(<2 x i64> %v, ptr %p) {1476; CHECK-LABEL: store_lane_i64_with_folded_gep_offset:1477; CHECK: .functype store_lane_i64_with_folded_gep_offset (v128, i32) -> ()1478; CHECK-NEXT: # %bb.0:1479; CHECK-NEXT: local.get 11480; CHECK-NEXT: local.get 01481; CHECK-NEXT: v128.store64_lane 48, 01482; CHECK-NEXT: # fallthrough-return1483;1484; MEM64-LABEL: store_lane_i64_with_folded_gep_offset:1485; MEM64: .functype store_lane_i64_with_folded_gep_offset (v128, i64) -> ()1486; MEM64-NEXT: # %bb.0:1487; MEM64-NEXT: local.get 11488; MEM64-NEXT: local.get 01489; MEM64-NEXT: v128.store64_lane 48, 01490; MEM64-NEXT: # fallthrough-return1491 %s = getelementptr inbounds i64, ptr %p, i32 61492 %x = extractelement <2 x i64> %v, i32 01493 store i64 %x, ptr %s1494 ret void1495}1496 1497define void @store_lane_i64_with_unfolded_gep_negative_offset(<2 x i64> %v, ptr %p) {1498; CHECK-LABEL: store_lane_i64_with_unfolded_gep_negative_offset:1499; CHECK: .functype store_lane_i64_with_unfolded_gep_negative_offset (v128, i32) -> ()1500; CHECK-NEXT: # %bb.0:1501; CHECK-NEXT: local.get 11502; CHECK-NEXT: i32.const -481503; CHECK-NEXT: i32.add1504; CHECK-NEXT: local.get 01505; CHECK-NEXT: v128.store64_lane 0, 01506; CHECK-NEXT: # fallthrough-return1507;1508; MEM64-LABEL: store_lane_i64_with_unfolded_gep_negative_offset:1509; MEM64: .functype store_lane_i64_with_unfolded_gep_negative_offset (v128, i64) -> ()1510; MEM64-NEXT: # %bb.0:1511; MEM64-NEXT: local.get 11512; MEM64-NEXT: i64.const -481513; MEM64-NEXT: i64.add1514; MEM64-NEXT: local.get 01515; MEM64-NEXT: v128.store64_lane 0, 01516; MEM64-NEXT: # fallthrough-return1517 %s = getelementptr inbounds i64, ptr %p, i32 -61518 %x = extractelement <2 x i64> %v, i32 01519 store i64 %x, ptr %s1520 ret void1521}1522 1523define void @store_lane_i64_with_unfolded_offset(<2 x i64> %v, ptr %p) {1524; CHECK-LABEL: store_lane_i64_with_unfolded_offset:1525; CHECK: .functype store_lane_i64_with_unfolded_offset (v128, i32) -> ()1526; CHECK-NEXT: # %bb.0:1527; CHECK-NEXT: local.get 11528; CHECK-NEXT: i32.const 241529; CHECK-NEXT: i32.add1530; CHECK-NEXT: local.get 01531; CHECK-NEXT: v128.store64_lane 0, 01532; CHECK-NEXT: # fallthrough-return1533;1534; MEM64-LABEL: store_lane_i64_with_unfolded_offset:1535; MEM64: .functype store_lane_i64_with_unfolded_offset (v128, i64) -> ()1536; MEM64-NEXT: # %bb.0:1537; MEM64-NEXT: local.get 11538; MEM64-NEXT: i32.wrap_i641539; MEM64-NEXT: i32.const 241540; MEM64-NEXT: i32.add1541; MEM64-NEXT: i64.extend_i32_u1542; MEM64-NEXT: local.get 01543; MEM64-NEXT: v128.store64_lane 0, 01544; MEM64-NEXT: # fallthrough-return1545 %q = ptrtoint ptr %p to i321546 %r = add nsw i32 %q, 241547 %s = inttoptr i32 %r to ptr1548 %x = extractelement <2 x i64> %v, i32 01549 store i64 %x, ptr %s1550 ret void1551}1552 1553define void @store_lane_i64_with_unfolded_gep_offset(<2 x i64> %v, ptr %p) {1554; CHECK-LABEL: store_lane_i64_with_unfolded_gep_offset:1555; CHECK: .functype store_lane_i64_with_unfolded_gep_offset (v128, i32) -> ()1556; CHECK-NEXT: # %bb.0:1557; CHECK-NEXT: local.get 11558; CHECK-NEXT: i32.const 481559; CHECK-NEXT: i32.add1560; CHECK-NEXT: local.get 01561; CHECK-NEXT: v128.store64_lane 0, 01562; CHECK-NEXT: # fallthrough-return1563;1564; MEM64-LABEL: store_lane_i64_with_unfolded_gep_offset:1565; MEM64: .functype store_lane_i64_with_unfolded_gep_offset (v128, i64) -> ()1566; MEM64-NEXT: # %bb.0:1567; MEM64-NEXT: local.get 11568; MEM64-NEXT: i64.const 481569; MEM64-NEXT: i64.add1570; MEM64-NEXT: local.get 01571; MEM64-NEXT: v128.store64_lane 0, 01572; MEM64-NEXT: # fallthrough-return1573 %s = getelementptr i64, ptr %p, i32 61574 %x = extractelement <2 x i64> %v, i32 01575 store i64 %x, ptr %s1576 ret void1577}1578 1579define void @store_lane_i64_to_numeric_address(<2 x i64> %v) {1580; CHECK-LABEL: store_lane_i64_to_numeric_address:1581; CHECK: .functype store_lane_i64_to_numeric_address (v128) -> ()1582; CHECK-NEXT: # %bb.0:1583; CHECK-NEXT: i32.const 01584; CHECK-NEXT: local.get 01585; CHECK-NEXT: v128.store64_lane 42, 01586; CHECK-NEXT: # fallthrough-return1587;1588; MEM64-LABEL: store_lane_i64_to_numeric_address:1589; MEM64: .functype store_lane_i64_to_numeric_address (v128) -> ()1590; MEM64-NEXT: # %bb.0:1591; MEM64-NEXT: i64.const 01592; MEM64-NEXT: local.get 01593; MEM64-NEXT: v128.store64_lane 42, 01594; MEM64-NEXT: # fallthrough-return1595 %s = inttoptr i32 42 to ptr1596 %x = extractelement <2 x i64> %v, i32 01597 store i64 %x, ptr %s1598 ret void1599}1600 1601define void @store_lane_i64_from_global_address(<2 x i64> %v) {1602; CHECK-LABEL: store_lane_i64_from_global_address:1603; CHECK: .functype store_lane_i64_from_global_address (v128) -> ()1604; CHECK-NEXT: # %bb.0:1605; CHECK-NEXT: i32.const 01606; CHECK-NEXT: local.get 01607; CHECK-NEXT: v128.store64_lane gv_i64, 01608; CHECK-NEXT: # fallthrough-return1609;1610; MEM64-LABEL: store_lane_i64_from_global_address:1611; MEM64: .functype store_lane_i64_from_global_address (v128) -> ()1612; MEM64-NEXT: # %bb.0:1613; MEM64-NEXT: i64.const 01614; MEM64-NEXT: local.get 01615; MEM64-NEXT: v128.store64_lane gv_i64, 01616; MEM64-NEXT: # fallthrough-return1617 %x = extractelement <2 x i64> %v, i32 01618 store i64 %x, ptr @gv_i641619 ret void1620}1621