https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/148677
None >From c6aabe2d44b7839c7afec4030baa77a9dc4f8bc8 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Tue, 15 Jul 2025 02:06:39 +0900 Subject: [PATCH] Mips: Add frexp intrinsic test --- llvm/test/CodeGen/Mips/llvm.frexp.ll | 676 +++++++++++++++++++++++++++ 1 file changed, 676 insertions(+) create mode 100644 llvm/test/CodeGen/Mips/llvm.frexp.ll diff --git a/llvm/test/CodeGen/Mips/llvm.frexp.ll b/llvm/test/CodeGen/Mips/llvm.frexp.ll new file mode 100644 index 0000000000000..beb0b25425f7d --- /dev/null +++ b/llvm/test/CodeGen/Mips/llvm.frexp.ll @@ -0,0 +1,676 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mtriple=mipsel < %s | FileCheck -check-prefix=MIPSEL %s +; RUN: llc -mtriple=mips < %s | FileCheck %s -check-prefixes=SOFT-FLOAT-32 +; RUN: llc -mtriple=mips64 < %s | FileCheck %s -check-prefixes=SOFT-FLOAT-64 + +define { half, i32 } @test_frexp_f16_i32(half %a) nounwind { +; CHECK-LABEL: test_frexp_f16_i32: +; CHECK: bl __extendhfsf2 +; CHECK: bl frexpf +; CHECK: ldw r{{[0-9]+}}, sp[1] +; CHECK: bl __truncsfhf2 +; MIPSEL-LABEL: test_frexp_f16_i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -24 +; MIPSEL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: jal __extendhfsf2 +; MIPSEL-NEXT: nop +; MIPSEL-NEXT: addiu $5, $sp, 16 +; MIPSEL-NEXT: jal frexpf +; MIPSEL-NEXT: mov.s $f12, $f0 +; MIPSEL-NEXT: jal __truncsfhf2 +; MIPSEL-NEXT: mov.s $f12, $f0 +; MIPSEL-NEXT: lw $3, 16($sp) +; MIPSEL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-32-LABEL: test_frexp_f16_i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24 +; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: jal __extendhfsf2 +; SOFT-FLOAT-32-NEXT: nop +; SOFT-FLOAT-32-NEXT: addiu $5, $sp, 16 +; SOFT-FLOAT-32-NEXT: jal frexpf +; SOFT-FLOAT-32-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-32-NEXT: jal __truncsfhf2 +; SOFT-FLOAT-32-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-32-NEXT: lw $3, 16($sp) +; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-64-LABEL: test_frexp_f16_i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16 +; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: jal __extendhfsf2 +; SOFT-FLOAT-64-NEXT: sll $4, $4, 0 +; SOFT-FLOAT-64-NEXT: daddiu $5, $sp, 4 +; SOFT-FLOAT-64-NEXT: jal frexpf +; SOFT-FLOAT-64-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-64-NEXT: jal __truncsfhf2 +; SOFT-FLOAT-64-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-64-NEXT: lw $3, 4($sp) +; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16 +%result = call { half, i32 } @llvm.frexp.f16.i32(half %a) + ret { half, i32 } %result +} + +define { <2 x half>, <2 x i32> } @test_frexp_v2f16_v2i32(<2 x half> %a) nounwind { +; CHECK-LABEL: test_frexp_v2f16_v2i32: +; CHECK: bl frexpf +; CHECK: bl frexpf +; MIPSEL-LABEL: test_frexp_v2f16_v2i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -32 +; MIPSEL-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $18, 24($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $17, 20($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $16, 16($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: move $16, $5 +; MIPSEL-NEXT: move $17, $4 +; MIPSEL-NEXT: jal __extendhfsf2 +; MIPSEL-NEXT: srl $4, $5, 16 +; MIPSEL-NEXT: addiu $5, $17, 12 +; MIPSEL-NEXT: jal frexpf +; MIPSEL-NEXT: mov.s $f12, $f0 +; MIPSEL-NEXT: jal __truncsfhf2 +; MIPSEL-NEXT: mov.s $f12, $f0 +; MIPSEL-NEXT: move $18, $2 +; MIPSEL-NEXT: jal __extendhfsf2 +; MIPSEL-NEXT: move $4, $16 +; MIPSEL-NEXT: addiu $5, $17, 8 +; MIPSEL-NEXT: jal frexpf +; MIPSEL-NEXT: mov.s $f12, $f0 +; MIPSEL-NEXT: sh $18, 2($17) +; MIPSEL-NEXT: jal __truncsfhf2 +; MIPSEL-NEXT: mov.s $f12, $f0 +; MIPSEL-NEXT: sh $2, 0($17) +; MIPSEL-NEXT: lw $16, 16($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $17, 20($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $18, 24($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 32 +; +; SOFT-FLOAT-32-LABEL: test_frexp_v2f16_v2i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -32 +; SOFT-FLOAT-32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $18, 24($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $17, 20($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: move $16, $5 +; SOFT-FLOAT-32-NEXT: move $17, $4 +; SOFT-FLOAT-32-NEXT: jal __extendhfsf2 +; SOFT-FLOAT-32-NEXT: move $4, $5 +; SOFT-FLOAT-32-NEXT: addiu $5, $17, 12 +; SOFT-FLOAT-32-NEXT: jal frexpf +; SOFT-FLOAT-32-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-32-NEXT: jal __truncsfhf2 +; SOFT-FLOAT-32-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-32-NEXT: move $18, $2 +; SOFT-FLOAT-32-NEXT: jal __extendhfsf2 +; SOFT-FLOAT-32-NEXT: srl $4, $16, 16 +; SOFT-FLOAT-32-NEXT: addiu $5, $17, 8 +; SOFT-FLOAT-32-NEXT: jal frexpf +; SOFT-FLOAT-32-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-32-NEXT: sh $18, 2($17) +; SOFT-FLOAT-32-NEXT: jal __truncsfhf2 +; SOFT-FLOAT-32-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-32-NEXT: sh $2, 0($17) +; SOFT-FLOAT-32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $17, 20($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $18, 24($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 32 +; +; SOFT-FLOAT-64-LABEL: test_frexp_v2f16_v2i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -32 +; SOFT-FLOAT-64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $18, 16($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $17, 8($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: move $16, $5 +; SOFT-FLOAT-64-NEXT: move $17, $4 +; SOFT-FLOAT-64-NEXT: jal __extendhfsf2 +; SOFT-FLOAT-64-NEXT: sll $4, $5, 0 +; SOFT-FLOAT-64-NEXT: daddiu $5, $17, 12 +; SOFT-FLOAT-64-NEXT: jal frexpf +; SOFT-FLOAT-64-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-64-NEXT: jal __truncsfhf2 +; SOFT-FLOAT-64-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-64-NEXT: move $18, $2 +; SOFT-FLOAT-64-NEXT: sll $1, $16, 0 +; SOFT-FLOAT-64-NEXT: jal __extendhfsf2 +; SOFT-FLOAT-64-NEXT: srl $4, $1, 16 +; SOFT-FLOAT-64-NEXT: daddiu $5, $17, 8 +; SOFT-FLOAT-64-NEXT: jal frexpf +; SOFT-FLOAT-64-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-64-NEXT: sh $18, 2($17) +; SOFT-FLOAT-64-NEXT: jal __truncsfhf2 +; SOFT-FLOAT-64-NEXT: mov.s $f12, $f0 +; SOFT-FLOAT-64-NEXT: sh $2, 0($17) +; SOFT-FLOAT-64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $17, 8($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $18, 16($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 32 + %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a) + ret { <2 x half>, <2 x i32> } %result +} + +define { float, i32 } @test_frexp_f32_i32(float %a) nounwind { +; CHECK-LABEL: test_frexp_f32_i32: +; CHECK: bl frexpf +; MIPSEL-LABEL: test_frexp_f32_i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -24 +; MIPSEL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: jal frexpf +; MIPSEL-NEXT: addiu $5, $sp, 16 +; MIPSEL-NEXT: lw $2, 16($sp) +; MIPSEL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-32-LABEL: test_frexp_f32_i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24 +; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: jal frexpf +; SOFT-FLOAT-32-NEXT: addiu $5, $sp, 16 +; SOFT-FLOAT-32-NEXT: lw $2, 16($sp) +; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-64-LABEL: test_frexp_f32_i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16 +; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: jal frexpf +; SOFT-FLOAT-64-NEXT: daddiu $5, $sp, 4 +; SOFT-FLOAT-64-NEXT: lw $2, 4($sp) +; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16 + %result = call { float, i32 } @llvm.frexp.f32.i32(float %a) + ret { float, i32 } %result +} + +define { float, i32 } @test_frexp_f32_i32_tailcall(float %a) nounwind { +; CHECK-LABEL: test_frexp_f32_i32_tailcall: +; CHECK: bl frexpf +; MIPSEL-LABEL: test_frexp_f32_i32_tailcall: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -24 +; MIPSEL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: jal frexpf +; MIPSEL-NEXT: addiu $5, $sp, 16 +; MIPSEL-NEXT: lw $2, 16($sp) +; MIPSEL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-32-LABEL: test_frexp_f32_i32_tailcall: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24 +; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: jal frexpf +; SOFT-FLOAT-32-NEXT: addiu $5, $sp, 16 +; SOFT-FLOAT-32-NEXT: lw $2, 16($sp) +; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-64-LABEL: test_frexp_f32_i32_tailcall: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16 +; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: jal frexpf +; SOFT-FLOAT-64-NEXT: daddiu $5, $sp, 4 +; SOFT-FLOAT-64-NEXT: lw $2, 4($sp) +; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16 + %result = tail call { float, i32 } @llvm.frexp.f32.i32(float %a) + ret { float, i32 } %result +} + +define { <2 x float>, <2 x i32> } @test_frexp_v2f32_v2i32(<2 x float> %a) nounwind { +; CHECK-LABEL: test_frexp_v2f32_v2i32: +; CHECK: bl frexpf +; CHECK: bl frexpf +; MIPSEL-LABEL: test_frexp_v2f32_v2i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -32 +; MIPSEL-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $17, 24($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $16, 20($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: move $16, $6 +; MIPSEL-NEXT: move $17, $4 +; MIPSEL-NEXT: mtc1 $7, $f12 +; MIPSEL-NEXT: jal frexpf +; MIPSEL-NEXT: addiu $5, $4, 12 +; MIPSEL-NEXT: swc1 $f0, 4($17) +; MIPSEL-NEXT: mtc1 $16, $f12 +; MIPSEL-NEXT: jal frexpf +; MIPSEL-NEXT: addiu $5, $17, 8 +; MIPSEL-NEXT: swc1 $f0, 0($17) +; MIPSEL-NEXT: lw $16, 20($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $17, 24($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 32 +; +; SOFT-FLOAT-32-LABEL: test_frexp_v2f32_v2i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -32 +; SOFT-FLOAT-32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: move $16, $6 +; SOFT-FLOAT-32-NEXT: move $17, $4 +; SOFT-FLOAT-32-NEXT: mtc1 $7, $f12 +; SOFT-FLOAT-32-NEXT: jal frexpf +; SOFT-FLOAT-32-NEXT: addiu $5, $4, 12 +; SOFT-FLOAT-32-NEXT: swc1 $f0, 4($17) +; SOFT-FLOAT-32-NEXT: mtc1 $16, $f12 +; SOFT-FLOAT-32-NEXT: jal frexpf +; SOFT-FLOAT-32-NEXT: addiu $5, $17, 8 +; SOFT-FLOAT-32-NEXT: swc1 $f0, 0($17) +; SOFT-FLOAT-32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 32 +; +; SOFT-FLOAT-64-LABEL: test_frexp_v2f32_v2i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -32 +; SOFT-FLOAT-64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $16, 16($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: move $16, $4 +; SOFT-FLOAT-64-NEXT: sll $1, $16, 0 +; SOFT-FLOAT-64-NEXT: mtc1 $1, $f12 +; SOFT-FLOAT-64-NEXT: jal frexpf +; SOFT-FLOAT-64-NEXT: daddiu $5, $sp, 8 +; SOFT-FLOAT-64-NEXT: mfc1 $1, $f0 +; SOFT-FLOAT-64-NEXT: dsll $1, $1, 32 +; SOFT-FLOAT-64-NEXT: dsrl $2, $16, 32 +; SOFT-FLOAT-64-NEXT: daddiu $5, $sp, 12 +; SOFT-FLOAT-64-NEXT: dsrl $16, $1, 32 +; SOFT-FLOAT-64-NEXT: sll $1, $2, 0 +; SOFT-FLOAT-64-NEXT: jal frexpf +; SOFT-FLOAT-64-NEXT: mtc1 $1, $f12 +; SOFT-FLOAT-64-NEXT: mfc1 $1, $f0 +; SOFT-FLOAT-64-NEXT: dsll $1, $1, 32 +; SOFT-FLOAT-64-NEXT: or $2, $16, $1 +; SOFT-FLOAT-64-NEXT: lw $1, 12($sp) +; SOFT-FLOAT-64-NEXT: dsll $1, $1, 32 +; SOFT-FLOAT-64-NEXT: lw $3, 8($sp) +; SOFT-FLOAT-64-NEXT: dsll $3, $3, 32 +; SOFT-FLOAT-64-NEXT: dsrl $3, $3, 32 +; SOFT-FLOAT-64-NEXT: or $3, $3, $1 +; SOFT-FLOAT-64-NEXT: ld $16, 16($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 32 + %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a) + ret { <2 x float>, <2 x i32> } %result +} + +define { double, i32 } @test_frexp_f64_i32(double %a) nounwind { +; CHECK-LABEL: test_frexp_f64_i32: +; CHECK: bl frexp +; MIPSEL-LABEL: test_frexp_f64_i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -24 +; MIPSEL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: jal frexp +; MIPSEL-NEXT: addiu $6, $sp, 16 +; MIPSEL-NEXT: lw $2, 16($sp) +; MIPSEL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-32-LABEL: test_frexp_f64_i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24 +; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: jal frexp +; SOFT-FLOAT-32-NEXT: addiu $6, $sp, 16 +; SOFT-FLOAT-32-NEXT: lw $2, 16($sp) +; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24 +; +; SOFT-FLOAT-64-LABEL: test_frexp_f64_i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16 +; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: jal frexp +; SOFT-FLOAT-64-NEXT: daddiu $5, $sp, 4 +; SOFT-FLOAT-64-NEXT: lw $2, 4($sp) +; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16 + %result = call { double, i32 } @llvm.frexp.f64.i32(double %a) + ret { double, i32 } %result +} + +define { <2 x double>, <2 x i32> } @test_frexp_v2f64_v2i32(<2 x double> %a) nounwind { +; CHECK-LABEL: test_frexp_v2f64_v2i32: +; CHECK: bl frexp +; CHECK: bl frexp +; MIPSEL-LABEL: test_frexp_v2f64_v2i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -48 +; MIPSEL-NEXT: sw $ra, 44($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $18, 40($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $17, 36($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $16, 32($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: move $16, $7 +; MIPSEL-NEXT: move $17, $6 +; MIPSEL-NEXT: move $18, $4 +; MIPSEL-NEXT: lw $1, 64($sp) +; MIPSEL-NEXT: lw $2, 68($sp) +; MIPSEL-NEXT: sw $2, 28($sp) +; MIPSEL-NEXT: sw $1, 24($sp) +; MIPSEL-NEXT: addiu $6, $4, 20 +; MIPSEL-NEXT: jal frexp +; MIPSEL-NEXT: ldc1 $f12, 24($sp) +; MIPSEL-NEXT: sdc1 $f0, 8($18) +; MIPSEL-NEXT: sw $16, 20($sp) +; MIPSEL-NEXT: sw $17, 16($sp) +; MIPSEL-NEXT: addiu $6, $18, 16 +; MIPSEL-NEXT: jal frexp +; MIPSEL-NEXT: ldc1 $f12, 16($sp) +; MIPSEL-NEXT: sdc1 $f0, 0($18) +; MIPSEL-NEXT: lw $16, 32($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $17, 36($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $18, 40($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $ra, 44($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 48 +; +; SOFT-FLOAT-32-LABEL: test_frexp_v2f64_v2i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -48 +; SOFT-FLOAT-32-NEXT: sw $ra, 44($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $18, 40($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $17, 36($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $16, 32($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: move $16, $7 +; SOFT-FLOAT-32-NEXT: move $17, $6 +; SOFT-FLOAT-32-NEXT: move $18, $4 +; SOFT-FLOAT-32-NEXT: lw $1, 64($sp) +; SOFT-FLOAT-32-NEXT: lw $2, 68($sp) +; SOFT-FLOAT-32-NEXT: sw $2, 28($sp) +; SOFT-FLOAT-32-NEXT: sw $1, 24($sp) +; SOFT-FLOAT-32-NEXT: addiu $6, $4, 20 +; SOFT-FLOAT-32-NEXT: jal frexp +; SOFT-FLOAT-32-NEXT: ldc1 $f12, 24($sp) +; SOFT-FLOAT-32-NEXT: sdc1 $f0, 8($18) +; SOFT-FLOAT-32-NEXT: sw $16, 20($sp) +; SOFT-FLOAT-32-NEXT: sw $17, 16($sp) +; SOFT-FLOAT-32-NEXT: addiu $6, $18, 16 +; SOFT-FLOAT-32-NEXT: jal frexp +; SOFT-FLOAT-32-NEXT: ldc1 $f12, 16($sp) +; SOFT-FLOAT-32-NEXT: sdc1 $f0, 0($18) +; SOFT-FLOAT-32-NEXT: lw $16, 32($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $17, 36($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $18, 40($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $ra, 44($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 48 +; +; SOFT-FLOAT-64-LABEL: test_frexp_v2f64_v2i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -32 +; SOFT-FLOAT-64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $17, 16($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: move $16, $5 +; SOFT-FLOAT-64-NEXT: move $17, $4 +; SOFT-FLOAT-64-NEXT: dmtc1 $6, $f12 +; SOFT-FLOAT-64-NEXT: jal frexp +; SOFT-FLOAT-64-NEXT: daddiu $5, $4, 20 +; SOFT-FLOAT-64-NEXT: sdc1 $f0, 8($17) +; SOFT-FLOAT-64-NEXT: dmtc1 $16, $f12 +; SOFT-FLOAT-64-NEXT: jal frexp +; SOFT-FLOAT-64-NEXT: daddiu $5, $17, 16 +; SOFT-FLOAT-64-NEXT: sdc1 $f0, 0($17) +; SOFT-FLOAT-64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $17, 16($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 32 + %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a) + ret { <2 x double>, <2 x i32> } %result +} + +define { fp128, i32 } @test_frexp_fp128_i32(fp128 %a) nounwind { +; CHECK-LABEL: test_frexp_fp128_i32: +; CHECK: bl frexpl +; MIPSEL-LABEL: test_frexp_fp128_i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -40 +; MIPSEL-NEXT: sw $ra, 36($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $16, 32($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: move $1, $7 +; MIPSEL-NEXT: move $16, $4 +; MIPSEL-NEXT: addiu $2, $sp, 28 +; MIPSEL-NEXT: sw $2, 16($sp) +; MIPSEL-NEXT: lw $7, 56($sp) +; MIPSEL-NEXT: move $4, $5 +; MIPSEL-NEXT: move $5, $6 +; MIPSEL-NEXT: jal frexpl +; MIPSEL-NEXT: move $6, $1 +; MIPSEL-NEXT: sw $5, 12($16) +; MIPSEL-NEXT: sw $4, 8($16) +; MIPSEL-NEXT: sw $3, 4($16) +; MIPSEL-NEXT: sw $2, 0($16) +; MIPSEL-NEXT: lw $1, 28($sp) +; MIPSEL-NEXT: sw $1, 16($16) +; MIPSEL-NEXT: lw $16, 32($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $ra, 36($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 40 +; +; SOFT-FLOAT-32-LABEL: test_frexp_fp128_i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -40 +; SOFT-FLOAT-32-NEXT: sw $ra, 36($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $16, 32($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: move $1, $7 +; SOFT-FLOAT-32-NEXT: move $16, $4 +; SOFT-FLOAT-32-NEXT: addiu $2, $sp, 28 +; SOFT-FLOAT-32-NEXT: sw $2, 16($sp) +; SOFT-FLOAT-32-NEXT: lw $7, 56($sp) +; SOFT-FLOAT-32-NEXT: move $4, $5 +; SOFT-FLOAT-32-NEXT: move $5, $6 +; SOFT-FLOAT-32-NEXT: jal frexpl +; SOFT-FLOAT-32-NEXT: move $6, $1 +; SOFT-FLOAT-32-NEXT: sw $5, 12($16) +; SOFT-FLOAT-32-NEXT: sw $4, 8($16) +; SOFT-FLOAT-32-NEXT: sw $3, 4($16) +; SOFT-FLOAT-32-NEXT: sw $2, 0($16) +; SOFT-FLOAT-32-NEXT: lw $1, 28($sp) +; SOFT-FLOAT-32-NEXT: sw $1, 16($16) +; SOFT-FLOAT-32-NEXT: lw $16, 32($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $ra, 36($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 40 +; +; SOFT-FLOAT-64-LABEL: test_frexp_fp128_i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16 +; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: dmfc1 $4, $f12 +; SOFT-FLOAT-64-NEXT: dmfc1 $5, $f13 +; SOFT-FLOAT-64-NEXT: jal frexpl +; SOFT-FLOAT-64-NEXT: daddiu $6, $sp, 4 +; SOFT-FLOAT-64-NEXT: lw $4, 4($sp) +; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16 + %result = call { fp128, i32 } @llvm.frexp.fp128.i32(fp128 %a) + ret { fp128, i32 } %result +} + +define { <2 x fp128>, <2 x i32> } @test_frexp_v2fp128_v2i32(<2 x fp128> %a) nounwind { +; CHECK-LABEL: test_frexp_v2fp128_v2i32: +; CHECK: bl frexpl +; CHECK: bl frexpl +; MIPSEL-LABEL: test_frexp_v2fp128_v2i32: +; MIPSEL: # %bb.0: +; MIPSEL-NEXT: addiu $sp, $sp, -48 +; MIPSEL-NEXT: sw $ra, 44($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $18, 40($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $17, 36($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: sw $16, 32($sp) # 4-byte Folded Spill +; MIPSEL-NEXT: move $16, $7 +; MIPSEL-NEXT: move $17, $6 +; MIPSEL-NEXT: move $18, $4 +; MIPSEL-NEXT: addiu $1, $sp, 28 +; MIPSEL-NEXT: sw $1, 16($sp) +; MIPSEL-NEXT: lw $4, 72($sp) +; MIPSEL-NEXT: lw $5, 76($sp) +; MIPSEL-NEXT: lw $6, 80($sp) +; MIPSEL-NEXT: lw $7, 84($sp) +; MIPSEL-NEXT: jal frexpl +; MIPSEL-NEXT: nop +; MIPSEL-NEXT: addiu $1, $sp, 24 +; MIPSEL-NEXT: sw $1, 16($sp) +; MIPSEL-NEXT: lw $7, 68($sp) +; MIPSEL-NEXT: lw $6, 64($sp) +; MIPSEL-NEXT: sw $5, 28($18) +; MIPSEL-NEXT: sw $4, 24($18) +; MIPSEL-NEXT: sw $3, 20($18) +; MIPSEL-NEXT: sw $2, 16($18) +; MIPSEL-NEXT: move $4, $17 +; MIPSEL-NEXT: jal frexpl +; MIPSEL-NEXT: move $5, $16 +; MIPSEL-NEXT: sw $5, 12($18) +; MIPSEL-NEXT: sw $4, 8($18) +; MIPSEL-NEXT: sw $3, 4($18) +; MIPSEL-NEXT: sw $2, 0($18) +; MIPSEL-NEXT: lw $1, 28($sp) +; MIPSEL-NEXT: sw $1, 36($18) +; MIPSEL-NEXT: lw $1, 24($sp) +; MIPSEL-NEXT: sw $1, 32($18) +; MIPSEL-NEXT: lw $16, 32($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $17, 36($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $18, 40($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: lw $ra, 44($sp) # 4-byte Folded Reload +; MIPSEL-NEXT: jr $ra +; MIPSEL-NEXT: addiu $sp, $sp, 48 +; +; SOFT-FLOAT-32-LABEL: test_frexp_v2fp128_v2i32: +; SOFT-FLOAT-32: # %bb.0: +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -48 +; SOFT-FLOAT-32-NEXT: sw $ra, 44($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $18, 40($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $17, 36($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: sw $16, 32($sp) # 4-byte Folded Spill +; SOFT-FLOAT-32-NEXT: move $16, $7 +; SOFT-FLOAT-32-NEXT: move $17, $6 +; SOFT-FLOAT-32-NEXT: move $18, $4 +; SOFT-FLOAT-32-NEXT: addiu $1, $sp, 28 +; SOFT-FLOAT-32-NEXT: sw $1, 16($sp) +; SOFT-FLOAT-32-NEXT: lw $4, 72($sp) +; SOFT-FLOAT-32-NEXT: lw $5, 76($sp) +; SOFT-FLOAT-32-NEXT: lw $6, 80($sp) +; SOFT-FLOAT-32-NEXT: lw $7, 84($sp) +; SOFT-FLOAT-32-NEXT: jal frexpl +; SOFT-FLOAT-32-NEXT: nop +; SOFT-FLOAT-32-NEXT: addiu $1, $sp, 24 +; SOFT-FLOAT-32-NEXT: sw $1, 16($sp) +; SOFT-FLOAT-32-NEXT: lw $7, 68($sp) +; SOFT-FLOAT-32-NEXT: lw $6, 64($sp) +; SOFT-FLOAT-32-NEXT: sw $5, 28($18) +; SOFT-FLOAT-32-NEXT: sw $4, 24($18) +; SOFT-FLOAT-32-NEXT: sw $3, 20($18) +; SOFT-FLOAT-32-NEXT: sw $2, 16($18) +; SOFT-FLOAT-32-NEXT: move $4, $17 +; SOFT-FLOAT-32-NEXT: jal frexpl +; SOFT-FLOAT-32-NEXT: move $5, $16 +; SOFT-FLOAT-32-NEXT: sw $5, 12($18) +; SOFT-FLOAT-32-NEXT: sw $4, 8($18) +; SOFT-FLOAT-32-NEXT: sw $3, 4($18) +; SOFT-FLOAT-32-NEXT: sw $2, 0($18) +; SOFT-FLOAT-32-NEXT: lw $1, 28($sp) +; SOFT-FLOAT-32-NEXT: sw $1, 36($18) +; SOFT-FLOAT-32-NEXT: lw $1, 24($sp) +; SOFT-FLOAT-32-NEXT: sw $1, 32($18) +; SOFT-FLOAT-32-NEXT: lw $16, 32($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $17, 36($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $18, 40($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: lw $ra, 44($sp) # 4-byte Folded Reload +; SOFT-FLOAT-32-NEXT: jr $ra +; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 48 +; +; SOFT-FLOAT-64-LABEL: test_frexp_v2fp128_v2i32: +; SOFT-FLOAT-64: # %bb.0: +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -64 +; SOFT-FLOAT-64-NEXT: sd $ra, 56($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $20, 48($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $19, 40($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $18, 32($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $17, 24($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: sd $16, 16($sp) # 8-byte Folded Spill +; SOFT-FLOAT-64-NEXT: move $16, $6 +; SOFT-FLOAT-64-NEXT: move $17, $5 +; SOFT-FLOAT-64-NEXT: move $18, $4 +; SOFT-FLOAT-64-NEXT: daddiu $6, $sp, 12 +; SOFT-FLOAT-64-NEXT: move $4, $7 +; SOFT-FLOAT-64-NEXT: jal frexpl +; SOFT-FLOAT-64-NEXT: move $5, $8 +; SOFT-FLOAT-64-NEXT: move $19, $2 +; SOFT-FLOAT-64-NEXT: move $20, $3 +; SOFT-FLOAT-64-NEXT: daddiu $6, $sp, 8 +; SOFT-FLOAT-64-NEXT: lw $1, 12($sp) +; SOFT-FLOAT-64-NEXT: sw $1, 36($18) +; SOFT-FLOAT-64-NEXT: move $4, $17 +; SOFT-FLOAT-64-NEXT: jal frexpl +; SOFT-FLOAT-64-NEXT: move $5, $16 +; SOFT-FLOAT-64-NEXT: lw $1, 8($sp) +; SOFT-FLOAT-64-NEXT: sw $1, 32($18) +; SOFT-FLOAT-64-NEXT: sd $20, 24($18) +; SOFT-FLOAT-64-NEXT: sd $19, 16($18) +; SOFT-FLOAT-64-NEXT: sd $3, 8($18) +; SOFT-FLOAT-64-NEXT: sd $2, 0($18) +; SOFT-FLOAT-64-NEXT: ld $16, 16($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $17, 24($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $18, 32($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $19, 40($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $20, 48($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: ld $ra, 56($sp) # 8-byte Folded Reload +; SOFT-FLOAT-64-NEXT: jr $ra +; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 64 + %result = call { <2 x fp128>, <2 x i32> } @llvm.frexp.v2fp128.v2i32(<2 x fp128> %a) + ret { <2 x fp128>, <2 x i32> } %result +} + +declare { half, i32 } @llvm.frexp.f16.i32(half) #0 +declare { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half>) #0 + +declare { float, i32 } @llvm.frexp.f32.i32(float) #0 +declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #0 + +declare { double, i32 } @llvm.frexp.f64.i32(double) #0 +declare { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double>) #0 + +declare { fp128, i32 } @llvm.frexp.fp128.i32(fp128) #0 +declare { <2 x fp128>, <2 x i32> } @llvm.frexp.v2fp128.v2i32(<2 x fp128>) #0 + +attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits