1cb327922SThomas Lively; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2cb327922SThomas Lively; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s 3cb327922SThomas Lively 4cb327922SThomas Lively; Test SIMD v128.load{32,64}_zero instructions 5cb327922SThomas Lively 6cb327922SThomas Livelytarget triple = "wasm32-unknown-unknown" 7cb327922SThomas Lively 8cb327922SThomas Lively;===---------------------------------------------------------------------------- 9cb327922SThomas Lively; v128.load32_zero 10cb327922SThomas Lively;===---------------------------------------------------------------------------- 11cb327922SThomas Lively 12cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_no_offset(i32* %p) { 13cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_no_offset: 14cb327922SThomas Lively; CHECK: .functype load_zero_i32_no_offset (i32) -> (v128) 15cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 16cb327922SThomas Lively; CHECK-NEXT: local.get 0 17*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 18cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 19*1a57ee12SThomas Lively %x = load i32, i32* %p 20*1a57ee12SThomas Lively %v = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 21cb327922SThomas Lively ret <4 x i32> %v 22cb327922SThomas Lively} 23cb327922SThomas Lively 24cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_with_folded_offset(i32* %p) { 25cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_folded_offset: 26cb327922SThomas Lively; CHECK: .functype load_zero_i32_with_folded_offset (i32) -> (v128) 27cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 28cb327922SThomas Lively; CHECK-NEXT: local.get 0 29*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 24 30cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 31cb327922SThomas Lively %q = ptrtoint i32* %p to i32 32cb327922SThomas Lively %r = add nuw i32 %q, 24 33cb327922SThomas Lively %s = inttoptr i32 %r to i32* 34*1a57ee12SThomas Lively %x = load i32, i32* %s 35*1a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 36cb327922SThomas Lively ret <4 x i32> %t 37cb327922SThomas Lively} 38cb327922SThomas Lively 39cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_with_folded_gep_offset(i32* %p) { 40cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_folded_gep_offset: 41cb327922SThomas Lively; CHECK: .functype load_zero_i32_with_folded_gep_offset (i32) -> (v128) 42cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 43cb327922SThomas Lively; CHECK-NEXT: local.get 0 44*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 24 45cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 46cb327922SThomas Lively %s = getelementptr inbounds i32, i32* %p, i32 6 47*1a57ee12SThomas Lively %x = load i32, i32* %s 48*1a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 49cb327922SThomas Lively ret <4 x i32> %t 50cb327922SThomas Lively} 51cb327922SThomas Lively 52cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_with_unfolded_gep_negative_offset(i32* %p) { 53cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_unfolded_gep_negative_offset: 54cb327922SThomas Lively; CHECK: .functype load_zero_i32_with_unfolded_gep_negative_offset (i32) -> (v128) 55cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 56cb327922SThomas Lively; CHECK-NEXT: local.get 0 57cb327922SThomas Lively; CHECK-NEXT: i32.const -24 58cb327922SThomas Lively; CHECK-NEXT: i32.add 59*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 60cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 61cb327922SThomas Lively %s = getelementptr inbounds i32, i32* %p, i32 -6 62*1a57ee12SThomas Lively %x = load i32, i32* %s 63*1a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 64cb327922SThomas Lively ret <4 x i32> %t 65cb327922SThomas Lively} 66cb327922SThomas Lively 67cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_with_unfolded_offset(i32* %p) { 68cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_unfolded_offset: 69cb327922SThomas Lively; CHECK: .functype load_zero_i32_with_unfolded_offset (i32) -> (v128) 70cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 71cb327922SThomas Lively; CHECK-NEXT: local.get 0 72cb327922SThomas Lively; CHECK-NEXT: i32.const 24 73cb327922SThomas Lively; CHECK-NEXT: i32.add 74*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 75cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 76cb327922SThomas Lively %q = ptrtoint i32* %p to i32 77cb327922SThomas Lively %r = add nsw i32 %q, 24 78cb327922SThomas Lively %s = inttoptr i32 %r to i32* 79*1a57ee12SThomas Lively %x = load i32, i32* %s 80*1a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 81cb327922SThomas Lively ret <4 x i32> %t 82cb327922SThomas Lively} 83cb327922SThomas Lively 84cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_with_unfolded_gep_offset(i32* %p) { 85cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_unfolded_gep_offset: 86cb327922SThomas Lively; CHECK: .functype load_zero_i32_with_unfolded_gep_offset (i32) -> (v128) 87cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 88cb327922SThomas Lively; CHECK-NEXT: local.get 0 89cb327922SThomas Lively; CHECK-NEXT: i32.const 24 90cb327922SThomas Lively; CHECK-NEXT: i32.add 91*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 92cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 93cb327922SThomas Lively %s = getelementptr i32, i32* %p, i32 6 94*1a57ee12SThomas Lively %x = load i32, i32* %s 95*1a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 96cb327922SThomas Lively ret <4 x i32> %t 97cb327922SThomas Lively} 98cb327922SThomas Lively 99cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_from_numeric_address() { 100cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_from_numeric_address: 101cb327922SThomas Lively; CHECK: .functype load_zero_i32_from_numeric_address () -> (v128) 102cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 103cb327922SThomas Lively; CHECK-NEXT: i32.const 0 104*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 42 105cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 106cb327922SThomas Lively %s = inttoptr i32 42 to i32* 107*1a57ee12SThomas Lively %x = load i32, i32* %s 108*1a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 109cb327922SThomas Lively ret <4 x i32> %t 110cb327922SThomas Lively} 111cb327922SThomas Lively 112cb327922SThomas Lively@gv_i32 = global i32 0 113cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_from_global_address() { 114cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_from_global_address: 115cb327922SThomas Lively; CHECK: .functype load_zero_i32_from_global_address () -> (v128) 116cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 117cb327922SThomas Lively; CHECK-NEXT: i32.const 0 118*1a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero gv_i32 119cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 120*1a57ee12SThomas Lively %x = load i32, i32* @gv_i32 121*1a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 122cb327922SThomas Lively ret <4 x i32> %t 123cb327922SThomas Lively} 124cb327922SThomas Lively 125cb327922SThomas Lively;===---------------------------------------------------------------------------- 126cb327922SThomas Lively; v128.load64_zero 127cb327922SThomas Lively;===---------------------------------------------------------------------------- 128cb327922SThomas Lively 129cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_no_offset(i64* %p) { 130cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_no_offset: 131cb327922SThomas Lively; CHECK: .functype load_zero_i64_no_offset (i32) -> (v128) 132cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 133cb327922SThomas Lively; CHECK-NEXT: local.get 0 134*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 135cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 136*1a57ee12SThomas Lively %x = load i64, i64* %p 137*1a57ee12SThomas Lively %v = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 138cb327922SThomas Lively ret <2 x i64> %v 139cb327922SThomas Lively} 140cb327922SThomas Lively 141cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_with_folded_offset(i64* %p) { 142cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_folded_offset: 143cb327922SThomas Lively; CHECK: .functype load_zero_i64_with_folded_offset (i32) -> (v128) 144cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 145cb327922SThomas Lively; CHECK-NEXT: local.get 0 146*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 24 147cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 148cb327922SThomas Lively %q = ptrtoint i64* %p to i32 149cb327922SThomas Lively %r = add nuw i32 %q, 24 150cb327922SThomas Lively %s = inttoptr i32 %r to i64* 151*1a57ee12SThomas Lively %x = load i64, i64* %s 152*1a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 153cb327922SThomas Lively ret <2 x i64> %t 154cb327922SThomas Lively} 155cb327922SThomas Lively 156cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_with_folded_gep_offset(i64* %p) { 157cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_folded_gep_offset: 158cb327922SThomas Lively; CHECK: .functype load_zero_i64_with_folded_gep_offset (i32) -> (v128) 159cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 160cb327922SThomas Lively; CHECK-NEXT: local.get 0 161*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 48 162cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 163cb327922SThomas Lively %s = getelementptr inbounds i64, i64* %p, i64 6 164*1a57ee12SThomas Lively %x = load i64, i64* %s 165*1a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 166cb327922SThomas Lively ret <2 x i64> %t 167cb327922SThomas Lively} 168cb327922SThomas Lively 169cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_with_unfolded_gep_negative_offset(i64* %p) { 170cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_unfolded_gep_negative_offset: 171cb327922SThomas Lively; CHECK: .functype load_zero_i64_with_unfolded_gep_negative_offset (i32) -> (v128) 172cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 173cb327922SThomas Lively; CHECK-NEXT: local.get 0 174cb327922SThomas Lively; CHECK-NEXT: i32.const -48 175cb327922SThomas Lively; CHECK-NEXT: i32.add 176*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 177cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 178cb327922SThomas Lively %s = getelementptr inbounds i64, i64* %p, i64 -6 179*1a57ee12SThomas Lively %x = load i64, i64* %s 180*1a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 181cb327922SThomas Lively ret <2 x i64> %t 182cb327922SThomas Lively} 183cb327922SThomas Lively 184cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_with_unfolded_offset(i64* %p) { 185cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_unfolded_offset: 186cb327922SThomas Lively; CHECK: .functype load_zero_i64_with_unfolded_offset (i32) -> (v128) 187cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 188cb327922SThomas Lively; CHECK-NEXT: local.get 0 189cb327922SThomas Lively; CHECK-NEXT: i32.const 24 190cb327922SThomas Lively; CHECK-NEXT: i32.add 191*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 192cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 193cb327922SThomas Lively %q = ptrtoint i64* %p to i32 194cb327922SThomas Lively %r = add nsw i32 %q, 24 195cb327922SThomas Lively %s = inttoptr i32 %r to i64* 196*1a57ee12SThomas Lively %x = load i64, i64* %s 197*1a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 198cb327922SThomas Lively ret <2 x i64> %t 199cb327922SThomas Lively} 200cb327922SThomas Lively 201cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_with_unfolded_gep_offset(i64* %p) { 202cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_unfolded_gep_offset: 203cb327922SThomas Lively; CHECK: .functype load_zero_i64_with_unfolded_gep_offset (i32) -> (v128) 204cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 205cb327922SThomas Lively; CHECK-NEXT: local.get 0 206cb327922SThomas Lively; CHECK-NEXT: i32.const 48 207cb327922SThomas Lively; CHECK-NEXT: i32.add 208*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 209cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 210cb327922SThomas Lively %s = getelementptr i64, i64* %p, i64 6 211*1a57ee12SThomas Lively %x = load i64, i64* %s 212*1a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 213cb327922SThomas Lively ret <2 x i64> %t 214cb327922SThomas Lively} 215cb327922SThomas Lively 216cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_from_numeric_address() { 217cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_from_numeric_address: 218cb327922SThomas Lively; CHECK: .functype load_zero_i64_from_numeric_address () -> (v128) 219cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 220cb327922SThomas Lively; CHECK-NEXT: i32.const 0 221*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 42 222cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 223cb327922SThomas Lively %s = inttoptr i32 42 to i64* 224*1a57ee12SThomas Lively %x = load i64, i64* %s 225*1a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 226cb327922SThomas Lively ret <2 x i64> %t 227cb327922SThomas Lively} 228cb327922SThomas Lively 229cb327922SThomas Lively@gv_i64 = global i64 0 230cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_from_global_address() { 231cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_from_global_address: 232cb327922SThomas Lively; CHECK: .functype load_zero_i64_from_global_address () -> (v128) 233cb327922SThomas Lively; CHECK-NEXT: # %bb.0: 234cb327922SThomas Lively; CHECK-NEXT: i32.const 0 235*1a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero gv_i64 236cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 237*1a57ee12SThomas Lively %x = load i64, i64* @gv_i64 238*1a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 239cb327922SThomas Lively ret <2 x i64> %t 240cb327922SThomas Lively} 241