241 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 v128.load{32,64}_zero instructions5 6target triple = "wasm32-unknown-unknown"7 8;===----------------------------------------------------------------------------9; v128.load32_zero10;===----------------------------------------------------------------------------11 12define <4 x i32> @load_zero_i32_no_offset(ptr %p) {13; CHECK-LABEL: load_zero_i32_no_offset:14; CHECK: .functype load_zero_i32_no_offset (i32) -> (v128)15; CHECK-NEXT: # %bb.0:16; CHECK-NEXT: local.get 017; CHECK-NEXT: v128.load32_zero 018; CHECK-NEXT: # fallthrough-return19 %x = load i32, ptr %p20 %v = insertelement <4 x i32> zeroinitializer, i32 %x, i32 021 ret <4 x i32> %v22}23 24define <4 x i32> @load_zero_i32_with_folded_offset(ptr %p) {25; CHECK-LABEL: load_zero_i32_with_folded_offset:26; CHECK: .functype load_zero_i32_with_folded_offset (i32) -> (v128)27; CHECK-NEXT: # %bb.0:28; CHECK-NEXT: local.get 029; CHECK-NEXT: v128.load32_zero 2430; CHECK-NEXT: # fallthrough-return31 %q = ptrtoint ptr %p to i3232 %r = add nuw i32 %q, 2433 %s = inttoptr i32 %r to ptr34 %x = load i32, ptr %s35 %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 036 ret <4 x i32> %t37}38 39define <4 x i32> @load_zero_i32_with_folded_gep_offset(ptr %p) {40; CHECK-LABEL: load_zero_i32_with_folded_gep_offset:41; CHECK: .functype load_zero_i32_with_folded_gep_offset (i32) -> (v128)42; CHECK-NEXT: # %bb.0:43; CHECK-NEXT: local.get 044; CHECK-NEXT: v128.load32_zero 2445; CHECK-NEXT: # fallthrough-return46 %s = getelementptr inbounds i32, ptr %p, i32 647 %x = load i32, ptr %s48 %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 049 ret <4 x i32> %t50}51 52define <4 x i32> @load_zero_i32_with_unfolded_gep_negative_offset(ptr %p) {53; CHECK-LABEL: load_zero_i32_with_unfolded_gep_negative_offset:54; CHECK: .functype load_zero_i32_with_unfolded_gep_negative_offset (i32) -> (v128)55; CHECK-NEXT: # %bb.0:56; CHECK-NEXT: local.get 057; CHECK-NEXT: i32.const -2458; CHECK-NEXT: i32.add59; CHECK-NEXT: v128.load32_zero 060; CHECK-NEXT: # fallthrough-return61 %s = getelementptr inbounds i32, ptr %p, i32 -662 %x = load i32, ptr %s63 %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 064 ret <4 x i32> %t65}66 67define <4 x i32> @load_zero_i32_with_unfolded_offset(ptr %p) {68; CHECK-LABEL: load_zero_i32_with_unfolded_offset:69; CHECK: .functype load_zero_i32_with_unfolded_offset (i32) -> (v128)70; CHECK-NEXT: # %bb.0:71; CHECK-NEXT: local.get 072; CHECK-NEXT: i32.const 2473; CHECK-NEXT: i32.add74; CHECK-NEXT: v128.load32_zero 075; CHECK-NEXT: # fallthrough-return76 %q = ptrtoint ptr %p to i3277 %r = add nsw i32 %q, 2478 %s = inttoptr i32 %r to ptr79 %x = load i32, ptr %s80 %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 081 ret <4 x i32> %t82}83 84define <4 x i32> @load_zero_i32_with_unfolded_gep_offset(ptr %p) {85; CHECK-LABEL: load_zero_i32_with_unfolded_gep_offset:86; CHECK: .functype load_zero_i32_with_unfolded_gep_offset (i32) -> (v128)87; CHECK-NEXT: # %bb.0:88; CHECK-NEXT: local.get 089; CHECK-NEXT: i32.const 2490; CHECK-NEXT: i32.add91; CHECK-NEXT: v128.load32_zero 092; CHECK-NEXT: # fallthrough-return93 %s = getelementptr i32, ptr %p, i32 694 %x = load i32, ptr %s95 %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 096 ret <4 x i32> %t97}98 99define <4 x i32> @load_zero_i32_from_numeric_address() {100; CHECK-LABEL: load_zero_i32_from_numeric_address:101; CHECK: .functype load_zero_i32_from_numeric_address () -> (v128)102; CHECK-NEXT: # %bb.0:103; CHECK-NEXT: i32.const 0104; CHECK-NEXT: v128.load32_zero 42105; CHECK-NEXT: # fallthrough-return106 %s = inttoptr i32 42 to ptr107 %x = load i32, ptr %s108 %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0109 ret <4 x i32> %t110}111 112@gv_i32 = global i32 0113define <4 x i32> @load_zero_i32_from_global_address() {114; CHECK-LABEL: load_zero_i32_from_global_address:115; CHECK: .functype load_zero_i32_from_global_address () -> (v128)116; CHECK-NEXT: # %bb.0:117; CHECK-NEXT: i32.const 0118; CHECK-NEXT: v128.load32_zero gv_i32119; CHECK-NEXT: # fallthrough-return120 %x = load i32, ptr @gv_i32121 %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0122 ret <4 x i32> %t123}124 125;===----------------------------------------------------------------------------126; v128.load64_zero127;===----------------------------------------------------------------------------128 129define <2 x i64> @load_zero_i64_no_offset(ptr %p) {130; CHECK-LABEL: load_zero_i64_no_offset:131; CHECK: .functype load_zero_i64_no_offset (i32) -> (v128)132; CHECK-NEXT: # %bb.0:133; CHECK-NEXT: local.get 0134; CHECK-NEXT: v128.load64_zero 0135; CHECK-NEXT: # fallthrough-return136 %x = load i64, ptr %p137 %v = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0138 ret <2 x i64> %v139}140 141define <2 x i64> @load_zero_i64_with_folded_offset(ptr %p) {142; CHECK-LABEL: load_zero_i64_with_folded_offset:143; CHECK: .functype load_zero_i64_with_folded_offset (i32) -> (v128)144; CHECK-NEXT: # %bb.0:145; CHECK-NEXT: local.get 0146; CHECK-NEXT: v128.load64_zero 24147; CHECK-NEXT: # fallthrough-return148 %q = ptrtoint ptr %p to i32149 %r = add nuw i32 %q, 24150 %s = inttoptr i32 %r to ptr151 %x = load i64, ptr %s152 %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0153 ret <2 x i64> %t154}155 156define <2 x i64> @load_zero_i64_with_folded_gep_offset(ptr %p) {157; CHECK-LABEL: load_zero_i64_with_folded_gep_offset:158; CHECK: .functype load_zero_i64_with_folded_gep_offset (i32) -> (v128)159; CHECK-NEXT: # %bb.0:160; CHECK-NEXT: local.get 0161; CHECK-NEXT: v128.load64_zero 48162; CHECK-NEXT: # fallthrough-return163 %s = getelementptr inbounds i64, ptr %p, i64 6164 %x = load i64, ptr %s165 %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0166 ret <2 x i64> %t167}168 169define <2 x i64> @load_zero_i64_with_unfolded_gep_negative_offset(ptr %p) {170; CHECK-LABEL: load_zero_i64_with_unfolded_gep_negative_offset:171; CHECK: .functype load_zero_i64_with_unfolded_gep_negative_offset (i32) -> (v128)172; CHECK-NEXT: # %bb.0:173; CHECK-NEXT: local.get 0174; CHECK-NEXT: i32.const -48175; CHECK-NEXT: i32.add176; CHECK-NEXT: v128.load64_zero 0177; CHECK-NEXT: # fallthrough-return178 %s = getelementptr inbounds i64, ptr %p, i64 -6179 %x = load i64, ptr %s180 %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0181 ret <2 x i64> %t182}183 184define <2 x i64> @load_zero_i64_with_unfolded_offset(ptr %p) {185; CHECK-LABEL: load_zero_i64_with_unfolded_offset:186; CHECK: .functype load_zero_i64_with_unfolded_offset (i32) -> (v128)187; CHECK-NEXT: # %bb.0:188; CHECK-NEXT: local.get 0189; CHECK-NEXT: i32.const 24190; CHECK-NEXT: i32.add191; CHECK-NEXT: v128.load64_zero 0192; CHECK-NEXT: # fallthrough-return193 %q = ptrtoint ptr %p to i32194 %r = add nsw i32 %q, 24195 %s = inttoptr i32 %r to ptr196 %x = load i64, ptr %s197 %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0198 ret <2 x i64> %t199}200 201define <2 x i64> @load_zero_i64_with_unfolded_gep_offset(ptr %p) {202; CHECK-LABEL: load_zero_i64_with_unfolded_gep_offset:203; CHECK: .functype load_zero_i64_with_unfolded_gep_offset (i32) -> (v128)204; CHECK-NEXT: # %bb.0:205; CHECK-NEXT: local.get 0206; CHECK-NEXT: i32.const 48207; CHECK-NEXT: i32.add208; CHECK-NEXT: v128.load64_zero 0209; CHECK-NEXT: # fallthrough-return210 %s = getelementptr i64, ptr %p, i64 6211 %x = load i64, ptr %s212 %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0213 ret <2 x i64> %t214}215 216define <2 x i64> @load_zero_i64_from_numeric_address() {217; CHECK-LABEL: load_zero_i64_from_numeric_address:218; CHECK: .functype load_zero_i64_from_numeric_address () -> (v128)219; CHECK-NEXT: # %bb.0:220; CHECK-NEXT: i32.const 0221; CHECK-NEXT: v128.load64_zero 42222; CHECK-NEXT: # fallthrough-return223 %s = inttoptr i32 42 to ptr224 %x = load i64, ptr %s225 %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0226 ret <2 x i64> %t227}228 229@gv_i64 = global i64 0230define <2 x i64> @load_zero_i64_from_global_address() {231; CHECK-LABEL: load_zero_i64_from_global_address:232; CHECK: .functype load_zero_i64_from_global_address () -> (v128)233; CHECK-NEXT: # %bb.0:234; CHECK-NEXT: i32.const 0235; CHECK-NEXT: v128.load64_zero gv_i64236; CHECK-NEXT: # fallthrough-return237 %x = load i64, ptr @gv_i64238 %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0239 ret <2 x i64> %t240}241