1223 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+lasx --verify-machineinstrs < %s \3; RUN: | FileCheck --check-prefix=LA32 %s4; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs < %s \5; RUN: | FileCheck --check-prefix=LA64 %s6; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs \7; RUN: --code-model=large < %s | FileCheck --check-prefix=LA64-LARGE %s8 9@g_i8 = dso_local global i8 010 11define dso_local signext i8 @load_s8() nounwind {12; LA32-LABEL: load_s8:13; LA32: # %bb.0: # %entry14; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)15; LA32-NEXT: ld.b $a0, $a0, %pc_lo12(g_i8)16; LA32-NEXT: ret17;18; LA64-LABEL: load_s8:19; LA64: # %bb.0: # %entry20; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)21; LA64-NEXT: ld.b $a0, $a0, %pc_lo12(g_i8)22; LA64-NEXT: ret23;24; LA64-LARGE-LABEL: load_s8:25; LA64-LARGE: # %bb.0: # %entry26; 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, $a031; LA64-LARGE-NEXT: ret32entry:33 %0 = load i8, ptr @g_i834 ret i8 %035}36 37define dso_local zeroext i8 @load_u8() nounwind {38; LA32-LABEL: load_u8:39; LA32: # %bb.0: # %entry40; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)41; LA32-NEXT: ld.bu $a0, $a0, %pc_lo12(g_i8)42; LA32-NEXT: ret43;44; LA64-LABEL: load_u8:45; LA64: # %bb.0: # %entry46; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)47; LA64-NEXT: ld.bu $a0, $a0, %pc_lo12(g_i8)48; LA64-NEXT: ret49;50; LA64-LARGE-LABEL: load_u8:51; LA64-LARGE: # %bb.0: # %entry52; 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, $a057; LA64-LARGE-NEXT: ret58entry:59 %0 = load i8, ptr @g_i860 ret i8 %061}62 63define dso_local void @store_i8() nounwind {64; LA32-LABEL: store_i8:65; LA32: # %bb.0: # %entry66; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)67; LA32-NEXT: ori $a1, $zero, 168; LA32-NEXT: st.b $a1, $a0, %pc_lo12(g_i8)69; LA32-NEXT: ret70;71; LA64-LABEL: store_i8:72; LA64: # %bb.0: # %entry73; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)74; LA64-NEXT: ori $a1, $zero, 175; LA64-NEXT: st.b $a1, $a0, %pc_lo12(g_i8)76; LA64-NEXT: ret77;78; LA64-LARGE-LABEL: store_i8:79; LA64-LARGE: # %bb.0: # %entry80; 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, 185; LA64-LARGE-NEXT: stx.b $a2, $a1, $a086; LA64-LARGE-NEXT: ret87entry:88 store i8 1, ptr @g_i889 ret void90}91 92@g_i16 = dso_local global i16 093 94define dso_local signext i16 @load_s16() nounwind {95; LA32-LABEL: load_s16:96; LA32: # %bb.0: # %entry97; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16)98; LA32-NEXT: ld.h $a0, $a0, %pc_lo12(g_i16)99; LA32-NEXT: ret100;101; LA64-LABEL: load_s16:102; LA64: # %bb.0: # %entry103; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16)104; LA64-NEXT: ld.h $a0, $a0, %pc_lo12(g_i16)105; LA64-NEXT: ret106;107; LA64-LARGE-LABEL: load_s16:108; LA64-LARGE: # %bb.0: # %entry109; 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, $a0114; LA64-LARGE-NEXT: ret115entry:116 %0 = load i16, ptr @g_i16117 ret i16 %0118}119 120define dso_local zeroext i16 @load_u16() nounwind {121; LA32-LABEL: load_u16:122; LA32: # %bb.0: # %entry123; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16)124; LA32-NEXT: ld.hu $a0, $a0, %pc_lo12(g_i16)125; LA32-NEXT: ret126;127; LA64-LABEL: load_u16:128; LA64: # %bb.0: # %entry129; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16)130; LA64-NEXT: ld.hu $a0, $a0, %pc_lo12(g_i16)131; LA64-NEXT: ret132;133; LA64-LARGE-LABEL: load_u16:134; LA64-LARGE: # %bb.0: # %entry135; 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, $a0140; LA64-LARGE-NEXT: ret141entry:142 %0 = load i16, ptr @g_i16143 ret i16 %0144}145 146define dso_local void @store_i16() nounwind {147; LA32-LABEL: store_i16:148; LA32: # %bb.0: # %entry149; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16)150; LA32-NEXT: ori $a1, $zero, 1151; LA32-NEXT: st.h $a1, $a0, %pc_lo12(g_i16)152; LA32-NEXT: ret153;154; LA64-LABEL: store_i16:155; LA64: # %bb.0: # %entry156; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16)157; LA64-NEXT: ori $a1, $zero, 1158; LA64-NEXT: st.h $a1, $a0, %pc_lo12(g_i16)159; LA64-NEXT: ret160;161; LA64-LARGE-LABEL: store_i16:162; LA64-LARGE: # %bb.0: # %entry163; 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, 1168; LA64-LARGE-NEXT: stx.h $a2, $a1, $a0169; LA64-LARGE-NEXT: ret170entry:171 store i16 1, ptr @g_i16172 ret void173}174 175@g_i32 = dso_local global i32 0176 177define dso_local signext i32 @load_s32() nounwind {178; LA32-LABEL: load_s32:179; LA32: # %bb.0: # %entry180; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32)181; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32)182; LA32-NEXT: ret183;184; LA64-LABEL: load_s32:185; LA64: # %bb.0: # %entry186; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32)187; LA64-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32)188; LA64-NEXT: ret189;190; LA64-LARGE-LABEL: load_s32:191; LA64-LARGE: # %bb.0: # %entry192; 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, $a0197; LA64-LARGE-NEXT: ret198entry:199 %0 = load i32, ptr @g_i32200 ret i32 %0201}202 203define dso_local zeroext i32 @load_u32() nounwind {204; LA32-LABEL: load_u32:205; LA32: # %bb.0: # %entry206; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32)207; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32)208; LA32-NEXT: ret209;210; LA64-LABEL: load_u32:211; LA64: # %bb.0: # %entry212; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32)213; LA64-NEXT: ld.wu $a0, $a0, %pc_lo12(g_i32)214; LA64-NEXT: ret215;216; LA64-LARGE-LABEL: load_u32:217; LA64-LARGE: # %bb.0: # %entry218; 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, $a0223; LA64-LARGE-NEXT: ret224entry:225 %0 = load i32, ptr @g_i32226 ret i32 %0227}228 229define dso_local void @store_i32() nounwind {230; LA32-LABEL: store_i32:231; LA32: # %bb.0: # %entry232; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32)233; LA32-NEXT: ori $a1, $zero, 1234; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_i32)235; LA32-NEXT: ret236;237; LA64-LABEL: store_i32:238; LA64: # %bb.0: # %entry239; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32)240; LA64-NEXT: ori $a1, $zero, 1241; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_i32)242; LA64-NEXT: ret243;244; LA64-LARGE-LABEL: store_i32:245; LA64-LARGE: # %bb.0: # %entry246; 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, 1251; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0252; LA64-LARGE-NEXT: ret253entry:254 store i32 1, ptr @g_i32255 ret void256}257 258@g_i64 = dso_local global i64 0259 260define dso_local i64 @load_i64() nounwind {261; LA32-LABEL: load_i64:262; LA32: # %bb.0: # %entry263; 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, 0266; LA32-NEXT: ld.w $a1, $a1, 4267; LA32-NEXT: ret268;269; LA64-LABEL: load_i64:270; LA64: # %bb.0: # %entry271; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i64)272; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(g_i64)273; LA64-NEXT: ret274;275; LA64-LARGE-LABEL: load_i64:276; LA64-LARGE: # %bb.0: # %entry277; 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, $a0282; LA64-LARGE-NEXT: ret283entry:284 %0 = load i64, ptr @g_i64285 ret i64 %0286}287 288define dso_local void @store_i64() nounwind {289; LA32-LABEL: store_i64:290; LA32: # %bb.0: # %entry291; 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, 4294; LA32-NEXT: ori $a1, $zero, 1295; LA32-NEXT: st.w $a1, $a0, 0296; LA32-NEXT: ret297;298; LA64-LABEL: store_i64:299; LA64: # %bb.0: # %entry300; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i64)301; LA64-NEXT: ori $a1, $zero, 1302; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_i64)303; LA64-NEXT: ret304;305; LA64-LARGE-LABEL: store_i64:306; LA64-LARGE: # %bb.0: # %entry307; 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, 1312; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0313; LA64-LARGE-NEXT: ret314entry:315 store i64 1, ptr @g_i64316 ret void317}318 319@g_f32 = dso_local global float 0.0320 321define dso_local float @load_f32() nounwind {322; LA32-LABEL: load_f32:323; LA32: # %bb.0: # %entry324; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f32)325; LA32-NEXT: fld.s $fa0, $a0, %pc_lo12(g_f32)326; LA32-NEXT: ret327;328; LA64-LABEL: load_f32:329; LA64: # %bb.0: # %entry330; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f32)331; LA64-NEXT: fld.s $fa0, $a0, %pc_lo12(g_f32)332; LA64-NEXT: ret333;334; LA64-LARGE-LABEL: load_f32:335; LA64-LARGE: # %bb.0: # %entry336; 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, $a0341; LA64-LARGE-NEXT: ret342entry:343 %0 = load float, ptr @g_f32344 ret float %0345}346 347define dso_local void @store_f32() nounwind {348; LA32-LABEL: store_f32:349; LA32: # %bb.0: # %entry350; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f32)351; LA32-NEXT: lu12i.w $a1, 260096352; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_f32)353; LA32-NEXT: ret354;355; LA64-LABEL: store_f32:356; LA64: # %bb.0: # %entry357; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f32)358; LA64-NEXT: lu12i.w $a1, 260096359; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_f32)360; LA64-NEXT: ret361;362; LA64-LARGE-LABEL: store_f32:363; LA64-LARGE: # %bb.0: # %entry364; 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, 260096369; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0370; LA64-LARGE-NEXT: ret371entry:372 store float 1.0, ptr @g_f32373 ret void374}375 376@g_f64 = dso_local global double 0.0377 378define dso_local double @load_f64() nounwind {379; LA32-LABEL: load_f64:380; LA32: # %bb.0: # %entry381; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f64)382; LA32-NEXT: fld.d $fa0, $a0, %pc_lo12(g_f64)383; LA32-NEXT: ret384;385; LA64-LABEL: load_f64:386; LA64: # %bb.0: # %entry387; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f64)388; LA64-NEXT: fld.d $fa0, $a0, %pc_lo12(g_f64)389; LA64-NEXT: ret390;391; LA64-LARGE-LABEL: load_f64:392; LA64-LARGE: # %bb.0: # %entry393; 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, $a0398; LA64-LARGE-NEXT: ret399entry:400 %0 = load double, ptr @g_f64401 ret double %0402}403 404define dso_local void @store_f64() nounwind {405; LA32-LABEL: store_f64:406; LA32: # %bb.0: # %entry407; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f64)408; LA32-NEXT: vldi $vr0, -912409; LA32-NEXT: fst.d $fa0, $a0, %pc_lo12(g_f64)410; LA32-NEXT: ret411;412; LA64-LABEL: store_f64:413; LA64: # %bb.0: # %entry414; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f64)415; LA64-NEXT: lu52i.d $a1, $zero, 1023416; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_f64)417; LA64-NEXT: ret418;419; LA64-LARGE-LABEL: store_f64:420; LA64-LARGE: # %bb.0: # %entry421; 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, 1023426; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0427; LA64-LARGE-NEXT: ret428entry:429 store double 1.0, ptr @g_f64430 ret void431}432 433@g_m64 = dso_local global i64 0434 435define dso_local void @store_multi() nounwind {436; LA32-LABEL: store_multi:437; LA32: # %bb.0: # %entry438; 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, 4441; LA32-NEXT: ori $a1, $zero, 1442; LA32-NEXT: st.w $a1, $a0, 0443; LA32-NEXT: st.w $zero, $a0, 4444; LA32-NEXT: ori $a1, $zero, 2445; LA32-NEXT: st.w $a1, $a0, 0446; LA32-NEXT: ret447;448; LA64-LABEL: store_multi:449; LA64: # %bb.0: # %entry450; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_m64)451; LA64-NEXT: ori $a1, $zero, 1452; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_m64)453; LA64-NEXT: ori $a1, $zero, 2454; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_m64)455; LA64-NEXT: ret456;457; LA64-LARGE-LABEL: store_multi:458; LA64-LARGE: # %bb.0: # %entry459; 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, 1464; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0465; LA64-LARGE-NEXT: ori $a2, $zero, 2466; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0467; LA64-LARGE-NEXT: ret468entry:469 store volatile i64 1, ptr @g_m64470 store volatile i64 2, ptr @g_m64471 ret void472}473 474@g_sf32 = dso_local global float 0.0475 476define dso_local void @store_sf32() nounwind {477; LA32-LABEL: store_sf32:478; LA32: # %bb.0: # %entry479; 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: ret483;484; LA64-LABEL: store_sf32:485; LA64: # %bb.0: # %entry486; 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: ret490;491; LA64-LARGE-LABEL: store_sf32:492; LA64-LARGE: # %bb.0: # %entry493; 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, $a0498; LA64-LARGE-NEXT: fstx.s $fa0, $a1, $a0499; LA64-LARGE-NEXT: ret500entry:501 %0 = load float, ptr @g_sf32502 store volatile float %0, ptr @g_sf32503 ret void504}505 506@g_sf64 = dso_local global double 0.0507 508define dso_local void @store_sf64() nounwind {509; LA32-LABEL: store_sf64:510; LA32: # %bb.0: # %entry511; 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: ret515;516; LA64-LABEL: store_sf64:517; LA64: # %bb.0: # %entry518; 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: ret522;523; LA64-LARGE-LABEL: store_sf64:524; LA64-LARGE: # %bb.0: # %entry525; 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, $a0530; LA64-LARGE-NEXT: fstx.d $fa0, $a1, $a0531; LA64-LARGE-NEXT: ret532entry:533 %0 = load double, ptr @g_sf64534 store volatile double %0, ptr @g_sf64535 ret void536}537 538@g_i32x4_src = dso_local global [4 x i32] zeroinitializer, align 16539@g_i32x4_dst = dso_local global [4 x i32] zeroinitializer, align 16540 541define dso_local void @copy_i32x4() nounwind {542; LA32-LABEL: copy_i32x4:543; LA32: # %bb.0: # %entry544; 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: ret549;550; LA64-LABEL: copy_i32x4:551; LA64: # %bb.0: # %entry552; 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: ret557;558; LA64-LARGE-LABEL: copy_i32x4:559; LA64-LARGE: # %bb.0: # %entry560; 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, $a0565; 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, $a0570; LA64-LARGE-NEXT: ret571entry:572 %0 = load <4 x i32>, ptr @g_i32x4_src, align 16573 store <4 x i32> %0, ptr @g_i32x4_dst, align 16574 ret void575}576 577@g_i32x8_src = dso_local global [8 x i32] zeroinitializer, align 32578@g_i32x8_dst = dso_local global [8 x i32] zeroinitializer, align 32579 580define dso_local void @copy_i32x8() nounwind {581; LA32-LABEL: copy_i32x8:582; LA32: # %bb.0: # %entry583; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x8_src)584; LA32-NEXT: xvld $xr0, $a0, %pc_lo12(g_i32x8_src)585; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x8_dst)586; LA32-NEXT: xvst $xr0, $a0, %pc_lo12(g_i32x8_dst)587; LA32-NEXT: ret588;589; LA64-LABEL: copy_i32x8:590; LA64: # %bb.0: # %entry591; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x8_src)592; LA64-NEXT: xvld $xr0, $a0, %pc_lo12(g_i32x8_src)593; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x8_dst)594; LA64-NEXT: xvst $xr0, $a0, %pc_lo12(g_i32x8_dst)595; LA64-NEXT: ret596;597; LA64-LARGE-LABEL: copy_i32x8:598; LA64-LARGE: # %bb.0: # %entry599; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x8_src)600; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x8_src)601; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x8_src)602; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x8_src)603; LA64-LARGE-NEXT: xvldx $xr0, $a1, $a0604; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x8_dst)605; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x8_dst)606; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x8_dst)607; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x8_dst)608; LA64-LARGE-NEXT: xvstx $xr0, $a1, $a0609; LA64-LARGE-NEXT: ret610entry:611 %0 = load <8 x i32>, ptr @g_i32x8_src, align 32612 store <8 x i32> %0, ptr @g_i32x8_dst, align 32613 ret void614}615 616@g_i8x16 = dso_local global <16 x i8> zeroinitializer, align 16617 618define void @copy_i8_to_i8x16() {619; LA32-LABEL: copy_i8_to_i8x16:620; LA32: # %bb.0: # %entry621; 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: ret626;627; LA64-LABEL: copy_i8_to_i8x16:628; LA64: # %bb.0: # %entry629; 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: ret634;635; LA64-LARGE-LABEL: copy_i8_to_i8x16:636; LA64-LARGE: # %bb.0: # %entry637; 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, $a0642; LA64-LARGE-NEXT: vldrepl.b $vr0, $a0, 0643; 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, $a0648; LA64-LARGE-NEXT: ret649entry: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 16652 ret void653}654 655@g_i8x32 = dso_local global <32 x i8> zeroinitializer, align 32656 657define void @copy_i8_to_i8x32() {658; LA32-LABEL: copy_i8_to_i8x32:659; LA32: # %bb.0: # %entry660; 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: ret665;666; LA64-LABEL: copy_i8_to_i8x32:667; LA64: # %bb.0: # %entry668; 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: ret673;674; LA64-LARGE-LABEL: copy_i8_to_i8x32:675; LA64-LARGE: # %bb.0: # %entry676; 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, $a0681; LA64-LARGE-NEXT: xvldrepl.b $xr0, $a0, 0682; 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, $a0687; LA64-LARGE-NEXT: ret688entry: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 32691 ret void692}693 694@g_rmw = dso_local global i64 0695 696define dso_local void @rmw() nounwind {697; LA32-LABEL: rmw:698; LA32: # %bb.0: # %entry699; 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, 0702; LA32-NEXT: ld.w $a2, $a0, 4703; LA32-NEXT: addi.w $a1, $a1, 1704; LA32-NEXT: sltui $a3, $a1, 1705; LA32-NEXT: add.w $a2, $a2, $a3706; LA32-NEXT: st.w $a1, $a0, 0707; LA32-NEXT: st.w $a2, $a0, 4708; LA32-NEXT: ret709;710; LA64-LABEL: rmw:711; LA64: # %bb.0: # %entry712; 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, 1715; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_rmw)716; LA64-NEXT: ret717;718; LA64-LARGE-LABEL: rmw:719; LA64-LARGE: # %bb.0: # %entry720; 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, $a0725; LA64-LARGE-NEXT: addi.d $a2, $a2, 1726; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0727; LA64-LARGE-NEXT: ret728entry:729 %0 = load i64, ptr @g_rmw730 %1 = add i64 %0, 1731 store i64 %1, ptr @g_rmw732 ret void733}734 735@g_a32 = dso_local global [2048 x i32] zeroinitializer, align 4736 737define dso_local void @store_a32() nounwind {738; LA32-LABEL: store_a32:739; LA32: # %bb.0: # %entry740; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096)741; LA32-NEXT: ori $a1, $zero, 1742; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4096)743; LA32-NEXT: ret744;745; LA64-LABEL: store_a32:746; LA64: # %bb.0: # %entry747; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096)748; LA64-NEXT: ori $a1, $zero, 1749; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4096)750; LA64-NEXT: ret751;752; LA64-LARGE-LABEL: store_a32:753; LA64-LARGE: # %bb.0: # %entry754; 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, 1759; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0760; LA64-LARGE-NEXT: ret761entry:762 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4763 ret void764}765 766define dso_local void @store_a32_2() nounwind {767; LA32-LABEL: store_a32_2:768; LA32: # %bb.0: # %entry769; 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, 1772; LA32-NEXT: add.w $a2, $a0, $a1773; LA32-NEXT: ori $a3, $zero, 1774; LA32-NEXT: st.w $a3, $a2, 0775; LA32-NEXT: ori $a1, $a1, 8776; LA32-NEXT: add.w $a0, $a0, $a1777; LA32-NEXT: ori $a1, $zero, 2778; LA32-NEXT: st.w $a1, $a0, 0779; LA32-NEXT: ret780;781; LA64-LABEL: store_a32_2:782; LA64: # %bb.0: # %entry783; 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, 1786; LA64-NEXT: stptr.w $a1, $a0, 4096787; LA64-NEXT: ori $a1, $zero, 2788; LA64-NEXT: stptr.w $a1, $a0, 4104789; LA64-NEXT: ret790;791; LA64-LARGE-LABEL: store_a32_2:792; LA64-LARGE: # %bb.0: # %entry793; 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, $a0798; LA64-LARGE-NEXT: ori $a1, $zero, 1799; LA64-LARGE-NEXT: stptr.w $a1, $a0, 4096800; LA64-LARGE-NEXT: ori $a1, $zero, 2801; LA64-LARGE-NEXT: stptr.w $a1, $a0, 4104802; LA64-LARGE-NEXT: ret803entry:804 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4805 store i32 2, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1026), align 4806 ret void807}808 809define dso_local void @control_flow_with_mem_access() nounwind {810; LA32-LABEL: control_flow_with_mem_access:811; LA32: # %bb.0: # %entry812; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)813; LA32-NEXT: ld.w $a1, $a0, %pc_lo12(g_a32+4)814; LA32-NEXT: blez $a1, .LBB25_2815; LA32-NEXT: # %bb.1: # %if.then816; LA32-NEXT: ori $a1, $zero, 10817; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4)818; LA32-NEXT: .LBB25_2: # %if.end819; LA32-NEXT: ret820;821; LA64-LABEL: control_flow_with_mem_access:822; LA64: # %bb.0: # %entry823; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)824; LA64-NEXT: ld.w $a1, $a0, %pc_lo12(g_a32+4)825; LA64-NEXT: blez $a1, .LBB25_2826; LA64-NEXT: # %bb.1: # %if.then827; LA64-NEXT: ori $a1, $zero, 10828; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4)829; LA64-NEXT: .LBB25_2: # %if.end830; LA64-NEXT: ret831;832; LA64-LARGE-LABEL: control_flow_with_mem_access:833; LA64-LARGE: # %bb.0: # %entry834; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)835; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4)836; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4)837; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4)838; LA64-LARGE-NEXT: ldx.w $a0, $a1, $a0839; LA64-LARGE-NEXT: blez $a0, .LBB25_2840; LA64-LARGE-NEXT: # %bb.1: # %if.then841; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)842; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4)843; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4)844; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4)845; LA64-LARGE-NEXT: ori $a2, $zero, 10846; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0847; LA64-LARGE-NEXT: .LBB25_2: # %if.end848; LA64-LARGE-NEXT: ret849entry:850 %0 = load i32, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4851 %cmp = icmp sgt i32 %0, 0852 br i1 %cmp, label %if.then, label %if.end853 854if.then:855 store i32 10, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4856 br label %if.end857 858if.end:859 ret void860}861 862define dso_local ptr @load_ba_1() nounwind {863; LA32-LABEL: load_ba_1:864; LA32: # %bb.0: # %entry865; LA32-NEXT: .Ltmp0: # Block address taken866; LA32-NEXT: # %bb.1: # %label867; LA32-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0)868; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(.Ltmp0)869; LA32-NEXT: ret870;871; LA64-LABEL: load_ba_1:872; LA64: # %bb.0: # %entry873; LA64-NEXT: .Ltmp0: # Block address taken874; LA64-NEXT: # %bb.1: # %label875; LA64-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0)876; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(.Ltmp0)877; LA64-NEXT: ret878;879; LA64-LARGE-LABEL: load_ba_1:880; LA64-LARGE: # %bb.0: # %entry881; LA64-LARGE-NEXT: .Ltmp0: # Block address taken882; LA64-LARGE-NEXT: # %bb.1: # %label883; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0)884; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(.Ltmp0)885; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(.Ltmp0)886; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Ltmp0)887; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0888; LA64-LARGE-NEXT: ret889entry:890 br label %label891label:892 %0 = load ptr, ptr blockaddress(@load_ba_1, %label)893 ret ptr %0894}895 896define dso_local ptr @load_ba_2() nounwind {897; LA32-LABEL: load_ba_2:898; LA32: # %bb.0: # %entry899; LA32-NEXT: .Ltmp1: # Block address taken900; LA32-NEXT: # %bb.1: # %label901; LA32-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8)902; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(.Ltmp1+8)903; LA32-NEXT: ret904;905; LA64-LABEL: load_ba_2:906; LA64: # %bb.0: # %entry907; LA64-NEXT: .Ltmp1: # Block address taken908; LA64-NEXT: # %bb.1: # %label909; LA64-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8)910; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(.Ltmp1+8)911; LA64-NEXT: ret912;913; LA64-LARGE-LABEL: load_ba_2:914; LA64-LARGE: # %bb.0: # %entry915; LA64-LARGE-NEXT: .Ltmp1: # Block address taken916; LA64-LARGE-NEXT: # %bb.1: # %label917; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8)918; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(.Ltmp1+8)919; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(.Ltmp1+8)920; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Ltmp1+8)921; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0922; LA64-LARGE-NEXT: ret923entry:924 br label %label925label:926 %0 = load ptr, ptr getelementptr inbounds (i8, ptr blockaddress(@load_ba_2, %label), i32 8)927 ret ptr %0928}929 930@g_a64 = dso_local global [614750729487779976 x i64] zeroinitializer, align 8931 932define dso_local ptr @load_addr_offset_1() nounwind {933; LA32-LABEL: load_addr_offset_1:934; LA32: # %bb.0: # %entry935; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8)936; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8)937; LA32-NEXT: ret938;939; LA64-LABEL: load_addr_offset_1:940; LA64: # %bb.0: # %entry941; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8)942; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8)943; LA64-NEXT: ret944;945; LA64-LARGE-LABEL: load_addr_offset_1:946; LA64-LARGE: # %bb.0: # %entry947; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8)948; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8)949; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8)950; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8)951; LA64-LARGE-NEXT: add.d $a0, $a1, $a0952; LA64-LARGE-NEXT: ret953entry:954 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1)955}956 957define dso_local ptr @load_addr_offset_257() nounwind {958; LA32-LABEL: load_addr_offset_257:959; LA32: # %bb.0: # %entry960; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056)961; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2056)962; LA32-NEXT: ret963;964; LA64-LABEL: load_addr_offset_257:965; LA64: # %bb.0: # %entry966; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056)967; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2056)968; LA64-NEXT: ret969;970; LA64-LARGE-LABEL: load_addr_offset_257:971; LA64-LARGE: # %bb.0: # %entry972; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056)973; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2056)974; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2056)975; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2056)976; LA64-LARGE-NEXT: add.d $a0, $a1, $a0977; LA64-LARGE-NEXT: ret978entry:979 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 257)980}981 982define dso_local ptr @load_addr_offset_1048576() nounwind {983; LA32-LABEL: load_addr_offset_1048576:984; LA32: # %bb.0: # %entry985; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608)986; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8388608)987; LA32-NEXT: ret988;989; LA64-LABEL: load_addr_offset_1048576:990; LA64: # %bb.0: # %entry991; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608)992; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8388608)993; LA64-NEXT: ret994;995; LA64-LARGE-LABEL: load_addr_offset_1048576:996; LA64-LARGE: # %bb.0: # %entry997; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608)998; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8388608)999; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8388608)1000; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388608)1001; LA64-LARGE-NEXT: add.d $a0, $a1, $a01002; LA64-LARGE-NEXT: ret1003entry:1004 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048576)1005}1006 1007define dso_local ptr @load_addr_offset_1048577() nounwind {1008; LA32-LABEL: load_addr_offset_1048577:1009; LA32: # %bb.0: # %entry1010; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616)1011; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8388616)1012; LA32-NEXT: ret1013;1014; LA64-LABEL: load_addr_offset_1048577:1015; LA64: # %bb.0: # %entry1016; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616)1017; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8388616)1018; LA64-NEXT: ret1019;1020; LA64-LARGE-LABEL: load_addr_offset_1048577:1021; LA64-LARGE: # %bb.0: # %entry1022; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616)1023; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8388616)1024; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8388616)1025; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388616)1026; LA64-LARGE-NEXT: add.d $a0, $a1, $a01027; LA64-LARGE-NEXT: ret1028entry:1029 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048577)1030}1031 1032define dso_local ptr @load_addr_offset_268432896() nounwind {1033; LA32-LABEL: load_addr_offset_268432896:1034; LA32: # %bb.0: # %entry1035; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168)1036; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2147463168)1037; LA32-NEXT: ret1038;1039; LA64-LABEL: load_addr_offset_268432896:1040; LA64: # %bb.0: # %entry1041; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168)1042; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2147463168)1043; LA64-NEXT: ret1044;1045; LA64-LARGE-LABEL: load_addr_offset_268432896:1046; LA64-LARGE: # %bb.0: # %entry1047; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168)1048; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2147463168)1049; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2147463168)1050; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463168)1051; LA64-LARGE-NEXT: add.d $a0, $a1, $a01052; LA64-LARGE-NEXT: ret1053entry:1054 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432896)1055}1056 1057define dso_local ptr @load_addr_offset_268432897() nounwind {1058; LA32-LABEL: load_addr_offset_268432897:1059; LA32: # %bb.0: # %entry1060; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176)1061; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2147463176)1062; LA32-NEXT: ret1063;1064; LA64-LABEL: load_addr_offset_268432897:1065; LA64: # %bb.0: # %entry1066; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176)1067; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2147463176)1068; LA64-NEXT: ret1069;1070; LA64-LARGE-LABEL: load_addr_offset_268432897:1071; LA64-LARGE: # %bb.0: # %entry1072; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176)1073; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2147463176)1074; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2147463176)1075; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463176)1076; LA64-LARGE-NEXT: add.d $a0, $a1, $a01077; LA64-LARGE-NEXT: ret1078entry:1079 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432897)1080}1081 1082define dso_local ptr @load_addr_offset_281474439839744() nounwind {1083; LA32-LABEL: load_addr_offset_281474439839744:1084; LA32: # %bb.0: # %entry1085; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64)1086; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64)1087; LA32-NEXT: ret1088;1089; LA64-LABEL: load_addr_offset_281474439839744:1090; LA64: # %bb.0: # %entry1091; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)1092; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)1093; LA64-NEXT: ori $a1, $zero, 01094; LA64-NEXT: lu32i.d $a1, 5242871095; LA64-NEXT: add.d $a0, $a0, $a11096; LA64-NEXT: ret1097;1098; LA64-LARGE-LABEL: load_addr_offset_281474439839744:1099; LA64-LARGE: # %bb.0: # %entry1100; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2251795518717952)1101; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2251795518717952)1102; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2251795518717952)1103; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2251795518717952)1104; LA64-LARGE-NEXT: add.d $a0, $a1, $a01105; LA64-LARGE-NEXT: ret1106entry:1107 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 281474439839744)1108}1109 1110define dso_local ptr @load_addr_offset_248792680471040() nounwind {1111; LA32-LABEL: load_addr_offset_248792680471040:1112; LA32: # %bb.0: # %entry1113; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2059194368)1114; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2059194368)1115; LA32-NEXT: ret1116;1117; LA64-LABEL: load_addr_offset_248792680471040:1118; LA64: # %bb.0: # %entry1119; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)1120; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)1121; LA64-NEXT: lu12i.w $a1, 5027331122; LA64-NEXT: lu32i.d $a1, 4634121123; LA64-NEXT: add.d $a0, $a0, $a11124; LA64-NEXT: ret1125;1126; LA64-LARGE-LABEL: load_addr_offset_248792680471040:1127; LA64-LARGE: # %bb.0: # %entry1128; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+1990341443768320)1129; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+1990341443768320)1130; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+1990341443768320)1131; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+1990341443768320)1132; LA64-LARGE-NEXT: add.d $a0, $a1, $a01133; LA64-LARGE-NEXT: ret1134entry:1135 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 248792680471040)1136}1137 1138define dso_local ptr @load_addr_offset_9380351707272() nounwind {1139; LA32-LABEL: load_addr_offset_9380351707272:1140; LA32: # %bb.0: # %entry1141; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+1145062464)1142; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+1145062464)1143; LA32-NEXT: ret1144;1145; LA64-LABEL: load_addr_offset_9380351707272:1146; LA64: # %bb.0: # %entry1147; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)1148; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)1149; LA64-NEXT: lu12i.w $a1, 2795561150; LA64-NEXT: ori $a1, $a1, 10881151; LA64-NEXT: lu32i.d $a1, 174721152; LA64-NEXT: add.d $a0, $a0, $a11153; LA64-NEXT: ret1154;1155; LA64-LARGE-LABEL: load_addr_offset_9380351707272:1156; LA64-LARGE: # %bb.0: # %entry1157; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+75042813658176)1158; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+75042813658176)1159; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+75042813658176)1160; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+75042813658176)1161; LA64-LARGE-NEXT: add.d $a0, $a1, $a01162; LA64-LARGE-NEXT: ret1163entry:1164 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 9380351707272)1165}1166 1167define dso_local ptr @load_addr_offset_562949953421312() nounwind {1168; LA32-LABEL: load_addr_offset_562949953421312:1169; LA32: # %bb.0: # %entry1170; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64)1171; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64)1172; LA32-NEXT: ret1173;1174; LA64-LABEL: load_addr_offset_562949953421312:1175; LA64: # %bb.0: # %entry1176; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)1177; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)1178; LA64-NEXT: lu52i.d $a1, $zero, 11179; LA64-NEXT: add.d $a0, $a0, $a11180; LA64-NEXT: ret1181;1182; LA64-LARGE-LABEL: load_addr_offset_562949953421312:1183; LA64-LARGE: # %bb.0: # %entry1184; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+4503599627370496)1185; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+4503599627370496)1186; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+4503599627370496)1187; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+4503599627370496)1188; LA64-LARGE-NEXT: add.d $a0, $a1, $a01189; LA64-LARGE-NEXT: ret1190entry:1191 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 562949953421312)1192}1193 1194define dso_local ptr @load_addr_offset_614749556925924693() nounwind {1195; LA32-LABEL: load_addr_offset_614749556925924693:1196; LA32: # %bb.0: # %entry1197; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+858794664)1198; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+858794664)1199; LA32-NEXT: ret1200;1201; LA64-LABEL: load_addr_offset_614749556925924693:1202; LA64: # %bb.0: # %entry1203; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)1204; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)1205; LA64-NEXT: lu12i.w $a1, 2096661206; LA64-NEXT: ori $a1, $a1, 27281207; LA64-NEXT: lu32i.d $a1, 152881208; LA64-NEXT: lu52i.d $a1, $a1, 10921209; LA64-NEXT: add.d $a0, $a0, $a11210; LA64-NEXT: ret1211;1212; LA64-LARGE-LABEL: load_addr_offset_614749556925924693:1213; LA64-LARGE: # %bb.0: # %entry1214; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+4917996455407397544)1215; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+4917996455407397544)1216; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+4917996455407397544)1217; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+4917996455407397544)1218; LA64-LARGE-NEXT: add.d $a0, $a1, $a01219; LA64-LARGE-NEXT: ret1220entry:1221 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 614749556925924693)1222}1223