@@ -3122,3 +3122,123 @@ define void @callee_no_irq() nounwind{
31223122 store volatile [32 x i32 ] %val , [32 x i32 ]* @var_test_irq
31233123 ret void
31243124}
3125+
3126+ declare void @bar (ptr , ptr )
3127+ declare ptr @llvm.frameaddress.p0 (i32 immarg)
3128+
3129+ define i32 @use_fp (i32 %x ) {
3130+ ; RV32IZCMP-LABEL: use_fp:
3131+ ; RV32IZCMP: # %bb.0: # %entry
3132+ ; RV32IZCMP-NEXT: cm.push {ra, s0-s1}, -32
3133+ ; RV32IZCMP-NEXT: .cfi_def_cfa_offset 32
3134+ ; RV32IZCMP-NEXT: .cfi_offset ra, -12
3135+ ; RV32IZCMP-NEXT: .cfi_offset s0, -8
3136+ ; RV32IZCMP-NEXT: .cfi_offset s1, -4
3137+ ; RV32IZCMP-NEXT: addi s0, sp, 32
3138+ ; RV32IZCMP-NEXT: .cfi_def_cfa s0, 0
3139+ ; RV32IZCMP-NEXT: mv s1, a0
3140+ ; RV32IZCMP-NEXT: addi a1, s0, -20
3141+ ; RV32IZCMP-NEXT: mv a0, s0
3142+ ; RV32IZCMP-NEXT: call bar@plt
3143+ ; RV32IZCMP-NEXT: mv a0, s1
3144+ ; RV32IZCMP-NEXT: cm.popret {ra, s0-s1}, 32
3145+ ;
3146+ ; RV64IZCMP-LABEL: use_fp:
3147+ ; RV64IZCMP: # %bb.0: # %entry
3148+ ; RV64IZCMP-NEXT: cm.push {ra, s0-s1}, -48
3149+ ; RV64IZCMP-NEXT: .cfi_def_cfa_offset 48
3150+ ; RV64IZCMP-NEXT: .cfi_offset ra, -24
3151+ ; RV64IZCMP-NEXT: .cfi_offset s0, -16
3152+ ; RV64IZCMP-NEXT: .cfi_offset s1, -8
3153+ ; RV64IZCMP-NEXT: addi s0, sp, 48
3154+ ; RV64IZCMP-NEXT: .cfi_def_cfa s0, 0
3155+ ; RV64IZCMP-NEXT: mv s1, a0
3156+ ; RV64IZCMP-NEXT: addi a1, s0, -36
3157+ ; RV64IZCMP-NEXT: mv a0, s0
3158+ ; RV64IZCMP-NEXT: call bar@plt
3159+ ; RV64IZCMP-NEXT: mv a0, s1
3160+ ; RV64IZCMP-NEXT: cm.popret {ra, s0-s1}, 48
3161+ ;
3162+ ; RV32IZCMP-SR-LABEL: use_fp:
3163+ ; RV32IZCMP-SR: # %bb.0: # %entry
3164+ ; RV32IZCMP-SR-NEXT: cm.push {ra, s0-s1}, -32
3165+ ; RV32IZCMP-SR-NEXT: .cfi_def_cfa_offset 32
3166+ ; RV32IZCMP-SR-NEXT: .cfi_offset ra, -12
3167+ ; RV32IZCMP-SR-NEXT: .cfi_offset s0, -8
3168+ ; RV32IZCMP-SR-NEXT: .cfi_offset s1, -4
3169+ ; RV32IZCMP-SR-NEXT: addi s0, sp, 32
3170+ ; RV32IZCMP-SR-NEXT: .cfi_def_cfa s0, 0
3171+ ; RV32IZCMP-SR-NEXT: mv s1, a0
3172+ ; RV32IZCMP-SR-NEXT: addi a1, s0, -20
3173+ ; RV32IZCMP-SR-NEXT: mv a0, s0
3174+ ; RV32IZCMP-SR-NEXT: call bar@plt
3175+ ; RV32IZCMP-SR-NEXT: mv a0, s1
3176+ ; RV32IZCMP-SR-NEXT: cm.popret {ra, s0-s1}, 32
3177+ ;
3178+ ; RV64IZCMP-SR-LABEL: use_fp:
3179+ ; RV64IZCMP-SR: # %bb.0: # %entry
3180+ ; RV64IZCMP-SR-NEXT: cm.push {ra, s0-s1}, -48
3181+ ; RV64IZCMP-SR-NEXT: .cfi_def_cfa_offset 48
3182+ ; RV64IZCMP-SR-NEXT: .cfi_offset ra, -24
3183+ ; RV64IZCMP-SR-NEXT: .cfi_offset s0, -16
3184+ ; RV64IZCMP-SR-NEXT: .cfi_offset s1, -8
3185+ ; RV64IZCMP-SR-NEXT: addi s0, sp, 48
3186+ ; RV64IZCMP-SR-NEXT: .cfi_def_cfa s0, 0
3187+ ; RV64IZCMP-SR-NEXT: mv s1, a0
3188+ ; RV64IZCMP-SR-NEXT: addi a1, s0, -36
3189+ ; RV64IZCMP-SR-NEXT: mv a0, s0
3190+ ; RV64IZCMP-SR-NEXT: call bar@plt
3191+ ; RV64IZCMP-SR-NEXT: mv a0, s1
3192+ ; RV64IZCMP-SR-NEXT: cm.popret {ra, s0-s1}, 48
3193+ ;
3194+ ; RV32I-LABEL: use_fp:
3195+ ; RV32I: # %bb.0: # %entry
3196+ ; RV32I-NEXT: addi sp, sp, -16
3197+ ; RV32I-NEXT: .cfi_def_cfa_offset 16
3198+ ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3199+ ; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
3200+ ; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
3201+ ; RV32I-NEXT: .cfi_offset ra, -4
3202+ ; RV32I-NEXT: .cfi_offset s0, -8
3203+ ; RV32I-NEXT: .cfi_offset s1, -12
3204+ ; RV32I-NEXT: addi s0, sp, 16
3205+ ; RV32I-NEXT: .cfi_def_cfa s0, 0
3206+ ; RV32I-NEXT: mv s1, a0
3207+ ; RV32I-NEXT: addi a1, s0, -16
3208+ ; RV32I-NEXT: mv a0, s0
3209+ ; RV32I-NEXT: call bar@plt
3210+ ; RV32I-NEXT: mv a0, s1
3211+ ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3212+ ; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
3213+ ; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
3214+ ; RV32I-NEXT: addi sp, sp, 16
3215+ ; RV32I-NEXT: ret
3216+ ;
3217+ ; RV64I-LABEL: use_fp:
3218+ ; RV64I: # %bb.0: # %entry
3219+ ; RV64I-NEXT: addi sp, sp, -32
3220+ ; RV64I-NEXT: .cfi_def_cfa_offset 32
3221+ ; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
3222+ ; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
3223+ ; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
3224+ ; RV64I-NEXT: .cfi_offset ra, -8
3225+ ; RV64I-NEXT: .cfi_offset s0, -16
3226+ ; RV64I-NEXT: .cfi_offset s1, -24
3227+ ; RV64I-NEXT: addi s0, sp, 32
3228+ ; RV64I-NEXT: .cfi_def_cfa s0, 0
3229+ ; RV64I-NEXT: mv s1, a0
3230+ ; RV64I-NEXT: addi a1, s0, -28
3231+ ; RV64I-NEXT: mv a0, s0
3232+ ; RV64I-NEXT: call bar@plt
3233+ ; RV64I-NEXT: mv a0, s1
3234+ ; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
3235+ ; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
3236+ ; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
3237+ ; RV64I-NEXT: addi sp, sp, 32
3238+ ; RV64I-NEXT: ret
3239+ entry:
3240+ %var = alloca i32 , align 4
3241+ %0 = tail call ptr @llvm.frameaddress.p0 (i32 0 )
3242+ call void @bar (ptr %0 , ptr %var )
3243+ ret i32 %x
3244+ }
0 commit comments