@@ -3186,3 +3186,129 @@ define half @minimumnum_half(half %x, half %y) {
3186
3186
%z = call half @llvm.minimumnum.f16 (half %x , half %y )
3187
3187
ret half %z
3188
3188
}
3189
+
3190
+ define half @ldexp_half (half %x , i32 signext %y ) nounwind {
3191
+ ; RV32IZFH-LABEL: ldexp_half:
3192
+ ; RV32IZFH: # %bb.0:
3193
+ ; RV32IZFH-NEXT: addi sp, sp, -16
3194
+ ; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3195
+ ; RV32IZFH-NEXT: fcvt.s.h fa0, fa0
3196
+ ; RV32IZFH-NEXT: call ldexpf
3197
+ ; RV32IZFH-NEXT: fcvt.h.s fa0, fa0
3198
+ ; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3199
+ ; RV32IZFH-NEXT: addi sp, sp, 16
3200
+ ; RV32IZFH-NEXT: ret
3201
+ ;
3202
+ ; RV64IZFH-LABEL: ldexp_half:
3203
+ ; RV64IZFH: # %bb.0:
3204
+ ; RV64IZFH-NEXT: addi sp, sp, -16
3205
+ ; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3206
+ ; RV64IZFH-NEXT: fcvt.s.h fa0, fa0
3207
+ ; RV64IZFH-NEXT: call ldexpf
3208
+ ; RV64IZFH-NEXT: fcvt.h.s fa0, fa0
3209
+ ; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3210
+ ; RV64IZFH-NEXT: addi sp, sp, 16
3211
+ ; RV64IZFH-NEXT: ret
3212
+ ;
3213
+ ; RV32IZHINX-LABEL: ldexp_half:
3214
+ ; RV32IZHINX: # %bb.0:
3215
+ ; RV32IZHINX-NEXT: addi sp, sp, -16
3216
+ ; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3217
+ ; RV32IZHINX-NEXT: fcvt.s.h a0, a0
3218
+ ; RV32IZHINX-NEXT: call ldexpf
3219
+ ; RV32IZHINX-NEXT: fcvt.h.s a0, a0
3220
+ ; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3221
+ ; RV32IZHINX-NEXT: addi sp, sp, 16
3222
+ ; RV32IZHINX-NEXT: ret
3223
+ ;
3224
+ ; RV64IZHINX-LABEL: ldexp_half:
3225
+ ; RV64IZHINX: # %bb.0:
3226
+ ; RV64IZHINX-NEXT: addi sp, sp, -16
3227
+ ; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3228
+ ; RV64IZHINX-NEXT: fcvt.s.h a0, a0
3229
+ ; RV64IZHINX-NEXT: call ldexpf
3230
+ ; RV64IZHINX-NEXT: fcvt.h.s a0, a0
3231
+ ; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3232
+ ; RV64IZHINX-NEXT: addi sp, sp, 16
3233
+ ; RV64IZHINX-NEXT: ret
3234
+ ;
3235
+ ; RV32I-LABEL: ldexp_half:
3236
+ ; RV32I: # %bb.0:
3237
+ ; RV32I-NEXT: addi sp, sp, -16
3238
+ ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3239
+ ; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
3240
+ ; RV32I-NEXT: mv s0, a1
3241
+ ; RV32I-NEXT: slli a0, a0, 16
3242
+ ; RV32I-NEXT: srli a0, a0, 16
3243
+ ; RV32I-NEXT: call __extendhfsf2
3244
+ ; RV32I-NEXT: mv a1, s0
3245
+ ; RV32I-NEXT: call ldexpf
3246
+ ; RV32I-NEXT: call __truncsfhf2
3247
+ ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3248
+ ; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
3249
+ ; RV32I-NEXT: addi sp, sp, 16
3250
+ ; RV32I-NEXT: ret
3251
+ ;
3252
+ ; RV64I-LABEL: ldexp_half:
3253
+ ; RV64I: # %bb.0:
3254
+ ; RV64I-NEXT: addi sp, sp, -16
3255
+ ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3256
+ ; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
3257
+ ; RV64I-NEXT: mv s0, a1
3258
+ ; RV64I-NEXT: slli a0, a0, 48
3259
+ ; RV64I-NEXT: srli a0, a0, 48
3260
+ ; RV64I-NEXT: call __extendhfsf2
3261
+ ; RV64I-NEXT: mv a1, s0
3262
+ ; RV64I-NEXT: call ldexpf
3263
+ ; RV64I-NEXT: call __truncsfhf2
3264
+ ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3265
+ ; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
3266
+ ; RV64I-NEXT: addi sp, sp, 16
3267
+ ; RV64I-NEXT: ret
3268
+ ;
3269
+ ; RV32IZFHMIN-LABEL: ldexp_half:
3270
+ ; RV32IZFHMIN: # %bb.0:
3271
+ ; RV32IZFHMIN-NEXT: addi sp, sp, -16
3272
+ ; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3273
+ ; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3274
+ ; RV32IZFHMIN-NEXT: call ldexpf
3275
+ ; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3276
+ ; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3277
+ ; RV32IZFHMIN-NEXT: addi sp, sp, 16
3278
+ ; RV32IZFHMIN-NEXT: ret
3279
+ ;
3280
+ ; RV64IZFHMIN-LABEL: ldexp_half:
3281
+ ; RV64IZFHMIN: # %bb.0:
3282
+ ; RV64IZFHMIN-NEXT: addi sp, sp, -16
3283
+ ; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3284
+ ; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3285
+ ; RV64IZFHMIN-NEXT: call ldexpf
3286
+ ; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3287
+ ; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3288
+ ; RV64IZFHMIN-NEXT: addi sp, sp, 16
3289
+ ; RV64IZFHMIN-NEXT: ret
3290
+ ;
3291
+ ; RV32IZHINXMIN-LABEL: ldexp_half:
3292
+ ; RV32IZHINXMIN: # %bb.0:
3293
+ ; RV32IZHINXMIN-NEXT: addi sp, sp, -16
3294
+ ; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3295
+ ; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0
3296
+ ; RV32IZHINXMIN-NEXT: call ldexpf
3297
+ ; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0
3298
+ ; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3299
+ ; RV32IZHINXMIN-NEXT: addi sp, sp, 16
3300
+ ; RV32IZHINXMIN-NEXT: ret
3301
+ ;
3302
+ ; RV64IZHINXMIN-LABEL: ldexp_half:
3303
+ ; RV64IZHINXMIN: # %bb.0:
3304
+ ; RV64IZHINXMIN-NEXT: addi sp, sp, -16
3305
+ ; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3306
+ ; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0
3307
+ ; RV64IZHINXMIN-NEXT: call ldexpf
3308
+ ; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0
3309
+ ; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3310
+ ; RV64IZHINXMIN-NEXT: addi sp, sp, 16
3311
+ ; RV64IZHINXMIN-NEXT: ret
3312
+ %z = call half @llvm.ldexp.f16.i32 (half %x , i32 %y )
3313
+ ret half %z
3314
+ }
0 commit comments