brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.5 KiB · 973eb9f Raw
704 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple riscv32-unknown-elf -o - %s \3; RUN: 2>&1 | FileCheck %s -check-prefix CHECK-RV324; RUN: llc -mtriple riscv32-unknown-elf -mattr=+f -o - %s \5; RUN: 2>&1 | FileCheck %s -check-prefix CHECK-RV32IF6; RUN: llc -mtriple riscv32-unknown-elf -mattr=+f,+d -o - %s \7; RUN: 2>&1 | FileCheck %s -check-prefix CHECK-RV32IFD8;9; TODO: Add RV64 tests when we can lower global addresses.10 11; Checking all registers that are used are being saved.12; This includes Caller (arguments and temps) and13; Callee saved registers.14;15; extern int a, b, c;16; __attribute__((interrupt)) void foo_no_call(void) {17;   c = a + b;18; }19;20 21@a = external global i3222@b = external global i3223@c = external global i3224 25define void @foo_i32() nounwind #0 {26; CHECK-RV32-LABEL: foo_i32:27; CHECK-RV32:       # %bb.0:28; CHECK-RV32-NEXT:    addi sp, sp, -1629; CHECK-RV32-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill30; CHECK-RV32-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill31; CHECK-RV32-NEXT:    lui a0, %hi(a)32; CHECK-RV32-NEXT:    lui a1, %hi(b)33; CHECK-RV32-NEXT:    lw a0, %lo(a)(a0)34; CHECK-RV32-NEXT:    lw a1, %lo(b)(a1)35; CHECK-RV32-NEXT:    add a0, a1, a036; CHECK-RV32-NEXT:    lui a1, %hi(c)37; CHECK-RV32-NEXT:    sw a0, %lo(c)(a1)38; CHECK-RV32-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload39; CHECK-RV32-NEXT:    lw a1, 8(sp) # 4-byte Folded Reload40; CHECK-RV32-NEXT:    addi sp, sp, 1641; CHECK-RV32-NEXT:    mret42;43; CHECK-RV32IF-LABEL: foo_i32:44; CHECK-RV32IF:       # %bb.0:45; CHECK-RV32IF-NEXT:    addi sp, sp, -1646; CHECK-RV32IF-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill47; CHECK-RV32IF-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill48; CHECK-RV32IF-NEXT:    lui a0, %hi(a)49; CHECK-RV32IF-NEXT:    lui a1, %hi(b)50; CHECK-RV32IF-NEXT:    lw a0, %lo(a)(a0)51; CHECK-RV32IF-NEXT:    lw a1, %lo(b)(a1)52; CHECK-RV32IF-NEXT:    add a0, a1, a053; CHECK-RV32IF-NEXT:    lui a1, %hi(c)54; CHECK-RV32IF-NEXT:    sw a0, %lo(c)(a1)55; CHECK-RV32IF-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload56; CHECK-RV32IF-NEXT:    lw a1, 8(sp) # 4-byte Folded Reload57; CHECK-RV32IF-NEXT:    addi sp, sp, 1658; CHECK-RV32IF-NEXT:    mret59;60; CHECK-RV32IFD-LABEL: foo_i32:61; CHECK-RV32IFD:       # %bb.0:62; CHECK-RV32IFD-NEXT:    addi sp, sp, -1663; CHECK-RV32IFD-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill64; CHECK-RV32IFD-NEXT:    sw a1, 8(sp) # 4-byte Folded Spill65; CHECK-RV32IFD-NEXT:    lui a0, %hi(a)66; CHECK-RV32IFD-NEXT:    lui a1, %hi(b)67; CHECK-RV32IFD-NEXT:    lw a0, %lo(a)(a0)68; CHECK-RV32IFD-NEXT:    lw a1, %lo(b)(a1)69; CHECK-RV32IFD-NEXT:    add a0, a1, a070; CHECK-RV32IFD-NEXT:    lui a1, %hi(c)71; CHECK-RV32IFD-NEXT:    sw a0, %lo(c)(a1)72; CHECK-RV32IFD-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload73; CHECK-RV32IFD-NEXT:    lw a1, 8(sp) # 4-byte Folded Reload74; CHECK-RV32IFD-NEXT:    addi sp, sp, 1675; CHECK-RV32IFD-NEXT:    mret76  %1 = load i32, ptr @a77  %2 = load i32, ptr @b78  %add = add nsw i32 %2, %179  store i32 %add, ptr @c80  ret void81}82 83;84; Additionally check frame pointer and return address are properly saved.85;86 87define void @foo_fp_i32() nounwind #1 {88; CHECK-RV32-LABEL: foo_fp_i32:89; CHECK-RV32:       # %bb.0:90; CHECK-RV32-NEXT:    addi sp, sp, -1691; CHECK-RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill92; CHECK-RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill93; CHECK-RV32-NEXT:    sw a0, 4(sp) # 4-byte Folded Spill94; CHECK-RV32-NEXT:    sw a1, 0(sp) # 4-byte Folded Spill95; CHECK-RV32-NEXT:    addi s0, sp, 1696; CHECK-RV32-NEXT:    lui a0, %hi(a)97; CHECK-RV32-NEXT:    lui a1, %hi(b)98; CHECK-RV32-NEXT:    lw a0, %lo(a)(a0)99; CHECK-RV32-NEXT:    lw a1, %lo(b)(a1)100; CHECK-RV32-NEXT:    add a0, a1, a0101; CHECK-RV32-NEXT:    lui a1, %hi(c)102; CHECK-RV32-NEXT:    sw a0, %lo(c)(a1)103; CHECK-RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload104; CHECK-RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload105; CHECK-RV32-NEXT:    lw a0, 4(sp) # 4-byte Folded Reload106; CHECK-RV32-NEXT:    lw a1, 0(sp) # 4-byte Folded Reload107; CHECK-RV32-NEXT:    addi sp, sp, 16108; CHECK-RV32-NEXT:    mret109;110; CHECK-RV32IF-LABEL: foo_fp_i32:111; CHECK-RV32IF:       # %bb.0:112; CHECK-RV32IF-NEXT:    addi sp, sp, -16113; CHECK-RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill114; CHECK-RV32IF-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill115; CHECK-RV32IF-NEXT:    sw a0, 4(sp) # 4-byte Folded Spill116; CHECK-RV32IF-NEXT:    sw a1, 0(sp) # 4-byte Folded Spill117; CHECK-RV32IF-NEXT:    addi s0, sp, 16118; CHECK-RV32IF-NEXT:    lui a0, %hi(a)119; CHECK-RV32IF-NEXT:    lui a1, %hi(b)120; CHECK-RV32IF-NEXT:    lw a0, %lo(a)(a0)121; CHECK-RV32IF-NEXT:    lw a1, %lo(b)(a1)122; CHECK-RV32IF-NEXT:    add a0, a1, a0123; CHECK-RV32IF-NEXT:    lui a1, %hi(c)124; CHECK-RV32IF-NEXT:    sw a0, %lo(c)(a1)125; CHECK-RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload126; CHECK-RV32IF-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload127; CHECK-RV32IF-NEXT:    lw a0, 4(sp) # 4-byte Folded Reload128; CHECK-RV32IF-NEXT:    lw a1, 0(sp) # 4-byte Folded Reload129; CHECK-RV32IF-NEXT:    addi sp, sp, 16130; CHECK-RV32IF-NEXT:    mret131;132; CHECK-RV32IFD-LABEL: foo_fp_i32:133; CHECK-RV32IFD:       # %bb.0:134; CHECK-RV32IFD-NEXT:    addi sp, sp, -16135; CHECK-RV32IFD-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill136; CHECK-RV32IFD-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill137; CHECK-RV32IFD-NEXT:    sw a0, 4(sp) # 4-byte Folded Spill138; CHECK-RV32IFD-NEXT:    sw a1, 0(sp) # 4-byte Folded Spill139; CHECK-RV32IFD-NEXT:    addi s0, sp, 16140; CHECK-RV32IFD-NEXT:    lui a0, %hi(a)141; CHECK-RV32IFD-NEXT:    lui a1, %hi(b)142; CHECK-RV32IFD-NEXT:    lw a0, %lo(a)(a0)143; CHECK-RV32IFD-NEXT:    lw a1, %lo(b)(a1)144; CHECK-RV32IFD-NEXT:    add a0, a1, a0145; CHECK-RV32IFD-NEXT:    lui a1, %hi(c)146; CHECK-RV32IFD-NEXT:    sw a0, %lo(c)(a1)147; CHECK-RV32IFD-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload148; CHECK-RV32IFD-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload149; CHECK-RV32IFD-NEXT:    lw a0, 4(sp) # 4-byte Folded Reload150; CHECK-RV32IFD-NEXT:    lw a1, 0(sp) # 4-byte Folded Reload151; CHECK-RV32IFD-NEXT:    addi sp, sp, 16152; CHECK-RV32IFD-NEXT:    mret153  %1 = load i32, ptr @a154  %2 = load i32, ptr @b155  %add = add nsw i32 %2, %1156  store i32 %add, ptr @c157  ret void158}159 160@e = external global float161@f = external global float162@d = external global float163 164define void @foo_float() nounwind #0 {165; CHECK-RV32-LABEL: foo_float:166; CHECK-RV32:       # %bb.0:167; CHECK-RV32-NEXT:    addi sp, sp, -64168; CHECK-RV32-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill169; CHECK-RV32-NEXT:    sw t0, 56(sp) # 4-byte Folded Spill170; CHECK-RV32-NEXT:    sw t1, 52(sp) # 4-byte Folded Spill171; CHECK-RV32-NEXT:    sw t2, 48(sp) # 4-byte Folded Spill172; CHECK-RV32-NEXT:    sw a0, 44(sp) # 4-byte Folded Spill173; CHECK-RV32-NEXT:    sw a1, 40(sp) # 4-byte Folded Spill174; CHECK-RV32-NEXT:    sw a2, 36(sp) # 4-byte Folded Spill175; CHECK-RV32-NEXT:    sw a3, 32(sp) # 4-byte Folded Spill176; CHECK-RV32-NEXT:    sw a4, 28(sp) # 4-byte Folded Spill177; CHECK-RV32-NEXT:    sw a5, 24(sp) # 4-byte Folded Spill178; CHECK-RV32-NEXT:    sw a6, 20(sp) # 4-byte Folded Spill179; CHECK-RV32-NEXT:    sw a7, 16(sp) # 4-byte Folded Spill180; CHECK-RV32-NEXT:    sw t3, 12(sp) # 4-byte Folded Spill181; CHECK-RV32-NEXT:    sw t4, 8(sp) # 4-byte Folded Spill182; CHECK-RV32-NEXT:    sw t5, 4(sp) # 4-byte Folded Spill183; CHECK-RV32-NEXT:    sw t6, 0(sp) # 4-byte Folded Spill184; CHECK-RV32-NEXT:    lui a0, %hi(e)185; CHECK-RV32-NEXT:    lui a1, %hi(f)186; CHECK-RV32-NEXT:    lw a0, %lo(e)(a0)187; CHECK-RV32-NEXT:    lw a1, %lo(f)(a1)188; CHECK-RV32-NEXT:    call __addsf3189; CHECK-RV32-NEXT:    lui a1, %hi(d)190; CHECK-RV32-NEXT:    sw a0, %lo(d)(a1)191; CHECK-RV32-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload192; CHECK-RV32-NEXT:    lw t0, 56(sp) # 4-byte Folded Reload193; CHECK-RV32-NEXT:    lw t1, 52(sp) # 4-byte Folded Reload194; CHECK-RV32-NEXT:    lw t2, 48(sp) # 4-byte Folded Reload195; CHECK-RV32-NEXT:    lw a0, 44(sp) # 4-byte Folded Reload196; CHECK-RV32-NEXT:    lw a1, 40(sp) # 4-byte Folded Reload197; CHECK-RV32-NEXT:    lw a2, 36(sp) # 4-byte Folded Reload198; CHECK-RV32-NEXT:    lw a3, 32(sp) # 4-byte Folded Reload199; CHECK-RV32-NEXT:    lw a4, 28(sp) # 4-byte Folded Reload200; CHECK-RV32-NEXT:    lw a5, 24(sp) # 4-byte Folded Reload201; CHECK-RV32-NEXT:    lw a6, 20(sp) # 4-byte Folded Reload202; CHECK-RV32-NEXT:    lw a7, 16(sp) # 4-byte Folded Reload203; CHECK-RV32-NEXT:    lw t3, 12(sp) # 4-byte Folded Reload204; CHECK-RV32-NEXT:    lw t4, 8(sp) # 4-byte Folded Reload205; CHECK-RV32-NEXT:    lw t5, 4(sp) # 4-byte Folded Reload206; CHECK-RV32-NEXT:    lw t6, 0(sp) # 4-byte Folded Reload207; CHECK-RV32-NEXT:    addi sp, sp, 64208; CHECK-RV32-NEXT:    mret209;210; CHECK-RV32IF-LABEL: foo_float:211; CHECK-RV32IF:       # %bb.0:212; CHECK-RV32IF-NEXT:    addi sp, sp, -16213; CHECK-RV32IF-NEXT:    sw a0, 12(sp) # 4-byte Folded Spill214; CHECK-RV32IF-NEXT:    fsw fa4, 8(sp) # 4-byte Folded Spill215; CHECK-RV32IF-NEXT:    fsw fa5, 4(sp) # 4-byte Folded Spill216; CHECK-RV32IF-NEXT:    lui a0, %hi(e)217; CHECK-RV32IF-NEXT:    flw fa5, %lo(e)(a0)218; CHECK-RV32IF-NEXT:    lui a0, %hi(f)219; CHECK-RV32IF-NEXT:    flw fa4, %lo(f)(a0)220; CHECK-RV32IF-NEXT:    fadd.s fa5, fa5, fa4221; CHECK-RV32IF-NEXT:    lui a0, %hi(d)222; CHECK-RV32IF-NEXT:    fsw fa5, %lo(d)(a0)223; CHECK-RV32IF-NEXT:    lw a0, 12(sp) # 4-byte Folded Reload224; CHECK-RV32IF-NEXT:    flw fa4, 8(sp) # 4-byte Folded Reload225; CHECK-RV32IF-NEXT:    flw fa5, 4(sp) # 4-byte Folded Reload226; CHECK-RV32IF-NEXT:    addi sp, sp, 16227; CHECK-RV32IF-NEXT:    mret228;229; CHECK-RV32IFD-LABEL: foo_float:230; CHECK-RV32IFD:       # %bb.0:231; CHECK-RV32IFD-NEXT:    addi sp, sp, -32232; CHECK-RV32IFD-NEXT:    sw a0, 28(sp) # 4-byte Folded Spill233; CHECK-RV32IFD-NEXT:    fsd fa4, 16(sp) # 8-byte Folded Spill234; CHECK-RV32IFD-NEXT:    fsd fa5, 8(sp) # 8-byte Folded Spill235; CHECK-RV32IFD-NEXT:    lui a0, %hi(e)236; CHECK-RV32IFD-NEXT:    flw fa5, %lo(e)(a0)237; CHECK-RV32IFD-NEXT:    lui a0, %hi(f)238; CHECK-RV32IFD-NEXT:    flw fa4, %lo(f)(a0)239; CHECK-RV32IFD-NEXT:    fadd.s fa5, fa5, fa4240; CHECK-RV32IFD-NEXT:    lui a0, %hi(d)241; CHECK-RV32IFD-NEXT:    fsw fa5, %lo(d)(a0)242; CHECK-RV32IFD-NEXT:    lw a0, 28(sp) # 4-byte Folded Reload243; CHECK-RV32IFD-NEXT:    fld fa4, 16(sp) # 8-byte Folded Reload244; CHECK-RV32IFD-NEXT:    fld fa5, 8(sp) # 8-byte Folded Reload245; CHECK-RV32IFD-NEXT:    addi sp, sp, 32246; CHECK-RV32IFD-NEXT:    mret247  %1 = load float, ptr @e248  %2 = load float, ptr @f249  %add = fadd float %1, %2250  store float %add, ptr @d251  ret void252}253 254;255; Additionally check frame pointer and return address are properly saved.256;257define void @foo_fp_float() nounwind #1 {258; CHECK-RV32-LABEL: foo_fp_float:259; CHECK-RV32:       # %bb.0:260; CHECK-RV32-NEXT:    addi sp, sp, -80261; CHECK-RV32-NEXT:    sw ra, 76(sp) # 4-byte Folded Spill262; CHECK-RV32-NEXT:    sw t0, 72(sp) # 4-byte Folded Spill263; CHECK-RV32-NEXT:    sw t1, 68(sp) # 4-byte Folded Spill264; CHECK-RV32-NEXT:    sw t2, 64(sp) # 4-byte Folded Spill265; CHECK-RV32-NEXT:    sw s0, 60(sp) # 4-byte Folded Spill266; CHECK-RV32-NEXT:    sw a0, 56(sp) # 4-byte Folded Spill267; CHECK-RV32-NEXT:    sw a1, 52(sp) # 4-byte Folded Spill268; CHECK-RV32-NEXT:    sw a2, 48(sp) # 4-byte Folded Spill269; CHECK-RV32-NEXT:    sw a3, 44(sp) # 4-byte Folded Spill270; CHECK-RV32-NEXT:    sw a4, 40(sp) # 4-byte Folded Spill271; CHECK-RV32-NEXT:    sw a5, 36(sp) # 4-byte Folded Spill272; CHECK-RV32-NEXT:    sw a6, 32(sp) # 4-byte Folded Spill273; CHECK-RV32-NEXT:    sw a7, 28(sp) # 4-byte Folded Spill274; CHECK-RV32-NEXT:    sw t3, 24(sp) # 4-byte Folded Spill275; CHECK-RV32-NEXT:    sw t4, 20(sp) # 4-byte Folded Spill276; CHECK-RV32-NEXT:    sw t5, 16(sp) # 4-byte Folded Spill277; CHECK-RV32-NEXT:    sw t6, 12(sp) # 4-byte Folded Spill278; CHECK-RV32-NEXT:    addi s0, sp, 80279; CHECK-RV32-NEXT:    lui a0, %hi(e)280; CHECK-RV32-NEXT:    lui a1, %hi(f)281; CHECK-RV32-NEXT:    lw a0, %lo(e)(a0)282; CHECK-RV32-NEXT:    lw a1, %lo(f)(a1)283; CHECK-RV32-NEXT:    call __addsf3284; CHECK-RV32-NEXT:    lui a1, %hi(d)285; CHECK-RV32-NEXT:    sw a0, %lo(d)(a1)286; CHECK-RV32-NEXT:    lw ra, 76(sp) # 4-byte Folded Reload287; CHECK-RV32-NEXT:    lw t0, 72(sp) # 4-byte Folded Reload288; CHECK-RV32-NEXT:    lw t1, 68(sp) # 4-byte Folded Reload289; CHECK-RV32-NEXT:    lw t2, 64(sp) # 4-byte Folded Reload290; CHECK-RV32-NEXT:    lw s0, 60(sp) # 4-byte Folded Reload291; CHECK-RV32-NEXT:    lw a0, 56(sp) # 4-byte Folded Reload292; CHECK-RV32-NEXT:    lw a1, 52(sp) # 4-byte Folded Reload293; CHECK-RV32-NEXT:    lw a2, 48(sp) # 4-byte Folded Reload294; CHECK-RV32-NEXT:    lw a3, 44(sp) # 4-byte Folded Reload295; CHECK-RV32-NEXT:    lw a4, 40(sp) # 4-byte Folded Reload296; CHECK-RV32-NEXT:    lw a5, 36(sp) # 4-byte Folded Reload297; CHECK-RV32-NEXT:    lw a6, 32(sp) # 4-byte Folded Reload298; CHECK-RV32-NEXT:    lw a7, 28(sp) # 4-byte Folded Reload299; CHECK-RV32-NEXT:    lw t3, 24(sp) # 4-byte Folded Reload300; CHECK-RV32-NEXT:    lw t4, 20(sp) # 4-byte Folded Reload301; CHECK-RV32-NEXT:    lw t5, 16(sp) # 4-byte Folded Reload302; CHECK-RV32-NEXT:    lw t6, 12(sp) # 4-byte Folded Reload303; CHECK-RV32-NEXT:    addi sp, sp, 80304; CHECK-RV32-NEXT:    mret305;306; CHECK-RV32IF-LABEL: foo_fp_float:307; CHECK-RV32IF:       # %bb.0:308; CHECK-RV32IF-NEXT:    addi sp, sp, -32309; CHECK-RV32IF-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill310; CHECK-RV32IF-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill311; CHECK-RV32IF-NEXT:    sw a0, 20(sp) # 4-byte Folded Spill312; CHECK-RV32IF-NEXT:    fsw fa4, 16(sp) # 4-byte Folded Spill313; CHECK-RV32IF-NEXT:    fsw fa5, 12(sp) # 4-byte Folded Spill314; CHECK-RV32IF-NEXT:    addi s0, sp, 32315; CHECK-RV32IF-NEXT:    lui a0, %hi(e)316; CHECK-RV32IF-NEXT:    flw fa5, %lo(e)(a0)317; CHECK-RV32IF-NEXT:    lui a0, %hi(f)318; CHECK-RV32IF-NEXT:    flw fa4, %lo(f)(a0)319; CHECK-RV32IF-NEXT:    fadd.s fa5, fa5, fa4320; CHECK-RV32IF-NEXT:    lui a0, %hi(d)321; CHECK-RV32IF-NEXT:    fsw fa5, %lo(d)(a0)322; CHECK-RV32IF-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload323; CHECK-RV32IF-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload324; CHECK-RV32IF-NEXT:    lw a0, 20(sp) # 4-byte Folded Reload325; CHECK-RV32IF-NEXT:    flw fa4, 16(sp) # 4-byte Folded Reload326; CHECK-RV32IF-NEXT:    flw fa5, 12(sp) # 4-byte Folded Reload327; CHECK-RV32IF-NEXT:    addi sp, sp, 32328; CHECK-RV32IF-NEXT:    mret329;330; CHECK-RV32IFD-LABEL: foo_fp_float:331; CHECK-RV32IFD:       # %bb.0:332; CHECK-RV32IFD-NEXT:    addi sp, sp, -32333; CHECK-RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill334; CHECK-RV32IFD-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill335; CHECK-RV32IFD-NEXT:    sw a0, 20(sp) # 4-byte Folded Spill336; CHECK-RV32IFD-NEXT:    fsd fa4, 8(sp) # 8-byte Folded Spill337; CHECK-RV32IFD-NEXT:    fsd fa5, 0(sp) # 8-byte Folded Spill338; CHECK-RV32IFD-NEXT:    addi s0, sp, 32339; CHECK-RV32IFD-NEXT:    lui a0, %hi(e)340; CHECK-RV32IFD-NEXT:    flw fa5, %lo(e)(a0)341; CHECK-RV32IFD-NEXT:    lui a0, %hi(f)342; CHECK-RV32IFD-NEXT:    flw fa4, %lo(f)(a0)343; CHECK-RV32IFD-NEXT:    fadd.s fa5, fa5, fa4344; CHECK-RV32IFD-NEXT:    lui a0, %hi(d)345; CHECK-RV32IFD-NEXT:    fsw fa5, %lo(d)(a0)346; CHECK-RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload347; CHECK-RV32IFD-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload348; CHECK-RV32IFD-NEXT:    lw a0, 20(sp) # 4-byte Folded Reload349; CHECK-RV32IFD-NEXT:    fld fa4, 8(sp) # 8-byte Folded Reload350; CHECK-RV32IFD-NEXT:    fld fa5, 0(sp) # 8-byte Folded Reload351; CHECK-RV32IFD-NEXT:    addi sp, sp, 32352; CHECK-RV32IFD-NEXT:    mret353  %1 = load float, ptr @e354  %2 = load float, ptr @f355  %add = fadd float %1, %2356  store float %add, ptr @d357  ret void358}359 360@h = external global double361@i = external global double362@g = external global double363 364define void @foo_double() nounwind #0 {365; CHECK-RV32-LABEL: foo_double:366; CHECK-RV32:       # %bb.0:367; CHECK-RV32-NEXT:    addi sp, sp, -64368; CHECK-RV32-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill369; CHECK-RV32-NEXT:    sw t0, 56(sp) # 4-byte Folded Spill370; CHECK-RV32-NEXT:    sw t1, 52(sp) # 4-byte Folded Spill371; CHECK-RV32-NEXT:    sw t2, 48(sp) # 4-byte Folded Spill372; CHECK-RV32-NEXT:    sw a0, 44(sp) # 4-byte Folded Spill373; CHECK-RV32-NEXT:    sw a1, 40(sp) # 4-byte Folded Spill374; CHECK-RV32-NEXT:    sw a2, 36(sp) # 4-byte Folded Spill375; CHECK-RV32-NEXT:    sw a3, 32(sp) # 4-byte Folded Spill376; CHECK-RV32-NEXT:    sw a4, 28(sp) # 4-byte Folded Spill377; CHECK-RV32-NEXT:    sw a5, 24(sp) # 4-byte Folded Spill378; CHECK-RV32-NEXT:    sw a6, 20(sp) # 4-byte Folded Spill379; CHECK-RV32-NEXT:    sw a7, 16(sp) # 4-byte Folded Spill380; CHECK-RV32-NEXT:    sw t3, 12(sp) # 4-byte Folded Spill381; CHECK-RV32-NEXT:    sw t4, 8(sp) # 4-byte Folded Spill382; CHECK-RV32-NEXT:    sw t5, 4(sp) # 4-byte Folded Spill383; CHECK-RV32-NEXT:    sw t6, 0(sp) # 4-byte Folded Spill384; CHECK-RV32-NEXT:    lui a1, %hi(h)385; CHECK-RV32-NEXT:    lui a3, %hi(i)386; CHECK-RV32-NEXT:    lw a0, %lo(h)(a1)387; CHECK-RV32-NEXT:    lw a1, %lo(h+4)(a1)388; CHECK-RV32-NEXT:    lw a2, %lo(i)(a3)389; CHECK-RV32-NEXT:    lw a3, %lo(i+4)(a3)390; CHECK-RV32-NEXT:    call __adddf3391; CHECK-RV32-NEXT:    lui a2, %hi(g)392; CHECK-RV32-NEXT:    sw a1, %lo(g+4)(a2)393; CHECK-RV32-NEXT:    sw a0, %lo(g)(a2)394; CHECK-RV32-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload395; CHECK-RV32-NEXT:    lw t0, 56(sp) # 4-byte Folded Reload396; CHECK-RV32-NEXT:    lw t1, 52(sp) # 4-byte Folded Reload397; CHECK-RV32-NEXT:    lw t2, 48(sp) # 4-byte Folded Reload398; CHECK-RV32-NEXT:    lw a0, 44(sp) # 4-byte Folded Reload399; CHECK-RV32-NEXT:    lw a1, 40(sp) # 4-byte Folded Reload400; CHECK-RV32-NEXT:    lw a2, 36(sp) # 4-byte Folded Reload401; CHECK-RV32-NEXT:    lw a3, 32(sp) # 4-byte Folded Reload402; CHECK-RV32-NEXT:    lw a4, 28(sp) # 4-byte Folded Reload403; CHECK-RV32-NEXT:    lw a5, 24(sp) # 4-byte Folded Reload404; CHECK-RV32-NEXT:    lw a6, 20(sp) # 4-byte Folded Reload405; CHECK-RV32-NEXT:    lw a7, 16(sp) # 4-byte Folded Reload406; CHECK-RV32-NEXT:    lw t3, 12(sp) # 4-byte Folded Reload407; CHECK-RV32-NEXT:    lw t4, 8(sp) # 4-byte Folded Reload408; CHECK-RV32-NEXT:    lw t5, 4(sp) # 4-byte Folded Reload409; CHECK-RV32-NEXT:    lw t6, 0(sp) # 4-byte Folded Reload410; CHECK-RV32-NEXT:    addi sp, sp, 64411; CHECK-RV32-NEXT:    mret412;413; CHECK-RV32IF-LABEL: foo_double:414; CHECK-RV32IF:       # %bb.0:415; CHECK-RV32IF-NEXT:    addi sp, sp, -144416; CHECK-RV32IF-NEXT:    sw ra, 140(sp) # 4-byte Folded Spill417; CHECK-RV32IF-NEXT:    sw t0, 136(sp) # 4-byte Folded Spill418; CHECK-RV32IF-NEXT:    sw t1, 132(sp) # 4-byte Folded Spill419; CHECK-RV32IF-NEXT:    sw t2, 128(sp) # 4-byte Folded Spill420; CHECK-RV32IF-NEXT:    sw a0, 124(sp) # 4-byte Folded Spill421; CHECK-RV32IF-NEXT:    sw a1, 120(sp) # 4-byte Folded Spill422; CHECK-RV32IF-NEXT:    sw a2, 116(sp) # 4-byte Folded Spill423; CHECK-RV32IF-NEXT:    sw a3, 112(sp) # 4-byte Folded Spill424; CHECK-RV32IF-NEXT:    sw a4, 108(sp) # 4-byte Folded Spill425; CHECK-RV32IF-NEXT:    sw a5, 104(sp) # 4-byte Folded Spill426; CHECK-RV32IF-NEXT:    sw a6, 100(sp) # 4-byte Folded Spill427; CHECK-RV32IF-NEXT:    sw a7, 96(sp) # 4-byte Folded Spill428; CHECK-RV32IF-NEXT:    sw t3, 92(sp) # 4-byte Folded Spill429; CHECK-RV32IF-NEXT:    sw t4, 88(sp) # 4-byte Folded Spill430; CHECK-RV32IF-NEXT:    sw t5, 84(sp) # 4-byte Folded Spill431; CHECK-RV32IF-NEXT:    sw t6, 80(sp) # 4-byte Folded Spill432; CHECK-RV32IF-NEXT:    fsw ft0, 76(sp) # 4-byte Folded Spill433; CHECK-RV32IF-NEXT:    fsw ft1, 72(sp) # 4-byte Folded Spill434; CHECK-RV32IF-NEXT:    fsw ft2, 68(sp) # 4-byte Folded Spill435; CHECK-RV32IF-NEXT:    fsw ft3, 64(sp) # 4-byte Folded Spill436; CHECK-RV32IF-NEXT:    fsw ft4, 60(sp) # 4-byte Folded Spill437; CHECK-RV32IF-NEXT:    fsw ft5, 56(sp) # 4-byte Folded Spill438; CHECK-RV32IF-NEXT:    fsw ft6, 52(sp) # 4-byte Folded Spill439; CHECK-RV32IF-NEXT:    fsw ft7, 48(sp) # 4-byte Folded Spill440; CHECK-RV32IF-NEXT:    fsw fa0, 44(sp) # 4-byte Folded Spill441; CHECK-RV32IF-NEXT:    fsw fa1, 40(sp) # 4-byte Folded Spill442; CHECK-RV32IF-NEXT:    fsw fa2, 36(sp) # 4-byte Folded Spill443; CHECK-RV32IF-NEXT:    fsw fa3, 32(sp) # 4-byte Folded Spill444; CHECK-RV32IF-NEXT:    fsw fa4, 28(sp) # 4-byte Folded Spill445; CHECK-RV32IF-NEXT:    fsw fa5, 24(sp) # 4-byte Folded Spill446; CHECK-RV32IF-NEXT:    fsw fa6, 20(sp) # 4-byte Folded Spill447; CHECK-RV32IF-NEXT:    fsw fa7, 16(sp) # 4-byte Folded Spill448; CHECK-RV32IF-NEXT:    fsw ft8, 12(sp) # 4-byte Folded Spill449; CHECK-RV32IF-NEXT:    fsw ft9, 8(sp) # 4-byte Folded Spill450; CHECK-RV32IF-NEXT:    fsw ft10, 4(sp) # 4-byte Folded Spill451; CHECK-RV32IF-NEXT:    fsw ft11, 0(sp) # 4-byte Folded Spill452; CHECK-RV32IF-NEXT:    lui a1, %hi(h)453; CHECK-RV32IF-NEXT:    lui a3, %hi(i)454; CHECK-RV32IF-NEXT:    lw a0, %lo(h)(a1)455; CHECK-RV32IF-NEXT:    lw a1, %lo(h+4)(a1)456; CHECK-RV32IF-NEXT:    lw a2, %lo(i)(a3)457; CHECK-RV32IF-NEXT:    lw a3, %lo(i+4)(a3)458; CHECK-RV32IF-NEXT:    call __adddf3459; CHECK-RV32IF-NEXT:    lui a2, %hi(g)460; CHECK-RV32IF-NEXT:    sw a1, %lo(g+4)(a2)461; CHECK-RV32IF-NEXT:    sw a0, %lo(g)(a2)462; CHECK-RV32IF-NEXT:    lw ra, 140(sp) # 4-byte Folded Reload463; CHECK-RV32IF-NEXT:    lw t0, 136(sp) # 4-byte Folded Reload464; CHECK-RV32IF-NEXT:    lw t1, 132(sp) # 4-byte Folded Reload465; CHECK-RV32IF-NEXT:    lw t2, 128(sp) # 4-byte Folded Reload466; CHECK-RV32IF-NEXT:    lw a0, 124(sp) # 4-byte Folded Reload467; CHECK-RV32IF-NEXT:    lw a1, 120(sp) # 4-byte Folded Reload468; CHECK-RV32IF-NEXT:    lw a2, 116(sp) # 4-byte Folded Reload469; CHECK-RV32IF-NEXT:    lw a3, 112(sp) # 4-byte Folded Reload470; CHECK-RV32IF-NEXT:    lw a4, 108(sp) # 4-byte Folded Reload471; CHECK-RV32IF-NEXT:    lw a5, 104(sp) # 4-byte Folded Reload472; CHECK-RV32IF-NEXT:    lw a6, 100(sp) # 4-byte Folded Reload473; CHECK-RV32IF-NEXT:    lw a7, 96(sp) # 4-byte Folded Reload474; CHECK-RV32IF-NEXT:    lw t3, 92(sp) # 4-byte Folded Reload475; CHECK-RV32IF-NEXT:    lw t4, 88(sp) # 4-byte Folded Reload476; CHECK-RV32IF-NEXT:    lw t5, 84(sp) # 4-byte Folded Reload477; CHECK-RV32IF-NEXT:    lw t6, 80(sp) # 4-byte Folded Reload478; CHECK-RV32IF-NEXT:    flw ft0, 76(sp) # 4-byte Folded Reload479; CHECK-RV32IF-NEXT:    flw ft1, 72(sp) # 4-byte Folded Reload480; CHECK-RV32IF-NEXT:    flw ft2, 68(sp) # 4-byte Folded Reload481; CHECK-RV32IF-NEXT:    flw ft3, 64(sp) # 4-byte Folded Reload482; CHECK-RV32IF-NEXT:    flw ft4, 60(sp) # 4-byte Folded Reload483; CHECK-RV32IF-NEXT:    flw ft5, 56(sp) # 4-byte Folded Reload484; CHECK-RV32IF-NEXT:    flw ft6, 52(sp) # 4-byte Folded Reload485; CHECK-RV32IF-NEXT:    flw ft7, 48(sp) # 4-byte Folded Reload486; CHECK-RV32IF-NEXT:    flw fa0, 44(sp) # 4-byte Folded Reload487; CHECK-RV32IF-NEXT:    flw fa1, 40(sp) # 4-byte Folded Reload488; CHECK-RV32IF-NEXT:    flw fa2, 36(sp) # 4-byte Folded Reload489; CHECK-RV32IF-NEXT:    flw fa3, 32(sp) # 4-byte Folded Reload490; CHECK-RV32IF-NEXT:    flw fa4, 28(sp) # 4-byte Folded Reload491; CHECK-RV32IF-NEXT:    flw fa5, 24(sp) # 4-byte Folded Reload492; CHECK-RV32IF-NEXT:    flw fa6, 20(sp) # 4-byte Folded Reload493; CHECK-RV32IF-NEXT:    flw fa7, 16(sp) # 4-byte Folded Reload494; CHECK-RV32IF-NEXT:    flw ft8, 12(sp) # 4-byte Folded Reload495; CHECK-RV32IF-NEXT:    flw ft9, 8(sp) # 4-byte Folded Reload496; CHECK-RV32IF-NEXT:    flw ft10, 4(sp) # 4-byte Folded Reload497; CHECK-RV32IF-NEXT:    flw ft11, 0(sp) # 4-byte Folded Reload498; CHECK-RV32IF-NEXT:    addi sp, sp, 144499; CHECK-RV32IF-NEXT:    mret500;501; CHECK-RV32IFD-LABEL: foo_double:502; CHECK-RV32IFD:       # %bb.0:503; CHECK-RV32IFD-NEXT:    addi sp, sp, -32504; CHECK-RV32IFD-NEXT:    sw a0, 28(sp) # 4-byte Folded Spill505; CHECK-RV32IFD-NEXT:    fsd fa4, 16(sp) # 8-byte Folded Spill506; CHECK-RV32IFD-NEXT:    fsd fa5, 8(sp) # 8-byte Folded Spill507; CHECK-RV32IFD-NEXT:    lui a0, %hi(h)508; CHECK-RV32IFD-NEXT:    fld fa5, %lo(h)(a0)509; CHECK-RV32IFD-NEXT:    lui a0, %hi(i)510; CHECK-RV32IFD-NEXT:    fld fa4, %lo(i)(a0)511; CHECK-RV32IFD-NEXT:    fadd.d fa5, fa5, fa4512; CHECK-RV32IFD-NEXT:    lui a0, %hi(g)513; CHECK-RV32IFD-NEXT:    fsd fa5, %lo(g)(a0)514; CHECK-RV32IFD-NEXT:    lw a0, 28(sp) # 4-byte Folded Reload515; CHECK-RV32IFD-NEXT:    fld fa4, 16(sp) # 8-byte Folded Reload516; CHECK-RV32IFD-NEXT:    fld fa5, 8(sp) # 8-byte Folded Reload517; CHECK-RV32IFD-NEXT:    addi sp, sp, 32518; CHECK-RV32IFD-NEXT:    mret519  %1 = load double, ptr @h520  %2 = load double, ptr @i521  %add = fadd double %1, %2522  store double %add, ptr @g523  ret void524}525 526;527; Additionally check frame pointer and return address are properly saved.528;529define void @foo_fp_double() nounwind #1 {530; CHECK-RV32-LABEL: foo_fp_double:531; CHECK-RV32:       # %bb.0:532; CHECK-RV32-NEXT:    addi sp, sp, -80533; CHECK-RV32-NEXT:    sw ra, 76(sp) # 4-byte Folded Spill534; CHECK-RV32-NEXT:    sw t0, 72(sp) # 4-byte Folded Spill535; CHECK-RV32-NEXT:    sw t1, 68(sp) # 4-byte Folded Spill536; CHECK-RV32-NEXT:    sw t2, 64(sp) # 4-byte Folded Spill537; CHECK-RV32-NEXT:    sw s0, 60(sp) # 4-byte Folded Spill538; CHECK-RV32-NEXT:    sw a0, 56(sp) # 4-byte Folded Spill539; CHECK-RV32-NEXT:    sw a1, 52(sp) # 4-byte Folded Spill540; CHECK-RV32-NEXT:    sw a2, 48(sp) # 4-byte Folded Spill541; CHECK-RV32-NEXT:    sw a3, 44(sp) # 4-byte Folded Spill542; CHECK-RV32-NEXT:    sw a4, 40(sp) # 4-byte Folded Spill543; CHECK-RV32-NEXT:    sw a5, 36(sp) # 4-byte Folded Spill544; CHECK-RV32-NEXT:    sw a6, 32(sp) # 4-byte Folded Spill545; CHECK-RV32-NEXT:    sw a7, 28(sp) # 4-byte Folded Spill546; CHECK-RV32-NEXT:    sw t3, 24(sp) # 4-byte Folded Spill547; CHECK-RV32-NEXT:    sw t4, 20(sp) # 4-byte Folded Spill548; CHECK-RV32-NEXT:    sw t5, 16(sp) # 4-byte Folded Spill549; CHECK-RV32-NEXT:    sw t6, 12(sp) # 4-byte Folded Spill550; CHECK-RV32-NEXT:    addi s0, sp, 80551; CHECK-RV32-NEXT:    lui a1, %hi(h)552; CHECK-RV32-NEXT:    lui a3, %hi(i)553; CHECK-RV32-NEXT:    lw a0, %lo(h)(a1)554; CHECK-RV32-NEXT:    lw a1, %lo(h+4)(a1)555; CHECK-RV32-NEXT:    lw a2, %lo(i)(a3)556; CHECK-RV32-NEXT:    lw a3, %lo(i+4)(a3)557; CHECK-RV32-NEXT:    call __adddf3558; CHECK-RV32-NEXT:    lui a2, %hi(g)559; CHECK-RV32-NEXT:    sw a1, %lo(g+4)(a2)560; CHECK-RV32-NEXT:    sw a0, %lo(g)(a2)561; CHECK-RV32-NEXT:    lw ra, 76(sp) # 4-byte Folded Reload562; CHECK-RV32-NEXT:    lw t0, 72(sp) # 4-byte Folded Reload563; CHECK-RV32-NEXT:    lw t1, 68(sp) # 4-byte Folded Reload564; CHECK-RV32-NEXT:    lw t2, 64(sp) # 4-byte Folded Reload565; CHECK-RV32-NEXT:    lw s0, 60(sp) # 4-byte Folded Reload566; CHECK-RV32-NEXT:    lw a0, 56(sp) # 4-byte Folded Reload567; CHECK-RV32-NEXT:    lw a1, 52(sp) # 4-byte Folded Reload568; CHECK-RV32-NEXT:    lw a2, 48(sp) # 4-byte Folded Reload569; CHECK-RV32-NEXT:    lw a3, 44(sp) # 4-byte Folded Reload570; CHECK-RV32-NEXT:    lw a4, 40(sp) # 4-byte Folded Reload571; CHECK-RV32-NEXT:    lw a5, 36(sp) # 4-byte Folded Reload572; CHECK-RV32-NEXT:    lw a6, 32(sp) # 4-byte Folded Reload573; CHECK-RV32-NEXT:    lw a7, 28(sp) # 4-byte Folded Reload574; CHECK-RV32-NEXT:    lw t3, 24(sp) # 4-byte Folded Reload575; CHECK-RV32-NEXT:    lw t4, 20(sp) # 4-byte Folded Reload576; CHECK-RV32-NEXT:    lw t5, 16(sp) # 4-byte Folded Reload577; CHECK-RV32-NEXT:    lw t6, 12(sp) # 4-byte Folded Reload578; CHECK-RV32-NEXT:    addi sp, sp, 80579; CHECK-RV32-NEXT:    mret580;581; CHECK-RV32IF-LABEL: foo_fp_double:582; CHECK-RV32IF:       # %bb.0:583; CHECK-RV32IF-NEXT:    addi sp, sp, -160584; CHECK-RV32IF-NEXT:    sw ra, 156(sp) # 4-byte Folded Spill585; CHECK-RV32IF-NEXT:    sw t0, 152(sp) # 4-byte Folded Spill586; CHECK-RV32IF-NEXT:    sw t1, 148(sp) # 4-byte Folded Spill587; CHECK-RV32IF-NEXT:    sw t2, 144(sp) # 4-byte Folded Spill588; CHECK-RV32IF-NEXT:    sw s0, 140(sp) # 4-byte Folded Spill589; CHECK-RV32IF-NEXT:    sw a0, 136(sp) # 4-byte Folded Spill590; CHECK-RV32IF-NEXT:    sw a1, 132(sp) # 4-byte Folded Spill591; CHECK-RV32IF-NEXT:    sw a2, 128(sp) # 4-byte Folded Spill592; CHECK-RV32IF-NEXT:    sw a3, 124(sp) # 4-byte Folded Spill593; CHECK-RV32IF-NEXT:    sw a4, 120(sp) # 4-byte Folded Spill594; CHECK-RV32IF-NEXT:    sw a5, 116(sp) # 4-byte Folded Spill595; CHECK-RV32IF-NEXT:    sw a6, 112(sp) # 4-byte Folded Spill596; CHECK-RV32IF-NEXT:    sw a7, 108(sp) # 4-byte Folded Spill597; CHECK-RV32IF-NEXT:    sw t3, 104(sp) # 4-byte Folded Spill598; CHECK-RV32IF-NEXT:    sw t4, 100(sp) # 4-byte Folded Spill599; CHECK-RV32IF-NEXT:    sw t5, 96(sp) # 4-byte Folded Spill600; CHECK-RV32IF-NEXT:    sw t6, 92(sp) # 4-byte Folded Spill601; CHECK-RV32IF-NEXT:    fsw ft0, 88(sp) # 4-byte Folded Spill602; CHECK-RV32IF-NEXT:    fsw ft1, 84(sp) # 4-byte Folded Spill603; CHECK-RV32IF-NEXT:    fsw ft2, 80(sp) # 4-byte Folded Spill604; CHECK-RV32IF-NEXT:    fsw ft3, 76(sp) # 4-byte Folded Spill605; CHECK-RV32IF-NEXT:    fsw ft4, 72(sp) # 4-byte Folded Spill606; CHECK-RV32IF-NEXT:    fsw ft5, 68(sp) # 4-byte Folded Spill607; CHECK-RV32IF-NEXT:    fsw ft6, 64(sp) # 4-byte Folded Spill608; CHECK-RV32IF-NEXT:    fsw ft7, 60(sp) # 4-byte Folded Spill609; CHECK-RV32IF-NEXT:    fsw fa0, 56(sp) # 4-byte Folded Spill610; CHECK-RV32IF-NEXT:    fsw fa1, 52(sp) # 4-byte Folded Spill611; CHECK-RV32IF-NEXT:    fsw fa2, 48(sp) # 4-byte Folded Spill612; CHECK-RV32IF-NEXT:    fsw fa3, 44(sp) # 4-byte Folded Spill613; CHECK-RV32IF-NEXT:    fsw fa4, 40(sp) # 4-byte Folded Spill614; CHECK-RV32IF-NEXT:    fsw fa5, 36(sp) # 4-byte Folded Spill615; CHECK-RV32IF-NEXT:    fsw fa6, 32(sp) # 4-byte Folded Spill616; CHECK-RV32IF-NEXT:    fsw fa7, 28(sp) # 4-byte Folded Spill617; CHECK-RV32IF-NEXT:    fsw ft8, 24(sp) # 4-byte Folded Spill618; CHECK-RV32IF-NEXT:    fsw ft9, 20(sp) # 4-byte Folded Spill619; CHECK-RV32IF-NEXT:    fsw ft10, 16(sp) # 4-byte Folded Spill620; CHECK-RV32IF-NEXT:    fsw ft11, 12(sp) # 4-byte Folded Spill621; CHECK-RV32IF-NEXT:    addi s0, sp, 160622; CHECK-RV32IF-NEXT:    lui a1, %hi(h)623; CHECK-RV32IF-NEXT:    lui a3, %hi(i)624; CHECK-RV32IF-NEXT:    lw a0, %lo(h)(a1)625; CHECK-RV32IF-NEXT:    lw a1, %lo(h+4)(a1)626; CHECK-RV32IF-NEXT:    lw a2, %lo(i)(a3)627; CHECK-RV32IF-NEXT:    lw a3, %lo(i+4)(a3)628; CHECK-RV32IF-NEXT:    call __adddf3629; CHECK-RV32IF-NEXT:    lui a2, %hi(g)630; CHECK-RV32IF-NEXT:    sw a1, %lo(g+4)(a2)631; CHECK-RV32IF-NEXT:    sw a0, %lo(g)(a2)632; CHECK-RV32IF-NEXT:    lw ra, 156(sp) # 4-byte Folded Reload633; CHECK-RV32IF-NEXT:    lw t0, 152(sp) # 4-byte Folded Reload634; CHECK-RV32IF-NEXT:    lw t1, 148(sp) # 4-byte Folded Reload635; CHECK-RV32IF-NEXT:    lw t2, 144(sp) # 4-byte Folded Reload636; CHECK-RV32IF-NEXT:    lw s0, 140(sp) # 4-byte Folded Reload637; CHECK-RV32IF-NEXT:    lw a0, 136(sp) # 4-byte Folded Reload638; CHECK-RV32IF-NEXT:    lw a1, 132(sp) # 4-byte Folded Reload639; CHECK-RV32IF-NEXT:    lw a2, 128(sp) # 4-byte Folded Reload640; CHECK-RV32IF-NEXT:    lw a3, 124(sp) # 4-byte Folded Reload641; CHECK-RV32IF-NEXT:    lw a4, 120(sp) # 4-byte Folded Reload642; CHECK-RV32IF-NEXT:    lw a5, 116(sp) # 4-byte Folded Reload643; CHECK-RV32IF-NEXT:    lw a6, 112(sp) # 4-byte Folded Reload644; CHECK-RV32IF-NEXT:    lw a7, 108(sp) # 4-byte Folded Reload645; CHECK-RV32IF-NEXT:    lw t3, 104(sp) # 4-byte Folded Reload646; CHECK-RV32IF-NEXT:    lw t4, 100(sp) # 4-byte Folded Reload647; CHECK-RV32IF-NEXT:    lw t5, 96(sp) # 4-byte Folded Reload648; CHECK-RV32IF-NEXT:    lw t6, 92(sp) # 4-byte Folded Reload649; CHECK-RV32IF-NEXT:    flw ft0, 88(sp) # 4-byte Folded Reload650; CHECK-RV32IF-NEXT:    flw ft1, 84(sp) # 4-byte Folded Reload651; CHECK-RV32IF-NEXT:    flw ft2, 80(sp) # 4-byte Folded Reload652; CHECK-RV32IF-NEXT:    flw ft3, 76(sp) # 4-byte Folded Reload653; CHECK-RV32IF-NEXT:    flw ft4, 72(sp) # 4-byte Folded Reload654; CHECK-RV32IF-NEXT:    flw ft5, 68(sp) # 4-byte Folded Reload655; CHECK-RV32IF-NEXT:    flw ft6, 64(sp) # 4-byte Folded Reload656; CHECK-RV32IF-NEXT:    flw ft7, 60(sp) # 4-byte Folded Reload657; CHECK-RV32IF-NEXT:    flw fa0, 56(sp) # 4-byte Folded Reload658; CHECK-RV32IF-NEXT:    flw fa1, 52(sp) # 4-byte Folded Reload659; CHECK-RV32IF-NEXT:    flw fa2, 48(sp) # 4-byte Folded Reload660; CHECK-RV32IF-NEXT:    flw fa3, 44(sp) # 4-byte Folded Reload661; CHECK-RV32IF-NEXT:    flw fa4, 40(sp) # 4-byte Folded Reload662; CHECK-RV32IF-NEXT:    flw fa5, 36(sp) # 4-byte Folded Reload663; CHECK-RV32IF-NEXT:    flw fa6, 32(sp) # 4-byte Folded Reload664; CHECK-RV32IF-NEXT:    flw fa7, 28(sp) # 4-byte Folded Reload665; CHECK-RV32IF-NEXT:    flw ft8, 24(sp) # 4-byte Folded Reload666; CHECK-RV32IF-NEXT:    flw ft9, 20(sp) # 4-byte Folded Reload667; CHECK-RV32IF-NEXT:    flw ft10, 16(sp) # 4-byte Folded Reload668; CHECK-RV32IF-NEXT:    flw ft11, 12(sp) # 4-byte Folded Reload669; CHECK-RV32IF-NEXT:    addi sp, sp, 160670; CHECK-RV32IF-NEXT:    mret671;672; CHECK-RV32IFD-LABEL: foo_fp_double:673; CHECK-RV32IFD:       # %bb.0:674; CHECK-RV32IFD-NEXT:    addi sp, sp, -32675; CHECK-RV32IFD-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill676; CHECK-RV32IFD-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill677; CHECK-RV32IFD-NEXT:    sw a0, 20(sp) # 4-byte Folded Spill678; CHECK-RV32IFD-NEXT:    fsd fa4, 8(sp) # 8-byte Folded Spill679; CHECK-RV32IFD-NEXT:    fsd fa5, 0(sp) # 8-byte Folded Spill680; CHECK-RV32IFD-NEXT:    addi s0, sp, 32681; CHECK-RV32IFD-NEXT:    lui a0, %hi(h)682; CHECK-RV32IFD-NEXT:    fld fa5, %lo(h)(a0)683; CHECK-RV32IFD-NEXT:    lui a0, %hi(i)684; CHECK-RV32IFD-NEXT:    fld fa4, %lo(i)(a0)685; CHECK-RV32IFD-NEXT:    fadd.d fa5, fa5, fa4686; CHECK-RV32IFD-NEXT:    lui a0, %hi(g)687; CHECK-RV32IFD-NEXT:    fsd fa5, %lo(g)(a0)688; CHECK-RV32IFD-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload689; CHECK-RV32IFD-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload690; CHECK-RV32IFD-NEXT:    lw a0, 20(sp) # 4-byte Folded Reload691; CHECK-RV32IFD-NEXT:    fld fa4, 8(sp) # 8-byte Folded Reload692; CHECK-RV32IFD-NEXT:    fld fa5, 0(sp) # 8-byte Folded Reload693; CHECK-RV32IFD-NEXT:    addi sp, sp, 32694; CHECK-RV32IFD-NEXT:    mret695  %1 = load double, ptr @h696  %2 = load double, ptr @i697  %add = fadd double %1, %2698  store double %add, ptr @g699  ret void700}701 702attributes #0 = { "interrupt"="machine" }703attributes #1 = { "interrupt"="machine" "frame-pointer"="all" }704