| ;; :::::::::::::::::::: |
| ;; :: |
| ;; :: 32-bit floating point arithmetic |
| ;; :: |
| ;; :::::::::::::::::::: |
| |
| ;; Addition |
| (define_insn "*addsf3_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r, r,r,r,r") |
| (plus:SF (match_operand:SF 1 "nonmemory_operand" "%0,r, r,0,r,F") |
| (match_operand:SF 2 "nonmemory_operand" "r,r,CfZ,F,F,r")))] |
| "TARGET_FP_SP_BASE |
| && (register_operand (operands[1], SFmode) |
| || register_operand (operands[2], SFmode))" |
| "fsadd%?\\t%0,%1,%2" |
| [(set_attr "length" "4,4,4,8,8,8") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no,no,yes,no,no") |
| (set_attr "cond" "canuse,nocond,nocond,canuse_limm,nocond,nocond") |
| ]) |
| |
| ;; Subtraction |
| (define_insn "*subsf3_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r, r,r,r,r") |
| (minus:SF (match_operand:SF 1 "nonmemory_operand" "0,r, r,0,r,F") |
| (match_operand:SF 2 "nonmemory_operand" "r,r,CfZ,F,F,r")))] |
| "TARGET_FP_SP_BASE |
| && (register_operand (operands[1], SFmode) |
| || register_operand (operands[2], SFmode))" |
| "fssub%?\\t%0,%1,%2" |
| [(set_attr "length" "4,4,4,8,8,8") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no,no,yes,no,no") |
| (set_attr "cond" "canuse,nocond,nocond,canuse_limm,nocond,nocond") |
| ]) |
| |
| ;; Multiplication |
| (define_insn "*mulsf3_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r,r,r,r") |
| (mult:SF (match_operand:SF 1 "nonmemory_operand" "%0,r,0,r,F") |
| (match_operand:SF 2 "nonmemory_operand" "r,r,F,F,r")))] |
| "TARGET_FP_SP_BASE |
| && (register_operand (operands[1], SFmode) |
| || register_operand (operands[2], SFmode))" |
| "fsmul%?\\t%0,%1,%2" |
| [(set_attr "length" "4,4,8,8,8") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no,yes,no,no") |
| (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond") |
| ]) |
| |
| ;; Multiplication with addition/subtraction |
| (define_expand "fmasf4" |
| [(set (match_operand:SF 0 "register_operand" "") |
| (fma:SF (match_operand:SF 1 "nonmemory_operand" "") |
| (match_operand:SF 2 "nonmemory_operand" "") |
| (match_operand:SF 3 "nonmemory_operand" "")))] |
| "TARGET_FP_SP_FUSED" |
| "{ |
| rtx tmp; |
| tmp = gen_rtx_REG (SFmode, ACCL_REGNO); |
| emit_move_insn (tmp, operands[3]); |
| operands[3] = tmp; |
| if (!register_operand (operands[1], SFmode) |
| && !register_operand (operands[2], SFmode)) |
| operands[2] = force_reg (SFmode, operands[2]); |
| }") |
| |
| (define_expand "fnmasf4" |
| [(set (match_operand:SF 0 "register_operand" "") |
| (fma:SF (neg:SF (match_operand:SF 1 "nonmemory_operand" "")) |
| (match_operand:SF 2 "nonmemory_operand" "") |
| (match_operand:SF 3 "nonmemory_operand" "")))] |
| "TARGET_FP_SP_FUSED" |
| "{ |
| rtx tmp; |
| tmp = gen_rtx_REG (SFmode, ACCL_REGNO); |
| emit_move_insn (tmp, operands[3]); |
| operands[3] = tmp; |
| if (!register_operand (operands[1], SFmode) |
| && !register_operand (operands[2], SFmode)) |
| operands[2] = force_reg (SFmode, operands[2]); |
| }") |
| |
| (define_insn "fmasf4_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r,r,r,r") |
| (fma:SF (match_operand:SF 1 "nonmemory_operand" "%0,r,0,r,F") |
| (match_operand:SF 2 "nonmemory_operand" "r,r,F,F,r") |
| (match_operand:SF 3 "accl_operand" "")))] |
| "TARGET_FP_SP_FUSED |
| && (register_operand (operands[1], SFmode) |
| || register_operand (operands[2], SFmode))" |
| "fsmadd%? %0,%1,%2" |
| [(set_attr "length" "4,4,8,8,8") |
| (set_attr "predicable" "yes,no,yes,no,no") |
| (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu_fuse")]) |
| |
| (define_insn "fnmasf4_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r,r,r,r") |
| (fma:SF (neg:SF (match_operand:SF 1 "nonmemory_operand" "%0,r,0,r,F")) |
| (match_operand:SF 2 "nonmemory_operand" "r,r,F,F,r") |
| (match_operand:SF 3 "accl_operand" "")))] |
| "TARGET_FP_SP_FUSED |
| && (register_operand (operands[1], SFmode) |
| || register_operand (operands[2], SFmode))" |
| "fsmsub%?\\t%0,%1,%2" |
| [(set_attr "length" "4,4,8,8,8") |
| (set_attr "predicable" "yes,no,yes,no,no") |
| (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu_fuse")]) |
| |
| (define_expand "fmadf4" |
| [(match_operand:DF 0 "even_register_operand" "") |
| (match_operand:DF 1 "even_register_operand" "") |
| (match_operand:DF 2 "even_register_operand" "") |
| (match_operand:DF 3 "even_register_operand" "")] |
| "TARGET_FP_DP_FUSED" |
| "{ |
| emit_insn (gen_fmadf4_split (operands[0], operands[1], operands[2], operands[3])); |
| DONE; |
| }") |
| |
| (define_insn_and_split "fmadf4_split" |
| [(set (match_operand:DF 0 "even_register_operand" "") |
| (fma:DF (match_operand:DF 1 "even_register_operand" "") |
| (match_operand:DF 2 "even_register_operand" "") |
| (match_operand:DF 3 "even_register_operand" ""))) |
| (clobber (reg:DF ARCV2_ACC))] |
| "TARGET_FP_DP_FUSED" |
| "#" |
| "TARGET_FP_DP_FUSED" |
| [(const_int 0)] |
| "{ |
| rtx acc_reg = gen_rtx_REG (DFmode, ACC_REG_FIRST); |
| emit_move_insn (acc_reg, operands[3]); |
| emit_insn (gen_fmadf4_fpu (operands[0], operands[1], operands[2])); |
| DONE; |
| }" |
| ) |
| |
| (define_expand "fnmadf4" |
| [(match_operand:DF 0 "even_register_operand" "") |
| (match_operand:DF 1 "even_register_operand" "") |
| (match_operand:DF 2 "even_register_operand" "") |
| (match_operand:DF 3 "even_register_operand" "")] |
| "TARGET_FP_DP_FUSED" |
| "{ |
| emit_insn (gen_fnmadf4_split (operands[0], operands[1], operands[2], operands[3])); |
| DONE; |
| }") |
| |
| (define_insn_and_split "fnmadf4_split" |
| [(set (match_operand:DF 0 "even_register_operand" "") |
| (fma:DF (neg:DF (match_operand:DF 1 "even_register_operand" "")) |
| (match_operand:DF 2 "even_register_operand" "") |
| (match_operand:DF 3 "even_register_operand" ""))) |
| (clobber (reg:DF ARCV2_ACC))] |
| "TARGET_FP_DP_FUSED" |
| "#" |
| "TARGET_FP_DP_FUSED" |
| [(const_int 0)] |
| "{ |
| rtx acc_reg = gen_rtx_REG (DFmode, ACC_REG_FIRST); |
| emit_move_insn (acc_reg, operands[3]); |
| emit_insn (gen_fnmadf4_fpu (operands[0], operands[1], operands[2])); |
| DONE; |
| }") |
| |
| (define_insn "fmadf4_fpu" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (fma:DF (match_operand:DF 1 "even_register_operand" "%0,r") |
| (match_operand:DF 2 "even_register_operand" "r,r") |
| (reg:DF ARCV2_ACC)))] |
| "TARGET_FP_DP_FUSED" |
| "fdmadd%?\\t%0,%1,%2" |
| [(set_attr "length" "4,4") |
| (set_attr "predicable" "yes,no") |
| (set_attr "cond" "canuse,nocond") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu_fuse")]) |
| |
| (define_insn "fnmadf4_fpu" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (fma:DF (neg:DF (match_operand:DF 1 "even_register_operand" "%0,r")) |
| (match_operand:DF 2 "even_register_operand" "r,r") |
| (reg:DF ARCV2_ACC)))] |
| "TARGET_FP_DP_FUSED" |
| "fdmsub%?\\t%0,%1,%2" |
| [(set_attr "length" "4,4") |
| (set_attr "predicable" "yes,no") |
| (set_attr "cond" "canuse,nocond") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu_fuse")]) |
| |
| ;; Division |
| (define_insn "*divsf3_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r,r,r,r") |
| (div:SF (match_operand:SF 1 "nonmemory_operand" "0,r,0,r,F") |
| (match_operand:SF 2 "nonmemory_operand" "r,r,F,F,r")))] |
| "TARGET_FP_SP_SQRT |
| && (register_operand (operands[1], SFmode) |
| || register_operand (operands[2], SFmode))" |
| "fsdiv%?\\t%0,%1,%2" |
| [(set_attr "length" "4,4,8,8,8") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu_sdiv") |
| (set_attr "predicable" "yes,no,yes,no,no") |
| (set_attr "cond" "canuse,nocond,canuse_limm,nocond,nocond") |
| ]) |
| |
| ;; Negation |
| ;; see pattern in arc.md |
| |
| ;; Absolute value |
| ;; see pattern in arc.md |
| |
| ;; Square root |
| (define_insn "sqrtsf2_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r") |
| (sqrt:SF (match_operand:SF 1 "nonmemory_operand" "r,F")))] |
| "TARGET_FP_SP_SQRT" |
| "fssqrt\\t%0,%1" |
| [(set_attr "length" "4,8") |
| (set_attr "type" "fpu_sdiv")]) |
| |
| ;; Comparison |
| (define_insn "*cmpsf_fpu" |
| [(set (reg:CC_FPU CC_REG) |
| (compare:CC_FPU (match_operand:SF 0 "register_operand" "r, r,r") |
| (match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))] |
| "TARGET_FP_SP_BASE" |
| "fscmp%?\\t%0,%1" |
| [(set_attr "length" "4,4,8") |
| (set_attr "iscompact" "false") |
| (set_attr "cond" "set") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes")]) |
| |
| (define_insn "*cmpsf_fpu_trap" |
| [(set (reg:CC_FPUE CC_REG) |
| (compare:CC_FPUE (match_operand:SF 0 "register_operand" "r, r,r") |
| (match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))] |
| "TARGET_FP_SP_BASE" |
| "fscmpf%?\\t%0,%1" |
| [(set_attr "length" "4,4,8") |
| (set_attr "iscompact" "false") |
| (set_attr "cond" "set") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes")]) |
| |
| (define_insn "*cmpsf_fpu_uneq" |
| [(set (reg:CC_FPU_UNEQ CC_REG) |
| (compare:CC_FPU_UNEQ |
| (match_operand:SF 0 "register_operand" "r, r,r") |
| (match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))] |
| "TARGET_FP_SP_BASE" |
| "fscmp\\t%0,%1\\n\\tmov.v.f\\t0,0\\t;set Z flag" |
| [(set_attr "length" "8,8,12") |
| (set_attr "iscompact" "false") |
| (set_attr "cond" "set") |
| (set_attr "type" "fpu")]) |
| |
| ;; :::::::::::::::::::: |
| ;; :: |
| ;; :: 64-bit floating point arithmetic |
| ;; :: |
| ;; :::::::::::::::::::: |
| |
| ;; Addition |
| (define_insn "*adddf3_fpu" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (plus:DF (match_operand:DF 1 "even_register_operand" "%0,r") |
| (match_operand:DF 2 "even_register_operand" "r,r")))] |
| "TARGET_FP_DP_BASE" |
| "fdadd%? %0,%1,%2" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no") |
| (set_attr "cond" "canuse,nocond") |
| ]) |
| |
| ;; Subtraction |
| (define_insn "*subdf3_fpu" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (minus:DF (match_operand:DF 1 "even_register_operand" "0,r") |
| (match_operand:DF 2 "even_register_operand" "r,r")))] |
| "TARGET_FP_DP_BASE" |
| "fdsub%? %0,%1,%2" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no") |
| (set_attr "cond" "canuse,nocond") |
| ]) |
| |
| ;; Multiplication |
| (define_insn "*muldf3_fpu" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (mult:DF (match_operand:DF 1 "even_register_operand" "%0,r") |
| (match_operand:DF 2 "even_register_operand" "r,r")))] |
| "TARGET_FP_DP_BASE" |
| "fdmul%? %0,%1,%2" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no") |
| (set_attr "cond" "canuse,nocond") |
| ]) |
| |
| ;; Division |
| (define_insn "divdf3" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (div:DF (match_operand:DF 1 "even_register_operand" "0,r") |
| (match_operand:DF 2 "even_register_operand" "r,r")))] |
| "TARGET_FP_DP_SQRT" |
| "fddiv%? %0,%1,%2" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu_ddiv") |
| (set_attr "predicable" "yes,no") |
| (set_attr "cond" "canuse,nocond") |
| ]) |
| |
| ;; Square root |
| (define_insn "sqrtdf2" |
| [(set (match_operand:DF 0 "even_register_operand" "=r") |
| (sqrt:DF (match_operand:DF 1 "even_register_operand" "r")))] |
| "TARGET_FP_DP_SQRT" |
| "fdsqrt %0,%1" |
| [(set_attr "length" "4") |
| (set_attr "type" "fpu_ddiv")]) |
| |
| ;; Comparison |
| (define_insn "*cmpdf_fpu" |
| [(set (reg:CC_FPU CC_REG) |
| (compare:CC_FPU (match_operand:DF 0 "even_register_operand" "r") |
| (match_operand:DF 1 "even_register_operand" "r")))] |
| "TARGET_FP_DP_BASE" |
| "fdcmp%? %0, %1" |
| [(set_attr "length" "4") |
| (set_attr "iscompact" "false") |
| (set_attr "cond" "set") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes")]) |
| |
| (define_insn "*cmpdf_fpu_trap" |
| [(set (reg:CC_FPUE CC_REG) |
| (compare:CC_FPUE (match_operand:DF 0 "even_register_operand" "r") |
| (match_operand:DF 1 "even_register_operand" "r")))] |
| "TARGET_FP_DP_BASE" |
| "fdcmpf%? %0, %1" |
| [(set_attr "length" "4") |
| (set_attr "iscompact" "false") |
| (set_attr "cond" "set") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes")]) |
| |
| (define_insn "*cmpdf_fpu_uneq" |
| [(set (reg:CC_FPU_UNEQ CC_REG) |
| (compare:CC_FPU_UNEQ |
| (match_operand:DF 0 "even_register_operand" "r") |
| (match_operand:DF 1 "even_register_operand" "r")))] |
| "TARGET_FP_DP_BASE" |
| "fdcmp %0, %1\\n\\tmov.v.f 0,0\\t;set Z flag" |
| [(set_attr "length" "8") |
| (set_attr "iscompact" "false") |
| (set_attr "cond" "set") |
| (set_attr "type" "fpu")]) |
| |
| ;; :::::::::::::::::::: |
| ;; :: |
| ;; :: Conversion routines |
| ;; :: |
| ;; :::::::::::::::::::: |
| |
| ;; SF->DF |
| (define_insn "extendsfdf2" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (float_extend:DF (match_operand:SF 1 "register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt32_64%? %0,%1,0x04\\t;fs2d %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; SI->DF |
| (define_insn "floatsidf2" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (float:DF (match_operand:SI 1 "register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt32_64%? %0,%1,0x02\\t;fint2d %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; uSI->DF |
| (define_insn "floatunssidf2" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (unsigned_float:DF (match_operand:SI 1 "register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt32_64%? %0,%1,0x00\\t;fuint2d %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; SF->uDI (using rounding towards zero) |
| (define_insn "fixuns_truncsfdi2" |
| [(set (match_operand:DI 0 "even_register_operand" "=r,r") |
| (unsigned_fix:DI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))] |
| "TARGET_FP_DP_CONV" |
| "fcvt32_64%? %0,%1,0x09\\t;fs2ul_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; SF->DI (using rounding towards zero) |
| (define_insn "fix_truncsfdi2" |
| [(set (match_operand:DI 0 "even_register_operand" "=r,r") |
| (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))] |
| "TARGET_FP_DP_CONV" |
| "fcvt32_64%? %0,%1,0x0B\\t;fs2l_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; SI->SF |
| (define_insn "floatsisf2_fpu" |
| [(set (match_operand:SF 0 "register_operand" "=r,r") |
| (float:SF (match_operand:SI 1 "register_operand" "0,r")))] |
| "TARGET_FP_SP_CONV" |
| "fcvt32%? %0,%1,0x02\\t;fint2s %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; uSI->SF |
| (define_insn "floatunssisf2" |
| [(set (match_operand:SF 0 "register_operand" "=r,r") |
| (unsigned_float:SF (match_operand:SI 1 "register_operand" "0,r")))] |
| "TARGET_FP_SP_CONV" |
| "fcvt32%? %0,%1,0x00\\t;fuint2s %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; SF->uSI (using rounding towards zero) |
| (define_insn "fixuns_truncsfsi2" |
| [(set (match_operand:SI 0 "register_operand" "=r,r") |
| (unsigned_fix:SI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))] |
| "TARGET_FP_SP_CONV" |
| "fcvt32%? %0,%1,0x09\\t;fs2uint_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; SF->SI (using rounding towards zero) |
| (define_insn "fix_truncsfsi2_fpu" |
| [(set (match_operand:SI 0 "register_operand" "=r,r") |
| (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "0,r"))))] |
| "TARGET_FP_SP_CONV" |
| "fcvt32%? %0,%1,0x0B\\t;fs2int_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; DI->DF |
| (define_insn "floatdidf2" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (float:DF (match_operand:DI 1 "even_register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64%? %0,%1,0x02\\t;fl2d %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; uDI->DF |
| (define_insn "floatunsdidf2" |
| [(set (match_operand:DF 0 "even_register_operand" "=r,r") |
| (unsigned_float:DF (match_operand:DI 1 "even_register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64%? %0,%1,0x00\\t;ful2d %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; DF->uDI (using rounding towards zero) |
| (define_insn "fixuns_truncdfdi2" |
| [(set (match_operand:DI 0 "even_register_operand" "=r,r") |
| (unsigned_fix:DI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64%? %0,%1,0x09\\t;fd2ul_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; DF->DI (using rounding towards zero) |
| (define_insn "fix_truncdfdi2" |
| [(set (match_operand:DI 0 "even_register_operand" "=r,r") |
| (fix:DI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64%? %0,%1,0x0B\\t;fd2l_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; DF->SF |
| (define_insn "truncdfsf2" |
| [(set (match_operand:SF 0 "register_operand" "=r,r") |
| (float_truncate:SF (match_operand:DF 1 "even_register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64_32%? %0,%1,0x04\\t;fd2s %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; DI->SF |
| (define_insn "floatdisf2" |
| [(set (match_operand:SF 0 "register_operand" "=r,r") |
| (float:SF (match_operand:DI 1 "even_register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64_32%? %0,%1,0x02\\t;fl2s %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; uDI->SF |
| (define_insn "floatunsdisf2" |
| [(set (match_operand:SF 0 "register_operand" "=r,r") |
| (unsigned_float:SF (match_operand:DI 1 "even_register_operand" "0,r")))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64_32%? %0,%1,0x00\\t;ful2s %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; DF->uSI (using rounding towards zero) |
| (define_insn "fixuns_truncdfsi2" |
| [(set (match_operand:SI 0 "register_operand" "=r,r") |
| (unsigned_fix:SI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64_32%? %0,%1,0x09\\t;fd2uint_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |
| |
| ;; DF->SI (using rounding towards zero) |
| (define_insn "fix_truncdfsi2" |
| [(set (match_operand:SI 0 "register_operand" "=r,r") |
| (fix:SI (fix:DF (match_operand:DF 1 "even_register_operand" "0,r"))))] |
| "TARGET_FP_DP_CONV" |
| "fcvt64_32%? %0,%1,0x0B\\t;fd2int_rz %0,%1" |
| [(set_attr "length" "4,4") |
| (set_attr "iscompact" "false") |
| (set_attr "type" "fpu") |
| (set_attr "predicable" "yes,no")] |
| ) |