Advertisement
prat3492

Untitled

Sep 21st, 2015
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.23 KB | None | 0 0
  1. /* Implement division using vrecpe/vrecps with -funsafe-math-optimizations. */
  2.  
  3. (define_expand "div<mode>3"
  4. [(set (match_operand:VCVTF 0 "s_register_operand" "=w")
  5. (div:VCVTF (match_operand:VCVTF 1 "s_register_operand" "w")
  6. (match_operand:VCVTF 2 "s_register_operand" "w")))]
  7. "TARGET_NEON && !optimize_size
  8. && flag_unsafe_math_optimizations && flag_reciprocal_math"
  9. {
  10. rtx rec = gen_reg_rtx (<MODE>mode);
  11. rtx vrecps_temp = gen_reg_rtx (<MODE>mode);
  12.  
  13. /* Reciprocal estimate. */
  14. emit_insn (gen_neon_vrecpe<mode> (rec, operands[2]));
  15.  
  16. /* Perform 2 iterations of newton-raphson method.
  17. Two iterations seem to be sufficient, for single floating point
  18. since each iteration doubles number of bits in accuracy.
  19. vrecpe -> 8 bits.
  20. +2 iterations -> 32 bits, which is greater than 24 bit precision in fp value. */
  21. for (int i = 0; i < 2; i++)
  22. {
  23. emit_insn (gen_neon_vrecps<mode> (vrecps_temp, rec, operands[2]));
  24. emit_insn (gen_mul<mode>3 (rec, rec, vrecps_temp));
  25. }
  26.  
  27. /* We now have reciprocal in rec, perform operands[0] = operands[1] * rec. */
  28. emit_insn (gen_mul<mode>3 (operands[0], operands[1], rec));
  29. DONE;
  30. }
  31. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement