1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc --mtriple=loongarch32 --mattr=+d --relocation-model=static < %s | FileCheck %s --check-prefixes=ALL,LA32NOPIC 3; RUN: llc --mtriple=loongarch32 --mattr=+d --relocation-model=pic < %s | FileCheck %s --check-prefixes=ALL,LA32PIC 4; RUN: llc --mtriple=loongarch64 --mattr=+d --relocation-model=static < %s | FileCheck %s --check-prefixes=ALL,LA64NOPIC 5; RUN: llc --mtriple=loongarch64 --mattr=+d --relocation-model=pic < %s | FileCheck %s --check-prefixes=ALL,LA64PIC 6 7;; Check load from and store to global variables. 8@G = dso_local global i32 zeroinitializer, align 4 9@arr = dso_local global [10 x i32] zeroinitializer, align 4 10 11define i32 @load_store_global() nounwind { 12; LA32NOPIC-LABEL: load_store_global: 13; LA32NOPIC: # %bb.0: 14; LA32NOPIC-NEXT: pcalau12i $a1, %pc_hi20(G) 15; LA32NOPIC-NEXT: ld.w $a0, $a1, %pc_lo12(G) 16; LA32NOPIC-NEXT: addi.w $a0, $a0, 1 17; LA32NOPIC-NEXT: st.w $a0, $a1, %pc_lo12(G) 18; LA32NOPIC-NEXT: ret 19; 20; LA32PIC-LABEL: load_store_global: 21; LA32PIC: # %bb.0: 22; LA32PIC-NEXT: pcalau12i $a1, %pc_hi20(.LG$local) 23; LA32PIC-NEXT: ld.w $a0, $a1, %pc_lo12(.LG$local) 24; LA32PIC-NEXT: addi.w $a0, $a0, 1 25; LA32PIC-NEXT: st.w $a0, $a1, %pc_lo12(.LG$local) 26; LA32PIC-NEXT: ret 27; 28; LA64NOPIC-LABEL: load_store_global: 29; LA64NOPIC: # %bb.0: 30; LA64NOPIC-NEXT: pcalau12i $a1, %pc_hi20(G) 31; LA64NOPIC-NEXT: ld.w $a0, $a1, %pc_lo12(G) 32; LA64NOPIC-NEXT: addi.w $a0, $a0, 1 33; LA64NOPIC-NEXT: st.w $a0, $a1, %pc_lo12(G) 34; LA64NOPIC-NEXT: ret 35; 36; LA64PIC-LABEL: load_store_global: 37; LA64PIC: # %bb.0: 38; LA64PIC-NEXT: pcalau12i $a1, %pc_hi20(.LG$local) 39; LA64PIC-NEXT: ld.w $a0, $a1, %pc_lo12(.LG$local) 40; LA64PIC-NEXT: addi.w $a0, $a0, 1 41; LA64PIC-NEXT: st.w $a0, $a1, %pc_lo12(.LG$local) 42; LA64PIC-NEXT: ret 43 %v = load i32, ptr @G 44 %sum = add i32 %v, 1 45 store i32 %sum, ptr @G 46 ret i32 %sum 47} 48 49define i32 @load_store_global_array(i32 %a) nounwind { 50; LA32NOPIC-LABEL: load_store_global_array: 51; LA32NOPIC: # %bb.0: 52; LA32NOPIC-NEXT: pcalau12i $a1, %pc_hi20(arr) 53; LA32NOPIC-NEXT: addi.w $a2, $a1, %pc_lo12(arr) 54; LA32NOPIC-NEXT: ld.w $a1, $a2, 0 55; LA32NOPIC-NEXT: st.w $a0, $a2, 0 56; LA32NOPIC-NEXT: ld.w $zero, $a2, 36 57; LA32NOPIC-NEXT: st.w $a0, $a2, 36 58; LA32NOPIC-NEXT: move $a0, $a1 59; LA32NOPIC-NEXT: ret 60; 61; LA32PIC-LABEL: load_store_global_array: 62; LA32PIC: # %bb.0: 63; LA32PIC-NEXT: pcalau12i $a1, %pc_hi20(.Larr$local) 64; LA32PIC-NEXT: addi.w $a2, $a1, %pc_lo12(.Larr$local) 65; LA32PIC-NEXT: ld.w $a1, $a2, 0 66; LA32PIC-NEXT: st.w $a0, $a2, 0 67; LA32PIC-NEXT: ld.w $zero, $a2, 36 68; LA32PIC-NEXT: st.w $a0, $a2, 36 69; LA32PIC-NEXT: move $a0, $a1 70; LA32PIC-NEXT: ret 71; 72; LA64NOPIC-LABEL: load_store_global_array: 73; LA64NOPIC: # %bb.0: 74; LA64NOPIC-NEXT: pcalau12i $a1, %pc_hi20(arr) 75; LA64NOPIC-NEXT: addi.d $a2, $a1, %pc_lo12(arr) 76; LA64NOPIC-NEXT: ld.w $a1, $a2, 0 77; LA64NOPIC-NEXT: st.w $a0, $a2, 0 78; LA64NOPIC-NEXT: ld.w $zero, $a2, 36 79; LA64NOPIC-NEXT: st.w $a0, $a2, 36 80; LA64NOPIC-NEXT: move $a0, $a1 81; LA64NOPIC-NEXT: ret 82; 83; LA64PIC-LABEL: load_store_global_array: 84; LA64PIC: # %bb.0: 85; LA64PIC-NEXT: pcalau12i $a1, %pc_hi20(.Larr$local) 86; LA64PIC-NEXT: addi.d $a2, $a1, %pc_lo12(.Larr$local) 87; LA64PIC-NEXT: ld.w $a1, $a2, 0 88; LA64PIC-NEXT: st.w $a0, $a2, 0 89; LA64PIC-NEXT: ld.w $zero, $a2, 36 90; LA64PIC-NEXT: st.w $a0, $a2, 36 91; LA64PIC-NEXT: move $a0, $a1 92; LA64PIC-NEXT: ret 93 %1 = load volatile i32, ptr @arr, align 4 94 store i32 %a, ptr @arr, align 4 95 %2 = getelementptr [10 x i32], ptr @arr, i32 0, i32 9 96 %3 = load volatile i32, ptr %2, align 4 97 store i32 %a, ptr %2, align 4 98 ret i32 %1 99} 100 101;; Check indexed and unindexed, sext, zext and anyext loads. 102 103define i64 @ld_b(ptr %a) nounwind { 104; LA32NOPIC-LABEL: ld_b: 105; LA32NOPIC: # %bb.0: 106; LA32NOPIC-NEXT: ld.b $a2, $a0, 1 107; LA32NOPIC-NEXT: ld.b $zero, $a0, 0 108; LA32NOPIC-NEXT: srai.w $a1, $a2, 31 109; LA32NOPIC-NEXT: move $a0, $a2 110; LA32NOPIC-NEXT: ret 111; 112; LA32PIC-LABEL: ld_b: 113; LA32PIC: # %bb.0: 114; LA32PIC-NEXT: ld.b $a2, $a0, 1 115; LA32PIC-NEXT: ld.b $zero, $a0, 0 116; LA32PIC-NEXT: srai.w $a1, $a2, 31 117; LA32PIC-NEXT: move $a0, $a2 118; LA32PIC-NEXT: ret 119; 120; LA64NOPIC-LABEL: ld_b: 121; LA64NOPIC: # %bb.0: 122; LA64NOPIC-NEXT: ld.b $a1, $a0, 1 123; LA64NOPIC-NEXT: ld.b $zero, $a0, 0 124; LA64NOPIC-NEXT: move $a0, $a1 125; LA64NOPIC-NEXT: ret 126; 127; LA64PIC-LABEL: ld_b: 128; LA64PIC: # %bb.0: 129; LA64PIC-NEXT: ld.b $a1, $a0, 1 130; LA64PIC-NEXT: ld.b $zero, $a0, 0 131; LA64PIC-NEXT: move $a0, $a1 132; LA64PIC-NEXT: ret 133 %1 = getelementptr i8, ptr %a, i64 1 134 %2 = load i8, ptr %1 135 %3 = sext i8 %2 to i64 136 %4 = load volatile i8, ptr %a 137 ret i64 %3 138} 139 140define i64 @ld_h(ptr %a) nounwind { 141; LA32NOPIC-LABEL: ld_h: 142; LA32NOPIC: # %bb.0: 143; LA32NOPIC-NEXT: ld.h $a2, $a0, 4 144; LA32NOPIC-NEXT: ld.h $zero, $a0, 0 145; LA32NOPIC-NEXT: srai.w $a1, $a2, 31 146; LA32NOPIC-NEXT: move $a0, $a2 147; LA32NOPIC-NEXT: ret 148; 149; LA32PIC-LABEL: ld_h: 150; LA32PIC: # %bb.0: 151; LA32PIC-NEXT: ld.h $a2, $a0, 4 152; LA32PIC-NEXT: ld.h $zero, $a0, 0 153; LA32PIC-NEXT: srai.w $a1, $a2, 31 154; LA32PIC-NEXT: move $a0, $a2 155; LA32PIC-NEXT: ret 156; 157; LA64NOPIC-LABEL: ld_h: 158; LA64NOPIC: # %bb.0: 159; LA64NOPIC-NEXT: ld.h $a1, $a0, 4 160; LA64NOPIC-NEXT: ld.h $zero, $a0, 0 161; LA64NOPIC-NEXT: move $a0, $a1 162; LA64NOPIC-NEXT: ret 163; 164; LA64PIC-LABEL: ld_h: 165; LA64PIC: # %bb.0: 166; LA64PIC-NEXT: ld.h $a1, $a0, 4 167; LA64PIC-NEXT: ld.h $zero, $a0, 0 168; LA64PIC-NEXT: move $a0, $a1 169; LA64PIC-NEXT: ret 170 %1 = getelementptr i16, ptr %a, i64 2 171 %2 = load i16, ptr %1 172 %3 = sext i16 %2 to i64 173 %4 = load volatile i16, ptr %a 174 ret i64 %3 175} 176 177define i64 @ld_w(ptr %a) nounwind { 178; LA32NOPIC-LABEL: ld_w: 179; LA32NOPIC: # %bb.0: 180; LA32NOPIC-NEXT: ld.w $a2, $a0, 12 181; LA32NOPIC-NEXT: ld.w $zero, $a0, 0 182; LA32NOPIC-NEXT: srai.w $a1, $a2, 31 183; LA32NOPIC-NEXT: move $a0, $a2 184; LA32NOPIC-NEXT: ret 185; 186; LA32PIC-LABEL: ld_w: 187; LA32PIC: # %bb.0: 188; LA32PIC-NEXT: ld.w $a2, $a0, 12 189; LA32PIC-NEXT: ld.w $zero, $a0, 0 190; LA32PIC-NEXT: srai.w $a1, $a2, 31 191; LA32PIC-NEXT: move $a0, $a2 192; LA32PIC-NEXT: ret 193; 194; LA64NOPIC-LABEL: ld_w: 195; LA64NOPIC: # %bb.0: 196; LA64NOPIC-NEXT: ld.w $a1, $a0, 12 197; LA64NOPIC-NEXT: ld.w $zero, $a0, 0 198; LA64NOPIC-NEXT: move $a0, $a1 199; LA64NOPIC-NEXT: ret 200; 201; LA64PIC-LABEL: ld_w: 202; LA64PIC: # %bb.0: 203; LA64PIC-NEXT: ld.w $a1, $a0, 12 204; LA64PIC-NEXT: ld.w $zero, $a0, 0 205; LA64PIC-NEXT: move $a0, $a1 206; LA64PIC-NEXT: ret 207 %1 = getelementptr i32, ptr %a, i64 3 208 %2 = load i32, ptr %1 209 %3 = sext i32 %2 to i64 210 %4 = load volatile i32, ptr %a 211 ret i64 %3 212} 213 214define i64 @ld_d(ptr %a) nounwind { 215; LA32NOPIC-LABEL: ld_d: 216; LA32NOPIC: # %bb.0: 217; LA32NOPIC-NEXT: ld.w $a1, $a0, 28 218; LA32NOPIC-NEXT: ld.w $a2, $a0, 24 219; LA32NOPIC-NEXT: ld.w $zero, $a0, 4 220; LA32NOPIC-NEXT: ld.w $zero, $a0, 0 221; LA32NOPIC-NEXT: move $a0, $a2 222; LA32NOPIC-NEXT: ret 223; 224; LA32PIC-LABEL: ld_d: 225; LA32PIC: # %bb.0: 226; LA32PIC-NEXT: ld.w $a1, $a0, 28 227; LA32PIC-NEXT: ld.w $a2, $a0, 24 228; LA32PIC-NEXT: ld.w $zero, $a0, 4 229; LA32PIC-NEXT: ld.w $zero, $a0, 0 230; LA32PIC-NEXT: move $a0, $a2 231; LA32PIC-NEXT: ret 232; 233; LA64NOPIC-LABEL: ld_d: 234; LA64NOPIC: # %bb.0: 235; LA64NOPIC-NEXT: ld.d $a1, $a0, 24 236; LA64NOPIC-NEXT: ld.d $zero, $a0, 0 237; LA64NOPIC-NEXT: move $a0, $a1 238; LA64NOPIC-NEXT: ret 239; 240; LA64PIC-LABEL: ld_d: 241; LA64PIC: # %bb.0: 242; LA64PIC-NEXT: ld.d $a1, $a0, 24 243; LA64PIC-NEXT: ld.d $zero, $a0, 0 244; LA64PIC-NEXT: move $a0, $a1 245; LA64PIC-NEXT: ret 246 %1 = getelementptr i64, ptr %a, i64 3 247 %2 = load i64, ptr %1 248 %3 = load volatile i64, ptr %a 249 ret i64 %2 250} 251 252define i64 @ld_bu(ptr %a) nounwind { 253; LA32NOPIC-LABEL: ld_bu: 254; LA32NOPIC: # %bb.0: 255; LA32NOPIC-NEXT: ld.bu $a1, $a0, 4 256; LA32NOPIC-NEXT: ld.bu $a0, $a0, 0 257; LA32NOPIC-NEXT: add.w $a0, $a1, $a0 258; LA32NOPIC-NEXT: sltu $a1, $a0, $a1 259; LA32NOPIC-NEXT: ret 260; 261; LA32PIC-LABEL: ld_bu: 262; LA32PIC: # %bb.0: 263; LA32PIC-NEXT: ld.bu $a1, $a0, 4 264; LA32PIC-NEXT: ld.bu $a0, $a0, 0 265; LA32PIC-NEXT: add.w $a0, $a1, $a0 266; LA32PIC-NEXT: sltu $a1, $a0, $a1 267; LA32PIC-NEXT: ret 268; 269; LA64NOPIC-LABEL: ld_bu: 270; LA64NOPIC: # %bb.0: 271; LA64NOPIC-NEXT: ld.bu $a1, $a0, 4 272; LA64NOPIC-NEXT: ld.bu $a0, $a0, 0 273; LA64NOPIC-NEXT: add.d $a0, $a1, $a0 274; LA64NOPIC-NEXT: ret 275; 276; LA64PIC-LABEL: ld_bu: 277; LA64PIC: # %bb.0: 278; LA64PIC-NEXT: ld.bu $a1, $a0, 4 279; LA64PIC-NEXT: ld.bu $a0, $a0, 0 280; LA64PIC-NEXT: add.d $a0, $a1, $a0 281; LA64PIC-NEXT: ret 282 %1 = getelementptr i8, ptr %a, i64 4 283 %2 = load i8, ptr %1 284 %3 = zext i8 %2 to i64 285 %4 = load volatile i8, ptr %a 286 %5 = zext i8 %4 to i64 287 %6 = add i64 %3, %5 288 ret i64 %6 289} 290 291define i64 @ld_hu(ptr %a) nounwind { 292; LA32NOPIC-LABEL: ld_hu: 293; LA32NOPIC: # %bb.0: 294; LA32NOPIC-NEXT: ld.hu $a1, $a0, 10 295; LA32NOPIC-NEXT: ld.hu $a0, $a0, 0 296; LA32NOPIC-NEXT: add.w $a0, $a1, $a0 297; LA32NOPIC-NEXT: sltu $a1, $a0, $a1 298; LA32NOPIC-NEXT: ret 299; 300; LA32PIC-LABEL: ld_hu: 301; LA32PIC: # %bb.0: 302; LA32PIC-NEXT: ld.hu $a1, $a0, 10 303; LA32PIC-NEXT: ld.hu $a0, $a0, 0 304; LA32PIC-NEXT: add.w $a0, $a1, $a0 305; LA32PIC-NEXT: sltu $a1, $a0, $a1 306; LA32PIC-NEXT: ret 307; 308; LA64NOPIC-LABEL: ld_hu: 309; LA64NOPIC: # %bb.0: 310; LA64NOPIC-NEXT: ld.hu $a1, $a0, 10 311; LA64NOPIC-NEXT: ld.hu $a0, $a0, 0 312; LA64NOPIC-NEXT: add.d $a0, $a1, $a0 313; LA64NOPIC-NEXT: ret 314; 315; LA64PIC-LABEL: ld_hu: 316; LA64PIC: # %bb.0: 317; LA64PIC-NEXT: ld.hu $a1, $a0, 10 318; LA64PIC-NEXT: ld.hu $a0, $a0, 0 319; LA64PIC-NEXT: add.d $a0, $a1, $a0 320; LA64PIC-NEXT: ret 321 %1 = getelementptr i16, ptr %a, i64 5 322 %2 = load i16, ptr %1 323 %3 = zext i16 %2 to i64 324 %4 = load volatile i16, ptr %a 325 %5 = zext i16 %4 to i64 326 %6 = add i64 %3, %5 327 ret i64 %6 328} 329 330define i64 @ld_wu(ptr %a) nounwind { 331; LA32NOPIC-LABEL: ld_wu: 332; LA32NOPIC: # %bb.0: 333; LA32NOPIC-NEXT: ld.w $a1, $a0, 20 334; LA32NOPIC-NEXT: ld.w $a0, $a0, 0 335; LA32NOPIC-NEXT: add.w $a0, $a1, $a0 336; LA32NOPIC-NEXT: sltu $a1, $a0, $a1 337; LA32NOPIC-NEXT: ret 338; 339; LA32PIC-LABEL: ld_wu: 340; LA32PIC: # %bb.0: 341; LA32PIC-NEXT: ld.w $a1, $a0, 20 342; LA32PIC-NEXT: ld.w $a0, $a0, 0 343; LA32PIC-NEXT: add.w $a0, $a1, $a0 344; LA32PIC-NEXT: sltu $a1, $a0, $a1 345; LA32PIC-NEXT: ret 346; 347; LA64NOPIC-LABEL: ld_wu: 348; LA64NOPIC: # %bb.0: 349; LA64NOPIC-NEXT: ld.wu $a1, $a0, 20 350; LA64NOPIC-NEXT: ld.wu $a0, $a0, 0 351; LA64NOPIC-NEXT: add.d $a0, $a1, $a0 352; LA64NOPIC-NEXT: ret 353; 354; LA64PIC-LABEL: ld_wu: 355; LA64PIC: # %bb.0: 356; LA64PIC-NEXT: ld.wu $a1, $a0, 20 357; LA64PIC-NEXT: ld.wu $a0, $a0, 0 358; LA64PIC-NEXT: add.d $a0, $a1, $a0 359; LA64PIC-NEXT: ret 360 %1 = getelementptr i32, ptr %a, i64 5 361 %2 = load i32, ptr %1 362 %3 = zext i32 %2 to i64 363 %4 = load volatile i32, ptr %a 364 %5 = zext i32 %4 to i64 365 %6 = add i64 %3, %5 366 ret i64 %6 367} 368 369define i64 @ldx_b(ptr %a, i64 %idx) nounwind { 370; LA32NOPIC-LABEL: ldx_b: 371; LA32NOPIC: # %bb.0: 372; LA32NOPIC-NEXT: add.w $a1, $a0, $a1 373; LA32NOPIC-NEXT: ld.b $a2, $a1, 0 374; LA32NOPIC-NEXT: ld.b $zero, $a0, 0 375; LA32NOPIC-NEXT: srai.w $a1, $a2, 31 376; LA32NOPIC-NEXT: move $a0, $a2 377; LA32NOPIC-NEXT: ret 378; 379; LA32PIC-LABEL: ldx_b: 380; LA32PIC: # %bb.0: 381; LA32PIC-NEXT: add.w $a1, $a0, $a1 382; LA32PIC-NEXT: ld.b $a2, $a1, 0 383; LA32PIC-NEXT: ld.b $zero, $a0, 0 384; LA32PIC-NEXT: srai.w $a1, $a2, 31 385; LA32PIC-NEXT: move $a0, $a2 386; LA32PIC-NEXT: ret 387; 388; LA64NOPIC-LABEL: ldx_b: 389; LA64NOPIC: # %bb.0: 390; LA64NOPIC-NEXT: ldx.b $a1, $a0, $a1 391; LA64NOPIC-NEXT: ld.b $zero, $a0, 0 392; LA64NOPIC-NEXT: move $a0, $a1 393; LA64NOPIC-NEXT: ret 394; 395; LA64PIC-LABEL: ldx_b: 396; LA64PIC: # %bb.0: 397; LA64PIC-NEXT: ldx.b $a1, $a0, $a1 398; LA64PIC-NEXT: ld.b $zero, $a0, 0 399; LA64PIC-NEXT: move $a0, $a1 400; LA64PIC-NEXT: ret 401 %1 = getelementptr i8, ptr %a, i64 %idx 402 %2 = load i8, ptr %1 403 %3 = sext i8 %2 to i64 404 %4 = load volatile i8, ptr %a 405 ret i64 %3 406} 407 408define i64 @ldx_h(ptr %a, i64 %idx) nounwind { 409; LA32NOPIC-LABEL: ldx_h: 410; LA32NOPIC: # %bb.0: 411; LA32NOPIC-NEXT: alsl.w $a1, $a1, $a0, 1 412; LA32NOPIC-NEXT: ld.h $a2, $a1, 0 413; LA32NOPIC-NEXT: ld.h $zero, $a0, 0 414; LA32NOPIC-NEXT: srai.w $a1, $a2, 31 415; LA32NOPIC-NEXT: move $a0, $a2 416; LA32NOPIC-NEXT: ret 417; 418; LA32PIC-LABEL: ldx_h: 419; LA32PIC: # %bb.0: 420; LA32PIC-NEXT: alsl.w $a1, $a1, $a0, 1 421; LA32PIC-NEXT: ld.h $a2, $a1, 0 422; LA32PIC-NEXT: ld.h $zero, $a0, 0 423; LA32PIC-NEXT: srai.w $a1, $a2, 31 424; LA32PIC-NEXT: move $a0, $a2 425; LA32PIC-NEXT: ret 426; 427; LA64NOPIC-LABEL: ldx_h: 428; LA64NOPIC: # %bb.0: 429; LA64NOPIC-NEXT: slli.d $a1, $a1, 1 430; LA64NOPIC-NEXT: ldx.h $a1, $a0, $a1 431; LA64NOPIC-NEXT: ld.h $zero, $a0, 0 432; LA64NOPIC-NEXT: move $a0, $a1 433; LA64NOPIC-NEXT: ret 434; 435; LA64PIC-LABEL: ldx_h: 436; LA64PIC: # %bb.0: 437; LA64PIC-NEXT: slli.d $a1, $a1, 1 438; LA64PIC-NEXT: ldx.h $a1, $a0, $a1 439; LA64PIC-NEXT: ld.h $zero, $a0, 0 440; LA64PIC-NEXT: move $a0, $a1 441; LA64PIC-NEXT: ret 442 %1 = getelementptr i16, ptr %a, i64 %idx 443 %2 = load i16, ptr %1 444 %3 = sext i16 %2 to i64 445 %4 = load volatile i16, ptr %a 446 ret i64 %3 447} 448 449define i64 @ldx_w(ptr %a, i64 %idx) nounwind { 450; LA32NOPIC-LABEL: ldx_w: 451; LA32NOPIC: # %bb.0: 452; LA32NOPIC-NEXT: alsl.w $a1, $a1, $a0, 2 453; LA32NOPIC-NEXT: ld.w $a2, $a1, 0 454; LA32NOPIC-NEXT: ld.w $zero, $a0, 0 455; LA32NOPIC-NEXT: srai.w $a1, $a2, 31 456; LA32NOPIC-NEXT: move $a0, $a2 457; LA32NOPIC-NEXT: ret 458; 459; LA32PIC-LABEL: ldx_w: 460; LA32PIC: # %bb.0: 461; LA32PIC-NEXT: alsl.w $a1, $a1, $a0, 2 462; LA32PIC-NEXT: ld.w $a2, $a1, 0 463; LA32PIC-NEXT: ld.w $zero, $a0, 0 464; LA32PIC-NEXT: srai.w $a1, $a2, 31 465; LA32PIC-NEXT: move $a0, $a2 466; LA32PIC-NEXT: ret 467; 468; LA64NOPIC-LABEL: ldx_w: 469; LA64NOPIC: # %bb.0: 470; LA64NOPIC-NEXT: slli.d $a1, $a1, 2 471; LA64NOPIC-NEXT: ldx.w $a1, $a0, $a1 472; LA64NOPIC-NEXT: ld.w $zero, $a0, 0 473; LA64NOPIC-NEXT: move $a0, $a1 474; LA64NOPIC-NEXT: ret 475; 476; LA64PIC-LABEL: ldx_w: 477; LA64PIC: # %bb.0: 478; LA64PIC-NEXT: slli.d $a1, $a1, 2 479; LA64PIC-NEXT: ldx.w $a1, $a0, $a1 480; LA64PIC-NEXT: ld.w $zero, $a0, 0 481; LA64PIC-NEXT: move $a0, $a1 482; LA64PIC-NEXT: ret 483 %1 = getelementptr i32, ptr %a, i64 %idx 484 %2 = load i32, ptr %1 485 %3 = sext i32 %2 to i64 486 %4 = load volatile i32, ptr %a 487 ret i64 %3 488} 489 490define i64 @ldx_d(ptr %a, i64 %idx) nounwind { 491; LA32NOPIC-LABEL: ldx_d: 492; LA32NOPIC: # %bb.0: 493; LA32NOPIC-NEXT: alsl.w $a1, $a1, $a0, 3 494; LA32NOPIC-NEXT: ld.w $a2, $a1, 0 495; LA32NOPIC-NEXT: ld.w $a1, $a1, 4 496; LA32NOPIC-NEXT: ld.w $zero, $a0, 0 497; LA32NOPIC-NEXT: ld.w $zero, $a0, 4 498; LA32NOPIC-NEXT: move $a0, $a2 499; LA32NOPIC-NEXT: ret 500; 501; LA32PIC-LABEL: ldx_d: 502; LA32PIC: # %bb.0: 503; LA32PIC-NEXT: alsl.w $a1, $a1, $a0, 3 504; LA32PIC-NEXT: ld.w $a2, $a1, 0 505; LA32PIC-NEXT: ld.w $a1, $a1, 4 506; LA32PIC-NEXT: ld.w $zero, $a0, 0 507; LA32PIC-NEXT: ld.w $zero, $a0, 4 508; LA32PIC-NEXT: move $a0, $a2 509; LA32PIC-NEXT: ret 510; 511; LA64NOPIC-LABEL: ldx_d: 512; LA64NOPIC: # %bb.0: 513; LA64NOPIC-NEXT: slli.d $a1, $a1, 3 514; LA64NOPIC-NEXT: ldx.d $a1, $a0, $a1 515; LA64NOPIC-NEXT: ld.d $zero, $a0, 0 516; LA64NOPIC-NEXT: move $a0, $a1 517; LA64NOPIC-NEXT: ret 518; 519; LA64PIC-LABEL: ldx_d: 520; LA64PIC: # %bb.0: 521; LA64PIC-NEXT: slli.d $a1, $a1, 3 522; LA64PIC-NEXT: ldx.d $a1, $a0, $a1 523; LA64PIC-NEXT: ld.d $zero, $a0, 0 524; LA64PIC-NEXT: move $a0, $a1 525; LA64PIC-NEXT: ret 526 %1 = getelementptr i64, ptr %a, i64 %idx 527 %2 = load i64, ptr %1 528 %3 = load volatile i64, ptr %a 529 ret i64 %2 530} 531 532define i64 @ldx_bu(ptr %a, i64 %idx) nounwind { 533; LA32NOPIC-LABEL: ldx_bu: 534; LA32NOPIC: # %bb.0: 535; LA32NOPIC-NEXT: add.w $a1, $a0, $a1 536; LA32NOPIC-NEXT: ld.bu $a1, $a1, 0 537; LA32NOPIC-NEXT: ld.bu $a0, $a0, 0 538; LA32NOPIC-NEXT: add.w $a0, $a1, $a0 539; LA32NOPIC-NEXT: sltu $a1, $a0, $a1 540; LA32NOPIC-NEXT: ret 541; 542; LA32PIC-LABEL: ldx_bu: 543; LA32PIC: # %bb.0: 544; LA32PIC-NEXT: add.w $a1, $a0, $a1 545; LA32PIC-NEXT: ld.bu $a1, $a1, 0 546; LA32PIC-NEXT: ld.bu $a0, $a0, 0 547; LA32PIC-NEXT: add.w $a0, $a1, $a0 548; LA32PIC-NEXT: sltu $a1, $a0, $a1 549; LA32PIC-NEXT: ret 550; 551; LA64NOPIC-LABEL: ldx_bu: 552; LA64NOPIC: # %bb.0: 553; LA64NOPIC-NEXT: ldx.bu $a1, $a0, $a1 554; LA64NOPIC-NEXT: ld.bu $a0, $a0, 0 555; LA64NOPIC-NEXT: add.d $a0, $a1, $a0 556; LA64NOPIC-NEXT: ret 557; 558; LA64PIC-LABEL: ldx_bu: 559; LA64PIC: # %bb.0: 560; LA64PIC-NEXT: ldx.bu $a1, $a0, $a1 561; LA64PIC-NEXT: ld.bu $a0, $a0, 0 562; LA64PIC-NEXT: add.d $a0, $a1, $a0 563; LA64PIC-NEXT: ret 564 %1 = getelementptr i8, ptr %a, i64 %idx 565 %2 = load i8, ptr %1 566 %3 = zext i8 %2 to i64 567 %4 = load volatile i8, ptr %a 568 %5 = zext i8 %4 to i64 569 %6 = add i64 %3, %5 570 ret i64 %6 571} 572 573define i64 @ldx_hu(ptr %a, i64 %idx) nounwind { 574; LA32NOPIC-LABEL: ldx_hu: 575; LA32NOPIC: # %bb.0: 576; LA32NOPIC-NEXT: alsl.w $a1, $a1, $a0, 1 577; LA32NOPIC-NEXT: ld.hu $a1, $a1, 0 578; LA32NOPIC-NEXT: ld.hu $a0, $a0, 0 579; LA32NOPIC-NEXT: add.w $a0, $a1, $a0 580; LA32NOPIC-NEXT: sltu $a1, $a0, $a1 581; LA32NOPIC-NEXT: ret 582; 583; LA32PIC-LABEL: ldx_hu: 584; LA32PIC: # %bb.0: 585; LA32PIC-NEXT: alsl.w $a1, $a1, $a0, 1 586; LA32PIC-NEXT: ld.hu $a1, $a1, 0 587; LA32PIC-NEXT: ld.hu $a0, $a0, 0 588; LA32PIC-NEXT: add.w $a0, $a1, $a0 589; LA32PIC-NEXT: sltu $a1, $a0, $a1 590; LA32PIC-NEXT: ret 591; 592; LA64NOPIC-LABEL: ldx_hu: 593; LA64NOPIC: # %bb.0: 594; LA64NOPIC-NEXT: slli.d $a1, $a1, 1 595; LA64NOPIC-NEXT: ldx.hu $a1, $a0, $a1 596; LA64NOPIC-NEXT: ld.hu $a0, $a0, 0 597; LA64NOPIC-NEXT: add.d $a0, $a1, $a0 598; LA64NOPIC-NEXT: ret 599; 600; LA64PIC-LABEL: ldx_hu: 601; LA64PIC: # %bb.0: 602; LA64PIC-NEXT: slli.d $a1, $a1, 1 603; LA64PIC-NEXT: ldx.hu $a1, $a0, $a1 604; LA64PIC-NEXT: ld.hu $a0, $a0, 0 605; LA64PIC-NEXT: add.d $a0, $a1, $a0 606; LA64PIC-NEXT: ret 607 %1 = getelementptr i16, ptr %a, i64 %idx 608 %2 = load i16, ptr %1 609 %3 = zext i16 %2 to i64 610 %4 = load volatile i16, ptr %a 611 %5 = zext i16 %4 to i64 612 %6 = add i64 %3, %5 613 ret i64 %6 614} 615 616define i64 @ldx_wu(ptr %a, i64 %idx) nounwind { 617; LA32NOPIC-LABEL: ldx_wu: 618; LA32NOPIC: # %bb.0: 619; LA32NOPIC-NEXT: alsl.w $a1, $a1, $a0, 2 620; LA32NOPIC-NEXT: ld.w $a1, $a1, 0 621; LA32NOPIC-NEXT: ld.w $a0, $a0, 0 622; LA32NOPIC-NEXT: add.w $a0, $a1, $a0 623; LA32NOPIC-NEXT: sltu $a1, $a0, $a1 624; LA32NOPIC-NEXT: ret 625; 626; LA32PIC-LABEL: ldx_wu: 627; LA32PIC: # %bb.0: 628; LA32PIC-NEXT: alsl.w $a1, $a1, $a0, 2 629; LA32PIC-NEXT: ld.w $a1, $a1, 0 630; LA32PIC-NEXT: ld.w $a0, $a0, 0 631; LA32PIC-NEXT: add.w $a0, $a1, $a0 632; LA32PIC-NEXT: sltu $a1, $a0, $a1 633; LA32PIC-NEXT: ret 634; 635; LA64NOPIC-LABEL: ldx_wu: 636; LA64NOPIC: # %bb.0: 637; LA64NOPIC-NEXT: slli.d $a1, $a1, 2 638; LA64NOPIC-NEXT: ldx.wu $a1, $a0, $a1 639; LA64NOPIC-NEXT: ld.wu $a0, $a0, 0 640; LA64NOPIC-NEXT: add.d $a0, $a1, $a0 641; LA64NOPIC-NEXT: ret 642; 643; LA64PIC-LABEL: ldx_wu: 644; LA64PIC: # %bb.0: 645; LA64PIC-NEXT: slli.d $a1, $a1, 2 646; LA64PIC-NEXT: ldx.wu $a1, $a0, $a1 647; LA64PIC-NEXT: ld.wu $a0, $a0, 0 648; LA64PIC-NEXT: add.d $a0, $a1, $a0 649; LA64PIC-NEXT: ret 650 %1 = getelementptr i32, ptr %a, i64 %idx 651 %2 = load i32, ptr %1 652 %3 = zext i32 %2 to i64 653 %4 = load volatile i32, ptr %a 654 %5 = zext i32 %4 to i64 655 %6 = add i64 %3, %5 656 ret i64 %6 657} 658 659;; Check indexed and unindexed stores. 660 661define void @st_b(ptr %a, i8 %b) nounwind { 662; ALL-LABEL: st_b: 663; ALL: # %bb.0: 664; ALL-NEXT: st.b $a1, $a0, 0 665; ALL-NEXT: st.b $a1, $a0, 6 666; ALL-NEXT: ret 667 store i8 %b, ptr %a 668 %1 = getelementptr i8, ptr %a, i64 6 669 store i8 %b, ptr %1 670 ret void 671} 672 673define void @st_h(ptr %a, i16 %b) nounwind { 674; ALL-LABEL: st_h: 675; ALL: # %bb.0: 676; ALL-NEXT: st.h $a1, $a0, 0 677; ALL-NEXT: st.h $a1, $a0, 14 678; ALL-NEXT: ret 679 store i16 %b, ptr %a 680 %1 = getelementptr i16, ptr %a, i64 7 681 store i16 %b, ptr %1 682 ret void 683} 684 685define void @st_w(ptr %a, i32 %b) nounwind { 686; ALL-LABEL: st_w: 687; ALL: # %bb.0: 688; ALL-NEXT: st.w $a1, $a0, 0 689; ALL-NEXT: st.w $a1, $a0, 28 690; ALL-NEXT: ret 691 store i32 %b, ptr %a 692 %1 = getelementptr i32, ptr %a, i64 7 693 store i32 %b, ptr %1 694 ret void 695} 696 697define void @st_d(ptr %a, i64 %b) nounwind { 698; LA32NOPIC-LABEL: st_d: 699; LA32NOPIC: # %bb.0: 700; LA32NOPIC-NEXT: st.w $a2, $a0, 4 701; LA32NOPIC-NEXT: st.w $a1, $a0, 0 702; LA32NOPIC-NEXT: st.w $a2, $a0, 68 703; LA32NOPIC-NEXT: st.w $a1, $a0, 64 704; LA32NOPIC-NEXT: ret 705; 706; LA32PIC-LABEL: st_d: 707; LA32PIC: # %bb.0: 708; LA32PIC-NEXT: st.w $a2, $a0, 4 709; LA32PIC-NEXT: st.w $a1, $a0, 0 710; LA32PIC-NEXT: st.w $a2, $a0, 68 711; LA32PIC-NEXT: st.w $a1, $a0, 64 712; LA32PIC-NEXT: ret 713; 714; LA64NOPIC-LABEL: st_d: 715; LA64NOPIC: # %bb.0: 716; LA64NOPIC-NEXT: st.d $a1, $a0, 0 717; LA64NOPIC-NEXT: st.d $a1, $a0, 64 718; LA64NOPIC-NEXT: ret 719; 720; LA64PIC-LABEL: st_d: 721; LA64PIC: # %bb.0: 722; LA64PIC-NEXT: st.d $a1, $a0, 0 723; LA64PIC-NEXT: st.d $a1, $a0, 64 724; LA64PIC-NEXT: ret 725 store i64 %b, ptr %a 726 %1 = getelementptr i64, ptr %a, i64 8 727 store i64 %b, ptr %1 728 ret void 729} 730 731define void @stx_b(ptr %dst, i64 %idx, i8 %val) nounwind { 732; LA32NOPIC-LABEL: stx_b: 733; LA32NOPIC: # %bb.0: 734; LA32NOPIC-NEXT: add.w $a0, $a0, $a1 735; LA32NOPIC-NEXT: st.b $a3, $a0, 0 736; LA32NOPIC-NEXT: ret 737; 738; LA32PIC-LABEL: stx_b: 739; LA32PIC: # %bb.0: 740; LA32PIC-NEXT: add.w $a0, $a0, $a1 741; LA32PIC-NEXT: st.b $a3, $a0, 0 742; LA32PIC-NEXT: ret 743; 744; LA64NOPIC-LABEL: stx_b: 745; LA64NOPIC: # %bb.0: 746; LA64NOPIC-NEXT: stx.b $a2, $a0, $a1 747; LA64NOPIC-NEXT: ret 748; 749; LA64PIC-LABEL: stx_b: 750; LA64PIC: # %bb.0: 751; LA64PIC-NEXT: stx.b $a2, $a0, $a1 752; LA64PIC-NEXT: ret 753 %1 = getelementptr i8, ptr %dst, i64 %idx 754 store i8 %val, ptr %1 755 ret void 756} 757 758define void @stx_h(ptr %dst, i64 %idx, i16 %val) nounwind { 759; LA32NOPIC-LABEL: stx_h: 760; LA32NOPIC: # %bb.0: 761; LA32NOPIC-NEXT: alsl.w $a0, $a1, $a0, 1 762; LA32NOPIC-NEXT: st.h $a3, $a0, 0 763; LA32NOPIC-NEXT: ret 764; 765; LA32PIC-LABEL: stx_h: 766; LA32PIC: # %bb.0: 767; LA32PIC-NEXT: alsl.w $a0, $a1, $a0, 1 768; LA32PIC-NEXT: st.h $a3, $a0, 0 769; LA32PIC-NEXT: ret 770; 771; LA64NOPIC-LABEL: stx_h: 772; LA64NOPIC: # %bb.0: 773; LA64NOPIC-NEXT: slli.d $a1, $a1, 1 774; LA64NOPIC-NEXT: stx.h $a2, $a0, $a1 775; LA64NOPIC-NEXT: ret 776; 777; LA64PIC-LABEL: stx_h: 778; LA64PIC: # %bb.0: 779; LA64PIC-NEXT: slli.d $a1, $a1, 1 780; LA64PIC-NEXT: stx.h $a2, $a0, $a1 781; LA64PIC-NEXT: ret 782 %1 = getelementptr i16, ptr %dst, i64 %idx 783 store i16 %val, ptr %1 784 ret void 785} 786 787define void @stx_w(ptr %dst, i64 %idx, i32 %val) nounwind { 788; LA32NOPIC-LABEL: stx_w: 789; LA32NOPIC: # %bb.0: 790; LA32NOPIC-NEXT: alsl.w $a0, $a1, $a0, 2 791; LA32NOPIC-NEXT: st.w $a3, $a0, 0 792; LA32NOPIC-NEXT: ret 793; 794; LA32PIC-LABEL: stx_w: 795; LA32PIC: # %bb.0: 796; LA32PIC-NEXT: alsl.w $a0, $a1, $a0, 2 797; LA32PIC-NEXT: st.w $a3, $a0, 0 798; LA32PIC-NEXT: ret 799; 800; LA64NOPIC-LABEL: stx_w: 801; LA64NOPIC: # %bb.0: 802; LA64NOPIC-NEXT: slli.d $a1, $a1, 2 803; LA64NOPIC-NEXT: stx.w $a2, $a0, $a1 804; LA64NOPIC-NEXT: ret 805; 806; LA64PIC-LABEL: stx_w: 807; LA64PIC: # %bb.0: 808; LA64PIC-NEXT: slli.d $a1, $a1, 2 809; LA64PIC-NEXT: stx.w $a2, $a0, $a1 810; LA64PIC-NEXT: ret 811 %1 = getelementptr i32, ptr %dst, i64 %idx 812 store i32 %val, ptr %1 813 ret void 814} 815 816define void @stx_d(ptr %dst, i64 %idx, i64 %val) nounwind { 817; LA32NOPIC-LABEL: stx_d: 818; LA32NOPIC: # %bb.0: 819; LA32NOPIC-NEXT: alsl.w $a0, $a1, $a0, 3 820; LA32NOPIC-NEXT: st.w $a4, $a0, 4 821; LA32NOPIC-NEXT: st.w $a3, $a0, 0 822; LA32NOPIC-NEXT: ret 823; 824; LA32PIC-LABEL: stx_d: 825; LA32PIC: # %bb.0: 826; LA32PIC-NEXT: alsl.w $a0, $a1, $a0, 3 827; LA32PIC-NEXT: st.w $a4, $a0, 4 828; LA32PIC-NEXT: st.w $a3, $a0, 0 829; LA32PIC-NEXT: ret 830; 831; LA64NOPIC-LABEL: stx_d: 832; LA64NOPIC: # %bb.0: 833; LA64NOPIC-NEXT: slli.d $a1, $a1, 3 834; LA64NOPIC-NEXT: stx.d $a2, $a0, $a1 835; LA64NOPIC-NEXT: ret 836; 837; LA64PIC-LABEL: stx_d: 838; LA64PIC: # %bb.0: 839; LA64PIC-NEXT: slli.d $a1, $a1, 3 840; LA64PIC-NEXT: stx.d $a2, $a0, $a1 841; LA64PIC-NEXT: ret 842 %1 = getelementptr i64, ptr %dst, i64 %idx 843 store i64 %val, ptr %1 844 ret void 845} 846 847;; Check load from and store to an i1 location. 848define i64 @load_sext_zext_anyext_i1(ptr %a) nounwind { 849; LA32NOPIC-LABEL: load_sext_zext_anyext_i1: 850; LA32NOPIC: # %bb.0: 851; LA32NOPIC-NEXT: ld.bu $a1, $a0, 1 852; LA32NOPIC-NEXT: ld.bu $a3, $a0, 2 853; LA32NOPIC-NEXT: sub.w $a2, $a3, $a1 854; LA32NOPIC-NEXT: ld.b $zero, $a0, 0 855; LA32NOPIC-NEXT: sltu $a0, $a3, $a1 856; LA32NOPIC-NEXT: sub.w $a1, $zero, $a0 857; LA32NOPIC-NEXT: move $a0, $a2 858; LA32NOPIC-NEXT: ret 859; 860; LA32PIC-LABEL: load_sext_zext_anyext_i1: 861; LA32PIC: # %bb.0: 862; LA32PIC-NEXT: ld.bu $a1, $a0, 1 863; LA32PIC-NEXT: ld.bu $a3, $a0, 2 864; LA32PIC-NEXT: sub.w $a2, $a3, $a1 865; LA32PIC-NEXT: ld.b $zero, $a0, 0 866; LA32PIC-NEXT: sltu $a0, $a3, $a1 867; LA32PIC-NEXT: sub.w $a1, $zero, $a0 868; LA32PIC-NEXT: move $a0, $a2 869; LA32PIC-NEXT: ret 870; 871; LA64NOPIC-LABEL: load_sext_zext_anyext_i1: 872; LA64NOPIC: # %bb.0: 873; LA64NOPIC-NEXT: ld.bu $a1, $a0, 1 874; LA64NOPIC-NEXT: ld.bu $a2, $a0, 2 875; LA64NOPIC-NEXT: ld.b $zero, $a0, 0 876; LA64NOPIC-NEXT: sub.d $a0, $a2, $a1 877; LA64NOPIC-NEXT: ret 878; 879; LA64PIC-LABEL: load_sext_zext_anyext_i1: 880; LA64PIC: # %bb.0: 881; LA64PIC-NEXT: ld.bu $a1, $a0, 1 882; LA64PIC-NEXT: ld.bu $a2, $a0, 2 883; LA64PIC-NEXT: ld.b $zero, $a0, 0 884; LA64PIC-NEXT: sub.d $a0, $a2, $a1 885; LA64PIC-NEXT: ret 886 ;; sextload i1 887 %1 = getelementptr i1, ptr %a, i64 1 888 %2 = load i1, ptr %1 889 %3 = sext i1 %2 to i64 890 ;; zextload i1 891 %4 = getelementptr i1, ptr %a, i64 2 892 %5 = load i1, ptr %4 893 %6 = zext i1 %5 to i64 894 %7 = add i64 %3, %6 895 ;; extload i1 (anyext). Produced as the load is unused. 896 %8 = load volatile i1, ptr %a 897 ret i64 %7 898} 899 900define i16 @load_sext_zext_anyext_i1_i16(ptr %a) nounwind { 901; LA32NOPIC-LABEL: load_sext_zext_anyext_i1_i16: 902; LA32NOPIC: # %bb.0: 903; LA32NOPIC-NEXT: ld.bu $a1, $a0, 1 904; LA32NOPIC-NEXT: ld.bu $a2, $a0, 2 905; LA32NOPIC-NEXT: ld.b $zero, $a0, 0 906; LA32NOPIC-NEXT: sub.w $a0, $a2, $a1 907; LA32NOPIC-NEXT: ret 908; 909; LA32PIC-LABEL: load_sext_zext_anyext_i1_i16: 910; LA32PIC: # %bb.0: 911; LA32PIC-NEXT: ld.bu $a1, $a0, 1 912; LA32PIC-NEXT: ld.bu $a2, $a0, 2 913; LA32PIC-NEXT: ld.b $zero, $a0, 0 914; LA32PIC-NEXT: sub.w $a0, $a2, $a1 915; LA32PIC-NEXT: ret 916; 917; LA64NOPIC-LABEL: load_sext_zext_anyext_i1_i16: 918; LA64NOPIC: # %bb.0: 919; LA64NOPIC-NEXT: ld.bu $a1, $a0, 1 920; LA64NOPIC-NEXT: ld.bu $a2, $a0, 2 921; LA64NOPIC-NEXT: ld.b $zero, $a0, 0 922; LA64NOPIC-NEXT: sub.d $a0, $a2, $a1 923; LA64NOPIC-NEXT: ret 924; 925; LA64PIC-LABEL: load_sext_zext_anyext_i1_i16: 926; LA64PIC: # %bb.0: 927; LA64PIC-NEXT: ld.bu $a1, $a0, 1 928; LA64PIC-NEXT: ld.bu $a2, $a0, 2 929; LA64PIC-NEXT: ld.b $zero, $a0, 0 930; LA64PIC-NEXT: sub.d $a0, $a2, $a1 931; LA64PIC-NEXT: ret 932 ;; sextload i1 933 %1 = getelementptr i1, ptr %a, i64 1 934 %2 = load i1, ptr %1 935 %3 = sext i1 %2 to i16 936 ;; zextload i1 937 %4 = getelementptr i1, ptr %a, i64 2 938 %5 = load i1, ptr %4 939 %6 = zext i1 %5 to i16 940 %7 = add i16 %3, %6 941 ;; extload i1 (anyext). Produced as the load is unused. 942 %8 = load volatile i1, ptr %a 943 ret i16 %7 944} 945 946define i64 @ld_sd_constant(i64 %a) nounwind { 947; LA32NOPIC-LABEL: ld_sd_constant: 948; LA32NOPIC: # %bb.0: 949; LA32NOPIC-NEXT: lu12i.w $a3, -136485 950; LA32NOPIC-NEXT: ori $a4, $a3, 3823 951; LA32NOPIC-NEXT: ld.w $a2, $a4, 0 952; LA32NOPIC-NEXT: ori $a5, $a3, 3827 953; LA32NOPIC-NEXT: ld.w $a3, $a5, 0 954; LA32NOPIC-NEXT: st.w $a0, $a4, 0 955; LA32NOPIC-NEXT: st.w $a1, $a5, 0 956; LA32NOPIC-NEXT: move $a0, $a2 957; LA32NOPIC-NEXT: move $a1, $a3 958; LA32NOPIC-NEXT: ret 959; 960; LA32PIC-LABEL: ld_sd_constant: 961; LA32PIC: # %bb.0: 962; LA32PIC-NEXT: lu12i.w $a3, -136485 963; LA32PIC-NEXT: ori $a4, $a3, 3823 964; LA32PIC-NEXT: ld.w $a2, $a4, 0 965; LA32PIC-NEXT: ori $a5, $a3, 3827 966; LA32PIC-NEXT: ld.w $a3, $a5, 0 967; LA32PIC-NEXT: st.w $a0, $a4, 0 968; LA32PIC-NEXT: st.w $a1, $a5, 0 969; LA32PIC-NEXT: move $a0, $a2 970; LA32PIC-NEXT: move $a1, $a3 971; LA32PIC-NEXT: ret 972; 973; LA64NOPIC-LABEL: ld_sd_constant: 974; LA64NOPIC: # %bb.0: 975; LA64NOPIC-NEXT: lu12i.w $a1, -136485 976; LA64NOPIC-NEXT: ori $a2, $a1, 3823 977; LA64NOPIC-NEXT: bstrins.d $a2, $a2, 61, 32 978; LA64NOPIC-NEXT: ld.d $a1, $a2, 0 979; LA64NOPIC-NEXT: st.d $a0, $a2, 0 980; LA64NOPIC-NEXT: move $a0, $a1 981; LA64NOPIC-NEXT: ret 982; 983; LA64PIC-LABEL: ld_sd_constant: 984; LA64PIC: # %bb.0: 985; LA64PIC-NEXT: lu12i.w $a1, -136485 986; LA64PIC-NEXT: ori $a2, $a1, 3823 987; LA64PIC-NEXT: bstrins.d $a2, $a2, 61, 32 988; LA64PIC-NEXT: ld.d $a1, $a2, 0 989; LA64PIC-NEXT: st.d $a0, $a2, 0 990; LA64PIC-NEXT: move $a0, $a1 991; LA64PIC-NEXT: ret 992 %1 = inttoptr i64 16045690984833335023 to ptr 993 %2 = load volatile i64, ptr %1 994 store i64 %a, ptr %1 995 ret i64 %2 996} 997 998;; Check load from and store to a float location. 999define float @load_store_float(ptr %a, float %b) nounwind { 1000; ALL-LABEL: load_store_float: 1001; ALL: # %bb.0: 1002; ALL-NEXT: fld.s $fa1, $a0, 4 1003; ALL-NEXT: fst.s $fa0, $a0, 4 1004; ALL-NEXT: fmov.s $fa0, $fa1 1005; ALL-NEXT: ret 1006 %1 = getelementptr float, ptr %a, i64 1 1007 %2 = load float, ptr %1 1008 store float %b, ptr %1 1009 ret float %2 1010} 1011 1012;; Check load from and store to a double location. 1013define double @load_store_double(ptr %a, double %b) nounwind { 1014; ALL-LABEL: load_store_double: 1015; ALL: # %bb.0: 1016; ALL-NEXT: fld.d $fa1, $a0, 8 1017; ALL-NEXT: fst.d $fa0, $a0, 8 1018; ALL-NEXT: fmov.d $fa0, $fa1 1019; ALL-NEXT: ret 1020 %1 = getelementptr double, ptr %a, i64 1 1021 %2 = load double, ptr %1 1022 store double %b, ptr %1 1023 ret double %2 1024} 1025