@@ -3122,3 +3122,123 @@ define void @callee_no_irq() nounwind{
3122
3122
store volatile [32 x i32 ] %val , [32 x i32 ]* @var_test_irq
3123
3123
ret void
3124
3124
}
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