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 12*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_no_offset(ptr %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 171a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 18cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 19*73856247SNikita Popov %x = load i32, ptr %p 201a57ee12SThomas Lively %v = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 21cb327922SThomas Lively ret <4 x i32> %v 22cb327922SThomas Lively} 23cb327922SThomas Lively 24*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_folded_offset(ptr %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 291a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 24 30cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 31*73856247SNikita Popov %q = ptrtoint ptr %p to i32 32cb327922SThomas Lively %r = add nuw i32 %q, 24 33*73856247SNikita Popov %s = inttoptr i32 %r to ptr 34*73856247SNikita Popov %x = load i32, ptr %s 351a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 36cb327922SThomas Lively ret <4 x i32> %t 37cb327922SThomas Lively} 38cb327922SThomas Lively 39*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_folded_gep_offset(ptr %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 441a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 24 45cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 46*73856247SNikita Popov %s = getelementptr inbounds i32, ptr %p, i32 6 47*73856247SNikita Popov %x = load i32, ptr %s 481a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 49cb327922SThomas Lively ret <4 x i32> %t 50cb327922SThomas Lively} 51cb327922SThomas Lively 52*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_unfolded_gep_negative_offset(ptr %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 591a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 60cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 61*73856247SNikita Popov %s = getelementptr inbounds i32, ptr %p, i32 -6 62*73856247SNikita Popov %x = load i32, ptr %s 631a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 64cb327922SThomas Lively ret <4 x i32> %t 65cb327922SThomas Lively} 66cb327922SThomas Lively 67*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_unfolded_offset(ptr %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 741a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 75cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 76*73856247SNikita Popov %q = ptrtoint ptr %p to i32 77cb327922SThomas Lively %r = add nsw i32 %q, 24 78*73856247SNikita Popov %s = inttoptr i32 %r to ptr 79*73856247SNikita Popov %x = load i32, ptr %s 801a57ee12SThomas Lively %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0 81cb327922SThomas Lively ret <4 x i32> %t 82cb327922SThomas Lively} 83cb327922SThomas Lively 84*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_unfolded_gep_offset(ptr %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 911a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 0 92cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 93*73856247SNikita Popov %s = getelementptr i32, ptr %p, i32 6 94*73856247SNikita Popov %x = load i32, ptr %s 951a57ee12SThomas 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 1041a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero 42 105cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 106*73856247SNikita Popov %s = inttoptr i32 42 to ptr 107*73856247SNikita Popov %x = load i32, ptr %s 1081a57ee12SThomas 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 1181a57ee12SThomas Lively; CHECK-NEXT: v128.load32_zero gv_i32 119cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 120*73856247SNikita Popov %x = load i32, ptr @gv_i32 1211a57ee12SThomas 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 129*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_no_offset(ptr %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 1341a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 135cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 136*73856247SNikita Popov %x = load i64, ptr %p 1371a57ee12SThomas Lively %v = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 138cb327922SThomas Lively ret <2 x i64> %v 139cb327922SThomas Lively} 140cb327922SThomas Lively 141*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_folded_offset(ptr %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 1461a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 24 147cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 148*73856247SNikita Popov %q = ptrtoint ptr %p to i32 149cb327922SThomas Lively %r = add nuw i32 %q, 24 150*73856247SNikita Popov %s = inttoptr i32 %r to ptr 151*73856247SNikita Popov %x = load i64, ptr %s 1521a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 153cb327922SThomas Lively ret <2 x i64> %t 154cb327922SThomas Lively} 155cb327922SThomas Lively 156*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_folded_gep_offset(ptr %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 1611a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 48 162cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 163*73856247SNikita Popov %s = getelementptr inbounds i64, ptr %p, i64 6 164*73856247SNikita Popov %x = load i64, ptr %s 1651a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 166cb327922SThomas Lively ret <2 x i64> %t 167cb327922SThomas Lively} 168cb327922SThomas Lively 169*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_unfolded_gep_negative_offset(ptr %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 1761a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 177cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 178*73856247SNikita Popov %s = getelementptr inbounds i64, ptr %p, i64 -6 179*73856247SNikita Popov %x = load i64, ptr %s 1801a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 181cb327922SThomas Lively ret <2 x i64> %t 182cb327922SThomas Lively} 183cb327922SThomas Lively 184*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_unfolded_offset(ptr %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 1911a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 192cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 193*73856247SNikita Popov %q = ptrtoint ptr %p to i32 194cb327922SThomas Lively %r = add nsw i32 %q, 24 195*73856247SNikita Popov %s = inttoptr i32 %r to ptr 196*73856247SNikita Popov %x = load i64, ptr %s 1971a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 198cb327922SThomas Lively ret <2 x i64> %t 199cb327922SThomas Lively} 200cb327922SThomas Lively 201*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_unfolded_gep_offset(ptr %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 2081a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 0 209cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 210*73856247SNikita Popov %s = getelementptr i64, ptr %p, i64 6 211*73856247SNikita Popov %x = load i64, ptr %s 2121a57ee12SThomas 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 2211a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero 42 222cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 223*73856247SNikita Popov %s = inttoptr i32 42 to ptr 224*73856247SNikita Popov %x = load i64, ptr %s 2251a57ee12SThomas 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 2351a57ee12SThomas Lively; CHECK-NEXT: v128.load64_zero gv_i64 236cb327922SThomas Lively; CHECK-NEXT: # fallthrough-return 237*73856247SNikita Popov %x = load i64, ptr @gv_i64 2381a57ee12SThomas Lively %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 239cb327922SThomas Lively ret <2 x i64> %t 240cb327922SThomas Lively} 241