Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Implement division using vrecpe/vrecps with -funsafe-math-optimizations. */
- (define_expand "div<mode>3"
- [(set (match_operand:VCVTF 0 "s_register_operand" "=w")
- (div:VCVTF (match_operand:VCVTF 1 "s_register_operand" "w")
- (match_operand:VCVTF 2 "s_register_operand" "w")))]
- "TARGET_NEON && !optimize_size
- && flag_unsafe_math_optimizations && flag_reciprocal_math"
- {
- rtx rec = gen_reg_rtx (<MODE>mode);
- rtx vrecps_temp = gen_reg_rtx (<MODE>mode);
- /* Reciprocal estimate. */
- emit_insn (gen_neon_vrecpe<mode> (rec, operands[2]));
- /* Perform 2 iterations of newton-raphson method.
- Two iterations seem to be sufficient, for single floating point
- since each iteration doubles number of bits in accuracy.
- vrecpe -> 8 bits.
- +2 iterations -> 32 bits, which is greater than 24 bit precision in fp value. */
- for (int i = 0; i < 2; i++)
- {
- emit_insn (gen_neon_vrecps<mode> (vrecps_temp, rec, operands[2]));
- emit_insn (gen_mul<mode>3 (rec, rec, vrecps_temp));
- }
- /* We now have reciprocal in rec, perform operands[0] = operands[1] * rec. */
- emit_insn (gen_mul<mode>3 (operands[0], operands[1], rec));
- DONE;
- }
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement