1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 --mattr=+lasx --verify-machineinstrs < %s \ 3; RUN: | FileCheck --check-prefix=LA32 %s 4; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs < %s \ 5; RUN: | FileCheck --check-prefix=LA64 %s 6; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs \ 7; RUN: --code-model=large < %s | FileCheck --check-prefix=LA64-LARGE %s 8 9@g_i8 = dso_local global i8 0 10 11define dso_local signext i8 @load_s8() nounwind { 12; LA32-LABEL: load_s8: 13; LA32: # %bb.0: # %entry 14; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 15; LA32-NEXT: ld.b $a0, $a0, %pc_lo12(g_i8) 16; LA32-NEXT: ret 17; 18; LA64-LABEL: load_s8: 19; LA64: # %bb.0: # %entry 20; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 21; LA64-NEXT: ld.b $a0, $a0, %pc_lo12(g_i8) 22; LA64-NEXT: ret 23; 24; LA64-LARGE-LABEL: load_s8: 25; LA64-LARGE: # %bb.0: # %entry 26; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 27; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8) 28; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8) 29; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8) 30; LA64-LARGE-NEXT: ldx.b $a0, $a1, $a0 31; LA64-LARGE-NEXT: ret 32entry: 33 %0 = load i8, ptr @g_i8 34 ret i8 %0 35} 36 37define dso_local zeroext i8 @load_u8() nounwind { 38; LA32-LABEL: load_u8: 39; LA32: # %bb.0: # %entry 40; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 41; LA32-NEXT: ld.bu $a0, $a0, %pc_lo12(g_i8) 42; LA32-NEXT: ret 43; 44; LA64-LABEL: load_u8: 45; LA64: # %bb.0: # %entry 46; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 47; LA64-NEXT: ld.bu $a0, $a0, %pc_lo12(g_i8) 48; LA64-NEXT: ret 49; 50; LA64-LARGE-LABEL: load_u8: 51; LA64-LARGE: # %bb.0: # %entry 52; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 53; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8) 54; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8) 55; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8) 56; LA64-LARGE-NEXT: ldx.bu $a0, $a1, $a0 57; LA64-LARGE-NEXT: ret 58entry: 59 %0 = load i8, ptr @g_i8 60 ret i8 %0 61} 62 63define dso_local void @store_i8() nounwind { 64; LA32-LABEL: store_i8: 65; LA32: # %bb.0: # %entry 66; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 67; LA32-NEXT: ori $a1, $zero, 1 68; LA32-NEXT: st.b $a1, $a0, %pc_lo12(g_i8) 69; LA32-NEXT: ret 70; 71; LA64-LABEL: store_i8: 72; LA64: # %bb.0: # %entry 73; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 74; LA64-NEXT: ori $a1, $zero, 1 75; LA64-NEXT: st.b $a1, $a0, %pc_lo12(g_i8) 76; LA64-NEXT: ret 77; 78; LA64-LARGE-LABEL: store_i8: 79; LA64-LARGE: # %bb.0: # %entry 80; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 81; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8) 82; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8) 83; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8) 84; LA64-LARGE-NEXT: ori $a2, $zero, 1 85; LA64-LARGE-NEXT: stx.b $a2, $a1, $a0 86; LA64-LARGE-NEXT: ret 87entry: 88 store i8 1, ptr @g_i8 89 ret void 90} 91 92@g_i16 = dso_local global i16 0 93 94define dso_local signext i16 @load_s16() nounwind { 95; LA32-LABEL: load_s16: 96; LA32: # %bb.0: # %entry 97; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 98; LA32-NEXT: ld.h $a0, $a0, %pc_lo12(g_i16) 99; LA32-NEXT: ret 100; 101; LA64-LABEL: load_s16: 102; LA64: # %bb.0: # %entry 103; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 104; LA64-NEXT: ld.h $a0, $a0, %pc_lo12(g_i16) 105; LA64-NEXT: ret 106; 107; LA64-LARGE-LABEL: load_s16: 108; LA64-LARGE: # %bb.0: # %entry 109; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 110; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i16) 111; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i16) 112; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i16) 113; LA64-LARGE-NEXT: ldx.h $a0, $a1, $a0 114; LA64-LARGE-NEXT: ret 115entry: 116 %0 = load i16, ptr @g_i16 117 ret i16 %0 118} 119 120define dso_local zeroext i16 @load_u16() nounwind { 121; LA32-LABEL: load_u16: 122; LA32: # %bb.0: # %entry 123; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 124; LA32-NEXT: ld.hu $a0, $a0, %pc_lo12(g_i16) 125; LA32-NEXT: ret 126; 127; LA64-LABEL: load_u16: 128; LA64: # %bb.0: # %entry 129; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 130; LA64-NEXT: ld.hu $a0, $a0, %pc_lo12(g_i16) 131; LA64-NEXT: ret 132; 133; LA64-LARGE-LABEL: load_u16: 134; LA64-LARGE: # %bb.0: # %entry 135; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 136; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i16) 137; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i16) 138; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i16) 139; LA64-LARGE-NEXT: ldx.hu $a0, $a1, $a0 140; LA64-LARGE-NEXT: ret 141entry: 142 %0 = load i16, ptr @g_i16 143 ret i16 %0 144} 145 146define dso_local void @store_i16() nounwind { 147; LA32-LABEL: store_i16: 148; LA32: # %bb.0: # %entry 149; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 150; LA32-NEXT: ori $a1, $zero, 1 151; LA32-NEXT: st.h $a1, $a0, %pc_lo12(g_i16) 152; LA32-NEXT: ret 153; 154; LA64-LABEL: store_i16: 155; LA64: # %bb.0: # %entry 156; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 157; LA64-NEXT: ori $a1, $zero, 1 158; LA64-NEXT: st.h $a1, $a0, %pc_lo12(g_i16) 159; LA64-NEXT: ret 160; 161; LA64-LARGE-LABEL: store_i16: 162; LA64-LARGE: # %bb.0: # %entry 163; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i16) 164; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i16) 165; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i16) 166; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i16) 167; LA64-LARGE-NEXT: ori $a2, $zero, 1 168; LA64-LARGE-NEXT: stx.h $a2, $a1, $a0 169; LA64-LARGE-NEXT: ret 170entry: 171 store i16 1, ptr @g_i16 172 ret void 173} 174 175@g_i32 = dso_local global i32 0 176 177define dso_local signext i32 @load_s32() nounwind { 178; LA32-LABEL: load_s32: 179; LA32: # %bb.0: # %entry 180; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 181; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32) 182; LA32-NEXT: ret 183; 184; LA64-LABEL: load_s32: 185; LA64: # %bb.0: # %entry 186; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 187; LA64-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32) 188; LA64-NEXT: ret 189; 190; LA64-LARGE-LABEL: load_s32: 191; LA64-LARGE: # %bb.0: # %entry 192; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 193; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32) 194; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32) 195; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32) 196; LA64-LARGE-NEXT: ldx.w $a0, $a1, $a0 197; LA64-LARGE-NEXT: ret 198entry: 199 %0 = load i32, ptr @g_i32 200 ret i32 %0 201} 202 203define dso_local zeroext i32 @load_u32() nounwind { 204; LA32-LABEL: load_u32: 205; LA32: # %bb.0: # %entry 206; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 207; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32) 208; LA32-NEXT: ret 209; 210; LA64-LABEL: load_u32: 211; LA64: # %bb.0: # %entry 212; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 213; LA64-NEXT: ld.wu $a0, $a0, %pc_lo12(g_i32) 214; LA64-NEXT: ret 215; 216; LA64-LARGE-LABEL: load_u32: 217; LA64-LARGE: # %bb.0: # %entry 218; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 219; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32) 220; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32) 221; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32) 222; LA64-LARGE-NEXT: ldx.wu $a0, $a1, $a0 223; LA64-LARGE-NEXT: ret 224entry: 225 %0 = load i32, ptr @g_i32 226 ret i32 %0 227} 228 229define dso_local void @store_i32() nounwind { 230; LA32-LABEL: store_i32: 231; LA32: # %bb.0: # %entry 232; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 233; LA32-NEXT: ori $a1, $zero, 1 234; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_i32) 235; LA32-NEXT: ret 236; 237; LA64-LABEL: store_i32: 238; LA64: # %bb.0: # %entry 239; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 240; LA64-NEXT: ori $a1, $zero, 1 241; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_i32) 242; LA64-NEXT: ret 243; 244; LA64-LARGE-LABEL: store_i32: 245; LA64-LARGE: # %bb.0: # %entry 246; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32) 247; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32) 248; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32) 249; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32) 250; LA64-LARGE-NEXT: ori $a2, $zero, 1 251; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0 252; LA64-LARGE-NEXT: ret 253entry: 254 store i32 1, ptr @g_i32 255 ret void 256} 257 258@g_i64 = dso_local global i64 0 259 260define dso_local i64 @load_64() nounwind { 261; LA32-LABEL: load_64: 262; LA32: # %bb.0: # %entry 263; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i64) 264; LA32-NEXT: addi.w $a1, $a0, %pc_lo12(g_i64) 265; LA32-NEXT: ld.w $a0, $a1, 0 266; LA32-NEXT: ld.w $a1, $a1, 4 267; LA32-NEXT: ret 268; 269; LA64-LABEL: load_64: 270; LA64: # %bb.0: # %entry 271; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i64) 272; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(g_i64) 273; LA64-NEXT: ret 274; 275; LA64-LARGE-LABEL: load_64: 276; LA64-LARGE: # %bb.0: # %entry 277; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i64) 278; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i64) 279; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i64) 280; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i64) 281; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0 282; LA64-LARGE-NEXT: ret 283entry: 284 %0 = load i64, ptr @g_i64 285 ret i64 %0 286} 287 288define dso_local void @store_i64() nounwind { 289; LA32-LABEL: store_i64: 290; LA32: # %bb.0: # %entry 291; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i64) 292; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_i64) 293; LA32-NEXT: st.w $zero, $a0, 4 294; LA32-NEXT: ori $a1, $zero, 1 295; LA32-NEXT: st.w $a1, $a0, 0 296; LA32-NEXT: ret 297; 298; LA64-LABEL: store_i64: 299; LA64: # %bb.0: # %entry 300; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i64) 301; LA64-NEXT: ori $a1, $zero, 1 302; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_i64) 303; LA64-NEXT: ret 304; 305; LA64-LARGE-LABEL: store_i64: 306; LA64-LARGE: # %bb.0: # %entry 307; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i64) 308; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i64) 309; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i64) 310; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i64) 311; LA64-LARGE-NEXT: ori $a2, $zero, 1 312; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0 313; LA64-LARGE-NEXT: ret 314entry: 315 store i64 1, ptr @g_i64 316 ret void 317} 318 319@g_f32 = dso_local global float 0.0 320 321define dso_local float @load_f32() nounwind { 322; LA32-LABEL: load_f32: 323; LA32: # %bb.0: # %entry 324; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f32) 325; LA32-NEXT: fld.s $fa0, $a0, %pc_lo12(g_f32) 326; LA32-NEXT: ret 327; 328; LA64-LABEL: load_f32: 329; LA64: # %bb.0: # %entry 330; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f32) 331; LA64-NEXT: fld.s $fa0, $a0, %pc_lo12(g_f32) 332; LA64-NEXT: ret 333; 334; LA64-LARGE-LABEL: load_f32: 335; LA64-LARGE: # %bb.0: # %entry 336; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f32) 337; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f32) 338; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f32) 339; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f32) 340; LA64-LARGE-NEXT: fldx.s $fa0, $a1, $a0 341; LA64-LARGE-NEXT: ret 342entry: 343 %0 = load float, ptr @g_f32 344 ret float %0 345} 346 347define dso_local void @store_f32() nounwind { 348; LA32-LABEL: store_f32: 349; LA32: # %bb.0: # %entry 350; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f32) 351; LA32-NEXT: lu12i.w $a1, 260096 352; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_f32) 353; LA32-NEXT: ret 354; 355; LA64-LABEL: store_f32: 356; LA64: # %bb.0: # %entry 357; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f32) 358; LA64-NEXT: lu12i.w $a1, 260096 359; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_f32) 360; LA64-NEXT: ret 361; 362; LA64-LARGE-LABEL: store_f32: 363; LA64-LARGE: # %bb.0: # %entry 364; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f32) 365; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f32) 366; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f32) 367; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f32) 368; LA64-LARGE-NEXT: lu12i.w $a2, 260096 369; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0 370; LA64-LARGE-NEXT: ret 371entry: 372 store float 1.0, ptr @g_f32 373 ret void 374} 375 376@g_f64 = dso_local global double 0.0 377 378define dso_local double @load_f64() nounwind { 379; LA32-LABEL: load_f64: 380; LA32: # %bb.0: # %entry 381; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f64) 382; LA32-NEXT: fld.d $fa0, $a0, %pc_lo12(g_f64) 383; LA32-NEXT: ret 384; 385; LA64-LABEL: load_f64: 386; LA64: # %bb.0: # %entry 387; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f64) 388; LA64-NEXT: fld.d $fa0, $a0, %pc_lo12(g_f64) 389; LA64-NEXT: ret 390; 391; LA64-LARGE-LABEL: load_f64: 392; LA64-LARGE: # %bb.0: # %entry 393; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f64) 394; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f64) 395; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f64) 396; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f64) 397; LA64-LARGE-NEXT: fldx.d $fa0, $a1, $a0 398; LA64-LARGE-NEXT: ret 399entry: 400 %0 = load double, ptr @g_f64 401 ret double %0 402} 403 404define dso_local void @store_f64() nounwind { 405; LA32-LABEL: store_f64: 406; LA32: # %bb.0: # %entry 407; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f64) 408; LA32-NEXT: vldi $vr0, -912 409; LA32-NEXT: fst.d $fa0, $a0, %pc_lo12(g_f64) 410; LA32-NEXT: ret 411; 412; LA64-LABEL: store_f64: 413; LA64: # %bb.0: # %entry 414; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f64) 415; LA64-NEXT: lu52i.d $a1, $zero, 1023 416; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_f64) 417; LA64-NEXT: ret 418; 419; LA64-LARGE-LABEL: store_f64: 420; LA64-LARGE: # %bb.0: # %entry 421; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f64) 422; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f64) 423; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f64) 424; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f64) 425; LA64-LARGE-NEXT: lu52i.d $a2, $zero, 1023 426; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0 427; LA64-LARGE-NEXT: ret 428entry: 429 store double 1.0, ptr @g_f64 430 ret void 431} 432 433@g_m64 = dso_local global i64 0 434 435define dso_local void @store_multi() nounwind { 436; LA32-LABEL: store_multi: 437; LA32: # %bb.0: # %entry 438; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_m64) 439; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_m64) 440; LA32-NEXT: st.w $zero, $a0, 4 441; LA32-NEXT: ori $a1, $zero, 1 442; LA32-NEXT: st.w $a1, $a0, 0 443; LA32-NEXT: st.w $zero, $a0, 4 444; LA32-NEXT: ori $a1, $zero, 2 445; LA32-NEXT: st.w $a1, $a0, 0 446; LA32-NEXT: ret 447; 448; LA64-LABEL: store_multi: 449; LA64: # %bb.0: # %entry 450; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_m64) 451; LA64-NEXT: ori $a1, $zero, 1 452; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_m64) 453; LA64-NEXT: ori $a1, $zero, 2 454; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_m64) 455; LA64-NEXT: ret 456; 457; LA64-LARGE-LABEL: store_multi: 458; LA64-LARGE: # %bb.0: # %entry 459; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_m64) 460; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_m64) 461; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_m64) 462; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_m64) 463; LA64-LARGE-NEXT: ori $a2, $zero, 1 464; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0 465; LA64-LARGE-NEXT: ori $a2, $zero, 2 466; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0 467; LA64-LARGE-NEXT: ret 468entry: 469 store volatile i64 1, ptr @g_m64 470 store volatile i64 2, ptr @g_m64 471 ret void 472} 473 474@g_sf32 = dso_local global float 0.0 475 476define dso_local void @store_sf32() nounwind { 477; LA32-LABEL: store_sf32: 478; LA32: # %bb.0: # %entry 479; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_sf32) 480; LA32-NEXT: fld.s $fa0, $a0, %pc_lo12(g_sf32) 481; LA32-NEXT: fst.s $fa0, $a0, %pc_lo12(g_sf32) 482; LA32-NEXT: ret 483; 484; LA64-LABEL: store_sf32: 485; LA64: # %bb.0: # %entry 486; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_sf32) 487; LA64-NEXT: fld.s $fa0, $a0, %pc_lo12(g_sf32) 488; LA64-NEXT: fst.s $fa0, $a0, %pc_lo12(g_sf32) 489; LA64-NEXT: ret 490; 491; LA64-LARGE-LABEL: store_sf32: 492; LA64-LARGE: # %bb.0: # %entry 493; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_sf32) 494; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_sf32) 495; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_sf32) 496; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_sf32) 497; LA64-LARGE-NEXT: fldx.s $fa0, $a1, $a0 498; LA64-LARGE-NEXT: fstx.s $fa0, $a1, $a0 499; LA64-LARGE-NEXT: ret 500entry: 501 %0 = load float, ptr @g_sf32 502 store volatile float %0, ptr @g_sf32 503 ret void 504} 505 506@g_sf64 = dso_local global double 0.0 507 508define dso_local void @store_sf64() nounwind { 509; LA32-LABEL: store_sf64: 510; LA32: # %bb.0: # %entry 511; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_sf64) 512; LA32-NEXT: fld.d $fa0, $a0, %pc_lo12(g_sf64) 513; LA32-NEXT: fst.d $fa0, $a0, %pc_lo12(g_sf64) 514; LA32-NEXT: ret 515; 516; LA64-LABEL: store_sf64: 517; LA64: # %bb.0: # %entry 518; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_sf64) 519; LA64-NEXT: fld.d $fa0, $a0, %pc_lo12(g_sf64) 520; LA64-NEXT: fst.d $fa0, $a0, %pc_lo12(g_sf64) 521; LA64-NEXT: ret 522; 523; LA64-LARGE-LABEL: store_sf64: 524; LA64-LARGE: # %bb.0: # %entry 525; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_sf64) 526; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_sf64) 527; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_sf64) 528; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_sf64) 529; LA64-LARGE-NEXT: fldx.d $fa0, $a1, $a0 530; LA64-LARGE-NEXT: fstx.d $fa0, $a1, $a0 531; LA64-LARGE-NEXT: ret 532entry: 533 %0 = load double, ptr @g_sf64 534 store volatile double %0, ptr @g_sf64 535 ret void 536} 537 538@g_i32x4_src = dso_local global [4 x i32] zeroinitializer, align 16 539@g_i32x4_dst = dso_local global [4 x i32] zeroinitializer, align 16 540 541define dso_local void @copy_i32x4() nounwind { 542; LA32-LABEL: copy_i32x4: 543; LA32: # %bb.0: # %entry 544; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src) 545; LA32-NEXT: vld $vr0, $a0, %pc_lo12(g_i32x4_src) 546; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst) 547; LA32-NEXT: vst $vr0, $a0, %pc_lo12(g_i32x4_dst) 548; LA32-NEXT: ret 549; 550; LA64-LABEL: copy_i32x4: 551; LA64: # %bb.0: # %entry 552; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src) 553; LA64-NEXT: vld $vr0, $a0, %pc_lo12(g_i32x4_src) 554; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst) 555; LA64-NEXT: vst $vr0, $a0, %pc_lo12(g_i32x4_dst) 556; LA64-NEXT: ret 557; 558; LA64-LARGE-LABEL: copy_i32x4: 559; LA64-LARGE: # %bb.0: # %entry 560; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src) 561; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_src) 562; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_src) 563; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_src) 564; LA64-LARGE-NEXT: vldx $vr0, $a1, $a0 565; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst) 566; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_dst) 567; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_dst) 568; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_dst) 569; LA64-LARGE-NEXT: vstx $vr0, $a1, $a0 570; LA64-LARGE-NEXT: ret 571entry: 572 %0 = load <4 x i32>, ptr @g_i32x4_src, align 16 573 store <4 x i32> %0, ptr @g_i32x4_dst, align 16 574 ret void 575} 576 577@g_i32x8_src = dso_local global [8 x i32] zeroinitializer, align 32 578@g_i32x8_dst = dso_local global [8 x i32] zeroinitializer, align 32 579 580define dso_local void @copy_i32x8() nounwind { 581; LA32-LABEL: copy_i32x8: 582; LA32: # %bb.0: # %entry 583; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src) 584; LA32-NEXT: xvld $xr0, $a0, %pc_lo12(g_i32x4_src) 585; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst) 586; LA32-NEXT: xvst $xr0, $a0, %pc_lo12(g_i32x4_dst) 587; LA32-NEXT: ret 588; 589; LA64-LABEL: copy_i32x8: 590; LA64: # %bb.0: # %entry 591; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src) 592; LA64-NEXT: xvld $xr0, $a0, %pc_lo12(g_i32x4_src) 593; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst) 594; LA64-NEXT: xvst $xr0, $a0, %pc_lo12(g_i32x4_dst) 595; LA64-NEXT: ret 596; 597; LA64-LARGE-LABEL: copy_i32x8: 598; LA64-LARGE: # %bb.0: # %entry 599; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src) 600; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_src) 601; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_src) 602; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_src) 603; LA64-LARGE-NEXT: xvldx $xr0, $a1, $a0 604; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst) 605; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_dst) 606; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_dst) 607; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_dst) 608; LA64-LARGE-NEXT: xvstx $xr0, $a1, $a0 609; LA64-LARGE-NEXT: ret 610entry: 611 %0 = load <8 x i32>, ptr @g_i32x4_src, align 32 612 store <8 x i32> %0, ptr @g_i32x4_dst, align 32 613 ret void 614} 615 616@g_i8x16 = dso_local global <16 x i8> zeroinitializer, align 16 617 618define void @copy_i8_to_i8x16() { 619; LA32-LABEL: copy_i8_to_i8x16: 620; LA32: # %bb.0: # %entry 621; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 622; LA32-NEXT: vldrepl.b $vr0, $a0, %pc_lo12(g_i8) 623; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8x16) 624; LA32-NEXT: vst $vr0, $a0, %pc_lo12(g_i8x16) 625; LA32-NEXT: ret 626; 627; LA64-LABEL: copy_i8_to_i8x16: 628; LA64: # %bb.0: # %entry 629; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 630; LA64-NEXT: vldrepl.b $vr0, $a0, %pc_lo12(g_i8) 631; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8x16) 632; LA64-NEXT: vst $vr0, $a0, %pc_lo12(g_i8x16) 633; LA64-NEXT: ret 634; 635; LA64-LARGE-LABEL: copy_i8_to_i8x16: 636; LA64-LARGE: # %bb.0: # %entry 637; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 638; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8) 639; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8) 640; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8) 641; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 642; LA64-LARGE-NEXT: vldrepl.b $vr0, $a0, 0 643; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8x16) 644; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8x16) 645; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8x16) 646; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8x16) 647; LA64-LARGE-NEXT: vstx $vr0, $a1, $a0 648; LA64-LARGE-NEXT: ret 649entry: 650 %0 = call <16 x i8> @llvm.loongarch.lsx.vldrepl.b(ptr @g_i8, i32 0) 651 store <16 x i8> %0, ptr @g_i8x16, align 16 652 ret void 653} 654 655@g_i8x32 = dso_local global <32 x i8> zeroinitializer, align 32 656 657define void @copy_i8_to_i8x32() { 658; LA32-LABEL: copy_i8_to_i8x32: 659; LA32: # %bb.0: # %entry 660; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 661; LA32-NEXT: xvldrepl.b $xr0, $a0, %pc_lo12(g_i8) 662; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8x32) 663; LA32-NEXT: xvst $xr0, $a0, %pc_lo12(g_i8x32) 664; LA32-NEXT: ret 665; 666; LA64-LABEL: copy_i8_to_i8x32: 667; LA64: # %bb.0: # %entry 668; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 669; LA64-NEXT: xvldrepl.b $xr0, $a0, %pc_lo12(g_i8) 670; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8x32) 671; LA64-NEXT: xvst $xr0, $a0, %pc_lo12(g_i8x32) 672; LA64-NEXT: ret 673; 674; LA64-LARGE-LABEL: copy_i8_to_i8x32: 675; LA64-LARGE: # %bb.0: # %entry 676; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8) 677; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8) 678; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8) 679; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8) 680; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 681; LA64-LARGE-NEXT: xvldrepl.b $xr0, $a0, 0 682; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8x32) 683; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8x32) 684; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8x32) 685; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8x32) 686; LA64-LARGE-NEXT: xvstx $xr0, $a1, $a0 687; LA64-LARGE-NEXT: ret 688entry: 689 %0 = call <32 x i8> @llvm.loongarch.lasx.xvldrepl.b(ptr @g_i8, i32 0) 690 store <32 x i8> %0, ptr @g_i8x32, align 32 691 ret void 692} 693 694@g_rmw = dso_local global i64 0 695 696define dso_local void @rmw() nounwind { 697; LA32-LABEL: rmw: 698; LA32: # %bb.0: # %entry 699; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_rmw) 700; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_rmw) 701; LA32-NEXT: ld.w $a1, $a0, 0 702; LA32-NEXT: ld.w $a2, $a0, 4 703; LA32-NEXT: addi.w $a1, $a1, 1 704; LA32-NEXT: sltui $a3, $a1, 1 705; LA32-NEXT: add.w $a2, $a2, $a3 706; LA32-NEXT: st.w $a1, $a0, 0 707; LA32-NEXT: st.w $a2, $a0, 4 708; LA32-NEXT: ret 709; 710; LA64-LABEL: rmw: 711; LA64: # %bb.0: # %entry 712; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_rmw) 713; LA64-NEXT: ld.d $a1, $a0, %pc_lo12(g_rmw) 714; LA64-NEXT: addi.d $a1, $a1, 1 715; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_rmw) 716; LA64-NEXT: ret 717; 718; LA64-LARGE-LABEL: rmw: 719; LA64-LARGE: # %bb.0: # %entry 720; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_rmw) 721; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_rmw) 722; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_rmw) 723; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_rmw) 724; LA64-LARGE-NEXT: ldx.d $a2, $a1, $a0 725; LA64-LARGE-NEXT: addi.d $a2, $a2, 1 726; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0 727; LA64-LARGE-NEXT: ret 728entry: 729 %0 = load i64, ptr @g_rmw 730 %1 = add i64 %0, 1 731 store i64 %1, ptr @g_rmw 732 ret void 733} 734 735@g_a32 = dso_local global [2048 x i32] zeroinitializer, align 4 736 737define dso_local void @store_a32() nounwind { 738; LA32-LABEL: store_a32: 739; LA32: # %bb.0: # %entry 740; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096) 741; LA32-NEXT: ori $a1, $zero, 1 742; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4096) 743; LA32-NEXT: ret 744; 745; LA64-LABEL: store_a32: 746; LA64: # %bb.0: # %entry 747; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096) 748; LA64-NEXT: ori $a1, $zero, 1 749; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4096) 750; LA64-NEXT: ret 751; 752; LA64-LARGE-LABEL: store_a32: 753; LA64-LARGE: # %bb.0: # %entry 754; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096) 755; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4096) 756; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4096) 757; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4096) 758; LA64-LARGE-NEXT: ori $a2, $zero, 1 759; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0 760; LA64-LARGE-NEXT: ret 761entry: 762 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4 763 ret void 764} 765 766define dso_local void @store_a32_2() nounwind { 767; LA32-LABEL: store_a32_2: 768; LA32: # %bb.0: # %entry 769; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32) 770; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a32) 771; LA32-NEXT: lu12i.w $a1, 1 772; LA32-NEXT: add.w $a2, $a0, $a1 773; LA32-NEXT: ori $a3, $zero, 1 774; LA32-NEXT: st.w $a3, $a2, 0 775; LA32-NEXT: ori $a1, $a1, 8 776; LA32-NEXT: add.w $a0, $a0, $a1 777; LA32-NEXT: ori $a1, $zero, 2 778; LA32-NEXT: st.w $a1, $a0, 0 779; LA32-NEXT: ret 780; 781; LA64-LABEL: store_a32_2: 782; LA64: # %bb.0: # %entry 783; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32) 784; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a32) 785; LA64-NEXT: ori $a1, $zero, 1 786; LA64-NEXT: stptr.w $a1, $a0, 4096 787; LA64-NEXT: ori $a1, $zero, 2 788; LA64-NEXT: stptr.w $a1, $a0, 4104 789; LA64-NEXT: ret 790; 791; LA64-LARGE-LABEL: store_a32_2: 792; LA64-LARGE: # %bb.0: # %entry 793; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32) 794; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32) 795; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32) 796; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32) 797; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 798; LA64-LARGE-NEXT: ori $a1, $zero, 1 799; LA64-LARGE-NEXT: stptr.w $a1, $a0, 4096 800; LA64-LARGE-NEXT: ori $a1, $zero, 2 801; LA64-LARGE-NEXT: stptr.w $a1, $a0, 4104 802; LA64-LARGE-NEXT: ret 803entry: 804 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4 805 store i32 2, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1026), align 4 806 ret void 807} 808 809define dso_local void @control_flow_with_mem_access() nounwind { 810; LA32-LABEL: control_flow_with_mem_access: 811; LA32: # %bb.0: # %entry 812; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4) 813; LA32-NEXT: ld.w $a1, $a0, %pc_lo12(g_a32+4) 814; LA32-NEXT: ori $a2, $zero, 1 815; LA32-NEXT: blt $a1, $a2, .LBB25_2 816; LA32-NEXT: # %bb.1: # %if.then 817; LA32-NEXT: ori $a1, $zero, 10 818; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4) 819; LA32-NEXT: .LBB25_2: # %if.end 820; LA32-NEXT: ret 821; 822; LA64-LABEL: control_flow_with_mem_access: 823; LA64: # %bb.0: # %entry 824; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4) 825; LA64-NEXT: ld.w $a1, $a0, %pc_lo12(g_a32+4) 826; LA64-NEXT: ori $a2, $zero, 1 827; LA64-NEXT: blt $a1, $a2, .LBB25_2 828; LA64-NEXT: # %bb.1: # %if.then 829; LA64-NEXT: ori $a1, $zero, 10 830; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4) 831; LA64-NEXT: .LBB25_2: # %if.end 832; LA64-NEXT: ret 833; 834; LA64-LARGE-LABEL: control_flow_with_mem_access: 835; LA64-LARGE: # %bb.0: # %entry 836; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4) 837; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4) 838; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4) 839; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4) 840; LA64-LARGE-NEXT: ldx.w $a0, $a1, $a0 841; LA64-LARGE-NEXT: ori $a1, $zero, 1 842; LA64-LARGE-NEXT: blt $a0, $a1, .LBB25_2 843; LA64-LARGE-NEXT: # %bb.1: # %if.then 844; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4) 845; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4) 846; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4) 847; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4) 848; LA64-LARGE-NEXT: ori $a2, $zero, 10 849; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0 850; LA64-LARGE-NEXT: .LBB25_2: # %if.end 851; LA64-LARGE-NEXT: ret 852entry: 853 %0 = load i32, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4 854 %cmp = icmp sgt i32 %0, 0 855 br i1 %cmp, label %if.then, label %if.end 856 857if.then: 858 store i32 10, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4 859 br label %if.end 860 861if.end: 862 ret void 863} 864 865define dso_local ptr @load_ba_1() nounwind { 866; LA32-LABEL: load_ba_1: 867; LA32: # %bb.0: # %entry 868; LA32-NEXT: .Ltmp0: # Block address taken 869; LA32-NEXT: # %bb.1: # %label 870; LA32-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0) 871; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(.Ltmp0) 872; LA32-NEXT: ret 873; 874; LA64-LABEL: load_ba_1: 875; LA64: # %bb.0: # %entry 876; LA64-NEXT: .Ltmp0: # Block address taken 877; LA64-NEXT: # %bb.1: # %label 878; LA64-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0) 879; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(.Ltmp0) 880; LA64-NEXT: ret 881; 882; LA64-LARGE-LABEL: load_ba_1: 883; LA64-LARGE: # %bb.0: # %entry 884; LA64-LARGE-NEXT: .Ltmp0: # Block address taken 885; LA64-LARGE-NEXT: # %bb.1: # %label 886; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0) 887; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(.Ltmp0) 888; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(.Ltmp0) 889; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Ltmp0) 890; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0 891; LA64-LARGE-NEXT: ret 892entry: 893 br label %label 894label: 895 %0 = load ptr, ptr blockaddress(@load_ba_1, %label) 896 ret ptr %0 897} 898 899define dso_local ptr @load_ba_2() nounwind { 900; LA32-LABEL: load_ba_2: 901; LA32: # %bb.0: # %entry 902; LA32-NEXT: .Ltmp1: # Block address taken 903; LA32-NEXT: # %bb.1: # %label 904; LA32-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8) 905; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(.Ltmp1+8) 906; LA32-NEXT: ret 907; 908; LA64-LABEL: load_ba_2: 909; LA64: # %bb.0: # %entry 910; LA64-NEXT: .Ltmp1: # Block address taken 911; LA64-NEXT: # %bb.1: # %label 912; LA64-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8) 913; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(.Ltmp1+8) 914; LA64-NEXT: ret 915; 916; LA64-LARGE-LABEL: load_ba_2: 917; LA64-LARGE: # %bb.0: # %entry 918; LA64-LARGE-NEXT: .Ltmp1: # Block address taken 919; LA64-LARGE-NEXT: # %bb.1: # %label 920; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8) 921; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(.Ltmp1+8) 922; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(.Ltmp1+8) 923; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Ltmp1+8) 924; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0 925; LA64-LARGE-NEXT: ret 926entry: 927 br label %label 928label: 929 %0 = load ptr, ptr getelementptr inbounds (i8, ptr blockaddress(@load_ba_2, %label), i32 8) 930 ret ptr %0 931} 932 933@g_a64 = dso_local global [614750729487779976 x i64] zeroinitializer, align 8 934 935define dso_local ptr @load_addr_offset_1() nounwind { 936; LA32-LABEL: load_addr_offset_1: 937; LA32: # %bb.0: # %entry 938; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8) 939; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8) 940; LA32-NEXT: ret 941; 942; LA64-LABEL: load_addr_offset_1: 943; LA64: # %bb.0: # %entry 944; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8) 945; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8) 946; LA64-NEXT: ret 947; 948; LA64-LARGE-LABEL: load_addr_offset_1: 949; LA64-LARGE: # %bb.0: # %entry 950; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8) 951; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8) 952; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8) 953; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8) 954; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 955; LA64-LARGE-NEXT: ret 956entry: 957 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1) 958} 959 960define dso_local ptr @load_addr_offset_257() nounwind { 961; LA32-LABEL: load_addr_offset_257: 962; LA32: # %bb.0: # %entry 963; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056) 964; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2056) 965; LA32-NEXT: ret 966; 967; LA64-LABEL: load_addr_offset_257: 968; LA64: # %bb.0: # %entry 969; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056) 970; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2056) 971; LA64-NEXT: ret 972; 973; LA64-LARGE-LABEL: load_addr_offset_257: 974; LA64-LARGE: # %bb.0: # %entry 975; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056) 976; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2056) 977; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2056) 978; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2056) 979; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 980; LA64-LARGE-NEXT: ret 981entry: 982 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 257) 983} 984 985define dso_local ptr @load_addr_offset_1048576() nounwind { 986; LA32-LABEL: load_addr_offset_1048576: 987; LA32: # %bb.0: # %entry 988; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608) 989; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8388608) 990; LA32-NEXT: ret 991; 992; LA64-LABEL: load_addr_offset_1048576: 993; LA64: # %bb.0: # %entry 994; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608) 995; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8388608) 996; LA64-NEXT: ret 997; 998; LA64-LARGE-LABEL: load_addr_offset_1048576: 999; LA64-LARGE: # %bb.0: # %entry 1000; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608) 1001; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8388608) 1002; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8388608) 1003; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388608) 1004; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1005; LA64-LARGE-NEXT: ret 1006entry: 1007 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048576) 1008} 1009 1010define dso_local ptr @load_addr_offset_1048577() nounwind { 1011; LA32-LABEL: load_addr_offset_1048577: 1012; LA32: # %bb.0: # %entry 1013; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616) 1014; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8388616) 1015; LA32-NEXT: ret 1016; 1017; LA64-LABEL: load_addr_offset_1048577: 1018; LA64: # %bb.0: # %entry 1019; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616) 1020; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8388616) 1021; LA64-NEXT: ret 1022; 1023; LA64-LARGE-LABEL: load_addr_offset_1048577: 1024; LA64-LARGE: # %bb.0: # %entry 1025; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616) 1026; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8388616) 1027; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8388616) 1028; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388616) 1029; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1030; LA64-LARGE-NEXT: ret 1031entry: 1032 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048577) 1033} 1034 1035define dso_local ptr @load_addr_offset_268432896() nounwind { 1036; LA32-LABEL: load_addr_offset_268432896: 1037; LA32: # %bb.0: # %entry 1038; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168) 1039; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2147463168) 1040; LA32-NEXT: ret 1041; 1042; LA64-LABEL: load_addr_offset_268432896: 1043; LA64: # %bb.0: # %entry 1044; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168) 1045; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2147463168) 1046; LA64-NEXT: ret 1047; 1048; LA64-LARGE-LABEL: load_addr_offset_268432896: 1049; LA64-LARGE: # %bb.0: # %entry 1050; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168) 1051; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2147463168) 1052; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2147463168) 1053; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463168) 1054; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1055; LA64-LARGE-NEXT: ret 1056entry: 1057 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432896) 1058} 1059 1060define dso_local ptr @load_addr_offset_268432897() nounwind { 1061; LA32-LABEL: load_addr_offset_268432897: 1062; LA32: # %bb.0: # %entry 1063; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176) 1064; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2147463176) 1065; LA32-NEXT: ret 1066; 1067; LA64-LABEL: load_addr_offset_268432897: 1068; LA64: # %bb.0: # %entry 1069; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176) 1070; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2147463176) 1071; LA64-NEXT: ret 1072; 1073; LA64-LARGE-LABEL: load_addr_offset_268432897: 1074; LA64-LARGE: # %bb.0: # %entry 1075; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176) 1076; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2147463176) 1077; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2147463176) 1078; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463176) 1079; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1080; LA64-LARGE-NEXT: ret 1081entry: 1082 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432897) 1083} 1084 1085define dso_local ptr @load_addr_offset_281474439839744() nounwind { 1086; LA32-LABEL: load_addr_offset_281474439839744: 1087; LA32: # %bb.0: # %entry 1088; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64) 1089; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64) 1090; LA32-NEXT: ret 1091; 1092; LA64-LABEL: load_addr_offset_281474439839744: 1093; LA64: # %bb.0: # %entry 1094; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64) 1095; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64) 1096; LA64-NEXT: ori $a1, $zero, 0 1097; LA64-NEXT: lu32i.d $a1, 524287 1098; LA64-NEXT: add.d $a0, $a0, $a1 1099; LA64-NEXT: ret 1100; 1101; LA64-LARGE-LABEL: load_addr_offset_281474439839744: 1102; LA64-LARGE: # %bb.0: # %entry 1103; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2251795518717952) 1104; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2251795518717952) 1105; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2251795518717952) 1106; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2251795518717952) 1107; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1108; LA64-LARGE-NEXT: ret 1109entry: 1110 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 281474439839744) 1111} 1112 1113define dso_local ptr @load_addr_offset_248792680471040() nounwind { 1114; LA32-LABEL: load_addr_offset_248792680471040: 1115; LA32: # %bb.0: # %entry 1116; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2059194368) 1117; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2059194368) 1118; LA32-NEXT: ret 1119; 1120; LA64-LABEL: load_addr_offset_248792680471040: 1121; LA64: # %bb.0: # %entry 1122; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64) 1123; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64) 1124; LA64-NEXT: lu12i.w $a1, 502733 1125; LA64-NEXT: lu32i.d $a1, 463412 1126; LA64-NEXT: add.d $a0, $a0, $a1 1127; LA64-NEXT: ret 1128; 1129; LA64-LARGE-LABEL: load_addr_offset_248792680471040: 1130; LA64-LARGE: # %bb.0: # %entry 1131; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+1990341443768320) 1132; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+1990341443768320) 1133; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+1990341443768320) 1134; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+1990341443768320) 1135; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1136; LA64-LARGE-NEXT: ret 1137entry: 1138 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 248792680471040) 1139} 1140 1141define dso_local ptr @load_addr_offset_9380351707272() nounwind { 1142; LA32-LABEL: load_addr_offset_9380351707272: 1143; LA32: # %bb.0: # %entry 1144; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+1145062464) 1145; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+1145062464) 1146; LA32-NEXT: ret 1147; 1148; LA64-LABEL: load_addr_offset_9380351707272: 1149; LA64: # %bb.0: # %entry 1150; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64) 1151; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64) 1152; LA64-NEXT: lu12i.w $a1, 279556 1153; LA64-NEXT: ori $a1, $a1, 1088 1154; LA64-NEXT: lu32i.d $a1, 17472 1155; LA64-NEXT: add.d $a0, $a0, $a1 1156; LA64-NEXT: ret 1157; 1158; LA64-LARGE-LABEL: load_addr_offset_9380351707272: 1159; LA64-LARGE: # %bb.0: # %entry 1160; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+75042813658176) 1161; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+75042813658176) 1162; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+75042813658176) 1163; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+75042813658176) 1164; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1165; LA64-LARGE-NEXT: ret 1166entry: 1167 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 9380351707272) 1168} 1169 1170define dso_local ptr @load_addr_offset_562949953421312() nounwind { 1171; LA32-LABEL: load_addr_offset_562949953421312: 1172; LA32: # %bb.0: # %entry 1173; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64) 1174; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64) 1175; LA32-NEXT: ret 1176; 1177; LA64-LABEL: load_addr_offset_562949953421312: 1178; LA64: # %bb.0: # %entry 1179; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64) 1180; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64) 1181; LA64-NEXT: lu52i.d $a1, $zero, 1 1182; LA64-NEXT: add.d $a0, $a0, $a1 1183; LA64-NEXT: ret 1184; 1185; LA64-LARGE-LABEL: load_addr_offset_562949953421312: 1186; LA64-LARGE: # %bb.0: # %entry 1187; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+4503599627370496) 1188; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+4503599627370496) 1189; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+4503599627370496) 1190; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+4503599627370496) 1191; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1192; LA64-LARGE-NEXT: ret 1193entry: 1194 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 562949953421312) 1195} 1196 1197define dso_local ptr @load_addr_offset_614749556925924693() nounwind { 1198; LA32-LABEL: load_addr_offset_614749556925924693: 1199; LA32: # %bb.0: # %entry 1200; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+858794664) 1201; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+858794664) 1202; LA32-NEXT: ret 1203; 1204; LA64-LABEL: load_addr_offset_614749556925924693: 1205; LA64: # %bb.0: # %entry 1206; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64) 1207; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64) 1208; LA64-NEXT: lu12i.w $a1, 209666 1209; LA64-NEXT: ori $a1, $a1, 2728 1210; LA64-NEXT: lu32i.d $a1, 15288 1211; LA64-NEXT: lu52i.d $a1, $a1, 1092 1212; LA64-NEXT: add.d $a0, $a0, $a1 1213; LA64-NEXT: ret 1214; 1215; LA64-LARGE-LABEL: load_addr_offset_614749556925924693: 1216; LA64-LARGE: # %bb.0: # %entry 1217; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+4917996455407397544) 1218; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+4917996455407397544) 1219; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+4917996455407397544) 1220; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+4917996455407397544) 1221; LA64-LARGE-NEXT: add.d $a0, $a1, $a0 1222; LA64-LARGE-NEXT: ret 1223entry: 1224 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 614749556925924693) 1225} 1226