3647 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s3 4; Test SIMD loads and stores5 6target triple = "wasm32-unknown-unknown"7 8; ==============================================================================9; 16 x i810; ==============================================================================11define <16 x i8> @load_v16i8(ptr %p) {12; CHECK-LABEL: load_v16i8:13; CHECK: .functype load_v16i8 (i32) -> (v128)14; CHECK-NEXT: # %bb.0:15; CHECK-NEXT: local.get 016; CHECK-NEXT: v128.load 017; CHECK-NEXT: # fallthrough-return18 %v = load <16 x i8>, ptr %p19 ret <16 x i8> %v20}21 22define <16 x i8> @load_splat_v16i8(ptr %p) {23; CHECK-LABEL: load_splat_v16i8:24; CHECK: .functype load_splat_v16i8 (i32) -> (v128)25; CHECK-NEXT: # %bb.0:26; CHECK-NEXT: local.get 027; CHECK-NEXT: v128.load8_splat 028; CHECK-NEXT: # fallthrough-return29 %e = load i8, ptr %p30 %v1 = insertelement <16 x i8> undef, i8 %e, i32 031 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer32 ret <16 x i8> %v233}34 35define <16 x i8> @load_v16i8_with_folded_offset(ptr %p) {36; CHECK-LABEL: load_v16i8_with_folded_offset:37; CHECK: .functype load_v16i8_with_folded_offset (i32) -> (v128)38; CHECK-NEXT: # %bb.0:39; CHECK-NEXT: local.get 040; CHECK-NEXT: v128.load 1641; CHECK-NEXT: # fallthrough-return42 %q = ptrtoint ptr %p to i3243 %r = add nuw i32 %q, 1644 %s = inttoptr i32 %r to ptr45 %v = load <16 x i8>, ptr %s46 ret <16 x i8> %v47}48 49define <16 x i8> @load_splat_v16i8_with_folded_offset(ptr %p) {50; CHECK-LABEL: load_splat_v16i8_with_folded_offset:51; CHECK: .functype load_splat_v16i8_with_folded_offset (i32) -> (v128)52; CHECK-NEXT: # %bb.0:53; CHECK-NEXT: local.get 054; CHECK-NEXT: v128.load8_splat 1655; CHECK-NEXT: # fallthrough-return56 %q = ptrtoint ptr %p to i3257 %r = add nuw i32 %q, 1658 %s = inttoptr i32 %r to ptr59 %e = load i8, ptr %s60 %v1 = insertelement <16 x i8> undef, i8 %e, i32 061 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer62 ret <16 x i8> %v263}64 65define <16 x i8> @load_v16i8_with_folded_gep_offset(ptr %p) {66; CHECK-LABEL: load_v16i8_with_folded_gep_offset:67; CHECK: .functype load_v16i8_with_folded_gep_offset (i32) -> (v128)68; CHECK-NEXT: # %bb.0:69; CHECK-NEXT: local.get 070; CHECK-NEXT: v128.load 1671; CHECK-NEXT: # fallthrough-return72 %s = getelementptr inbounds <16 x i8>, ptr %p, i32 173 %v = load <16 x i8>, ptr %s74 ret <16 x i8> %v75}76 77define <16 x i8> @load_splat_v16i8_with_folded_gep_offset(ptr %p) {78; CHECK-LABEL: load_splat_v16i8_with_folded_gep_offset:79; CHECK: .functype load_splat_v16i8_with_folded_gep_offset (i32) -> (v128)80; CHECK-NEXT: # %bb.0:81; CHECK-NEXT: local.get 082; CHECK-NEXT: v128.load8_splat 183; CHECK-NEXT: # fallthrough-return84 %s = getelementptr inbounds i8, ptr %p, i32 185 %e = load i8, ptr %s86 %v1 = insertelement <16 x i8> undef, i8 %e, i32 087 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer88 ret <16 x i8> %v289}90 91define <16 x i8> @load_v16i8_with_unfolded_gep_negative_offset(ptr %p) {92; CHECK-LABEL: load_v16i8_with_unfolded_gep_negative_offset:93; CHECK: .functype load_v16i8_with_unfolded_gep_negative_offset (i32) -> (v128)94; CHECK-NEXT: # %bb.0:95; CHECK-NEXT: local.get 096; CHECK-NEXT: i32.const -1697; CHECK-NEXT: i32.add98; CHECK-NEXT: v128.load 099; CHECK-NEXT: # fallthrough-return100 %s = getelementptr inbounds <16 x i8>, ptr %p, i32 -1101 %v = load <16 x i8>, ptr %s102 ret <16 x i8> %v103}104 105define <16 x i8> @load_splat_v16i8_with_unfolded_gep_negative_offset(ptr %p) {106; CHECK-LABEL: load_splat_v16i8_with_unfolded_gep_negative_offset:107; CHECK: .functype load_splat_v16i8_with_unfolded_gep_negative_offset (i32) -> (v128)108; CHECK-NEXT: # %bb.0:109; CHECK-NEXT: local.get 0110; CHECK-NEXT: i32.const -1111; CHECK-NEXT: i32.add112; CHECK-NEXT: v128.load8_splat 0113; CHECK-NEXT: # fallthrough-return114 %s = getelementptr inbounds i8, ptr %p, i32 -1115 %e = load i8, ptr %s116 %v1 = insertelement <16 x i8> undef, i8 %e, i32 0117 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer118 ret <16 x i8> %v2119}120 121define <16 x i8> @load_v16i8_with_unfolded_offset(ptr %p) {122; CHECK-LABEL: load_v16i8_with_unfolded_offset:123; CHECK: .functype load_v16i8_with_unfolded_offset (i32) -> (v128)124; CHECK-NEXT: # %bb.0:125; CHECK-NEXT: local.get 0126; CHECK-NEXT: i32.const 16127; CHECK-NEXT: i32.add128; CHECK-NEXT: v128.load 0129; CHECK-NEXT: # fallthrough-return130 %q = ptrtoint ptr %p to i32131 %r = add nsw i32 %q, 16132 %s = inttoptr i32 %r to ptr133 %v = load <16 x i8>, ptr %s134 ret <16 x i8> %v135}136 137define <16 x i8> @load_splat_v16i8_with_unfolded_offset(ptr %p) {138; CHECK-LABEL: load_splat_v16i8_with_unfolded_offset:139; CHECK: .functype load_splat_v16i8_with_unfolded_offset (i32) -> (v128)140; CHECK-NEXT: # %bb.0:141; CHECK-NEXT: local.get 0142; CHECK-NEXT: i32.const 16143; CHECK-NEXT: i32.add144; CHECK-NEXT: v128.load8_splat 0145; CHECK-NEXT: # fallthrough-return146 %q = ptrtoint ptr %p to i32147 %r = add nsw i32 %q, 16148 %s = inttoptr i32 %r to ptr149 %e = load i8, ptr %s150 %v1 = insertelement <16 x i8> undef, i8 %e, i32 0151 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer152 ret <16 x i8> %v2153}154 155define <16 x i8> @load_v16i8_with_unfolded_gep_offset(ptr %p) {156; CHECK-LABEL: load_v16i8_with_unfolded_gep_offset:157; CHECK: .functype load_v16i8_with_unfolded_gep_offset (i32) -> (v128)158; CHECK-NEXT: # %bb.0:159; CHECK-NEXT: local.get 0160; CHECK-NEXT: i32.const 16161; CHECK-NEXT: i32.add162; CHECK-NEXT: v128.load 0163; CHECK-NEXT: # fallthrough-return164 %s = getelementptr <16 x i8>, ptr %p, i32 1165 %v = load <16 x i8>, ptr %s166 ret <16 x i8> %v167}168 169define <16 x i8> @load_splat_v16i8_with_unfolded_gep_offset(ptr %p) {170; CHECK-LABEL: load_splat_v16i8_with_unfolded_gep_offset:171; CHECK: .functype load_splat_v16i8_with_unfolded_gep_offset (i32) -> (v128)172; CHECK-NEXT: # %bb.0:173; CHECK-NEXT: local.get 0174; CHECK-NEXT: i32.const 1175; CHECK-NEXT: i32.add176; CHECK-NEXT: v128.load8_splat 0177; CHECK-NEXT: # fallthrough-return178 %s = getelementptr i8, ptr %p, i32 1179 %e = load i8, ptr %s180 %v1 = insertelement <16 x i8> undef, i8 %e, i32 0181 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer182 ret <16 x i8> %v2183}184 185define <16 x i8> @load_v16i8_from_numeric_address() {186; CHECK-LABEL: load_v16i8_from_numeric_address:187; CHECK: .functype load_v16i8_from_numeric_address () -> (v128)188; CHECK-NEXT: # %bb.0:189; CHECK-NEXT: i32.const 0190; CHECK-NEXT: v128.load 32191; CHECK-NEXT: # fallthrough-return192 %s = inttoptr i32 32 to ptr193 %v = load <16 x i8>, ptr %s194 ret <16 x i8> %v195}196 197define <16 x i8> @load_splat_v16i8_from_numeric_address() {198; CHECK-LABEL: load_splat_v16i8_from_numeric_address:199; CHECK: .functype load_splat_v16i8_from_numeric_address () -> (v128)200; CHECK-NEXT: # %bb.0:201; CHECK-NEXT: i32.const 0202; CHECK-NEXT: v128.load8_splat 32203; CHECK-NEXT: # fallthrough-return204 %s = inttoptr i32 32 to ptr205 %e = load i8, ptr %s206 %v1 = insertelement <16 x i8> undef, i8 %e, i32 0207 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer208 ret <16 x i8> %v2209}210 211@gv_v16i8 = global <16 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>212define <16 x i8> @load_v16i8_from_global_address() {213; CHECK-LABEL: load_v16i8_from_global_address:214; CHECK: .functype load_v16i8_from_global_address () -> (v128)215; CHECK-NEXT: # %bb.0:216; CHECK-NEXT: i32.const 0217; CHECK-NEXT: v128.load gv_v16i8218; CHECK-NEXT: # fallthrough-return219 %v = load <16 x i8>, ptr @gv_v16i8220 ret <16 x i8> %v221}222 223@gv_i8 = global i8 42224define <16 x i8> @load_splat_v16i8_from_global_address() {225; CHECK-LABEL: load_splat_v16i8_from_global_address:226; CHECK: .functype load_splat_v16i8_from_global_address () -> (v128)227; CHECK-NEXT: # %bb.0:228; CHECK-NEXT: i32.const 0229; CHECK-NEXT: v128.load8_splat gv_i8230; CHECK-NEXT: # fallthrough-return231 %e = load i8, ptr @gv_i8232 %v1 = insertelement <16 x i8> undef, i8 %e, i32 0233 %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer234 ret <16 x i8> %v2235}236 237define void @store_v16i8(<16 x i8> %v, ptr %p) {238; CHECK-LABEL: store_v16i8:239; CHECK: .functype store_v16i8 (v128, i32) -> ()240; CHECK-NEXT: # %bb.0:241; CHECK-NEXT: local.get 1242; CHECK-NEXT: local.get 0243; CHECK-NEXT: v128.store 0244; CHECK-NEXT: # fallthrough-return245 store <16 x i8> %v , ptr %p246 ret void247}248 249define void @store_v16i8_with_folded_offset(<16 x i8> %v, ptr %p) {250; CHECK-LABEL: store_v16i8_with_folded_offset:251; CHECK: .functype store_v16i8_with_folded_offset (v128, i32) -> ()252; CHECK-NEXT: # %bb.0:253; CHECK-NEXT: local.get 1254; CHECK-NEXT: local.get 0255; CHECK-NEXT: v128.store 16256; CHECK-NEXT: # fallthrough-return257 %q = ptrtoint ptr %p to i32258 %r = add nuw i32 %q, 16259 %s = inttoptr i32 %r to ptr260 store <16 x i8> %v , ptr %s261 ret void262}263 264define void @store_v16i8_with_folded_gep_offset(<16 x i8> %v, ptr %p) {265; CHECK-LABEL: store_v16i8_with_folded_gep_offset:266; CHECK: .functype store_v16i8_with_folded_gep_offset (v128, i32) -> ()267; CHECK-NEXT: # %bb.0:268; CHECK-NEXT: local.get 1269; CHECK-NEXT: local.get 0270; CHECK-NEXT: v128.store 16271; CHECK-NEXT: # fallthrough-return272 %s = getelementptr inbounds <16 x i8>, ptr %p, i32 1273 store <16 x i8> %v , ptr %s274 ret void275}276 277define void @store_v16i8_with_unfolded_gep_negative_offset(<16 x i8> %v, ptr %p) {278; CHECK-LABEL: store_v16i8_with_unfolded_gep_negative_offset:279; CHECK: .functype store_v16i8_with_unfolded_gep_negative_offset (v128, i32) -> ()280; CHECK-NEXT: # %bb.0:281; CHECK-NEXT: local.get 1282; CHECK-NEXT: i32.const -16283; CHECK-NEXT: i32.add284; CHECK-NEXT: local.get 0285; CHECK-NEXT: v128.store 0286; CHECK-NEXT: # fallthrough-return287 %s = getelementptr inbounds <16 x i8>, ptr %p, i32 -1288 store <16 x i8> %v , ptr %s289 ret void290}291 292define void @store_v16i8_with_unfolded_offset(<16 x i8> %v, ptr %p) {293; CHECK-LABEL: store_v16i8_with_unfolded_offset:294; CHECK: .functype store_v16i8_with_unfolded_offset (v128, i32) -> ()295; CHECK-NEXT: # %bb.0:296; CHECK-NEXT: local.get 1297; CHECK-NEXT: i32.const 16298; CHECK-NEXT: i32.add299; CHECK-NEXT: local.get 0300; CHECK-NEXT: v128.store 0301; CHECK-NEXT: # fallthrough-return302 %q = ptrtoint ptr %p to i32303 %r = add nsw i32 %q, 16304 %s = inttoptr i32 %r to ptr305 store <16 x i8> %v , ptr %s306 ret void307}308 309define void @store_v16i8_with_unfolded_gep_offset(<16 x i8> %v, ptr %p) {310; CHECK-LABEL: store_v16i8_with_unfolded_gep_offset:311; CHECK: .functype store_v16i8_with_unfolded_gep_offset (v128, i32) -> ()312; CHECK-NEXT: # %bb.0:313; CHECK-NEXT: local.get 1314; CHECK-NEXT: i32.const 16315; CHECK-NEXT: i32.add316; CHECK-NEXT: local.get 0317; CHECK-NEXT: v128.store 0318; CHECK-NEXT: # fallthrough-return319 %s = getelementptr <16 x i8>, ptr %p, i32 1320 store <16 x i8> %v , ptr %s321 ret void322}323 324define void @store_v16i8_to_numeric_address(<16 x i8> %v) {325; CHECK-LABEL: store_v16i8_to_numeric_address:326; CHECK: .functype store_v16i8_to_numeric_address (v128) -> ()327; CHECK-NEXT: # %bb.0:328; CHECK-NEXT: i32.const 0329; CHECK-NEXT: local.get 0330; CHECK-NEXT: v128.store 32331; CHECK-NEXT: # fallthrough-return332 %s = inttoptr i32 32 to ptr333 store <16 x i8> %v , ptr %s334 ret void335}336 337define void @store_v16i8_to_global_address(<16 x i8> %v) {338; CHECK-LABEL: store_v16i8_to_global_address:339; CHECK: .functype store_v16i8_to_global_address (v128) -> ()340; CHECK-NEXT: # %bb.0:341; CHECK-NEXT: i32.const 0342; CHECK-NEXT: local.get 0343; CHECK-NEXT: v128.store gv_v16i8344; CHECK-NEXT: # fallthrough-return345 store <16 x i8> %v , ptr @gv_v16i8346 ret void347}348 349; ==============================================================================350; 8 x i16351; ==============================================================================352define <8 x i16> @load_v8i16(ptr %p) {353; CHECK-LABEL: load_v8i16:354; CHECK: .functype load_v8i16 (i32) -> (v128)355; CHECK-NEXT: # %bb.0:356; CHECK-NEXT: local.get 0357; CHECK-NEXT: v128.load 0358; CHECK-NEXT: # fallthrough-return359 %v = load <8 x i16>, ptr %p360 ret <8 x i16> %v361}362 363define <8 x i16> @load_splat_v8i16(ptr %p) {364; CHECK-LABEL: load_splat_v8i16:365; CHECK: .functype load_splat_v8i16 (i32) -> (v128)366; CHECK-NEXT: # %bb.0:367; CHECK-NEXT: local.get 0368; CHECK-NEXT: v128.load16_splat 0369; CHECK-NEXT: # fallthrough-return370 %e = load i16, ptr %p371 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0372 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer373 ret <8 x i16> %v2374}375 376define <8 x i16> @load_sext_v8i16(ptr %p) {377; CHECK-LABEL: load_sext_v8i16:378; CHECK: .functype load_sext_v8i16 (i32) -> (v128)379; CHECK-NEXT: # %bb.0:380; CHECK-NEXT: local.get 0381; CHECK-NEXT: i16x8.load8x8_s 0382; CHECK-NEXT: # fallthrough-return383 %v = load <8 x i8>, ptr %p384 %v2 = sext <8 x i8> %v to <8 x i16>385 ret <8 x i16> %v2386}387 388define <8 x i16> @load_zext_v8i16(ptr %p) {389; CHECK-LABEL: load_zext_v8i16:390; CHECK: .functype load_zext_v8i16 (i32) -> (v128)391; CHECK-NEXT: # %bb.0:392; CHECK-NEXT: local.get 0393; CHECK-NEXT: i16x8.load8x8_u 0394; CHECK-NEXT: # fallthrough-return395 %v = load <8 x i8>, ptr %p396 %v2 = zext <8 x i8> %v to <8 x i16>397 ret <8 x i16> %v2398}399 400define <8 x i8> @load_ext_v8i16(ptr %p) {401; CHECK-LABEL: load_ext_v8i16:402; CHECK: .functype load_ext_v8i16 (i32) -> (v128)403; CHECK-NEXT: # %bb.0:404; CHECK-NEXT: local.get 0405; CHECK-NEXT: v128.load64_zero 0406; CHECK-NEXT: # fallthrough-return407 %v = load <8 x i8>, ptr %p408 ret <8 x i8> %v409}410 411define <8 x i16> @load_v8i16_with_folded_offset(ptr %p) {412; CHECK-LABEL: load_v8i16_with_folded_offset:413; CHECK: .functype load_v8i16_with_folded_offset (i32) -> (v128)414; CHECK-NEXT: # %bb.0:415; CHECK-NEXT: local.get 0416; CHECK-NEXT: v128.load 16417; CHECK-NEXT: # fallthrough-return418 %q = ptrtoint ptr %p to i32419 %r = add nuw i32 %q, 16420 %s = inttoptr i32 %r to ptr421 %v = load <8 x i16>, ptr %s422 ret <8 x i16> %v423}424 425define <8 x i16> @load_splat_v8i16_with_folded_offset(ptr %p) {426; CHECK-LABEL: load_splat_v8i16_with_folded_offset:427; CHECK: .functype load_splat_v8i16_with_folded_offset (i32) -> (v128)428; CHECK-NEXT: # %bb.0:429; CHECK-NEXT: local.get 0430; CHECK-NEXT: v128.load16_splat 16431; CHECK-NEXT: # fallthrough-return432 %q = ptrtoint ptr %p to i32433 %r = add nuw i32 %q, 16434 %s = inttoptr i32 %r to ptr435 %e = load i16, ptr %s436 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0437 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer438 ret <8 x i16> %v2439}440 441define <8 x i16> @load_sext_v8i16_with_folded_offset(ptr %p) {442; CHECK-LABEL: load_sext_v8i16_with_folded_offset:443; CHECK: .functype load_sext_v8i16_with_folded_offset (i32) -> (v128)444; CHECK-NEXT: # %bb.0:445; CHECK-NEXT: local.get 0446; CHECK-NEXT: i16x8.load8x8_s 16447; CHECK-NEXT: # fallthrough-return448 %q = ptrtoint ptr %p to i32449 %r = add nuw i32 %q, 16450 %s = inttoptr i32 %r to ptr451 %v = load <8 x i8>, ptr %s452 %v2 = sext <8 x i8> %v to <8 x i16>453 ret <8 x i16> %v2454}455 456define <8 x i16> @load_zext_v8i16_with_folded_offset(ptr %p) {457; CHECK-LABEL: load_zext_v8i16_with_folded_offset:458; CHECK: .functype load_zext_v8i16_with_folded_offset (i32) -> (v128)459; CHECK-NEXT: # %bb.0:460; CHECK-NEXT: local.get 0461; CHECK-NEXT: i16x8.load8x8_u 16462; CHECK-NEXT: # fallthrough-return463 %q = ptrtoint ptr %p to i32464 %r = add nuw i32 %q, 16465 %s = inttoptr i32 %r to ptr466 %v = load <8 x i8>, ptr %s467 %v2 = zext <8 x i8> %v to <8 x i16>468 ret <8 x i16> %v2469}470 471define <8 x i8> @load_ext_v8i16_with_folded_offset(ptr %p) {472; CHECK-LABEL: load_ext_v8i16_with_folded_offset:473; CHECK: .functype load_ext_v8i16_with_folded_offset (i32) -> (v128)474; CHECK-NEXT: # %bb.0:475; CHECK-NEXT: local.get 0476; CHECK-NEXT: v128.load64_zero 16477; CHECK-NEXT: # fallthrough-return478 %q = ptrtoint ptr %p to i32479 %r = add nuw i32 %q, 16480 %s = inttoptr i32 %r to ptr481 %v = load <8 x i8>, ptr %s482 ret <8 x i8> %v483}484 485define <8 x i16> @load_v8i16_with_folded_gep_offset(ptr %p) {486; CHECK-LABEL: load_v8i16_with_folded_gep_offset:487; CHECK: .functype load_v8i16_with_folded_gep_offset (i32) -> (v128)488; CHECK-NEXT: # %bb.0:489; CHECK-NEXT: local.get 0490; CHECK-NEXT: v128.load 16491; CHECK-NEXT: # fallthrough-return492 %s = getelementptr inbounds <8 x i16>, ptr %p, i32 1493 %v = load <8 x i16>, ptr %s494 ret <8 x i16> %v495}496 497define <8 x i16> @load_splat_v8i16_with_folded_gep_offset(ptr %p) {498; CHECK-LABEL: load_splat_v8i16_with_folded_gep_offset:499; CHECK: .functype load_splat_v8i16_with_folded_gep_offset (i32) -> (v128)500; CHECK-NEXT: # %bb.0:501; CHECK-NEXT: local.get 0502; CHECK-NEXT: v128.load16_splat 2503; CHECK-NEXT: # fallthrough-return504 %s = getelementptr inbounds i16, ptr %p, i32 1505 %e = load i16, ptr %s506 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0507 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer508 ret <8 x i16> %v2509}510 511define <8 x i16> @load_sext_v8i16_with_folded_gep_offset(ptr %p) {512; CHECK-LABEL: load_sext_v8i16_with_folded_gep_offset:513; CHECK: .functype load_sext_v8i16_with_folded_gep_offset (i32) -> (v128)514; CHECK-NEXT: # %bb.0:515; CHECK-NEXT: local.get 0516; CHECK-NEXT: i16x8.load8x8_s 8517; CHECK-NEXT: # fallthrough-return518 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1519 %v = load <8 x i8>, ptr %s520 %v2 = sext <8 x i8> %v to <8 x i16>521 ret <8 x i16> %v2522}523 524define <8 x i16> @load_zext_v8i16_with_folded_gep_offset(ptr %p) {525; CHECK-LABEL: load_zext_v8i16_with_folded_gep_offset:526; CHECK: .functype load_zext_v8i16_with_folded_gep_offset (i32) -> (v128)527; CHECK-NEXT: # %bb.0:528; CHECK-NEXT: local.get 0529; CHECK-NEXT: i16x8.load8x8_u 8530; CHECK-NEXT: # fallthrough-return531 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1532 %v = load <8 x i8>, ptr %s533 %v2 = zext <8 x i8> %v to <8 x i16>534 ret <8 x i16> %v2535}536 537define <8 x i8> @load_ext_v8i16_with_folded_gep_offset(ptr %p) {538; CHECK-LABEL: load_ext_v8i16_with_folded_gep_offset:539; CHECK: .functype load_ext_v8i16_with_folded_gep_offset (i32) -> (v128)540; CHECK-NEXT: # %bb.0:541; CHECK-NEXT: local.get 0542; CHECK-NEXT: v128.load64_zero 8543; CHECK-NEXT: # fallthrough-return544 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1545 %v = load <8 x i8>, ptr %s546 ret <8 x i8> %v547}548 549define <8 x i16> @load_v8i16_with_unfolded_gep_negative_offset(ptr %p) {550; CHECK-LABEL: load_v8i16_with_unfolded_gep_negative_offset:551; CHECK: .functype load_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)552; CHECK-NEXT: # %bb.0:553; CHECK-NEXT: local.get 0554; CHECK-NEXT: i32.const -16555; CHECK-NEXT: i32.add556; CHECK-NEXT: v128.load 0557; CHECK-NEXT: # fallthrough-return558 %s = getelementptr inbounds <8 x i16>, ptr %p, i32 -1559 %v = load <8 x i16>, ptr %s560 ret <8 x i16> %v561}562 563define <8 x i16> @load_splat_v8i16_with_unfolded_gep_negative_offset(ptr %p) {564; CHECK-LABEL: load_splat_v8i16_with_unfolded_gep_negative_offset:565; CHECK: .functype load_splat_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)566; CHECK-NEXT: # %bb.0:567; CHECK-NEXT: local.get 0568; CHECK-NEXT: i32.const -2569; CHECK-NEXT: i32.add570; CHECK-NEXT: v128.load16_splat 0571; CHECK-NEXT: # fallthrough-return572 %s = getelementptr inbounds i16, ptr %p, i32 -1573 %e = load i16, ptr %s574 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0575 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer576 ret <8 x i16> %v2577}578 579define <8 x i16> @load_sext_v8i16_with_unfolded_gep_negative_offset(ptr %p) {580; CHECK-LABEL: load_sext_v8i16_with_unfolded_gep_negative_offset:581; CHECK: .functype load_sext_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)582; CHECK-NEXT: # %bb.0:583; CHECK-NEXT: local.get 0584; CHECK-NEXT: i32.const -8585; CHECK-NEXT: i32.add586; CHECK-NEXT: i16x8.load8x8_s 0587; CHECK-NEXT: # fallthrough-return588 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -1589 %v = load <8 x i8>, ptr %s590 %v2 = sext <8 x i8> %v to <8 x i16>591 ret <8 x i16> %v2592}593 594define <8 x i16> @load_zext_v8i16_with_unfolded_gep_negative_offset(ptr %p) {595; CHECK-LABEL: load_zext_v8i16_with_unfolded_gep_negative_offset:596; CHECK: .functype load_zext_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)597; CHECK-NEXT: # %bb.0:598; CHECK-NEXT: local.get 0599; CHECK-NEXT: i32.const -8600; CHECK-NEXT: i32.add601; CHECK-NEXT: i16x8.load8x8_u 0602; CHECK-NEXT: # fallthrough-return603 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -1604 %v = load <8 x i8>, ptr %s605 %v2 = zext <8 x i8> %v to <8 x i16>606 ret <8 x i16> %v2607}608 609define <8 x i8> @load_ext_v8i16_with_unfolded_gep_negative_offset(ptr %p) {610; CHECK-LABEL: load_ext_v8i16_with_unfolded_gep_negative_offset:611; CHECK: .functype load_ext_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)612; CHECK-NEXT: # %bb.0:613; CHECK-NEXT: local.get 0614; CHECK-NEXT: i32.const -8615; CHECK-NEXT: i32.add616; CHECK-NEXT: v128.load64_zero 0617; CHECK-NEXT: # fallthrough-return618 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -1619 %v = load <8 x i8>, ptr %s620 ret <8 x i8> %v621}622 623define <8 x i16> @load_v8i16_with_unfolded_offset(ptr %p) {624; CHECK-LABEL: load_v8i16_with_unfolded_offset:625; CHECK: .functype load_v8i16_with_unfolded_offset (i32) -> (v128)626; CHECK-NEXT: # %bb.0:627; CHECK-NEXT: local.get 0628; CHECK-NEXT: i32.const 16629; CHECK-NEXT: i32.add630; CHECK-NEXT: v128.load 0631; CHECK-NEXT: # fallthrough-return632 %q = ptrtoint ptr %p to i32633 %r = add nsw i32 %q, 16634 %s = inttoptr i32 %r to ptr635 %v = load <8 x i16>, ptr %s636 ret <8 x i16> %v637}638 639define <8 x i16> @load_splat_v8i16_with_unfolded_offset(ptr %p) {640; CHECK-LABEL: load_splat_v8i16_with_unfolded_offset:641; CHECK: .functype load_splat_v8i16_with_unfolded_offset (i32) -> (v128)642; CHECK-NEXT: # %bb.0:643; CHECK-NEXT: local.get 0644; CHECK-NEXT: i32.const 16645; CHECK-NEXT: i32.add646; CHECK-NEXT: v128.load16_splat 0647; CHECK-NEXT: # fallthrough-return648 %q = ptrtoint ptr %p to i32649 %r = add nsw i32 %q, 16650 %s = inttoptr i32 %r to ptr651 %e = load i16, ptr %s652 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0653 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer654 ret <8 x i16> %v2655}656 657define <8 x i16> @load_sext_v8i16_with_unfolded_offset(ptr %p) {658; CHECK-LABEL: load_sext_v8i16_with_unfolded_offset:659; CHECK: .functype load_sext_v8i16_with_unfolded_offset (i32) -> (v128)660; CHECK-NEXT: # %bb.0:661; CHECK-NEXT: local.get 0662; CHECK-NEXT: i32.const 16663; CHECK-NEXT: i32.add664; CHECK-NEXT: i16x8.load8x8_s 0665; CHECK-NEXT: # fallthrough-return666 %q = ptrtoint ptr %p to i32667 %r = add nsw i32 %q, 16668 %s = inttoptr i32 %r to ptr669 %v = load <8 x i8>, ptr %s670 %v2 = sext <8 x i8> %v to <8 x i16>671 ret <8 x i16> %v2672}673 674define <8 x i16> @load_zext_v8i16_with_unfolded_offset(ptr %p) {675; CHECK-LABEL: load_zext_v8i16_with_unfolded_offset:676; CHECK: .functype load_zext_v8i16_with_unfolded_offset (i32) -> (v128)677; CHECK-NEXT: # %bb.0:678; CHECK-NEXT: local.get 0679; CHECK-NEXT: i32.const 16680; CHECK-NEXT: i32.add681; CHECK-NEXT: i16x8.load8x8_u 0682; CHECK-NEXT: # fallthrough-return683 %q = ptrtoint ptr %p to i32684 %r = add nsw i32 %q, 16685 %s = inttoptr i32 %r to ptr686 %v = load <8 x i8>, ptr %s687 %v2 = zext <8 x i8> %v to <8 x i16>688 ret <8 x i16> %v2689}690 691define <8 x i8> @load_ext_v8i16_with_unfolded_offset(ptr %p) {692; CHECK-LABEL: load_ext_v8i16_with_unfolded_offset:693; CHECK: .functype load_ext_v8i16_with_unfolded_offset (i32) -> (v128)694; CHECK-NEXT: # %bb.0:695; CHECK-NEXT: local.get 0696; CHECK-NEXT: i32.const 16697; CHECK-NEXT: i32.add698; CHECK-NEXT: v128.load64_zero 0699; CHECK-NEXT: # fallthrough-return700 %q = ptrtoint ptr %p to i32701 %r = add nsw i32 %q, 16702 %s = inttoptr i32 %r to ptr703 %v = load <8 x i8>, ptr %s704 ret <8 x i8> %v705}706 707define <8 x i16> @load_v8i16_with_unfolded_gep_offset(ptr %p) {708; CHECK-LABEL: load_v8i16_with_unfolded_gep_offset:709; CHECK: .functype load_v8i16_with_unfolded_gep_offset (i32) -> (v128)710; CHECK-NEXT: # %bb.0:711; CHECK-NEXT: local.get 0712; CHECK-NEXT: i32.const 16713; CHECK-NEXT: i32.add714; CHECK-NEXT: v128.load 0715; CHECK-NEXT: # fallthrough-return716 %s = getelementptr <8 x i16>, ptr %p, i32 1717 %v = load <8 x i16>, ptr %s718 ret <8 x i16> %v719}720 721define <8 x i16> @load_splat_v8i16_with_unfolded_gep_offset(ptr %p) {722; CHECK-LABEL: load_splat_v8i16_with_unfolded_gep_offset:723; CHECK: .functype load_splat_v8i16_with_unfolded_gep_offset (i32) -> (v128)724; CHECK-NEXT: # %bb.0:725; CHECK-NEXT: local.get 0726; CHECK-NEXT: i32.const 2727; CHECK-NEXT: i32.add728; CHECK-NEXT: v128.load16_splat 0729; CHECK-NEXT: # fallthrough-return730 %s = getelementptr i16, ptr %p, i32 1731 %e = load i16, ptr %s732 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0733 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer734 ret <8 x i16> %v2735}736 737define <8 x i16> @load_sext_v8i16_with_unfolded_gep_offset(ptr %p) {738; CHECK-LABEL: load_sext_v8i16_with_unfolded_gep_offset:739; CHECK: .functype load_sext_v8i16_with_unfolded_gep_offset (i32) -> (v128)740; CHECK-NEXT: # %bb.0:741; CHECK-NEXT: local.get 0742; CHECK-NEXT: i32.const 8743; CHECK-NEXT: i32.add744; CHECK-NEXT: i16x8.load8x8_s 0745; CHECK-NEXT: # fallthrough-return746 %s = getelementptr <8 x i8>, ptr %p, i32 1747 %v = load <8 x i8>, ptr %s748 %v2 = sext <8 x i8> %v to <8 x i16>749 ret <8 x i16> %v2750}751 752define <8 x i16> @load_zext_v8i16_with_unfolded_gep_offset(ptr %p) {753; CHECK-LABEL: load_zext_v8i16_with_unfolded_gep_offset:754; CHECK: .functype load_zext_v8i16_with_unfolded_gep_offset (i32) -> (v128)755; CHECK-NEXT: # %bb.0:756; CHECK-NEXT: local.get 0757; CHECK-NEXT: i32.const 8758; CHECK-NEXT: i32.add759; CHECK-NEXT: i16x8.load8x8_u 0760; CHECK-NEXT: # fallthrough-return761 %s = getelementptr <8 x i8>, ptr %p, i32 1762 %v = load <8 x i8>, ptr %s763 %v2 = zext <8 x i8> %v to <8 x i16>764 ret <8 x i16> %v2765}766 767define <8 x i8> @load_ext_v8i16_with_unfolded_gep_offset(ptr %p) {768; CHECK-LABEL: load_ext_v8i16_with_unfolded_gep_offset:769; CHECK: .functype load_ext_v8i16_with_unfolded_gep_offset (i32) -> (v128)770; CHECK-NEXT: # %bb.0:771; CHECK-NEXT: local.get 0772; CHECK-NEXT: i32.const 8773; CHECK-NEXT: i32.add774; CHECK-NEXT: v128.load64_zero 0775; CHECK-NEXT: # fallthrough-return776 %s = getelementptr <8 x i8>, ptr %p, i32 1777 %v = load <8 x i8>, ptr %s778 ret <8 x i8> %v779}780 781define <8 x i16> @load_v8i16_from_numeric_address() {782; CHECK-LABEL: load_v8i16_from_numeric_address:783; CHECK: .functype load_v8i16_from_numeric_address () -> (v128)784; CHECK-NEXT: # %bb.0:785; CHECK-NEXT: i32.const 0786; CHECK-NEXT: v128.load 32787; CHECK-NEXT: # fallthrough-return788 %s = inttoptr i32 32 to ptr789 %v = load <8 x i16>, ptr %s790 ret <8 x i16> %v791}792 793define <8 x i16> @load_splat_v8i16_from_numeric_address() {794; CHECK-LABEL: load_splat_v8i16_from_numeric_address:795; CHECK: .functype load_splat_v8i16_from_numeric_address () -> (v128)796; CHECK-NEXT: # %bb.0:797; CHECK-NEXT: i32.const 0798; CHECK-NEXT: v128.load16_splat 32799; CHECK-NEXT: # fallthrough-return800 %s = inttoptr i32 32 to ptr801 %e = load i16, ptr %s802 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0803 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer804 ret <8 x i16> %v2805}806 807define <8 x i16> @load_sext_v8i16_from_numeric_address() {808; CHECK-LABEL: load_sext_v8i16_from_numeric_address:809; CHECK: .functype load_sext_v8i16_from_numeric_address () -> (v128)810; CHECK-NEXT: # %bb.0:811; CHECK-NEXT: i32.const 0812; CHECK-NEXT: i16x8.load8x8_s 32813; CHECK-NEXT: # fallthrough-return814 %s = inttoptr i32 32 to ptr815 %v = load <8 x i8>, ptr %s816 %v2 = sext <8 x i8> %v to <8 x i16>817 ret <8 x i16> %v2818}819 820define <8 x i16> @load_zext_v8i16_from_numeric_address() {821; CHECK-LABEL: load_zext_v8i16_from_numeric_address:822; CHECK: .functype load_zext_v8i16_from_numeric_address () -> (v128)823; CHECK-NEXT: # %bb.0:824; CHECK-NEXT: i32.const 0825; CHECK-NEXT: i16x8.load8x8_u 32826; CHECK-NEXT: # fallthrough-return827 %s = inttoptr i32 32 to ptr828 %v = load <8 x i8>, ptr %s829 %v2 = zext <8 x i8> %v to <8 x i16>830 ret <8 x i16> %v2831}832 833define <8 x i8> @load_ext_v8i16_from_numeric_address() {834; CHECK-LABEL: load_ext_v8i16_from_numeric_address:835; CHECK: .functype load_ext_v8i16_from_numeric_address () -> (v128)836; CHECK-NEXT: # %bb.0:837; CHECK-NEXT: i32.const 0838; CHECK-NEXT: v128.load64_zero 32839; CHECK-NEXT: # fallthrough-return840 %s = inttoptr i32 32 to ptr841 %v = load <8 x i8>, ptr %s842 ret <8 x i8> %v843}844 845@gv_v8i16 = global <8 x i16> <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>846define <8 x i16> @load_v8i16_from_global_address() {847; CHECK-LABEL: load_v8i16_from_global_address:848; CHECK: .functype load_v8i16_from_global_address () -> (v128)849; CHECK-NEXT: # %bb.0:850; CHECK-NEXT: i32.const 0851; CHECK-NEXT: v128.load gv_v8i16852; CHECK-NEXT: # fallthrough-return853 %v = load <8 x i16>, ptr @gv_v8i16854 ret <8 x i16> %v855}856 857@gv_i16 = global i16 42858define <8 x i16> @load_splat_v8i16_from_global_address() {859; CHECK-LABEL: load_splat_v8i16_from_global_address:860; CHECK: .functype load_splat_v8i16_from_global_address () -> (v128)861; CHECK-NEXT: # %bb.0:862; CHECK-NEXT: i32.const 0863; CHECK-NEXT: v128.load16_splat gv_i16864; CHECK-NEXT: # fallthrough-return865 %e = load i16, ptr @gv_i16866 %v1 = insertelement <8 x i16> undef, i16 %e, i32 0867 %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer868 ret <8 x i16> %v2869}870 871@gv_v8i8 = global <8 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>872define <8 x i16> @load_sext_v8i16_from_global_address() {873; CHECK-LABEL: load_sext_v8i16_from_global_address:874; CHECK: .functype load_sext_v8i16_from_global_address () -> (v128)875; CHECK-NEXT: # %bb.0:876; CHECK-NEXT: i32.const 0877; CHECK-NEXT: i16x8.load8x8_s gv_v8i8878; CHECK-NEXT: # fallthrough-return879 %v = load <8 x i8>, ptr @gv_v8i8880 %v2 = sext <8 x i8> %v to <8 x i16>881 ret <8 x i16> %v2882}883 884define <8 x i16> @load_zext_v8i16_from_global_address() {885; CHECK-LABEL: load_zext_v8i16_from_global_address:886; CHECK: .functype load_zext_v8i16_from_global_address () -> (v128)887; CHECK-NEXT: # %bb.0:888; CHECK-NEXT: i32.const 0889; CHECK-NEXT: i16x8.load8x8_u gv_v8i8890; CHECK-NEXT: # fallthrough-return891 %v = load <8 x i8>, ptr @gv_v8i8892 %v2 = zext <8 x i8> %v to <8 x i16>893 ret <8 x i16> %v2894}895 896define <8 x i8> @load_ext_v8i16_from_global_address() {897; CHECK-LABEL: load_ext_v8i16_from_global_address:898; CHECK: .functype load_ext_v8i16_from_global_address () -> (v128)899; CHECK-NEXT: # %bb.0:900; CHECK-NEXT: i32.const 0901; CHECK-NEXT: v128.load64_zero gv_v8i8902; CHECK-NEXT: # fallthrough-return903 %v = load <8 x i8>, ptr @gv_v8i8904 ret <8 x i8> %v905}906 907 908define void @store_v8i16(<8 x i16> %v, ptr %p) {909; CHECK-LABEL: store_v8i16:910; CHECK: .functype store_v8i16 (v128, i32) -> ()911; CHECK-NEXT: # %bb.0:912; CHECK-NEXT: local.get 1913; CHECK-NEXT: local.get 0914; CHECK-NEXT: v128.store 0915; CHECK-NEXT: # fallthrough-return916 store <8 x i16> %v , ptr %p917 ret void918}919 920define void @store_narrowing_v8i16(<8 x i8> %v, ptr %p) {921; CHECK-LABEL: store_narrowing_v8i16:922; CHECK: .functype store_narrowing_v8i16 (v128, i32) -> ()923; CHECK-NEXT: # %bb.0:924; CHECK-NEXT: local.get 1925; CHECK-NEXT: local.get 0926; CHECK-NEXT: v128.store64_lane 0, 0927; CHECK-NEXT: # fallthrough-return928 store <8 x i8> %v, ptr %p929 ret void930}931 932define void @store_v8i16_with_folded_offset(<8 x i16> %v, ptr %p) {933; CHECK-LABEL: store_v8i16_with_folded_offset:934; CHECK: .functype store_v8i16_with_folded_offset (v128, i32) -> ()935; CHECK-NEXT: # %bb.0:936; CHECK-NEXT: local.get 1937; CHECK-NEXT: local.get 0938; CHECK-NEXT: v128.store 16939; CHECK-NEXT: # fallthrough-return940 %q = ptrtoint ptr %p to i32941 %r = add nuw i32 %q, 16942 %s = inttoptr i32 %r to ptr943 store <8 x i16> %v , ptr %s944 ret void945}946 947define void @store_narrowing_v8i16_with_folded_offset(<8 x i8> %v, ptr %p) {948; CHECK-LABEL: store_narrowing_v8i16_with_folded_offset:949; CHECK: .functype store_narrowing_v8i16_with_folded_offset (v128, i32) -> ()950; CHECK-NEXT: # %bb.0:951; CHECK-NEXT: local.get 1952; CHECK-NEXT: local.get 0953; CHECK-NEXT: v128.store64_lane 16, 0954; CHECK-NEXT: # fallthrough-return955 %q = ptrtoint ptr %p to i32956 %r = add nuw i32 %q, 16957 %s = inttoptr i32 %r to ptr958 store <8 x i8> %v , ptr %s959 ret void960}961 962define void @store_v8i16_with_folded_gep_offset(<8 x i16> %v, ptr %p) {963; CHECK-LABEL: store_v8i16_with_folded_gep_offset:964; CHECK: .functype store_v8i16_with_folded_gep_offset (v128, i32) -> ()965; CHECK-NEXT: # %bb.0:966; CHECK-NEXT: local.get 1967; CHECK-NEXT: local.get 0968; CHECK-NEXT: v128.store 16969; CHECK-NEXT: # fallthrough-return970 %s = getelementptr inbounds <8 x i16>, ptr %p, i32 1971 store <8 x i16> %v , ptr %s972 ret void973}974 975define void @store_narrowing_v8i16_with_folded_gep_offset(<8 x i8> %v, ptr %p) {976; CHECK-LABEL: store_narrowing_v8i16_with_folded_gep_offset:977; CHECK: .functype store_narrowing_v8i16_with_folded_gep_offset (v128, i32) -> ()978; CHECK-NEXT: # %bb.0:979; CHECK-NEXT: local.get 1980; CHECK-NEXT: local.get 0981; CHECK-NEXT: v128.store64_lane 8, 0982; CHECK-NEXT: # fallthrough-return983 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1984 store <8 x i8> %v , ptr %s985 ret void986}987 988define void @store_v8i16_with_unfolded_gep_negative_offset(<8 x i16> %v, ptr %p) {989; CHECK-LABEL: store_v8i16_with_unfolded_gep_negative_offset:990; CHECK: .functype store_v8i16_with_unfolded_gep_negative_offset (v128, i32) -> ()991; CHECK-NEXT: # %bb.0:992; CHECK-NEXT: local.get 1993; CHECK-NEXT: i32.const -16994; CHECK-NEXT: i32.add995; CHECK-NEXT: local.get 0996; CHECK-NEXT: v128.store 0997; CHECK-NEXT: # fallthrough-return998 %s = getelementptr inbounds <8 x i16>, ptr %p, i32 -1999 store <8 x i16> %v , ptr %s1000 ret void1001}1002 1003define void @store_narrowing_v8i16_with_unfolded_gep_negative_offset(<8 x i8> %v, ptr %p) {1004; CHECK-LABEL: store_narrowing_v8i16_with_unfolded_gep_negative_offset:1005; CHECK: .functype store_narrowing_v8i16_with_unfolded_gep_negative_offset (v128, i32) -> ()1006; CHECK-NEXT: # %bb.0:1007; CHECK-NEXT: local.get 11008; CHECK-NEXT: i32.const -81009; CHECK-NEXT: i32.add1010; CHECK-NEXT: local.get 01011; CHECK-NEXT: v128.store64_lane 0, 01012; CHECK-NEXT: # fallthrough-return1013 %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -11014 store <8 x i8> %v , ptr %s1015 ret void1016}1017 1018define void @store_v8i16_with_unfolded_offset(<8 x i16> %v, ptr %p) {1019; CHECK-LABEL: store_v8i16_with_unfolded_offset:1020; CHECK: .functype store_v8i16_with_unfolded_offset (v128, i32) -> ()1021; CHECK-NEXT: # %bb.0:1022; CHECK-NEXT: local.get 11023; CHECK-NEXT: i32.const 161024; CHECK-NEXT: i32.add1025; CHECK-NEXT: local.get 01026; CHECK-NEXT: v128.store 01027; CHECK-NEXT: # fallthrough-return1028 %q = ptrtoint ptr %p to i321029 %r = add nsw i32 %q, 161030 %s = inttoptr i32 %r to ptr1031 store <8 x i16> %v , ptr %s1032 ret void1033}1034 1035define void @store_narrowing_v8i16_with_unfolded_offset(<8 x i8> %v, ptr %p) {1036; CHECK-LABEL: store_narrowing_v8i16_with_unfolded_offset:1037; CHECK: .functype store_narrowing_v8i16_with_unfolded_offset (v128, i32) -> ()1038; CHECK-NEXT: # %bb.0:1039; CHECK-NEXT: local.get 11040; CHECK-NEXT: i32.const 161041; CHECK-NEXT: i32.add1042; CHECK-NEXT: local.get 01043; CHECK-NEXT: v128.store64_lane 0, 01044; CHECK-NEXT: # fallthrough-return1045 %q = ptrtoint ptr %p to i321046 %r = add nsw i32 %q, 161047 %s = inttoptr i32 %r to ptr1048 store <8 x i8> %v , ptr %s1049 ret void1050}1051 1052define void @store_v8i16_with_unfolded_gep_offset(<8 x i16> %v, ptr %p) {1053; CHECK-LABEL: store_v8i16_with_unfolded_gep_offset:1054; CHECK: .functype store_v8i16_with_unfolded_gep_offset (v128, i32) -> ()1055; CHECK-NEXT: # %bb.0:1056; CHECK-NEXT: local.get 11057; CHECK-NEXT: i32.const 161058; CHECK-NEXT: i32.add1059; CHECK-NEXT: local.get 01060; CHECK-NEXT: v128.store 01061; CHECK-NEXT: # fallthrough-return1062 %s = getelementptr <8 x i16>, ptr %p, i32 11063 store <8 x i16> %v , ptr %s1064 ret void1065}1066 1067define void @store_narrowing_v8i16_with_unfolded_gep_offset(<8 x i8> %v, ptr %p) {1068; CHECK-LABEL: store_narrowing_v8i16_with_unfolded_gep_offset:1069; CHECK: .functype store_narrowing_v8i16_with_unfolded_gep_offset (v128, i32) -> ()1070; CHECK-NEXT: # %bb.0:1071; CHECK-NEXT: local.get 11072; CHECK-NEXT: i32.const 81073; CHECK-NEXT: i32.add1074; CHECK-NEXT: local.get 01075; CHECK-NEXT: v128.store64_lane 0, 01076; CHECK-NEXT: # fallthrough-return1077 %s = getelementptr <8 x i8>, ptr %p, i32 11078 store <8 x i8> %v , ptr %s1079 ret void1080}1081 1082define void @store_v8i16_to_numeric_address(<8 x i16> %v) {1083; CHECK-LABEL: store_v8i16_to_numeric_address:1084; CHECK: .functype store_v8i16_to_numeric_address (v128) -> ()1085; CHECK-NEXT: # %bb.0:1086; CHECK-NEXT: i32.const 01087; CHECK-NEXT: local.get 01088; CHECK-NEXT: v128.store 321089; CHECK-NEXT: # fallthrough-return1090 %s = inttoptr i32 32 to ptr1091 store <8 x i16> %v , ptr %s1092 ret void1093}1094 1095define void @store_narrowing_v8i16_to_numeric_address(<8 x i8> %v, ptr %p) {1096; CHECK-LABEL: store_narrowing_v8i16_to_numeric_address:1097; CHECK: .functype store_narrowing_v8i16_to_numeric_address (v128, i32) -> ()1098; CHECK-NEXT: # %bb.0:1099; CHECK-NEXT: i32.const 01100; CHECK-NEXT: local.get 01101; CHECK-NEXT: v128.store64_lane 32, 01102; CHECK-NEXT: # fallthrough-return1103 %s = inttoptr i32 32 to ptr1104 store <8 x i8> %v , ptr %s1105 ret void1106}1107 1108define void @store_v8i16_to_global_address(<8 x i16> %v) {1109; CHECK-LABEL: store_v8i16_to_global_address:1110; CHECK: .functype store_v8i16_to_global_address (v128) -> ()1111; CHECK-NEXT: # %bb.0:1112; CHECK-NEXT: i32.const 01113; CHECK-NEXT: local.get 01114; CHECK-NEXT: v128.store gv_v8i161115; CHECK-NEXT: # fallthrough-return1116 store <8 x i16> %v , ptr @gv_v8i161117 ret void1118}1119 1120define void @store_narrowing_v8i16_to_global_address(<8 x i8> %v) {1121; CHECK-LABEL: store_narrowing_v8i16_to_global_address:1122; CHECK: .functype store_narrowing_v8i16_to_global_address (v128) -> ()1123; CHECK-NEXT: # %bb.0:1124; CHECK-NEXT: i32.const 01125; CHECK-NEXT: local.get 01126; CHECK-NEXT: v128.store64_lane gv_v8i8, 01127; CHECK-NEXT: # fallthrough-return1128 store <8 x i8> %v , ptr @gv_v8i81129 ret void1130}1131 1132; ==============================================================================1133; 4 x i321134; ==============================================================================1135define <4 x i32> @load_v4i32(ptr %p) {1136; CHECK-LABEL: load_v4i32:1137; CHECK: .functype load_v4i32 (i32) -> (v128)1138; CHECK-NEXT: # %bb.0:1139; CHECK-NEXT: local.get 01140; CHECK-NEXT: v128.load 01141; CHECK-NEXT: # fallthrough-return1142 %v = load <4 x i32>, ptr %p1143 ret <4 x i32> %v1144}1145 1146define <4 x i32> @load_splat_v4i32(ptr %addr) {1147; CHECK-LABEL: load_splat_v4i32:1148; CHECK: .functype load_splat_v4i32 (i32) -> (v128)1149; CHECK-NEXT: # %bb.0:1150; CHECK-NEXT: local.get 01151; CHECK-NEXT: v128.load32_splat 01152; CHECK-NEXT: # fallthrough-return1153 %e = load i32, ptr %addr, align 41154 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01155 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1156 ret <4 x i32> %v21157}1158 1159define <4 x i32> @load_sext_v4i16_to_v4i32(ptr %p) {1160; CHECK-LABEL: load_sext_v4i16_to_v4i32:1161; CHECK: .functype load_sext_v4i16_to_v4i32 (i32) -> (v128)1162; CHECK-NEXT: # %bb.0:1163; CHECK-NEXT: local.get 01164; CHECK-NEXT: i32x4.load16x4_s 01165; CHECK-NEXT: # fallthrough-return1166 %v = load <4 x i16>, ptr %p1167 %v2 = sext <4 x i16> %v to <4 x i32>1168 ret <4 x i32> %v21169}1170 1171define <4 x i32> @load_zext_v4i16_to_v4i32(ptr %p) {1172; CHECK-LABEL: load_zext_v4i16_to_v4i32:1173; CHECK: .functype load_zext_v4i16_to_v4i32 (i32) -> (v128)1174; CHECK-NEXT: # %bb.0:1175; CHECK-NEXT: local.get 01176; CHECK-NEXT: i32x4.load16x4_u 01177; CHECK-NEXT: # fallthrough-return1178 %v = load <4 x i16>, ptr %p1179 %v2 = zext <4 x i16> %v to <4 x i32>1180 ret <4 x i32> %v21181}1182 1183define <4 x i32> @load_sext_v4i8_to_v4i32(ptr %p) {1184; CHECK-LABEL: load_sext_v4i8_to_v4i32:1185; CHECK: .functype load_sext_v4i8_to_v4i32 (i32) -> (v128)1186; CHECK-NEXT: # %bb.0:1187; CHECK-NEXT: local.get 01188; CHECK-NEXT: v128.load32_zero 01189; CHECK-NEXT: i16x8.extend_low_i8x16_s1190; CHECK-NEXT: i32x4.extend_low_i16x8_s1191; CHECK-NEXT: # fallthrough-return1192 %v = load <4 x i8>, ptr %p1193 %v2 = sext <4 x i8> %v to <4 x i32>1194 ret <4 x i32> %v21195}1196 1197define <4 x i32> @load_zext_v4i8_to_v4i32(ptr %p) {1198; CHECK-LABEL: load_zext_v4i8_to_v4i32:1199; CHECK: .functype load_zext_v4i8_to_v4i32 (i32) -> (v128)1200; CHECK-NEXT: # %bb.0:1201; CHECK-NEXT: local.get 01202; CHECK-NEXT: v128.load32_zero 01203; CHECK-NEXT: i16x8.extend_low_i8x16_u1204; CHECK-NEXT: i32x4.extend_low_i16x8_u1205; CHECK-NEXT: # fallthrough-return1206 %v = load <4 x i8>, ptr %p1207 %v2 = zext <4 x i8> %v to <4 x i32>1208 ret <4 x i32> %v21209}1210 1211define <4 x i16> @load_ext_v4i32(ptr %p) {1212; CHECK-LABEL: load_ext_v4i32:1213; CHECK: .functype load_ext_v4i32 (i32) -> (v128)1214; CHECK-NEXT: # %bb.0:1215; CHECK-NEXT: local.get 01216; CHECK-NEXT: v128.load64_zero 01217; CHECK-NEXT: # fallthrough-return1218 %v = load <4 x i16>, ptr %p1219 ret <4 x i16> %v1220}1221 1222define <4 x i32> @load_v4i32_with_folded_offset(ptr %p) {1223; CHECK-LABEL: load_v4i32_with_folded_offset:1224; CHECK: .functype load_v4i32_with_folded_offset (i32) -> (v128)1225; CHECK-NEXT: # %bb.0:1226; CHECK-NEXT: local.get 01227; CHECK-NEXT: v128.load 161228; CHECK-NEXT: # fallthrough-return1229 %q = ptrtoint ptr %p to i321230 %r = add nuw i32 %q, 161231 %s = inttoptr i32 %r to ptr1232 %v = load <4 x i32>, ptr %s1233 ret <4 x i32> %v1234}1235 1236define <4 x i32> @load_splat_v4i32_with_folded_offset(ptr %p) {1237; CHECK-LABEL: load_splat_v4i32_with_folded_offset:1238; CHECK: .functype load_splat_v4i32_with_folded_offset (i32) -> (v128)1239; CHECK-NEXT: # %bb.0:1240; CHECK-NEXT: local.get 01241; CHECK-NEXT: v128.load32_splat 161242; CHECK-NEXT: # fallthrough-return1243 %q = ptrtoint ptr %p to i321244 %r = add nuw i32 %q, 161245 %s = inttoptr i32 %r to ptr1246 %e = load i32, ptr %s1247 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01248 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1249 ret <4 x i32> %v21250}1251 1252define <4 x i32> @load_sext_v4i16_to_v4i32_with_folded_offset(ptr %p) {1253; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_folded_offset:1254; CHECK: .functype load_sext_v4i16_to_v4i32_with_folded_offset (i32) -> (v128)1255; CHECK-NEXT: # %bb.0:1256; CHECK-NEXT: local.get 01257; CHECK-NEXT: i32x4.load16x4_s 161258; CHECK-NEXT: # fallthrough-return1259 %q = ptrtoint ptr %p to i321260 %r = add nuw i32 %q, 161261 %s = inttoptr i32 %r to ptr1262 %v = load <4 x i16>, ptr %s1263 %v2 = sext <4 x i16> %v to <4 x i32>1264 ret <4 x i32> %v21265}1266 1267define <4 x i32> @load_zext_v4i16_to_v4i32_with_folded_offset(ptr %p) {1268; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_folded_offset:1269; CHECK: .functype load_zext_v4i16_to_v4i32_with_folded_offset (i32) -> (v128)1270; CHECK-NEXT: # %bb.0:1271; CHECK-NEXT: local.get 01272; CHECK-NEXT: i32x4.load16x4_u 161273; CHECK-NEXT: # fallthrough-return1274 %q = ptrtoint ptr %p to i321275 %r = add nuw i32 %q, 161276 %s = inttoptr i32 %r to ptr1277 %v = load <4 x i16>, ptr %s1278 %v2 = zext <4 x i16> %v to <4 x i32>1279 ret <4 x i32> %v21280}1281 1282define <4 x i32> @load_sext_v4i8_to_v4i32_with_folded_offset(ptr %p) {1283; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_folded_offset:1284; CHECK: .functype load_sext_v4i8_to_v4i32_with_folded_offset (i32) -> (v128)1285; CHECK-NEXT: # %bb.0:1286; CHECK-NEXT: local.get 01287; CHECK-NEXT: v128.load32_zero 161288; CHECK-NEXT: i16x8.extend_low_i8x16_s1289; CHECK-NEXT: i32x4.extend_low_i16x8_s1290; CHECK-NEXT: # fallthrough-return1291 %q = ptrtoint ptr %p to i321292 %r = add nuw i32 %q, 161293 %s = inttoptr i32 %r to ptr1294 %v = load <4 x i8>, ptr %s1295 %v2 = sext <4 x i8> %v to <4 x i32>1296 ret <4 x i32> %v21297}1298 1299define <4 x i32> @load_zext_v4i8_to_v4i32_with_folded_offset(ptr %p) {1300; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_folded_offset:1301; CHECK: .functype load_zext_v4i8_to_v4i32_with_folded_offset (i32) -> (v128)1302; CHECK-NEXT: # %bb.0:1303; CHECK-NEXT: local.get 01304; CHECK-NEXT: v128.load32_zero 161305; CHECK-NEXT: i16x8.extend_low_i8x16_u1306; CHECK-NEXT: i32x4.extend_low_i16x8_u1307; CHECK-NEXT: # fallthrough-return1308 %q = ptrtoint ptr %p to i321309 %r = add nuw i32 %q, 161310 %s = inttoptr i32 %r to ptr1311 %v = load <4 x i8>, ptr %s1312 %v2 = zext <4 x i8> %v to <4 x i32>1313 ret <4 x i32> %v21314}1315 1316define <4 x i16> @load_ext_v4i32_with_folded_offset(ptr %p) {1317; CHECK-LABEL: load_ext_v4i32_with_folded_offset:1318; CHECK: .functype load_ext_v4i32_with_folded_offset (i32) -> (v128)1319; CHECK-NEXT: # %bb.0:1320; CHECK-NEXT: local.get 01321; CHECK-NEXT: v128.load64_zero 161322; CHECK-NEXT: # fallthrough-return1323 %q = ptrtoint ptr %p to i321324 %r = add nuw i32 %q, 161325 %s = inttoptr i32 %r to ptr1326 %v = load <4 x i16>, ptr %s1327 ret <4 x i16> %v1328}1329 1330define <4 x i32> @load_v4i32_with_folded_gep_offset(ptr %p) {1331; CHECK-LABEL: load_v4i32_with_folded_gep_offset:1332; CHECK: .functype load_v4i32_with_folded_gep_offset (i32) -> (v128)1333; CHECK-NEXT: # %bb.0:1334; CHECK-NEXT: local.get 01335; CHECK-NEXT: v128.load 161336; CHECK-NEXT: # fallthrough-return1337 %s = getelementptr inbounds <4 x i32>, ptr %p, i32 11338 %v = load <4 x i32>, ptr %s1339 ret <4 x i32> %v1340}1341 1342define <4 x i32> @load_splat_v4i32_with_folded_gep_offset(ptr %p) {1343; CHECK-LABEL: load_splat_v4i32_with_folded_gep_offset:1344; CHECK: .functype load_splat_v4i32_with_folded_gep_offset (i32) -> (v128)1345; CHECK-NEXT: # %bb.0:1346; CHECK-NEXT: local.get 01347; CHECK-NEXT: v128.load32_splat 41348; CHECK-NEXT: # fallthrough-return1349 %s = getelementptr inbounds i32, ptr %p, i32 11350 %e = load i32, ptr %s1351 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01352 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1353 ret <4 x i32> %v21354}1355 1356define <4 x i32> @load_sext_v4i16_to_v4i32_with_folded_gep_offset(ptr %p) {1357; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_folded_gep_offset:1358; CHECK: .functype load_sext_v4i16_to_v4i32_with_folded_gep_offset (i32) -> (v128)1359; CHECK-NEXT: # %bb.0:1360; CHECK-NEXT: local.get 01361; CHECK-NEXT: i32x4.load16x4_s 81362; CHECK-NEXT: # fallthrough-return1363 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 11364 %v = load <4 x i16>, ptr %s1365 %v2 = sext <4 x i16> %v to <4 x i32>1366 ret <4 x i32> %v21367}1368 1369define <4 x i32> @load_zext_v4i16_to_v4i32_with_folded_gep_offset(ptr %p) {1370; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_folded_gep_offset:1371; CHECK: .functype load_zext_v4i16_to_v4i32_with_folded_gep_offset (i32) -> (v128)1372; CHECK-NEXT: # %bb.0:1373; CHECK-NEXT: local.get 01374; CHECK-NEXT: i32x4.load16x4_u 81375; CHECK-NEXT: # fallthrough-return1376 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 11377 %v = load <4 x i16>, ptr %s1378 %v2 = zext <4 x i16> %v to <4 x i32>1379 ret <4 x i32> %v21380}1381 1382define <4 x i32> @load_sext_v4i8_to_v4i32_with_folded_gep_offset(ptr %p) {1383; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_folded_gep_offset:1384; CHECK: .functype load_sext_v4i8_to_v4i32_with_folded_gep_offset (i32) -> (v128)1385; CHECK-NEXT: # %bb.0:1386; CHECK-NEXT: local.get 01387; CHECK-NEXT: v128.load32_zero 41388; CHECK-NEXT: i16x8.extend_low_i8x16_s1389; CHECK-NEXT: i32x4.extend_low_i16x8_s1390; CHECK-NEXT: # fallthrough-return1391 %s = getelementptr inbounds <4 x i8>, ptr %p, i32 11392 %v = load <4 x i8>, ptr %s1393 %v2 = sext <4 x i8> %v to <4 x i32>1394 ret <4 x i32> %v21395}1396 1397define <4 x i32> @load_zext_v4i8_to_v4i32_with_folded_gep_offset(ptr %p) {1398; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_folded_gep_offset:1399; CHECK: .functype load_zext_v4i8_to_v4i32_with_folded_gep_offset (i32) -> (v128)1400; CHECK-NEXT: # %bb.0:1401; CHECK-NEXT: local.get 01402; CHECK-NEXT: v128.load32_zero 41403; CHECK-NEXT: i16x8.extend_low_i8x16_u1404; CHECK-NEXT: i32x4.extend_low_i16x8_u1405; CHECK-NEXT: # fallthrough-return1406 %s = getelementptr inbounds <4 x i8>, ptr %p, i32 11407 %v = load <4 x i8>, ptr %s1408 %v2 = zext <4 x i8> %v to <4 x i32>1409 ret <4 x i32> %v21410}1411 1412define <4 x i16> @load_ext_v4i32_with_folded_gep_offset(ptr %p) {1413; CHECK-LABEL: load_ext_v4i32_with_folded_gep_offset:1414; CHECK: .functype load_ext_v4i32_with_folded_gep_offset (i32) -> (v128)1415; CHECK-NEXT: # %bb.0:1416; CHECK-NEXT: local.get 01417; CHECK-NEXT: v128.load64_zero 81418; CHECK-NEXT: # fallthrough-return1419 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 11420 %v = load <4 x i16>, ptr %s1421 ret <4 x i16> %v1422}1423 1424define <4 x i32> @load_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1425; CHECK-LABEL: load_v4i32_with_unfolded_gep_negative_offset:1426; CHECK: .functype load_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1427; CHECK-NEXT: # %bb.0:1428; CHECK-NEXT: local.get 01429; CHECK-NEXT: i32.const -161430; CHECK-NEXT: i32.add1431; CHECK-NEXT: v128.load 01432; CHECK-NEXT: # fallthrough-return1433 %s = getelementptr inbounds <4 x i32>, ptr %p, i32 -11434 %v = load <4 x i32>, ptr %s1435 ret <4 x i32> %v1436}1437 1438define <4 x i32> @load_splat_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1439; CHECK-LABEL: load_splat_v4i32_with_unfolded_gep_negative_offset:1440; CHECK: .functype load_splat_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1441; CHECK-NEXT: # %bb.0:1442; CHECK-NEXT: local.get 01443; CHECK-NEXT: i32.const -41444; CHECK-NEXT: i32.add1445; CHECK-NEXT: v128.load32_splat 01446; CHECK-NEXT: # fallthrough-return1447 %s = getelementptr inbounds i32, ptr %p, i32 -11448 %e = load i32, ptr %s1449 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01450 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1451 ret <4 x i32> %v21452}1453 1454define <4 x i32> @load_sext_v4i16_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1455; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_unfolded_gep_negative_offset:1456; CHECK: .functype load_sext_v4i16_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1457; CHECK-NEXT: # %bb.0:1458; CHECK-NEXT: local.get 01459; CHECK-NEXT: i32.const -81460; CHECK-NEXT: i32.add1461; CHECK-NEXT: i32x4.load16x4_s 01462; CHECK-NEXT: # fallthrough-return1463 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -11464 %v = load <4 x i16>, ptr %s1465 %v2 = sext <4 x i16> %v to <4 x i32>1466 ret <4 x i32> %v21467}1468 1469define <4 x i32> @load_zext_v4i16_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1470; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_unfolded_gep_negative_offset:1471; CHECK: .functype load_zext_v4i16_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1472; CHECK-NEXT: # %bb.0:1473; CHECK-NEXT: local.get 01474; CHECK-NEXT: i32.const -81475; CHECK-NEXT: i32.add1476; CHECK-NEXT: i32x4.load16x4_u 01477; CHECK-NEXT: # fallthrough-return1478 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -11479 %v = load <4 x i16>, ptr %s1480 %v2 = zext <4 x i16> %v to <4 x i32>1481 ret <4 x i32> %v21482}1483 1484define <4 x i32> @load_sext_v4i8_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1485; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_unfolded_gep_negative_offset:1486; CHECK: .functype load_sext_v4i8_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1487; CHECK-NEXT: # %bb.0:1488; CHECK-NEXT: local.get 01489; CHECK-NEXT: i32.const -41490; CHECK-NEXT: i32.add1491; CHECK-NEXT: v128.load32_zero 01492; CHECK-NEXT: i16x8.extend_low_i8x16_s1493; CHECK-NEXT: i32x4.extend_low_i16x8_s1494; CHECK-NEXT: # fallthrough-return1495 %s = getelementptr inbounds <4 x i8>, ptr %p, i32 -11496 %v = load <4 x i8>, ptr %s1497 %v2 = sext <4 x i8> %v to <4 x i32>1498 ret <4 x i32> %v21499}1500 1501define <4 x i32> @load_zext_v4i8_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1502; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_unfolded_gep_negative_offset:1503; CHECK: .functype load_zext_v4i8_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1504; CHECK-NEXT: # %bb.0:1505; CHECK-NEXT: local.get 01506; CHECK-NEXT: i32.const -41507; CHECK-NEXT: i32.add1508; CHECK-NEXT: v128.load32_zero 01509; CHECK-NEXT: i16x8.extend_low_i8x16_u1510; CHECK-NEXT: i32x4.extend_low_i16x8_u1511; CHECK-NEXT: # fallthrough-return1512 %s = getelementptr inbounds <4 x i8>, ptr %p, i32 -11513 %v = load <4 x i8>, ptr %s1514 %v2 = zext <4 x i8> %v to <4 x i32>1515 ret <4 x i32> %v21516}1517 1518define <4 x i16> @load_ext_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1519; CHECK-LABEL: load_ext_v4i32_with_unfolded_gep_negative_offset:1520; CHECK: .functype load_ext_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1521; CHECK-NEXT: # %bb.0:1522; CHECK-NEXT: local.get 01523; CHECK-NEXT: i32.const -81524; CHECK-NEXT: i32.add1525; CHECK-NEXT: v128.load64_zero 01526; CHECK-NEXT: # fallthrough-return1527 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -11528 %v = load <4 x i16>, ptr %s1529 ret <4 x i16> %v1530}1531 1532define <4 x i32> @load_v4i32_with_unfolded_offset(ptr %p) {1533; CHECK-LABEL: load_v4i32_with_unfolded_offset:1534; CHECK: .functype load_v4i32_with_unfolded_offset (i32) -> (v128)1535; CHECK-NEXT: # %bb.0:1536; CHECK-NEXT: local.get 01537; CHECK-NEXT: i32.const 161538; CHECK-NEXT: i32.add1539; CHECK-NEXT: v128.load 01540; CHECK-NEXT: # fallthrough-return1541 %q = ptrtoint ptr %p to i321542 %r = add nsw i32 %q, 161543 %s = inttoptr i32 %r to ptr1544 %v = load <4 x i32>, ptr %s1545 ret <4 x i32> %v1546}1547 1548define <4 x i32> @load_splat_v4i32_with_unfolded_offset(ptr %p) {1549; CHECK-LABEL: load_splat_v4i32_with_unfolded_offset:1550; CHECK: .functype load_splat_v4i32_with_unfolded_offset (i32) -> (v128)1551; CHECK-NEXT: # %bb.0:1552; CHECK-NEXT: local.get 01553; CHECK-NEXT: i32.const 161554; CHECK-NEXT: i32.add1555; CHECK-NEXT: v128.load32_splat 01556; CHECK-NEXT: # fallthrough-return1557 %q = ptrtoint ptr %p to i321558 %r = add nsw i32 %q, 161559 %s = inttoptr i32 %r to ptr1560 %e = load i32, ptr %s1561 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01562 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1563 ret <4 x i32> %v21564}1565 1566define <4 x i32> @load_sext_v4i16_to_v4i32_with_unfolded_offset(ptr %p) {1567; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_unfolded_offset:1568; CHECK: .functype load_sext_v4i16_to_v4i32_with_unfolded_offset (i32) -> (v128)1569; CHECK-NEXT: # %bb.0:1570; CHECK-NEXT: local.get 01571; CHECK-NEXT: i32.const 161572; CHECK-NEXT: i32.add1573; CHECK-NEXT: i32x4.load16x4_s 01574; CHECK-NEXT: # fallthrough-return1575 %q = ptrtoint ptr %p to i321576 %r = add nsw i32 %q, 161577 %s = inttoptr i32 %r to ptr1578 %v = load <4 x i16>, ptr %s1579 %v2 = sext <4 x i16> %v to <4 x i32>1580 ret <4 x i32> %v21581}1582 1583define <4 x i32> @load_zext_v4i16_to_v4i32_with_unfolded_offset(ptr %p) {1584; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_unfolded_offset:1585; CHECK: .functype load_zext_v4i16_to_v4i32_with_unfolded_offset (i32) -> (v128)1586; CHECK-NEXT: # %bb.0:1587; CHECK-NEXT: local.get 01588; CHECK-NEXT: i32.const 161589; CHECK-NEXT: i32.add1590; CHECK-NEXT: i32x4.load16x4_u 01591; CHECK-NEXT: # fallthrough-return1592 %q = ptrtoint ptr %p to i321593 %r = add nsw i32 %q, 161594 %s = inttoptr i32 %r to ptr1595 %v = load <4 x i16>, ptr %s1596 %v2 = zext <4 x i16> %v to <4 x i32>1597 ret <4 x i32> %v21598}1599 1600define <4 x i32> @load_sext_v4i8_to_v4i32_with_unfolded_offset(ptr %p) {1601; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_unfolded_offset:1602; CHECK: .functype load_sext_v4i8_to_v4i32_with_unfolded_offset (i32) -> (v128)1603; CHECK-NEXT: # %bb.0:1604; CHECK-NEXT: local.get 01605; CHECK-NEXT: i32.const 161606; CHECK-NEXT: i32.add1607; CHECK-NEXT: v128.load32_zero 01608; CHECK-NEXT: i16x8.extend_low_i8x16_s1609; CHECK-NEXT: i32x4.extend_low_i16x8_s1610; CHECK-NEXT: # fallthrough-return1611 %q = ptrtoint ptr %p to i321612 %r = add nsw i32 %q, 161613 %s = inttoptr i32 %r to ptr1614 %v = load <4 x i8>, ptr %s1615 %v2 = sext <4 x i8> %v to <4 x i32>1616 ret <4 x i32> %v21617}1618 1619define <4 x i32> @load_zext_v4i8_to_v4i32_with_unfolded_offset(ptr %p) {1620; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_unfolded_offset:1621; CHECK: .functype load_zext_v4i8_to_v4i32_with_unfolded_offset (i32) -> (v128)1622; CHECK-NEXT: # %bb.0:1623; CHECK-NEXT: local.get 01624; CHECK-NEXT: i32.const 161625; CHECK-NEXT: i32.add1626; CHECK-NEXT: v128.load32_zero 01627; CHECK-NEXT: i16x8.extend_low_i8x16_u1628; CHECK-NEXT: i32x4.extend_low_i16x8_u1629; CHECK-NEXT: # fallthrough-return1630 %q = ptrtoint ptr %p to i321631 %r = add nsw i32 %q, 161632 %s = inttoptr i32 %r to ptr1633 %v = load <4 x i8>, ptr %s1634 %v2 = zext <4 x i8> %v to <4 x i32>1635 ret <4 x i32> %v21636}1637 1638define <4 x i16> @load_ext_v4i32_with_unfolded_offset(ptr %p) {1639; CHECK-LABEL: load_ext_v4i32_with_unfolded_offset:1640; CHECK: .functype load_ext_v4i32_with_unfolded_offset (i32) -> (v128)1641; CHECK-NEXT: # %bb.0:1642; CHECK-NEXT: local.get 01643; CHECK-NEXT: i32.const 161644; CHECK-NEXT: i32.add1645; CHECK-NEXT: v128.load64_zero 01646; CHECK-NEXT: # fallthrough-return1647 %q = ptrtoint ptr %p to i321648 %r = add nsw i32 %q, 161649 %s = inttoptr i32 %r to ptr1650 %v = load <4 x i16>, ptr %s1651 ret <4 x i16> %v1652}1653 1654define <4 x i32> @load_v4i32_with_unfolded_gep_offset(ptr %p) {1655; CHECK-LABEL: load_v4i32_with_unfolded_gep_offset:1656; CHECK: .functype load_v4i32_with_unfolded_gep_offset (i32) -> (v128)1657; CHECK-NEXT: # %bb.0:1658; CHECK-NEXT: local.get 01659; CHECK-NEXT: i32.const 161660; CHECK-NEXT: i32.add1661; CHECK-NEXT: v128.load 01662; CHECK-NEXT: # fallthrough-return1663 %s = getelementptr <4 x i32>, ptr %p, i32 11664 %v = load <4 x i32>, ptr %s1665 ret <4 x i32> %v1666}1667 1668define <4 x i32> @load_splat_v4i32_with_unfolded_gep_offset(ptr %p) {1669; CHECK-LABEL: load_splat_v4i32_with_unfolded_gep_offset:1670; CHECK: .functype load_splat_v4i32_with_unfolded_gep_offset (i32) -> (v128)1671; CHECK-NEXT: # %bb.0:1672; CHECK-NEXT: local.get 01673; CHECK-NEXT: i32.const 41674; CHECK-NEXT: i32.add1675; CHECK-NEXT: v128.load32_splat 01676; CHECK-NEXT: # fallthrough-return1677 %s = getelementptr i32, ptr %p, i32 11678 %e = load i32, ptr %s1679 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01680 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1681 ret <4 x i32> %v21682}1683 1684define <4 x i32> @load_sext_v4i16_to_v4i32_with_unfolded_gep_offset(ptr %p) {1685; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_unfolded_gep_offset:1686; CHECK: .functype load_sext_v4i16_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1687; CHECK-NEXT: # %bb.0:1688; CHECK-NEXT: local.get 01689; CHECK-NEXT: i32.const 81690; CHECK-NEXT: i32.add1691; CHECK-NEXT: i32x4.load16x4_s 01692; CHECK-NEXT: # fallthrough-return1693 %s = getelementptr <4 x i16>, ptr %p, i32 11694 %v = load <4 x i16>, ptr %s1695 %v2 = sext <4 x i16> %v to <4 x i32>1696 ret <4 x i32> %v21697}1698 1699define <4 x i32> @load_zext_v4i16_to_v4i32_with_unfolded_gep_offset(ptr %p) {1700; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_unfolded_gep_offset:1701; CHECK: .functype load_zext_v4i16_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1702; CHECK-NEXT: # %bb.0:1703; CHECK-NEXT: local.get 01704; CHECK-NEXT: i32.const 81705; CHECK-NEXT: i32.add1706; CHECK-NEXT: i32x4.load16x4_u 01707; CHECK-NEXT: # fallthrough-return1708 %s = getelementptr <4 x i16>, ptr %p, i32 11709 %v = load <4 x i16>, ptr %s1710 %v2 = zext <4 x i16> %v to <4 x i32>1711 ret <4 x i32> %v21712}1713 1714define <4 x i32> @load_sext_v4i8_to_v4i32_with_unfolded_gep_offset(ptr %p) {1715; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_unfolded_gep_offset:1716; CHECK: .functype load_sext_v4i8_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1717; CHECK-NEXT: # %bb.0:1718; CHECK-NEXT: local.get 01719; CHECK-NEXT: i32.const 41720; CHECK-NEXT: i32.add1721; CHECK-NEXT: v128.load32_zero 01722; CHECK-NEXT: i16x8.extend_low_i8x16_s1723; CHECK-NEXT: i32x4.extend_low_i16x8_s1724; CHECK-NEXT: # fallthrough-return1725 %s = getelementptr <4 x i8>, ptr %p, i32 11726 %v = load <4 x i8>, ptr %s1727 %v2 = sext <4 x i8> %v to <4 x i32>1728 ret <4 x i32> %v21729}1730 1731define <4 x i32> @load_zext_v4i8_to_v4i32_with_unfolded_gep_offset(ptr %p) {1732; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_unfolded_gep_offset:1733; CHECK: .functype load_zext_v4i8_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1734; CHECK-NEXT: # %bb.0:1735; CHECK-NEXT: local.get 01736; CHECK-NEXT: i32.const 41737; CHECK-NEXT: i32.add1738; CHECK-NEXT: v128.load32_zero 01739; CHECK-NEXT: i16x8.extend_low_i8x16_u1740; CHECK-NEXT: i32x4.extend_low_i16x8_u1741; CHECK-NEXT: # fallthrough-return1742 %s = getelementptr <4 x i8>, ptr %p, i32 11743 %v = load <4 x i8>, ptr %s1744 %v2 = zext <4 x i8> %v to <4 x i32>1745 ret <4 x i32> %v21746}1747 1748define <4 x i16> @load_ext_v4i32_with_unfolded_gep_offset(ptr %p) {1749; CHECK-LABEL: load_ext_v4i32_with_unfolded_gep_offset:1750; CHECK: .functype load_ext_v4i32_with_unfolded_gep_offset (i32) -> (v128)1751; CHECK-NEXT: # %bb.0:1752; CHECK-NEXT: local.get 01753; CHECK-NEXT: i32.const 81754; CHECK-NEXT: i32.add1755; CHECK-NEXT: v128.load64_zero 01756; CHECK-NEXT: # fallthrough-return1757 %s = getelementptr <4 x i16>, ptr %p, i32 11758 %v = load <4 x i16>, ptr %s1759 ret <4 x i16> %v1760}1761 1762define <4 x i32> @load_v4i32_from_numeric_address() {1763; CHECK-LABEL: load_v4i32_from_numeric_address:1764; CHECK: .functype load_v4i32_from_numeric_address () -> (v128)1765; CHECK-NEXT: # %bb.0:1766; CHECK-NEXT: i32.const 01767; CHECK-NEXT: v128.load 321768; CHECK-NEXT: # fallthrough-return1769 %s = inttoptr i32 32 to ptr1770 %v = load <4 x i32>, ptr %s1771 ret <4 x i32> %v1772}1773 1774define <4 x i32> @load_splat_v4i32_from_numeric_address() {1775; CHECK-LABEL: load_splat_v4i32_from_numeric_address:1776; CHECK: .functype load_splat_v4i32_from_numeric_address () -> (v128)1777; CHECK-NEXT: # %bb.0:1778; CHECK-NEXT: i32.const 01779; CHECK-NEXT: v128.load32_splat 321780; CHECK-NEXT: # fallthrough-return1781 %s = inttoptr i32 32 to ptr1782 %e = load i32, ptr %s1783 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01784 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1785 ret <4 x i32> %v21786}1787 1788define <4 x i32> @load_sext_v4i16_to_v4i32_from_numeric_address() {1789; CHECK-LABEL: load_sext_v4i16_to_v4i32_from_numeric_address:1790; CHECK: .functype load_sext_v4i16_to_v4i32_from_numeric_address () -> (v128)1791; CHECK-NEXT: # %bb.0:1792; CHECK-NEXT: i32.const 01793; CHECK-NEXT: i32x4.load16x4_s 321794; CHECK-NEXT: # fallthrough-return1795 %s = inttoptr i32 32 to ptr1796 %v = load <4 x i16>, ptr %s1797 %v2 = sext <4 x i16> %v to <4 x i32>1798 ret <4 x i32> %v21799}1800 1801define <4 x i32> @load_zext_v4i16_to_v4i32_from_numeric_address() {1802; CHECK-LABEL: load_zext_v4i16_to_v4i32_from_numeric_address:1803; CHECK: .functype load_zext_v4i16_to_v4i32_from_numeric_address () -> (v128)1804; CHECK-NEXT: # %bb.0:1805; CHECK-NEXT: i32.const 01806; CHECK-NEXT: i32x4.load16x4_u 321807; CHECK-NEXT: # fallthrough-return1808 %s = inttoptr i32 32 to ptr1809 %v = load <4 x i16>, ptr %s1810 %v2 = zext <4 x i16> %v to <4 x i32>1811 ret <4 x i32> %v21812}1813 1814define <4 x i32> @load_sext_v4i8_to_v4i32_from_numeric_address() {1815; CHECK-LABEL: load_sext_v4i8_to_v4i32_from_numeric_address:1816; CHECK: .functype load_sext_v4i8_to_v4i32_from_numeric_address () -> (v128)1817; CHECK-NEXT: # %bb.0:1818; CHECK-NEXT: i32.const 01819; CHECK-NEXT: v128.load32_zero 321820; CHECK-NEXT: i16x8.extend_low_i8x16_s1821; CHECK-NEXT: i32x4.extend_low_i16x8_s1822; CHECK-NEXT: # fallthrough-return1823 %s = inttoptr i32 32 to ptr1824 %v = load <4 x i8>, ptr %s1825 %v2 = sext <4 x i8> %v to <4 x i32>1826 ret <4 x i32> %v21827}1828 1829define <4 x i32> @load_zext_v4i8_to_v4i32_from_numeric_address() {1830; CHECK-LABEL: load_zext_v4i8_to_v4i32_from_numeric_address:1831; CHECK: .functype load_zext_v4i8_to_v4i32_from_numeric_address () -> (v128)1832; CHECK-NEXT: # %bb.0:1833; CHECK-NEXT: i32.const 01834; CHECK-NEXT: v128.load32_zero 321835; CHECK-NEXT: i16x8.extend_low_i8x16_u1836; CHECK-NEXT: i32x4.extend_low_i16x8_u1837; CHECK-NEXT: # fallthrough-return1838 %s = inttoptr i32 32 to ptr1839 %v = load <4 x i8>, ptr %s1840 %v2 = zext <4 x i8> %v to <4 x i32>1841 ret <4 x i32> %v21842}1843 1844define <4 x i16> @load_ext_v4i32_from_numeric_address() {1845; CHECK-LABEL: load_ext_v4i32_from_numeric_address:1846; CHECK: .functype load_ext_v4i32_from_numeric_address () -> (v128)1847; CHECK-NEXT: # %bb.0:1848; CHECK-NEXT: i32.const 01849; CHECK-NEXT: v128.load64_zero 321850; CHECK-NEXT: # fallthrough-return1851 %s = inttoptr i32 32 to ptr1852 %v = load <4 x i16>, ptr %s1853 ret <4 x i16> %v1854}1855 1856@gv_v4i32 = global <4 x i32> <i32 42, i32 42, i32 42, i32 42>1857define <4 x i32> @load_v4i32_from_global_address() {1858; CHECK-LABEL: load_v4i32_from_global_address:1859; CHECK: .functype load_v4i32_from_global_address () -> (v128)1860; CHECK-NEXT: # %bb.0:1861; CHECK-NEXT: i32.const 01862; CHECK-NEXT: v128.load gv_v4i321863; CHECK-NEXT: # fallthrough-return1864 %v = load <4 x i32>, ptr @gv_v4i321865 ret <4 x i32> %v1866}1867 1868@gv_i32 = global i32 421869define <4 x i32> @load_splat_v4i32_from_global_address() {1870; CHECK-LABEL: load_splat_v4i32_from_global_address:1871; CHECK: .functype load_splat_v4i32_from_global_address () -> (v128)1872; CHECK-NEXT: # %bb.0:1873; CHECK-NEXT: i32.const 01874; CHECK-NEXT: v128.load32_splat gv_i321875; CHECK-NEXT: # fallthrough-return1876 %e = load i32, ptr @gv_i321877 %v1 = insertelement <4 x i32> undef, i32 %e, i32 01878 %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1879 ret <4 x i32> %v21880}1881 1882@gv_v4i16 = global <4 x i16> <i16 42, i16 42, i16 42, i16 42>1883define <4 x i32> @load_sext_v4i16_to_v4i32_from_global_address() {1884; CHECK-LABEL: load_sext_v4i16_to_v4i32_from_global_address:1885; CHECK: .functype load_sext_v4i16_to_v4i32_from_global_address () -> (v128)1886; CHECK-NEXT: # %bb.0:1887; CHECK-NEXT: i32.const 01888; CHECK-NEXT: i32x4.load16x4_s gv_v4i161889; CHECK-NEXT: # fallthrough-return1890 %v = load <4 x i16>, ptr @gv_v4i161891 %v2 = sext <4 x i16> %v to <4 x i32>1892 ret <4 x i32> %v21893}1894 1895define <4 x i32> @load_zext_v4i16_to_v4i32_from_global_address() {1896; CHECK-LABEL: load_zext_v4i16_to_v4i32_from_global_address:1897; CHECK: .functype load_zext_v4i16_to_v4i32_from_global_address () -> (v128)1898; CHECK-NEXT: # %bb.0:1899; CHECK-NEXT: i32.const 01900; CHECK-NEXT: i32x4.load16x4_u gv_v4i161901; CHECK-NEXT: # fallthrough-return1902 %v = load <4 x i16>, ptr @gv_v4i161903 %v2 = zext <4 x i16> %v to <4 x i32>1904 ret <4 x i32> %v21905}1906 1907@gv_v4i8 = global <4 x i8> <i8 42, i8 42, i8 42, i8 42>1908define <4 x i32> @load_sext_v4i8_to_v4i32_from_global_address() {1909; CHECK-LABEL: load_sext_v4i8_to_v4i32_from_global_address:1910; CHECK: .functype load_sext_v4i8_to_v4i32_from_global_address () -> (v128)1911; CHECK-NEXT: # %bb.0:1912; CHECK-NEXT: i32.const 01913; CHECK-NEXT: v128.load32_zero gv_v4i81914; CHECK-NEXT: i16x8.extend_low_i8x16_s1915; CHECK-NEXT: i32x4.extend_low_i16x8_s1916; CHECK-NEXT: # fallthrough-return1917 %v = load <4 x i8>, ptr @gv_v4i81918 %v2 = sext <4 x i8> %v to <4 x i32>1919 ret <4 x i32> %v21920}1921 1922define <4 x i32> @load_zext_v4i8_to_v4i32_from_global_address() {1923; CHECK-LABEL: load_zext_v4i8_to_v4i32_from_global_address:1924; CHECK: .functype load_zext_v4i8_to_v4i32_from_global_address () -> (v128)1925; CHECK-NEXT: # %bb.0:1926; CHECK-NEXT: i32.const 01927; CHECK-NEXT: v128.load32_zero gv_v4i81928; CHECK-NEXT: i16x8.extend_low_i8x16_u1929; CHECK-NEXT: i32x4.extend_low_i16x8_u1930; CHECK-NEXT: # fallthrough-return1931 %v = load <4 x i8>, ptr @gv_v4i81932 %v2 = zext <4 x i8> %v to <4 x i32>1933 ret <4 x i32> %v21934}1935 1936define <4 x i16> @load_ext_v4i32_from_global_address() {1937; CHECK-LABEL: load_ext_v4i32_from_global_address:1938; CHECK: .functype load_ext_v4i32_from_global_address () -> (v128)1939; CHECK-NEXT: # %bb.0:1940; CHECK-NEXT: i32.const 01941; CHECK-NEXT: v128.load64_zero gv_v4i161942; CHECK-NEXT: # fallthrough-return1943 %v = load <4 x i16>, ptr @gv_v4i161944 ret <4 x i16> %v1945}1946 1947define void @store_v4i32(<4 x i32> %v, ptr %p) {1948; CHECK-LABEL: store_v4i32:1949; CHECK: .functype store_v4i32 (v128, i32) -> ()1950; CHECK-NEXT: # %bb.0:1951; CHECK-NEXT: local.get 11952; CHECK-NEXT: local.get 01953; CHECK-NEXT: v128.store 01954; CHECK-NEXT: # fallthrough-return1955 store <4 x i32> %v , ptr %p1956 ret void1957}1958 1959define void @store_narrowing_v4i32(<4 x i16> %v, ptr %p) {1960; CHECK-LABEL: store_narrowing_v4i32:1961; CHECK: .functype store_narrowing_v4i32 (v128, i32) -> ()1962; CHECK-NEXT: # %bb.0:1963; CHECK-NEXT: local.get 11964; CHECK-NEXT: local.get 01965; CHECK-NEXT: v128.store64_lane 0, 01966; CHECK-NEXT: # fallthrough-return1967 store <4 x i16> %v , ptr %p1968 ret void1969}1970 1971define void @store_v4i32_with_folded_offset(<4 x i32> %v, ptr %p) {1972; CHECK-LABEL: store_v4i32_with_folded_offset:1973; CHECK: .functype store_v4i32_with_folded_offset (v128, i32) -> ()1974; CHECK-NEXT: # %bb.0:1975; CHECK-NEXT: local.get 11976; CHECK-NEXT: local.get 01977; CHECK-NEXT: v128.store 161978; CHECK-NEXT: # fallthrough-return1979 %q = ptrtoint ptr %p to i321980 %r = add nuw i32 %q, 161981 %s = inttoptr i32 %r to ptr1982 store <4 x i32> %v , ptr %s1983 ret void1984}1985 1986define void @store_narrowing_v4i32_with_folded_offset(<4 x i16> %v, ptr %p) {1987; CHECK-LABEL: store_narrowing_v4i32_with_folded_offset:1988; CHECK: .functype store_narrowing_v4i32_with_folded_offset (v128, i32) -> ()1989; CHECK-NEXT: # %bb.0:1990; CHECK-NEXT: local.get 11991; CHECK-NEXT: local.get 01992; CHECK-NEXT: v128.store64_lane 16, 01993; CHECK-NEXT: # fallthrough-return1994 %q = ptrtoint ptr %p to i321995 %r = add nuw i32 %q, 161996 %s = inttoptr i32 %r to ptr1997 store <4 x i16> %v , ptr %s1998 ret void1999}2000 2001define void @store_v4i32_with_folded_gep_offset(<4 x i32> %v, ptr %p) {2002; CHECK-LABEL: store_v4i32_with_folded_gep_offset:2003; CHECK: .functype store_v4i32_with_folded_gep_offset (v128, i32) -> ()2004; CHECK-NEXT: # %bb.0:2005; CHECK-NEXT: local.get 12006; CHECK-NEXT: local.get 02007; CHECK-NEXT: v128.store 162008; CHECK-NEXT: # fallthrough-return2009 %s = getelementptr inbounds <4 x i32>, ptr %p, i32 12010 store <4 x i32> %v , ptr %s2011 ret void2012}2013 2014define void @store_narrowing_v4i32_with_folded_gep_offset(<4 x i16> %v, ptr %p) {2015; CHECK-LABEL: store_narrowing_v4i32_with_folded_gep_offset:2016; CHECK: .functype store_narrowing_v4i32_with_folded_gep_offset (v128, i32) -> ()2017; CHECK-NEXT: # %bb.0:2018; CHECK-NEXT: local.get 12019; CHECK-NEXT: local.get 02020; CHECK-NEXT: v128.store64_lane 8, 02021; CHECK-NEXT: # fallthrough-return2022 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 12023 store <4 x i16> %v , ptr %s2024 ret void2025}2026 2027define void @store_v4i32_with_unfolded_gep_negative_offset(<4 x i32> %v, ptr %p) {2028; CHECK-LABEL: store_v4i32_with_unfolded_gep_negative_offset:2029; CHECK: .functype store_v4i32_with_unfolded_gep_negative_offset (v128, i32) -> ()2030; CHECK-NEXT: # %bb.0:2031; CHECK-NEXT: local.get 12032; CHECK-NEXT: i32.const -162033; CHECK-NEXT: i32.add2034; CHECK-NEXT: local.get 02035; CHECK-NEXT: v128.store 02036; CHECK-NEXT: # fallthrough-return2037 %s = getelementptr inbounds <4 x i32>, ptr %p, i32 -12038 store <4 x i32> %v , ptr %s2039 ret void2040}2041 2042define void @store_narrowing_v4i32_with_unfolded_gep_negative_offset(<4 x i16> %v, ptr %p) {2043; CHECK-LABEL: store_narrowing_v4i32_with_unfolded_gep_negative_offset:2044; CHECK: .functype store_narrowing_v4i32_with_unfolded_gep_negative_offset (v128, i32) -> ()2045; CHECK-NEXT: # %bb.0:2046; CHECK-NEXT: local.get 12047; CHECK-NEXT: i32.const -82048; CHECK-NEXT: i32.add2049; CHECK-NEXT: local.get 02050; CHECK-NEXT: v128.store64_lane 0, 02051; CHECK-NEXT: # fallthrough-return2052 %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -12053 store <4 x i16> %v , ptr %s2054 ret void2055}2056 2057define void @store_v4i32_with_unfolded_offset(<4 x i32> %v, ptr %p) {2058; CHECK-LABEL: store_v4i32_with_unfolded_offset:2059; CHECK: .functype store_v4i32_with_unfolded_offset (v128, i32) -> ()2060; CHECK-NEXT: # %bb.0:2061; CHECK-NEXT: local.get 12062; CHECK-NEXT: i32.const 162063; CHECK-NEXT: i32.add2064; CHECK-NEXT: local.get 02065; CHECK-NEXT: v128.store 02066; CHECK-NEXT: # fallthrough-return2067 %q = ptrtoint ptr %p to i322068 %r = add nsw i32 %q, 162069 %s = inttoptr i32 %r to ptr2070 store <4 x i32> %v , ptr %s2071 ret void2072}2073 2074define void @store_narrowing_v4i32_with_unfolded_offset(<4 x i16> %v, ptr %p) {2075; CHECK-LABEL: store_narrowing_v4i32_with_unfolded_offset:2076; CHECK: .functype store_narrowing_v4i32_with_unfolded_offset (v128, i32) -> ()2077; CHECK-NEXT: # %bb.0:2078; CHECK-NEXT: local.get 12079; CHECK-NEXT: i32.const 162080; CHECK-NEXT: i32.add2081; CHECK-NEXT: local.get 02082; CHECK-NEXT: v128.store64_lane 0, 02083; CHECK-NEXT: # fallthrough-return2084 %q = ptrtoint ptr %p to i322085 %r = add nsw i32 %q, 162086 %s = inttoptr i32 %r to ptr2087 store <4 x i16> %v , ptr %s2088 ret void2089}2090 2091define void @store_v4i32_with_unfolded_gep_offset(<4 x i32> %v, ptr %p) {2092; CHECK-LABEL: store_v4i32_with_unfolded_gep_offset:2093; CHECK: .functype store_v4i32_with_unfolded_gep_offset (v128, i32) -> ()2094; CHECK-NEXT: # %bb.0:2095; CHECK-NEXT: local.get 12096; CHECK-NEXT: i32.const 162097; CHECK-NEXT: i32.add2098; CHECK-NEXT: local.get 02099; CHECK-NEXT: v128.store 02100; CHECK-NEXT: # fallthrough-return2101 %s = getelementptr <4 x i32>, ptr %p, i32 12102 store <4 x i32> %v , ptr %s2103 ret void2104}2105 2106define void @store_narrowing_v4i32_with_unfolded_gep_offset(<4 x i16> %v, ptr %p) {2107; CHECK-LABEL: store_narrowing_v4i32_with_unfolded_gep_offset:2108; CHECK: .functype store_narrowing_v4i32_with_unfolded_gep_offset (v128, i32) -> ()2109; CHECK-NEXT: # %bb.0:2110; CHECK-NEXT: local.get 12111; CHECK-NEXT: i32.const 82112; CHECK-NEXT: i32.add2113; CHECK-NEXT: local.get 02114; CHECK-NEXT: v128.store64_lane 0, 02115; CHECK-NEXT: # fallthrough-return2116 %s = getelementptr <4 x i16>, ptr %p, i32 12117 store <4 x i16> %v , ptr %s2118 ret void2119}2120 2121define void @store_v4i32_to_numeric_address(<4 x i32> %v) {2122; CHECK-LABEL: store_v4i32_to_numeric_address:2123; CHECK: .functype store_v4i32_to_numeric_address (v128) -> ()2124; CHECK-NEXT: # %bb.0:2125; CHECK-NEXT: i32.const 02126; CHECK-NEXT: local.get 02127; CHECK-NEXT: v128.store 322128; CHECK-NEXT: # fallthrough-return2129 %s = inttoptr i32 32 to ptr2130 store <4 x i32> %v , ptr %s2131 ret void2132}2133 2134define void @store_narrowing_v4i32_to_numeric_address(<4 x i16> %v) {2135; CHECK-LABEL: store_narrowing_v4i32_to_numeric_address:2136; CHECK: .functype store_narrowing_v4i32_to_numeric_address (v128) -> ()2137; CHECK-NEXT: # %bb.0:2138; CHECK-NEXT: i32.const 02139; CHECK-NEXT: local.get 02140; CHECK-NEXT: v128.store64_lane 32, 02141; CHECK-NEXT: # fallthrough-return2142 %s = inttoptr i32 32 to ptr2143 store <4 x i16> %v , ptr %s2144 ret void2145}2146 2147define void @store_v4i32_to_global_address(<4 x i32> %v) {2148; CHECK-LABEL: store_v4i32_to_global_address:2149; CHECK: .functype store_v4i32_to_global_address (v128) -> ()2150; CHECK-NEXT: # %bb.0:2151; CHECK-NEXT: i32.const 02152; CHECK-NEXT: local.get 02153; CHECK-NEXT: v128.store gv_v4i322154; CHECK-NEXT: # fallthrough-return2155 store <4 x i32> %v , ptr @gv_v4i322156 ret void2157}2158 2159define void @store_narrowing_v4i32_to_global_address(<4 x i16> %v) {2160; CHECK-LABEL: store_narrowing_v4i32_to_global_address:2161; CHECK: .functype store_narrowing_v4i32_to_global_address (v128) -> ()2162; CHECK-NEXT: # %bb.0:2163; CHECK-NEXT: i32.const 02164; CHECK-NEXT: local.get 02165; CHECK-NEXT: v128.store64_lane gv_v4i16, 02166; CHECK-NEXT: # fallthrough-return2167 store <4 x i16> %v , ptr @gv_v4i162168 ret void2169}2170 2171; ==============================================================================2172; 2 x i642173; ==============================================================================2174define <2 x i64> @load_v2i64(ptr %p) {2175; CHECK-LABEL: load_v2i64:2176; CHECK: .functype load_v2i64 (i32) -> (v128)2177; CHECK-NEXT: # %bb.0:2178; CHECK-NEXT: local.get 02179; CHECK-NEXT: v128.load 02180; CHECK-NEXT: # fallthrough-return2181 %v = load <2 x i64>, ptr %p2182 ret <2 x i64> %v2183}2184 2185define <2 x i64> @load_splat_v2i64(ptr %p) {2186; CHECK-LABEL: load_splat_v2i64:2187; CHECK: .functype load_splat_v2i64 (i32) -> (v128)2188; CHECK-NEXT: # %bb.0:2189; CHECK-NEXT: local.get 02190; CHECK-NEXT: v128.load64_splat 02191; CHECK-NEXT: # fallthrough-return2192 %e = load i64, ptr %p2193 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02194 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2195 ret <2 x i64> %v22196}2197 2198define <2 x i64> @load_sext_v2i64(ptr %p) {2199; CHECK-LABEL: load_sext_v2i64:2200; CHECK: .functype load_sext_v2i64 (i32) -> (v128)2201; CHECK-NEXT: # %bb.0:2202; CHECK-NEXT: local.get 02203; CHECK-NEXT: i64x2.load32x2_s 02204; CHECK-NEXT: # fallthrough-return2205 %v = load <2 x i32>, ptr %p2206 %v2 = sext <2 x i32> %v to <2 x i64>2207 ret <2 x i64> %v22208}2209 2210define <2 x i64> @load_zext_v2i64(ptr %p) {2211; CHECK-LABEL: load_zext_v2i64:2212; CHECK: .functype load_zext_v2i64 (i32) -> (v128)2213; CHECK-NEXT: # %bb.0:2214; CHECK-NEXT: local.get 02215; CHECK-NEXT: i64x2.load32x2_u 02216; CHECK-NEXT: # fallthrough-return2217 %v = load <2 x i32>, ptr %p2218 %v2 = zext <2 x i32> %v to <2 x i64>2219 ret <2 x i64> %v22220}2221 2222define <2 x i32> @load_ext_v2i64(ptr %p) {2223; CHECK-LABEL: load_ext_v2i64:2224; CHECK: .functype load_ext_v2i64 (i32) -> (v128)2225; CHECK-NEXT: # %bb.0:2226; CHECK-NEXT: local.get 02227; CHECK-NEXT: v128.load64_zero 02228; CHECK-NEXT: # fallthrough-return2229 %v = load <2 x i32>, ptr %p2230 ret <2 x i32> %v2231}2232 2233define <2 x i64> @load_v2i64_with_folded_offset(ptr %p) {2234; CHECK-LABEL: load_v2i64_with_folded_offset:2235; CHECK: .functype load_v2i64_with_folded_offset (i32) -> (v128)2236; CHECK-NEXT: # %bb.0:2237; CHECK-NEXT: local.get 02238; CHECK-NEXT: v128.load 162239; CHECK-NEXT: # fallthrough-return2240 %q = ptrtoint ptr %p to i322241 %r = add nuw i32 %q, 162242 %s = inttoptr i32 %r to ptr2243 %v = load <2 x i64>, ptr %s2244 ret <2 x i64> %v2245}2246 2247define <2 x i64> @load_splat_v2i64_with_folded_offset(ptr %p) {2248; CHECK-LABEL: load_splat_v2i64_with_folded_offset:2249; CHECK: .functype load_splat_v2i64_with_folded_offset (i32) -> (v128)2250; CHECK-NEXT: # %bb.0:2251; CHECK-NEXT: local.get 02252; CHECK-NEXT: v128.load64_splat 162253; CHECK-NEXT: # fallthrough-return2254 %q = ptrtoint ptr %p to i322255 %r = add nuw i32 %q, 162256 %s = inttoptr i32 %r to ptr2257 %e = load i64, ptr %s2258 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02259 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2260 ret <2 x i64> %v22261}2262 2263define <2 x i64> @load_sext_v2i64_with_folded_offset(ptr %p) {2264; CHECK-LABEL: load_sext_v2i64_with_folded_offset:2265; CHECK: .functype load_sext_v2i64_with_folded_offset (i32) -> (v128)2266; CHECK-NEXT: # %bb.0:2267; CHECK-NEXT: local.get 02268; CHECK-NEXT: i64x2.load32x2_s 162269; CHECK-NEXT: # fallthrough-return2270 %q = ptrtoint ptr %p to i322271 %r = add nuw i32 %q, 162272 %s = inttoptr i32 %r to ptr2273 %v = load <2 x i32>, ptr %s2274 %v2 = sext <2 x i32> %v to <2 x i64>2275 ret <2 x i64> %v22276}2277 2278define <2 x i64> @load_zext_v2i64_with_folded_offset(ptr %p) {2279; CHECK-LABEL: load_zext_v2i64_with_folded_offset:2280; CHECK: .functype load_zext_v2i64_with_folded_offset (i32) -> (v128)2281; CHECK-NEXT: # %bb.0:2282; CHECK-NEXT: local.get 02283; CHECK-NEXT: i64x2.load32x2_u 162284; CHECK-NEXT: # fallthrough-return2285 %q = ptrtoint ptr %p to i322286 %r = add nuw i32 %q, 162287 %s = inttoptr i32 %r to ptr2288 %v = load <2 x i32>, ptr %s2289 %v2 = zext <2 x i32> %v to <2 x i64>2290 ret <2 x i64> %v22291}2292 2293define <2 x i32> @load_ext_v2i64_with_folded_offset(ptr %p) {2294; CHECK-LABEL: load_ext_v2i64_with_folded_offset:2295; CHECK: .functype load_ext_v2i64_with_folded_offset (i32) -> (v128)2296; CHECK-NEXT: # %bb.0:2297; CHECK-NEXT: local.get 02298; CHECK-NEXT: v128.load64_zero 162299; CHECK-NEXT: # fallthrough-return2300 %q = ptrtoint ptr %p to i322301 %r = add nuw i32 %q, 162302 %s = inttoptr i32 %r to ptr2303 %v = load <2 x i32>, ptr %s2304 ret <2 x i32> %v2305}2306 2307define <2 x i64> @load_v2i64_with_folded_gep_offset(ptr %p) {2308; CHECK-LABEL: load_v2i64_with_folded_gep_offset:2309; CHECK: .functype load_v2i64_with_folded_gep_offset (i32) -> (v128)2310; CHECK-NEXT: # %bb.0:2311; CHECK-NEXT: local.get 02312; CHECK-NEXT: v128.load 162313; CHECK-NEXT: # fallthrough-return2314 %s = getelementptr inbounds <2 x i64>, ptr %p, i32 12315 %v = load <2 x i64>, ptr %s2316 ret <2 x i64> %v2317}2318 2319define <2 x i64> @load_splat_v2i64_with_folded_gep_offset(ptr %p) {2320; CHECK-LABEL: load_splat_v2i64_with_folded_gep_offset:2321; CHECK: .functype load_splat_v2i64_with_folded_gep_offset (i32) -> (v128)2322; CHECK-NEXT: # %bb.0:2323; CHECK-NEXT: local.get 02324; CHECK-NEXT: v128.load64_splat 82325; CHECK-NEXT: # fallthrough-return2326 %s = getelementptr inbounds i64, ptr %p, i32 12327 %e = load i64, ptr %s2328 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02329 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2330 ret <2 x i64> %v22331}2332 2333define <2 x i64> @load_sext_v2i64_with_folded_gep_offset(ptr %p) {2334; CHECK-LABEL: load_sext_v2i64_with_folded_gep_offset:2335; CHECK: .functype load_sext_v2i64_with_folded_gep_offset (i32) -> (v128)2336; CHECK-NEXT: # %bb.0:2337; CHECK-NEXT: local.get 02338; CHECK-NEXT: i64x2.load32x2_s 82339; CHECK-NEXT: # fallthrough-return2340 %s = getelementptr inbounds <2 x i32>, ptr %p, i32 12341 %v = load <2 x i32>, ptr %s2342 %v2 = sext <2 x i32> %v to <2 x i64>2343 ret <2 x i64> %v22344}2345 2346define <2 x i64> @load_zext_v2i64_with_folded_gep_offset(ptr %p) {2347; CHECK-LABEL: load_zext_v2i64_with_folded_gep_offset:2348; CHECK: .functype load_zext_v2i64_with_folded_gep_offset (i32) -> (v128)2349; CHECK-NEXT: # %bb.0:2350; CHECK-NEXT: local.get 02351; CHECK-NEXT: i64x2.load32x2_u 82352; CHECK-NEXT: # fallthrough-return2353 %s = getelementptr inbounds <2 x i32>, ptr %p, i32 12354 %v = load <2 x i32>, ptr %s2355 %v2 = zext <2 x i32> %v to <2 x i64>2356 ret <2 x i64> %v22357}2358 2359define <2 x i32> @load_ext_v2i64_with_folded_gep_offset(ptr %p) {2360; CHECK-LABEL: load_ext_v2i64_with_folded_gep_offset:2361; CHECK: .functype load_ext_v2i64_with_folded_gep_offset (i32) -> (v128)2362; CHECK-NEXT: # %bb.0:2363; CHECK-NEXT: local.get 02364; CHECK-NEXT: v128.load64_zero 82365; CHECK-NEXT: # fallthrough-return2366 %s = getelementptr inbounds <2 x i32>, ptr %p, i32 12367 %v = load <2 x i32>, ptr %s2368 ret <2 x i32> %v2369}2370 2371define <2 x i64> @load_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2372; CHECK-LABEL: load_v2i64_with_unfolded_gep_negative_offset:2373; CHECK: .functype load_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2374; CHECK-NEXT: # %bb.0:2375; CHECK-NEXT: local.get 02376; CHECK-NEXT: i32.const -162377; CHECK-NEXT: i32.add2378; CHECK-NEXT: v128.load 02379; CHECK-NEXT: # fallthrough-return2380 %s = getelementptr inbounds <2 x i64>, ptr %p, i32 -12381 %v = load <2 x i64>, ptr %s2382 ret <2 x i64> %v2383}2384 2385define <2 x i64> @load_splat_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2386; CHECK-LABEL: load_splat_v2i64_with_unfolded_gep_negative_offset:2387; CHECK: .functype load_splat_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2388; CHECK-NEXT: # %bb.0:2389; CHECK-NEXT: local.get 02390; CHECK-NEXT: i32.const -82391; CHECK-NEXT: i32.add2392; CHECK-NEXT: v128.load64_splat 02393; CHECK-NEXT: # fallthrough-return2394 %s = getelementptr inbounds i64, ptr %p, i32 -12395 %e = load i64, ptr %s2396 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02397 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2398 ret <2 x i64> %v22399}2400 2401define <2 x i64> @load_sext_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2402; CHECK-LABEL: load_sext_v2i64_with_unfolded_gep_negative_offset:2403; CHECK: .functype load_sext_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2404; CHECK-NEXT: # %bb.0:2405; CHECK-NEXT: local.get 02406; CHECK-NEXT: i32.const -82407; CHECK-NEXT: i32.add2408; CHECK-NEXT: i64x2.load32x2_s 02409; CHECK-NEXT: # fallthrough-return2410 %s = getelementptr inbounds <2 x i32>, ptr %p, i32 -12411 %v = load <2 x i32>, ptr %s2412 %v2 = sext <2 x i32> %v to <2 x i64>2413 ret <2 x i64> %v22414}2415 2416define <2 x i64> @load_zext_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2417; CHECK-LABEL: load_zext_v2i64_with_unfolded_gep_negative_offset:2418; CHECK: .functype load_zext_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2419; CHECK-NEXT: # %bb.0:2420; CHECK-NEXT: local.get 02421; CHECK-NEXT: i32.const -82422; CHECK-NEXT: i32.add2423; CHECK-NEXT: i64x2.load32x2_u 02424; CHECK-NEXT: # fallthrough-return2425 %s = getelementptr inbounds <2 x i32>, ptr %p, i32 -12426 %v = load <2 x i32>, ptr %s2427 %v2 = zext <2 x i32> %v to <2 x i64>2428 ret <2 x i64> %v22429}2430 2431define <2 x i32> @load_ext_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2432; CHECK-LABEL: load_ext_v2i64_with_unfolded_gep_negative_offset:2433; CHECK: .functype load_ext_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2434; CHECK-NEXT: # %bb.0:2435; CHECK-NEXT: local.get 02436; CHECK-NEXT: i32.const -82437; CHECK-NEXT: i32.add2438; CHECK-NEXT: v128.load64_zero 02439; CHECK-NEXT: # fallthrough-return2440 %s = getelementptr inbounds <2 x i32>, ptr %p, i32 -12441 %v = load <2 x i32>, ptr %s2442 ret <2 x i32> %v2443}2444 2445define <2 x i64> @load_v2i64_with_unfolded_offset(ptr %p) {2446; CHECK-LABEL: load_v2i64_with_unfolded_offset:2447; CHECK: .functype load_v2i64_with_unfolded_offset (i32) -> (v128)2448; CHECK-NEXT: # %bb.0:2449; CHECK-NEXT: local.get 02450; CHECK-NEXT: i32.const 162451; CHECK-NEXT: i32.add2452; CHECK-NEXT: v128.load 02453; CHECK-NEXT: # fallthrough-return2454 %q = ptrtoint ptr %p to i322455 %r = add nsw i32 %q, 162456 %s = inttoptr i32 %r to ptr2457 %v = load <2 x i64>, ptr %s2458 ret <2 x i64> %v2459}2460 2461define <2 x i64> @load_splat_v2i64_with_unfolded_offset(ptr %p) {2462; CHECK-LABEL: load_splat_v2i64_with_unfolded_offset:2463; CHECK: .functype load_splat_v2i64_with_unfolded_offset (i32) -> (v128)2464; CHECK-NEXT: # %bb.0:2465; CHECK-NEXT: local.get 02466; CHECK-NEXT: i32.const 162467; CHECK-NEXT: i32.add2468; CHECK-NEXT: v128.load64_splat 02469; CHECK-NEXT: # fallthrough-return2470 %q = ptrtoint ptr %p to i322471 %r = add nsw i32 %q, 162472 %s = inttoptr i32 %r to ptr2473 %e = load i64, ptr %s2474 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02475 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2476 ret <2 x i64> %v22477}2478 2479define <2 x i64> @load_sext_v2i64_with_unfolded_offset(ptr %p) {2480; CHECK-LABEL: load_sext_v2i64_with_unfolded_offset:2481; CHECK: .functype load_sext_v2i64_with_unfolded_offset (i32) -> (v128)2482; CHECK-NEXT: # %bb.0:2483; CHECK-NEXT: local.get 02484; CHECK-NEXT: i32.const 162485; CHECK-NEXT: i32.add2486; CHECK-NEXT: i64x2.load32x2_s 02487; CHECK-NEXT: # fallthrough-return2488 %q = ptrtoint ptr %p to i322489 %r = add nsw i32 %q, 162490 %s = inttoptr i32 %r to ptr2491 %v = load <2 x i32>, ptr %s2492 %v2 = sext <2 x i32> %v to <2 x i64>2493 ret <2 x i64> %v22494}2495 2496define <2 x i64> @load_zext_v2i64_with_unfolded_offset(ptr %p) {2497; CHECK-LABEL: load_zext_v2i64_with_unfolded_offset:2498; CHECK: .functype load_zext_v2i64_with_unfolded_offset (i32) -> (v128)2499; CHECK-NEXT: # %bb.0:2500; CHECK-NEXT: local.get 02501; CHECK-NEXT: i32.const 162502; CHECK-NEXT: i32.add2503; CHECK-NEXT: i64x2.load32x2_u 02504; CHECK-NEXT: # fallthrough-return2505 %q = ptrtoint ptr %p to i322506 %r = add nsw i32 %q, 162507 %s = inttoptr i32 %r to ptr2508 %v = load <2 x i32>, ptr %s2509 %v2 = zext <2 x i32> %v to <2 x i64>2510 ret <2 x i64> %v22511}2512 2513define <2 x i32> @load_ext_v2i64_with_unfolded_offset(ptr %p) {2514; CHECK-LABEL: load_ext_v2i64_with_unfolded_offset:2515; CHECK: .functype load_ext_v2i64_with_unfolded_offset (i32) -> (v128)2516; CHECK-NEXT: # %bb.0:2517; CHECK-NEXT: local.get 02518; CHECK-NEXT: i32.const 162519; CHECK-NEXT: i32.add2520; CHECK-NEXT: v128.load64_zero 02521; CHECK-NEXT: # fallthrough-return2522 %q = ptrtoint ptr %p to i322523 %r = add nsw i32 %q, 162524 %s = inttoptr i32 %r to ptr2525 %v = load <2 x i32>, ptr %s2526 ret <2 x i32> %v2527}2528 2529define <2 x i64> @load_v2i64_with_unfolded_gep_offset(ptr %p) {2530; CHECK-LABEL: load_v2i64_with_unfolded_gep_offset:2531; CHECK: .functype load_v2i64_with_unfolded_gep_offset (i32) -> (v128)2532; CHECK-NEXT: # %bb.0:2533; CHECK-NEXT: local.get 02534; CHECK-NEXT: i32.const 162535; CHECK-NEXT: i32.add2536; CHECK-NEXT: v128.load 02537; CHECK-NEXT: # fallthrough-return2538 %s = getelementptr <2 x i64>, ptr %p, i32 12539 %v = load <2 x i64>, ptr %s2540 ret <2 x i64> %v2541}2542 2543define <2 x i64> @load_splat_v2i64_with_unfolded_gep_offset(ptr %p) {2544; CHECK-LABEL: load_splat_v2i64_with_unfolded_gep_offset:2545; CHECK: .functype load_splat_v2i64_with_unfolded_gep_offset (i32) -> (v128)2546; CHECK-NEXT: # %bb.0:2547; CHECK-NEXT: local.get 02548; CHECK-NEXT: i32.const 82549; CHECK-NEXT: i32.add2550; CHECK-NEXT: v128.load64_splat 02551; CHECK-NEXT: # fallthrough-return2552 %s = getelementptr i64, ptr %p, i32 12553 %e = load i64, ptr %s2554 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02555 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2556 ret <2 x i64> %v22557}2558 2559define <2 x i64> @load_sext_v2i64_with_unfolded_gep_offset(ptr %p) {2560; CHECK-LABEL: load_sext_v2i64_with_unfolded_gep_offset:2561; CHECK: .functype load_sext_v2i64_with_unfolded_gep_offset (i32) -> (v128)2562; CHECK-NEXT: # %bb.0:2563; CHECK-NEXT: local.get 02564; CHECK-NEXT: i32.const 82565; CHECK-NEXT: i32.add2566; CHECK-NEXT: i64x2.load32x2_s 02567; CHECK-NEXT: # fallthrough-return2568 %s = getelementptr <2 x i32>, ptr %p, i32 12569 %v = load <2 x i32>, ptr %s2570 %v2 = sext <2 x i32> %v to <2 x i64>2571 ret <2 x i64> %v22572}2573 2574define <2 x i64> @load_zext_v2i64_with_unfolded_gep_offset(ptr %p) {2575; CHECK-LABEL: load_zext_v2i64_with_unfolded_gep_offset:2576; CHECK: .functype load_zext_v2i64_with_unfolded_gep_offset (i32) -> (v128)2577; CHECK-NEXT: # %bb.0:2578; CHECK-NEXT: local.get 02579; CHECK-NEXT: i32.const 82580; CHECK-NEXT: i32.add2581; CHECK-NEXT: i64x2.load32x2_u 02582; CHECK-NEXT: # fallthrough-return2583 %s = getelementptr <2 x i32>, ptr %p, i32 12584 %v = load <2 x i32>, ptr %s2585 %v2 = zext <2 x i32> %v to <2 x i64>2586 ret <2 x i64> %v22587}2588 2589define <2 x i32> @load_ext_v2i64_with_unfolded_gep_offset(ptr %p) {2590; CHECK-LABEL: load_ext_v2i64_with_unfolded_gep_offset:2591; CHECK: .functype load_ext_v2i64_with_unfolded_gep_offset (i32) -> (v128)2592; CHECK-NEXT: # %bb.0:2593; CHECK-NEXT: local.get 02594; CHECK-NEXT: i32.const 82595; CHECK-NEXT: i32.add2596; CHECK-NEXT: v128.load64_zero 02597; CHECK-NEXT: # fallthrough-return2598 %s = getelementptr <2 x i32>, ptr %p, i32 12599 %v = load <2 x i32>, ptr %s2600 ret <2 x i32> %v2601}2602 2603define <2 x i64> @load_v2i64_from_numeric_address() {2604; CHECK-LABEL: load_v2i64_from_numeric_address:2605; CHECK: .functype load_v2i64_from_numeric_address () -> (v128)2606; CHECK-NEXT: # %bb.0:2607; CHECK-NEXT: i32.const 02608; CHECK-NEXT: v128.load 322609; CHECK-NEXT: # fallthrough-return2610 %s = inttoptr i32 32 to ptr2611 %v = load <2 x i64>, ptr %s2612 ret <2 x i64> %v2613}2614 2615define <2 x i64> @load_splat_v2i64_from_numeric_address() {2616; CHECK-LABEL: load_splat_v2i64_from_numeric_address:2617; CHECK: .functype load_splat_v2i64_from_numeric_address () -> (v128)2618; CHECK-NEXT: # %bb.0:2619; CHECK-NEXT: i32.const 02620; CHECK-NEXT: v128.load64_splat 322621; CHECK-NEXT: # fallthrough-return2622 %s = inttoptr i32 32 to ptr2623 %e = load i64, ptr %s2624 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02625 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2626 ret <2 x i64> %v22627}2628 2629define <2 x i64> @load_sext_v2i64_from_numeric_address() {2630; CHECK-LABEL: load_sext_v2i64_from_numeric_address:2631; CHECK: .functype load_sext_v2i64_from_numeric_address () -> (v128)2632; CHECK-NEXT: # %bb.0:2633; CHECK-NEXT: i32.const 02634; CHECK-NEXT: i64x2.load32x2_s 322635; CHECK-NEXT: # fallthrough-return2636 %s = inttoptr i32 32 to ptr2637 %v = load <2 x i32>, ptr %s2638 %v2 = sext <2 x i32> %v to <2 x i64>2639 ret <2 x i64> %v22640}2641 2642define <2 x i64> @load_zext_v2i64_from_numeric_address() {2643; CHECK-LABEL: load_zext_v2i64_from_numeric_address:2644; CHECK: .functype load_zext_v2i64_from_numeric_address () -> (v128)2645; CHECK-NEXT: # %bb.0:2646; CHECK-NEXT: i32.const 02647; CHECK-NEXT: i64x2.load32x2_u 322648; CHECK-NEXT: # fallthrough-return2649 %s = inttoptr i32 32 to ptr2650 %v = load <2 x i32>, ptr %s2651 %v2 = zext <2 x i32> %v to <2 x i64>2652 ret <2 x i64> %v22653}2654 2655define <2 x i32> @load_ext_v2i64_from_numeric_address() {2656; CHECK-LABEL: load_ext_v2i64_from_numeric_address:2657; CHECK: .functype load_ext_v2i64_from_numeric_address () -> (v128)2658; CHECK-NEXT: # %bb.0:2659; CHECK-NEXT: i32.const 02660; CHECK-NEXT: v128.load64_zero 322661; CHECK-NEXT: # fallthrough-return2662 %s = inttoptr i32 32 to ptr2663 %v = load <2 x i32>, ptr %s2664 ret <2 x i32> %v2665}2666 2667@gv_v2i64 = global <2 x i64> <i64 42, i64 42>2668define <2 x i64> @load_v2i64_from_global_address() {2669; CHECK-LABEL: load_v2i64_from_global_address:2670; CHECK: .functype load_v2i64_from_global_address () -> (v128)2671; CHECK-NEXT: # %bb.0:2672; CHECK-NEXT: i32.const 02673; CHECK-NEXT: v128.load gv_v2i642674; CHECK-NEXT: # fallthrough-return2675 %v = load <2 x i64>, ptr @gv_v2i642676 ret <2 x i64> %v2677}2678 2679@gv_i64 = global i64 422680define <2 x i64> @load_splat_v2i64_from_global_address() {2681; CHECK-LABEL: load_splat_v2i64_from_global_address:2682; CHECK: .functype load_splat_v2i64_from_global_address () -> (v128)2683; CHECK-NEXT: # %bb.0:2684; CHECK-NEXT: i32.const 02685; CHECK-NEXT: v128.load64_splat gv_i642686; CHECK-NEXT: # fallthrough-return2687 %e = load i64, ptr @gv_i642688 %v1 = insertelement <2 x i64> undef, i64 %e, i32 02689 %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2690 ret <2 x i64> %v22691}2692 2693@gv_v2i32 = global <2 x i32> <i32 42, i32 42>2694define <2 x i64> @load_sext_v2i64_from_global_address() {2695; CHECK-LABEL: load_sext_v2i64_from_global_address:2696; CHECK: .functype load_sext_v2i64_from_global_address () -> (v128)2697; CHECK-NEXT: # %bb.0:2698; CHECK-NEXT: i32.const 02699; CHECK-NEXT: i64x2.load32x2_s gv_v2i322700; CHECK-NEXT: # fallthrough-return2701 %v = load <2 x i32>, ptr @gv_v2i322702 %v2 = sext <2 x i32> %v to <2 x i64>2703 ret <2 x i64> %v22704}2705 2706define <2 x i64> @load_zext_v2i64_from_global_address() {2707; CHECK-LABEL: load_zext_v2i64_from_global_address:2708; CHECK: .functype load_zext_v2i64_from_global_address () -> (v128)2709; CHECK-NEXT: # %bb.0:2710; CHECK-NEXT: i32.const 02711; CHECK-NEXT: i64x2.load32x2_u gv_v2i322712; CHECK-NEXT: # fallthrough-return2713 %v = load <2 x i32>, ptr @gv_v2i322714 %v2 = zext <2 x i32> %v to <2 x i64>2715 ret <2 x i64> %v22716}2717 2718define <2 x i32> @load_ext_v2i64_from_global_address() {2719; CHECK-LABEL: load_ext_v2i64_from_global_address:2720; CHECK: .functype load_ext_v2i64_from_global_address () -> (v128)2721; CHECK-NEXT: # %bb.0:2722; CHECK-NEXT: i32.const 02723; CHECK-NEXT: v128.load64_zero gv_v2i322724; CHECK-NEXT: # fallthrough-return2725 %v = load <2 x i32>, ptr @gv_v2i322726 ret <2 x i32> %v2727}2728 2729define void @store_v2i64(<2 x i64> %v, ptr %p) {2730; CHECK-LABEL: store_v2i64:2731; CHECK: .functype store_v2i64 (v128, i32) -> ()2732; CHECK-NEXT: # %bb.0:2733; CHECK-NEXT: local.get 12734; CHECK-NEXT: local.get 02735; CHECK-NEXT: v128.store 02736; CHECK-NEXT: # fallthrough-return2737 store <2 x i64> %v , ptr %p2738 ret void2739}2740 2741define void @store_v2i64_with_folded_offset(<2 x i64> %v, ptr %p) {2742; CHECK-LABEL: store_v2i64_with_folded_offset:2743; CHECK: .functype store_v2i64_with_folded_offset (v128, i32) -> ()2744; CHECK-NEXT: # %bb.0:2745; CHECK-NEXT: local.get 12746; CHECK-NEXT: local.get 02747; CHECK-NEXT: v128.store 162748; CHECK-NEXT: # fallthrough-return2749 %q = ptrtoint ptr %p to i322750 %r = add nuw i32 %q, 162751 %s = inttoptr i32 %r to ptr2752 store <2 x i64> %v , ptr %s2753 ret void2754}2755 2756define void @store_v2i64_with_folded_gep_offset(<2 x i64> %v, ptr %p) {2757; CHECK-LABEL: store_v2i64_with_folded_gep_offset:2758; CHECK: .functype store_v2i64_with_folded_gep_offset (v128, i32) -> ()2759; CHECK-NEXT: # %bb.0:2760; CHECK-NEXT: local.get 12761; CHECK-NEXT: local.get 02762; CHECK-NEXT: v128.store 162763; CHECK-NEXT: # fallthrough-return2764 %s = getelementptr inbounds <2 x i64>, ptr %p, i32 12765 store <2 x i64> %v , ptr %s2766 ret void2767}2768 2769define void @store_v2i64_with_unfolded_gep_negative_offset(<2 x i64> %v, ptr %p) {2770; CHECK-LABEL: store_v2i64_with_unfolded_gep_negative_offset:2771; CHECK: .functype store_v2i64_with_unfolded_gep_negative_offset (v128, i32) -> ()2772; CHECK-NEXT: # %bb.0:2773; CHECK-NEXT: local.get 12774; CHECK-NEXT: i32.const -162775; CHECK-NEXT: i32.add2776; CHECK-NEXT: local.get 02777; CHECK-NEXT: v128.store 02778; CHECK-NEXT: # fallthrough-return2779 %s = getelementptr inbounds <2 x i64>, ptr %p, i32 -12780 store <2 x i64> %v , ptr %s2781 ret void2782}2783 2784define void @store_v2i64_with_unfolded_offset(<2 x i64> %v, ptr %p) {2785; CHECK-LABEL: store_v2i64_with_unfolded_offset:2786; CHECK: .functype store_v2i64_with_unfolded_offset (v128, i32) -> ()2787; CHECK-NEXT: # %bb.0:2788; CHECK-NEXT: local.get 12789; CHECK-NEXT: i32.const 162790; CHECK-NEXT: i32.add2791; CHECK-NEXT: local.get 02792; CHECK-NEXT: v128.store 02793; CHECK-NEXT: # fallthrough-return2794 %q = ptrtoint ptr %p to i322795 %r = add nsw i32 %q, 162796 %s = inttoptr i32 %r to ptr2797 store <2 x i64> %v , ptr %s2798 ret void2799}2800 2801define void @store_v2i64_with_unfolded_gep_offset(<2 x i64> %v, ptr %p) {2802; CHECK-LABEL: store_v2i64_with_unfolded_gep_offset:2803; CHECK: .functype store_v2i64_with_unfolded_gep_offset (v128, i32) -> ()2804; CHECK-NEXT: # %bb.0:2805; CHECK-NEXT: local.get 12806; CHECK-NEXT: i32.const 162807; CHECK-NEXT: i32.add2808; CHECK-NEXT: local.get 02809; CHECK-NEXT: v128.store 02810; CHECK-NEXT: # fallthrough-return2811 %s = getelementptr <2 x i64>, ptr %p, i32 12812 store <2 x i64> %v , ptr %s2813 ret void2814}2815 2816define void @store_v2i64_to_numeric_address(<2 x i64> %v) {2817; CHECK-LABEL: store_v2i64_to_numeric_address:2818; CHECK: .functype store_v2i64_to_numeric_address (v128) -> ()2819; CHECK-NEXT: # %bb.0:2820; CHECK-NEXT: i32.const 02821; CHECK-NEXT: local.get 02822; CHECK-NEXT: v128.store 322823; CHECK-NEXT: # fallthrough-return2824 %s = inttoptr i32 32 to ptr2825 store <2 x i64> %v , ptr %s2826 ret void2827}2828 2829define void @store_v2i64_to_global_address(<2 x i64> %v) {2830; CHECK-LABEL: store_v2i64_to_global_address:2831; CHECK: .functype store_v2i64_to_global_address (v128) -> ()2832; CHECK-NEXT: # %bb.0:2833; CHECK-NEXT: i32.const 02834; CHECK-NEXT: local.get 02835; CHECK-NEXT: v128.store gv_v2i642836; CHECK-NEXT: # fallthrough-return2837 store <2 x i64> %v , ptr @gv_v2i642838 ret void2839}2840 2841; ==============================================================================2842; 4 x float2843; ==============================================================================2844define <4 x float> @load_v4f32(ptr %p) {2845; CHECK-LABEL: load_v4f32:2846; CHECK: .functype load_v4f32 (i32) -> (v128)2847; CHECK-NEXT: # %bb.0:2848; CHECK-NEXT: local.get 02849; CHECK-NEXT: v128.load 02850; CHECK-NEXT: # fallthrough-return2851 %v = load <4 x float>, ptr %p2852 ret <4 x float> %v2853}2854 2855define <4 x float> @load_splat_v4f32(ptr %p) {2856; CHECK-LABEL: load_splat_v4f32:2857; CHECK: .functype load_splat_v4f32 (i32) -> (v128)2858; CHECK-NEXT: # %bb.0:2859; CHECK-NEXT: local.get 02860; CHECK-NEXT: v128.load32_splat 02861; CHECK-NEXT: # fallthrough-return2862 %e = load float, ptr %p2863 %v1 = insertelement <4 x float> undef, float %e, i32 02864 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2865 ret <4 x float> %v22866}2867 2868define <4 x float> @load_v4f32_with_folded_offset(ptr %p) {2869; CHECK-LABEL: load_v4f32_with_folded_offset:2870; CHECK: .functype load_v4f32_with_folded_offset (i32) -> (v128)2871; CHECK-NEXT: # %bb.0:2872; CHECK-NEXT: local.get 02873; CHECK-NEXT: v128.load 162874; CHECK-NEXT: # fallthrough-return2875 %q = ptrtoint ptr %p to i322876 %r = add nuw i32 %q, 162877 %s = inttoptr i32 %r to ptr2878 %v = load <4 x float>, ptr %s2879 ret <4 x float> %v2880}2881 2882define <4 x float> @load_splat_v4f32_with_folded_offset(ptr %p) {2883; CHECK-LABEL: load_splat_v4f32_with_folded_offset:2884; CHECK: .functype load_splat_v4f32_with_folded_offset (i32) -> (v128)2885; CHECK-NEXT: # %bb.0:2886; CHECK-NEXT: local.get 02887; CHECK-NEXT: v128.load32_splat 162888; CHECK-NEXT: # fallthrough-return2889 %q = ptrtoint ptr %p to i322890 %r = add nuw i32 %q, 162891 %s = inttoptr i32 %r to ptr2892 %e = load float, ptr %s2893 %v1 = insertelement <4 x float> undef, float %e, i32 02894 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2895 ret <4 x float> %v22896}2897 2898define <4 x float> @load_v4f32_with_folded_gep_offset(ptr %p) {2899; CHECK-LABEL: load_v4f32_with_folded_gep_offset:2900; CHECK: .functype load_v4f32_with_folded_gep_offset (i32) -> (v128)2901; CHECK-NEXT: # %bb.0:2902; CHECK-NEXT: local.get 02903; CHECK-NEXT: v128.load 162904; CHECK-NEXT: # fallthrough-return2905 %s = getelementptr inbounds <4 x float>, ptr %p, i32 12906 %v = load <4 x float>, ptr %s2907 ret <4 x float> %v2908}2909 2910define <4 x float> @load_splat_v4f32_with_folded_gep_offset(ptr %p) {2911; CHECK-LABEL: load_splat_v4f32_with_folded_gep_offset:2912; CHECK: .functype load_splat_v4f32_with_folded_gep_offset (i32) -> (v128)2913; CHECK-NEXT: # %bb.0:2914; CHECK-NEXT: local.get 02915; CHECK-NEXT: v128.load32_splat 42916; CHECK-NEXT: # fallthrough-return2917 %s = getelementptr inbounds float, ptr %p, i32 12918 %e = load float, ptr %s2919 %v1 = insertelement <4 x float> undef, float %e, i32 02920 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2921 ret <4 x float> %v22922}2923 2924define <4 x float> @load_v4f32_with_unfolded_gep_negative_offset(ptr %p) {2925; CHECK-LABEL: load_v4f32_with_unfolded_gep_negative_offset:2926; CHECK: .functype load_v4f32_with_unfolded_gep_negative_offset (i32) -> (v128)2927; CHECK-NEXT: # %bb.0:2928; CHECK-NEXT: local.get 02929; CHECK-NEXT: i32.const -162930; CHECK-NEXT: i32.add2931; CHECK-NEXT: v128.load 02932; CHECK-NEXT: # fallthrough-return2933 %s = getelementptr inbounds <4 x float>, ptr %p, i32 -12934 %v = load <4 x float>, ptr %s2935 ret <4 x float> %v2936}2937 2938define <4 x float> @load_splat_v4f32_with_unfolded_gep_negative_offset(ptr %p) {2939; CHECK-LABEL: load_splat_v4f32_with_unfolded_gep_negative_offset:2940; CHECK: .functype load_splat_v4f32_with_unfolded_gep_negative_offset (i32) -> (v128)2941; CHECK-NEXT: # %bb.0:2942; CHECK-NEXT: local.get 02943; CHECK-NEXT: i32.const -42944; CHECK-NEXT: i32.add2945; CHECK-NEXT: v128.load32_splat 02946; CHECK-NEXT: # fallthrough-return2947 %s = getelementptr inbounds float, ptr %p, i32 -12948 %e = load float, ptr %s2949 %v1 = insertelement <4 x float> undef, float %e, i32 02950 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2951 ret <4 x float> %v22952}2953 2954define <4 x float> @load_v4f32_with_unfolded_offset(ptr %p) {2955; CHECK-LABEL: load_v4f32_with_unfolded_offset:2956; CHECK: .functype load_v4f32_with_unfolded_offset (i32) -> (v128)2957; CHECK-NEXT: # %bb.0:2958; CHECK-NEXT: local.get 02959; CHECK-NEXT: i32.const 162960; CHECK-NEXT: i32.add2961; CHECK-NEXT: v128.load 02962; CHECK-NEXT: # fallthrough-return2963 %q = ptrtoint ptr %p to i322964 %r = add nsw i32 %q, 162965 %s = inttoptr i32 %r to ptr2966 %v = load <4 x float>, ptr %s2967 ret <4 x float> %v2968}2969 2970define <4 x float> @load_splat_v4f32_with_unfolded_offset(ptr %p) {2971; CHECK-LABEL: load_splat_v4f32_with_unfolded_offset:2972; CHECK: .functype load_splat_v4f32_with_unfolded_offset (i32) -> (v128)2973; CHECK-NEXT: # %bb.0:2974; CHECK-NEXT: local.get 02975; CHECK-NEXT: i32.const 162976; CHECK-NEXT: i32.add2977; CHECK-NEXT: v128.load32_splat 02978; CHECK-NEXT: # fallthrough-return2979 %q = ptrtoint ptr %p to i322980 %r = add nsw i32 %q, 162981 %s = inttoptr i32 %r to ptr2982 %e = load float, ptr %s2983 %v1 = insertelement <4 x float> undef, float %e, i32 02984 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2985 ret <4 x float> %v22986}2987 2988define <4 x float> @load_v4f32_with_unfolded_gep_offset(ptr %p) {2989; CHECK-LABEL: load_v4f32_with_unfolded_gep_offset:2990; CHECK: .functype load_v4f32_with_unfolded_gep_offset (i32) -> (v128)2991; CHECK-NEXT: # %bb.0:2992; CHECK-NEXT: local.get 02993; CHECK-NEXT: i32.const 162994; CHECK-NEXT: i32.add2995; CHECK-NEXT: v128.load 02996; CHECK-NEXT: # fallthrough-return2997 %s = getelementptr <4 x float>, ptr %p, i32 12998 %v = load <4 x float>, ptr %s2999 ret <4 x float> %v3000}3001 3002define <4 x float> @load_splat_v4f32_with_unfolded_gep_offset(ptr %p) {3003; CHECK-LABEL: load_splat_v4f32_with_unfolded_gep_offset:3004; CHECK: .functype load_splat_v4f32_with_unfolded_gep_offset (i32) -> (v128)3005; CHECK-NEXT: # %bb.0:3006; CHECK-NEXT: local.get 03007; CHECK-NEXT: i32.const 43008; CHECK-NEXT: i32.add3009; CHECK-NEXT: v128.load32_splat 03010; CHECK-NEXT: # fallthrough-return3011 %s = getelementptr float, ptr %p, i32 13012 %e = load float, ptr %s3013 %v1 = insertelement <4 x float> undef, float %e, i32 03014 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer3015 ret <4 x float> %v23016}3017 3018define <4 x float> @load_v4f32_from_numeric_address() {3019; CHECK-LABEL: load_v4f32_from_numeric_address:3020; CHECK: .functype load_v4f32_from_numeric_address () -> (v128)3021; CHECK-NEXT: # %bb.0:3022; CHECK-NEXT: i32.const 03023; CHECK-NEXT: v128.load 323024; CHECK-NEXT: # fallthrough-return3025 %s = inttoptr i32 32 to ptr3026 %v = load <4 x float>, ptr %s3027 ret <4 x float> %v3028}3029 3030define <4 x float> @load_splat_v4f32_from_numeric_address() {3031; CHECK-LABEL: load_splat_v4f32_from_numeric_address:3032; CHECK: .functype load_splat_v4f32_from_numeric_address () -> (v128)3033; CHECK-NEXT: # %bb.0:3034; CHECK-NEXT: i32.const 03035; CHECK-NEXT: v128.load32_splat 323036; CHECK-NEXT: # fallthrough-return3037 %s = inttoptr i32 32 to ptr3038 %e = load float, ptr %s3039 %v1 = insertelement <4 x float> undef, float %e, i32 03040 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer3041 ret <4 x float> %v23042}3043 3044@gv_v4f32 = global <4 x float> <float 42., float 42., float 42., float 42.>3045define <4 x float> @load_v4f32_from_global_address() {3046; CHECK-LABEL: load_v4f32_from_global_address:3047; CHECK: .functype load_v4f32_from_global_address () -> (v128)3048; CHECK-NEXT: # %bb.0:3049; CHECK-NEXT: i32.const 03050; CHECK-NEXT: v128.load gv_v4f323051; CHECK-NEXT: # fallthrough-return3052 %v = load <4 x float>, ptr @gv_v4f323053 ret <4 x float> %v3054}3055 3056@gv_f32 = global float 42.3057define <4 x float> @load_splat_v4f32_from_global_address() {3058; CHECK-LABEL: load_splat_v4f32_from_global_address:3059; CHECK: .functype load_splat_v4f32_from_global_address () -> (v128)3060; CHECK-NEXT: # %bb.0:3061; CHECK-NEXT: i32.const 03062; CHECK-NEXT: v128.load32_splat gv_f323063; CHECK-NEXT: # fallthrough-return3064 %e = load float, ptr @gv_f323065 %v1 = insertelement <4 x float> undef, float %e, i32 03066 %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer3067 ret <4 x float> %v23068}3069 3070define void @store_v4f32(<4 x float> %v, ptr %p) {3071; CHECK-LABEL: store_v4f32:3072; CHECK: .functype store_v4f32 (v128, i32) -> ()3073; CHECK-NEXT: # %bb.0:3074; CHECK-NEXT: local.get 13075; CHECK-NEXT: local.get 03076; CHECK-NEXT: v128.store 03077; CHECK-NEXT: # fallthrough-return3078 store <4 x float> %v , ptr %p3079 ret void3080}3081 3082define void @store_v4f32_with_folded_offset(<4 x float> %v, ptr %p) {3083; CHECK-LABEL: store_v4f32_with_folded_offset:3084; CHECK: .functype store_v4f32_with_folded_offset (v128, i32) -> ()3085; CHECK-NEXT: # %bb.0:3086; CHECK-NEXT: local.get 13087; CHECK-NEXT: local.get 03088; CHECK-NEXT: v128.store 163089; CHECK-NEXT: # fallthrough-return3090 %q = ptrtoint ptr %p to i323091 %r = add nuw i32 %q, 163092 %s = inttoptr i32 %r to ptr3093 store <4 x float> %v , ptr %s3094 ret void3095}3096 3097define void @store_v4f32_with_folded_gep_offset(<4 x float> %v, ptr %p) {3098; CHECK-LABEL: store_v4f32_with_folded_gep_offset:3099; CHECK: .functype store_v4f32_with_folded_gep_offset (v128, i32) -> ()3100; CHECK-NEXT: # %bb.0:3101; CHECK-NEXT: local.get 13102; CHECK-NEXT: local.get 03103; CHECK-NEXT: v128.store 163104; CHECK-NEXT: # fallthrough-return3105 %s = getelementptr inbounds <4 x float>, ptr %p, i32 13106 store <4 x float> %v , ptr %s3107 ret void3108}3109 3110define void @store_v4f32_with_unfolded_gep_negative_offset(<4 x float> %v, ptr %p) {3111; CHECK-LABEL: store_v4f32_with_unfolded_gep_negative_offset:3112; CHECK: .functype store_v4f32_with_unfolded_gep_negative_offset (v128, i32) -> ()3113; CHECK-NEXT: # %bb.0:3114; CHECK-NEXT: local.get 13115; CHECK-NEXT: i32.const -163116; CHECK-NEXT: i32.add3117; CHECK-NEXT: local.get 03118; CHECK-NEXT: v128.store 03119; CHECK-NEXT: # fallthrough-return3120 %s = getelementptr inbounds <4 x float>, ptr %p, i32 -13121 store <4 x float> %v , ptr %s3122 ret void3123}3124 3125define void @store_v4f32_with_unfolded_offset(<4 x float> %v, ptr %p) {3126; CHECK-LABEL: store_v4f32_with_unfolded_offset:3127; CHECK: .functype store_v4f32_with_unfolded_offset (v128, i32) -> ()3128; CHECK-NEXT: # %bb.0:3129; CHECK-NEXT: local.get 13130; CHECK-NEXT: i32.const 163131; CHECK-NEXT: i32.add3132; CHECK-NEXT: local.get 03133; CHECK-NEXT: v128.store 03134; CHECK-NEXT: # fallthrough-return3135 %q = ptrtoint ptr %p to i323136 %r = add nsw i32 %q, 163137 %s = inttoptr i32 %r to ptr3138 store <4 x float> %v , ptr %s3139 ret void3140}3141 3142define void @store_v4f32_with_unfolded_gep_offset(<4 x float> %v, ptr %p) {3143; CHECK-LABEL: store_v4f32_with_unfolded_gep_offset:3144; CHECK: .functype store_v4f32_with_unfolded_gep_offset (v128, i32) -> ()3145; CHECK-NEXT: # %bb.0:3146; CHECK-NEXT: local.get 13147; CHECK-NEXT: i32.const 163148; CHECK-NEXT: i32.add3149; CHECK-NEXT: local.get 03150; CHECK-NEXT: v128.store 03151; CHECK-NEXT: # fallthrough-return3152 %s = getelementptr <4 x float>, ptr %p, i32 13153 store <4 x float> %v , ptr %s3154 ret void3155}3156 3157define void @store_v4f32_to_numeric_address(<4 x float> %v) {3158; CHECK-LABEL: store_v4f32_to_numeric_address:3159; CHECK: .functype store_v4f32_to_numeric_address (v128) -> ()3160; CHECK-NEXT: # %bb.0:3161; CHECK-NEXT: i32.const 03162; CHECK-NEXT: local.get 03163; CHECK-NEXT: v128.store 323164; CHECK-NEXT: # fallthrough-return3165 %s = inttoptr i32 32 to ptr3166 store <4 x float> %v , ptr %s3167 ret void3168}3169 3170define void @store_v4f32_to_global_address(<4 x float> %v) {3171; CHECK-LABEL: store_v4f32_to_global_address:3172; CHECK: .functype store_v4f32_to_global_address (v128) -> ()3173; CHECK-NEXT: # %bb.0:3174; CHECK-NEXT: i32.const 03175; CHECK-NEXT: local.get 03176; CHECK-NEXT: v128.store gv_v4f323177; CHECK-NEXT: # fallthrough-return3178 store <4 x float> %v , ptr @gv_v4f323179 ret void3180}3181 3182; ==============================================================================3183; 2 x double3184; ==============================================================================3185define <2 x double> @load_v2f64(ptr %p) {3186; CHECK-LABEL: load_v2f64:3187; CHECK: .functype load_v2f64 (i32) -> (v128)3188; CHECK-NEXT: # %bb.0:3189; CHECK-NEXT: local.get 03190; CHECK-NEXT: v128.load 03191; CHECK-NEXT: # fallthrough-return3192 %v = load <2 x double>, ptr %p3193 ret <2 x double> %v3194}3195 3196define <2 x double> @load_splat_v2f64(ptr %p) {3197; CHECK-LABEL: load_splat_v2f64:3198; CHECK: .functype load_splat_v2f64 (i32) -> (v128)3199; CHECK-NEXT: # %bb.0:3200; CHECK-NEXT: local.get 03201; CHECK-NEXT: v128.load64_splat 03202; CHECK-NEXT: # fallthrough-return3203 %e = load double, ptr %p3204 %v1 = insertelement <2 x double> undef, double %e, i32 03205 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3206 ret <2 x double> %v23207}3208 3209define <2 x double> @load_promote_v2f64(ptr %p) {3210; CHECK-LABEL: load_promote_v2f64:3211; CHECK: .functype load_promote_v2f64 (i32) -> (v128)3212; CHECK-NEXT: # %bb.0:3213; CHECK-NEXT: local.get 03214; CHECK-NEXT: v128.load64_zero 03215; CHECK-NEXT: f64x2.promote_low_f32x43216; CHECK-NEXT: # fallthrough-return3217 %e = load <2 x float>, ptr %p3218 %v = fpext <2 x float> %e to <2 x double>3219 ret <2 x double> %v3220}3221 3222define <2 x double> @load_v2f64_with_folded_offset(ptr %p) {3223; CHECK-LABEL: load_v2f64_with_folded_offset:3224; CHECK: .functype load_v2f64_with_folded_offset (i32) -> (v128)3225; CHECK-NEXT: # %bb.0:3226; CHECK-NEXT: local.get 03227; CHECK-NEXT: v128.load 163228; CHECK-NEXT: # fallthrough-return3229 %q = ptrtoint ptr %p to i323230 %r = add nuw i32 %q, 163231 %s = inttoptr i32 %r to ptr3232 %v = load <2 x double>, ptr %s3233 ret <2 x double> %v3234}3235 3236define <2 x double> @load_splat_v2f64_with_folded_offset(ptr %p) {3237; CHECK-LABEL: load_splat_v2f64_with_folded_offset:3238; CHECK: .functype load_splat_v2f64_with_folded_offset (i32) -> (v128)3239; CHECK-NEXT: # %bb.0:3240; CHECK-NEXT: local.get 03241; CHECK-NEXT: v128.load64_splat 163242; CHECK-NEXT: # fallthrough-return3243 %q = ptrtoint ptr %p to i323244 %r = add nuw i32 %q, 163245 %s = inttoptr i32 %r to ptr3246 %e = load double, ptr %s3247 %v1 = insertelement <2 x double> undef, double %e, i32 03248 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3249 ret <2 x double> %v23250}3251 3252define <2 x double> @load_promote_v2f64_with_folded_offset(ptr %p) {3253; CHECK-LABEL: load_promote_v2f64_with_folded_offset:3254; CHECK: .functype load_promote_v2f64_with_folded_offset (i32) -> (v128)3255; CHECK-NEXT: # %bb.0:3256; CHECK-NEXT: local.get 03257; CHECK-NEXT: i32.const 163258; CHECK-NEXT: i32.add3259; CHECK-NEXT: v128.load64_zero 03260; CHECK-NEXT: f64x2.promote_low_f32x43261; CHECK-NEXT: # fallthrough-return3262 %q = ptrtoint ptr %p to i323263 %r = add nuw i32 %q, 163264 %s = inttoptr i32 %r to ptr3265 %e = load <2 x float>, ptr %s3266 %v = fpext <2 x float> %e to <2 x double>3267 ret <2 x double> %v3268}3269 3270define <2 x double> @load_v2f64_with_folded_gep_offset(ptr %p) {3271; CHECK-LABEL: load_v2f64_with_folded_gep_offset:3272; CHECK: .functype load_v2f64_with_folded_gep_offset (i32) -> (v128)3273; CHECK-NEXT: # %bb.0:3274; CHECK-NEXT: local.get 03275; CHECK-NEXT: v128.load 163276; CHECK-NEXT: # fallthrough-return3277 %s = getelementptr inbounds <2 x double>, ptr %p, i32 13278 %v = load <2 x double>, ptr %s3279 ret <2 x double> %v3280}3281 3282define <2 x double> @load_splat_v2f64_with_folded_gep_offset(ptr %p) {3283; CHECK-LABEL: load_splat_v2f64_with_folded_gep_offset:3284; CHECK: .functype load_splat_v2f64_with_folded_gep_offset (i32) -> (v128)3285; CHECK-NEXT: # %bb.0:3286; CHECK-NEXT: local.get 03287; CHECK-NEXT: v128.load64_splat 83288; CHECK-NEXT: # fallthrough-return3289 %s = getelementptr inbounds double, ptr %p, i32 13290 %e = load double, ptr %s3291 %v1 = insertelement <2 x double> undef, double %e, i32 03292 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3293 ret <2 x double> %v23294}3295 3296define <2 x double> @load_promote_v2f64_with_folded_gep_offset(ptr %p) {3297; CHECK-LABEL: load_promote_v2f64_with_folded_gep_offset:3298; CHECK: .functype load_promote_v2f64_with_folded_gep_offset (i32) -> (v128)3299; CHECK-NEXT: # %bb.0:3300; CHECK-NEXT: local.get 03301; CHECK-NEXT: i32.const 83302; CHECK-NEXT: i32.add3303; CHECK-NEXT: v128.load64_zero 03304; CHECK-NEXT: f64x2.promote_low_f32x43305; CHECK-NEXT: # fallthrough-return3306 %s = getelementptr inbounds <2 x float>, ptr %p, i32 13307 %e = load <2 x float>, ptr %s3308 %v = fpext <2 x float> %e to <2 x double>3309 ret <2 x double> %v3310}3311 3312define <2 x double> @load_v2f64_with_unfolded_gep_negative_offset(ptr %p) {3313; CHECK-LABEL: load_v2f64_with_unfolded_gep_negative_offset:3314; CHECK: .functype load_v2f64_with_unfolded_gep_negative_offset (i32) -> (v128)3315; CHECK-NEXT: # %bb.0:3316; CHECK-NEXT: local.get 03317; CHECK-NEXT: i32.const -163318; CHECK-NEXT: i32.add3319; CHECK-NEXT: v128.load 03320; CHECK-NEXT: # fallthrough-return3321 %s = getelementptr inbounds <2 x double>, ptr %p, i32 -13322 %v = load <2 x double>, ptr %s3323 ret <2 x double> %v3324}3325 3326define <2 x double> @load_splat_v2f64_with_unfolded_gep_negative_offset(ptr %p) {3327; CHECK-LABEL: load_splat_v2f64_with_unfolded_gep_negative_offset:3328; CHECK: .functype load_splat_v2f64_with_unfolded_gep_negative_offset (i32) -> (v128)3329; CHECK-NEXT: # %bb.0:3330; CHECK-NEXT: local.get 03331; CHECK-NEXT: i32.const -83332; CHECK-NEXT: i32.add3333; CHECK-NEXT: v128.load64_splat 03334; CHECK-NEXT: # fallthrough-return3335 %s = getelementptr inbounds double, ptr %p, i32 -13336 %e = load double, ptr %s3337 %v1 = insertelement <2 x double> undef, double %e, i32 03338 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3339 ret <2 x double> %v23340}3341 3342define <2 x double> @load_promote_v2f64_with_unfolded_gep_negative_offset(ptr %p) {3343; CHECK-LABEL: load_promote_v2f64_with_unfolded_gep_negative_offset:3344; CHECK: .functype load_promote_v2f64_with_unfolded_gep_negative_offset (i32) -> (v128)3345; CHECK-NEXT: # %bb.0:3346; CHECK-NEXT: local.get 03347; CHECK-NEXT: i32.const -83348; CHECK-NEXT: i32.add3349; CHECK-NEXT: v128.load64_zero 03350; CHECK-NEXT: f64x2.promote_low_f32x43351; CHECK-NEXT: # fallthrough-return3352 %s = getelementptr inbounds <2 x float>, ptr %p, i32 -13353 %e = load <2 x float>, ptr %s3354 %v = fpext <2 x float> %e to <2 x double>3355 ret <2 x double> %v3356}3357 3358define <2 x double> @load_v2f64_with_unfolded_offset(ptr %p) {3359; CHECK-LABEL: load_v2f64_with_unfolded_offset:3360; CHECK: .functype load_v2f64_with_unfolded_offset (i32) -> (v128)3361; CHECK-NEXT: # %bb.0:3362; CHECK-NEXT: local.get 03363; CHECK-NEXT: i32.const 163364; CHECK-NEXT: i32.add3365; CHECK-NEXT: v128.load 03366; CHECK-NEXT: # fallthrough-return3367 %q = ptrtoint ptr %p to i323368 %r = add nsw i32 %q, 163369 %s = inttoptr i32 %r to ptr3370 %v = load <2 x double>, ptr %s3371 ret <2 x double> %v3372}3373 3374define <2 x double> @load_splat_v2f64_with_unfolded_offset(ptr %p) {3375; CHECK-LABEL: load_splat_v2f64_with_unfolded_offset:3376; CHECK: .functype load_splat_v2f64_with_unfolded_offset (i32) -> (v128)3377; CHECK-NEXT: # %bb.0:3378; CHECK-NEXT: local.get 03379; CHECK-NEXT: i32.const 163380; CHECK-NEXT: i32.add3381; CHECK-NEXT: v128.load64_splat 03382; CHECK-NEXT: # fallthrough-return3383 %q = ptrtoint ptr %p to i323384 %r = add nsw i32 %q, 163385 %s = inttoptr i32 %r to ptr3386 %e = load double, ptr %s3387 %v1 = insertelement <2 x double> undef, double %e, i32 03388 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3389 ret <2 x double> %v23390}3391 3392define <2 x double> @load_promote_v2f64_with_unfolded_offset(ptr %p) {3393; CHECK-LABEL: load_promote_v2f64_with_unfolded_offset:3394; CHECK: .functype load_promote_v2f64_with_unfolded_offset (i32) -> (v128)3395; CHECK-NEXT: # %bb.0:3396; CHECK-NEXT: local.get 03397; CHECK-NEXT: i32.const 163398; CHECK-NEXT: i32.add3399; CHECK-NEXT: v128.load64_zero 03400; CHECK-NEXT: f64x2.promote_low_f32x43401; CHECK-NEXT: # fallthrough-return3402 %q = ptrtoint ptr %p to i323403 %r = add nsw i32 %q, 163404 %s = inttoptr i32 %r to ptr3405 %e = load <2 x float>, ptr %s3406 %v = fpext <2 x float> %e to <2 x double>3407 ret <2 x double> %v3408}3409 3410define <2 x double> @load_v2f64_with_unfolded_gep_offset(ptr %p) {3411; CHECK-LABEL: load_v2f64_with_unfolded_gep_offset:3412; CHECK: .functype load_v2f64_with_unfolded_gep_offset (i32) -> (v128)3413; CHECK-NEXT: # %bb.0:3414; CHECK-NEXT: local.get 03415; CHECK-NEXT: i32.const 163416; CHECK-NEXT: i32.add3417; CHECK-NEXT: v128.load 03418; CHECK-NEXT: # fallthrough-return3419 %s = getelementptr <2 x double>, ptr %p, i32 13420 %v = load <2 x double>, ptr %s3421 ret <2 x double> %v3422}3423 3424define <2 x double> @load_splat_v2f64_with_unfolded_gep_offset(ptr %p) {3425; CHECK-LABEL: load_splat_v2f64_with_unfolded_gep_offset:3426; CHECK: .functype load_splat_v2f64_with_unfolded_gep_offset (i32) -> (v128)3427; CHECK-NEXT: # %bb.0:3428; CHECK-NEXT: local.get 03429; CHECK-NEXT: i32.const 83430; CHECK-NEXT: i32.add3431; CHECK-NEXT: v128.load64_splat 03432; CHECK-NEXT: # fallthrough-return3433 %s = getelementptr double, ptr %p, i32 13434 %e = load double, ptr %s3435 %v1 = insertelement <2 x double> undef, double %e, i32 03436 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3437 ret <2 x double> %v23438}3439 3440define <2 x double> @load_promote_v2f64_with_unfolded_gep_offset(ptr %p) {3441; CHECK-LABEL: load_promote_v2f64_with_unfolded_gep_offset:3442; CHECK: .functype load_promote_v2f64_with_unfolded_gep_offset (i32) -> (v128)3443; CHECK-NEXT: # %bb.0:3444; CHECK-NEXT: local.get 03445; CHECK-NEXT: i32.const 83446; CHECK-NEXT: i32.add3447; CHECK-NEXT: v128.load64_zero 03448; CHECK-NEXT: f64x2.promote_low_f32x43449; CHECK-NEXT: # fallthrough-return3450 %s = getelementptr <2 x float>, ptr %p, i32 13451 %e = load <2 x float>, ptr %s3452 %v = fpext <2 x float> %e to <2 x double>3453 ret <2 x double> %v3454}3455 3456define <2 x double> @load_v2f64_from_numeric_address() {3457; CHECK-LABEL: load_v2f64_from_numeric_address:3458; CHECK: .functype load_v2f64_from_numeric_address () -> (v128)3459; CHECK-NEXT: # %bb.0:3460; CHECK-NEXT: i32.const 03461; CHECK-NEXT: v128.load 323462; CHECK-NEXT: # fallthrough-return3463 %s = inttoptr i32 32 to ptr3464 %v = load <2 x double>, ptr %s3465 ret <2 x double> %v3466}3467 3468define <2 x double> @load_splat_v2f64_from_numeric_address() {3469; CHECK-LABEL: load_splat_v2f64_from_numeric_address:3470; CHECK: .functype load_splat_v2f64_from_numeric_address () -> (v128)3471; CHECK-NEXT: # %bb.0:3472; CHECK-NEXT: i32.const 03473; CHECK-NEXT: v128.load64_splat 323474; CHECK-NEXT: # fallthrough-return3475 %s = inttoptr i32 32 to ptr3476 %e = load double, ptr %s3477 %v1 = insertelement <2 x double> undef, double %e, i32 03478 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3479 ret <2 x double> %v23480}3481 3482define <2 x double> @load_promote_v2f64_from_numeric_address() {3483; CHECK-LABEL: load_promote_v2f64_from_numeric_address:3484; CHECK: .functype load_promote_v2f64_from_numeric_address () -> (v128)3485; CHECK-NEXT: # %bb.0:3486; CHECK-NEXT: i32.const 323487; CHECK-NEXT: v128.load64_zero 03488; CHECK-NEXT: f64x2.promote_low_f32x43489; CHECK-NEXT: # fallthrough-return3490 %s = inttoptr i32 32 to ptr3491 %e = load <2 x float>, ptr %s3492 %v = fpext <2 x float> %e to <2 x double>3493 ret <2 x double> %v3494}3495 3496@gv_v2f64 = global <2 x double> <double 42., double 42.>3497define <2 x double> @load_v2f64_from_global_address() {3498; CHECK-LABEL: load_v2f64_from_global_address:3499; CHECK: .functype load_v2f64_from_global_address () -> (v128)3500; CHECK-NEXT: # %bb.0:3501; CHECK-NEXT: i32.const 03502; CHECK-NEXT: v128.load gv_v2f643503; CHECK-NEXT: # fallthrough-return3504 %v = load <2 x double>, ptr @gv_v2f643505 ret <2 x double> %v3506}3507 3508@gv_f64 = global double 42.3509define <2 x double> @load_splat_v2f64_from_global_address() {3510; CHECK-LABEL: load_splat_v2f64_from_global_address:3511; CHECK: .functype load_splat_v2f64_from_global_address () -> (v128)3512; CHECK-NEXT: # %bb.0:3513; CHECK-NEXT: i32.const 03514; CHECK-NEXT: v128.load64_splat gv_f643515; CHECK-NEXT: # fallthrough-return3516 %e = load double, ptr @gv_f643517 %v1 = insertelement <2 x double> undef, double %e, i32 03518 %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3519 ret <2 x double> %v23520}3521 3522@gv_v2f32 = global <2 x float> <float 42., float 42.>3523define <2 x double> @load_promote_v2f64_from_global_address() {3524; CHECK-LABEL: load_promote_v2f64_from_global_address:3525; CHECK: .functype load_promote_v2f64_from_global_address () -> (v128)3526; CHECK-NEXT: # %bb.0:3527; CHECK-NEXT: i32.const gv_v2f323528; CHECK-NEXT: v128.load64_zero 03529; CHECK-NEXT: f64x2.promote_low_f32x43530; CHECK-NEXT: # fallthrough-return3531 %e = load <2 x float>, ptr @gv_v2f323532 %v = fpext <2 x float> %e to <2 x double>3533 ret <2 x double> %v3534}3535 3536define void @store_v2f64(<2 x double> %v, ptr %p) {3537; CHECK-LABEL: store_v2f64:3538; CHECK: .functype store_v2f64 (v128, i32) -> ()3539; CHECK-NEXT: # %bb.0:3540; CHECK-NEXT: local.get 13541; CHECK-NEXT: local.get 03542; CHECK-NEXT: v128.store 03543; CHECK-NEXT: # fallthrough-return3544 store <2 x double> %v , ptr %p3545 ret void3546}3547 3548define void @store_v2f64_with_folded_offset(<2 x double> %v, ptr %p) {3549; CHECK-LABEL: store_v2f64_with_folded_offset:3550; CHECK: .functype store_v2f64_with_folded_offset (v128, i32) -> ()3551; CHECK-NEXT: # %bb.0:3552; CHECK-NEXT: local.get 13553; CHECK-NEXT: local.get 03554; CHECK-NEXT: v128.store 163555; CHECK-NEXT: # fallthrough-return3556 %q = ptrtoint ptr %p to i323557 %r = add nuw i32 %q, 163558 %s = inttoptr i32 %r to ptr3559 store <2 x double> %v , ptr %s3560 ret void3561}3562 3563define void @store_v2f64_with_folded_gep_offset(<2 x double> %v, ptr %p) {3564; CHECK-LABEL: store_v2f64_with_folded_gep_offset:3565; CHECK: .functype store_v2f64_with_folded_gep_offset (v128, i32) -> ()3566; CHECK-NEXT: # %bb.0:3567; CHECK-NEXT: local.get 13568; CHECK-NEXT: local.get 03569; CHECK-NEXT: v128.store 163570; CHECK-NEXT: # fallthrough-return3571 %s = getelementptr inbounds <2 x double>, ptr %p, i32 13572 store <2 x double> %v , ptr %s3573 ret void3574}3575 3576define void @store_v2f64_with_unfolded_gep_negative_offset(<2 x double> %v, ptr %p) {3577; CHECK-LABEL: store_v2f64_with_unfolded_gep_negative_offset:3578; CHECK: .functype store_v2f64_with_unfolded_gep_negative_offset (v128, i32) -> ()3579; CHECK-NEXT: # %bb.0:3580; CHECK-NEXT: local.get 13581; CHECK-NEXT: i32.const -163582; CHECK-NEXT: i32.add3583; CHECK-NEXT: local.get 03584; CHECK-NEXT: v128.store 03585; CHECK-NEXT: # fallthrough-return3586 %s = getelementptr inbounds <2 x double>, ptr %p, i32 -13587 store <2 x double> %v , ptr %s3588 ret void3589}3590 3591define void @store_v2f64_with_unfolded_offset(<2 x double> %v, ptr %p) {3592; CHECK-LABEL: store_v2f64_with_unfolded_offset:3593; CHECK: .functype store_v2f64_with_unfolded_offset (v128, i32) -> ()3594; CHECK-NEXT: # %bb.0:3595; CHECK-NEXT: local.get 13596; CHECK-NEXT: i32.const 163597; CHECK-NEXT: i32.add3598; CHECK-NEXT: local.get 03599; CHECK-NEXT: v128.store 03600; CHECK-NEXT: # fallthrough-return3601 %q = ptrtoint ptr %p to i323602 %r = add nsw i32 %q, 163603 %s = inttoptr i32 %r to ptr3604 store <2 x double> %v , ptr %s3605 ret void3606}3607 3608define void @store_v2f64_with_unfolded_gep_offset(<2 x double> %v, ptr %p) {3609; CHECK-LABEL: store_v2f64_with_unfolded_gep_offset:3610; CHECK: .functype store_v2f64_with_unfolded_gep_offset (v128, i32) -> ()3611; CHECK-NEXT: # %bb.0:3612; CHECK-NEXT: local.get 13613; CHECK-NEXT: i32.const 163614; CHECK-NEXT: i32.add3615; CHECK-NEXT: local.get 03616; CHECK-NEXT: v128.store 03617; CHECK-NEXT: # fallthrough-return3618 %s = getelementptr <2 x double>, ptr %p, i32 13619 store <2 x double> %v , ptr %s3620 ret void3621}3622 3623define void @store_v2f64_to_numeric_address(<2 x double> %v) {3624; CHECK-LABEL: store_v2f64_to_numeric_address:3625; CHECK: .functype store_v2f64_to_numeric_address (v128) -> ()3626; CHECK-NEXT: # %bb.0:3627; CHECK-NEXT: i32.const 03628; CHECK-NEXT: local.get 03629; CHECK-NEXT: v128.store 323630; CHECK-NEXT: # fallthrough-return3631 %s = inttoptr i32 32 to ptr3632 store <2 x double> %v , ptr %s3633 ret void3634}3635 3636define void @store_v2f64_to_global_address(<2 x double> %v) {3637; CHECK-LABEL: store_v2f64_to_global_address:3638; CHECK: .functype store_v2f64_to_global_address (v128) -> ()3639; CHECK-NEXT: # %bb.0:3640; CHECK-NEXT: i32.const 03641; CHECK-NEXT: local.get 03642; CHECK-NEXT: v128.store gv_v2f643643; CHECK-NEXT: # fallthrough-return3644 store <2 x double> %v , ptr @gv_v2f643645 ret void3646}3647