Class: Wardite::F64
- Inherits:
-
Object
- Object
- Wardite::F64
- Includes:
- ValueHelper
- Defined in:
- lib/wardite/value.rb
Instance Attribute Summary collapse
-
#value ⇒ Object
: Float.
Class Method Summary collapse
Instance Method Summary collapse
- #convert_s(to:) ⇒ Object
- #convert_u(to:) ⇒ Object
- #demote(to:) ⇒ Object
- #extend_s(to:) ⇒ Object
- #extend_u(to:) ⇒ Object
- #extendN_s(from:, to:) ⇒ Object
- #inspect ⇒ Object
- #memsize ⇒ Object
- #packed(size: nil) ⇒ Object
- #promote(to:) ⇒ Object
- #reinterpret(to:) ⇒ Object
- #sign ⇒ Object
- #trunc_s(to:, saturating: false) ⇒ Object
- #trunc_sat_s(to:) ⇒ Object
- #trunc_sat_u(to:) ⇒ Object
- #trunc_u(to:, saturating: false) ⇒ Object
- #wrap(to:) ⇒ Object
Methods included from ValueHelper
Instance Attribute Details
#value ⇒ Object
: Float
609 610 611 |
# File 'lib/wardite/value.rb', line 609 def value @value end |
Class Method Details
Instance Method Details
#convert_s(to:) ⇒ Object
748 749 750 |
# File 'lib/wardite/value.rb', line 748 def convert_s(to:) raise EvalError, "unsupported operation" end |
#convert_u(to:) ⇒ Object
754 755 756 |
# File 'lib/wardite/value.rb', line 754 def convert_u(to:) raise EvalError, "unsupported operation" end |
#demote(to:) ⇒ Object
TODO:
no loss of digits…
761 762 763 764 |
# File 'lib/wardite/value.rb', line 761 def demote(to:) raise EvalError, "unsupported operation" if to != :f32 F32(value) end |
#extend_s(to:) ⇒ Object
649 650 651 |
# File 'lib/wardite/value.rb', line 649 def extend_s(to:) raise EvalError, "unsupported operation" end |
#extend_u(to:) ⇒ Object
655 656 657 |
# File 'lib/wardite/value.rb', line 655 def extend_u(to:) raise EvalError, "unsupported operation" end |
#extendN_s(from:, to:) ⇒ Object
784 785 786 |
# File 'lib/wardite/value.rb', line 784 def extendN_s(from:, to:) raise EvalError, "unsupported operation" end |
#inspect ⇒ Object
800 801 802 |
# File 'lib/wardite/value.rb', line 800 def inspect "F64(#{@value})" end |
#memsize ⇒ Object
622 623 624 |
# File 'lib/wardite/value.rb', line 622 def memsize 64 end |
#packed(size: nil) ⇒ Object
637 638 639 |
# File 'lib/wardite/value.rb', line 637 def packed(size: nil) [self.value].pack("E") end |
#promote(to:) ⇒ Object
768 769 770 |
# File 'lib/wardite/value.rb', line 768 def promote(to:) raise EvalError, "unsupported operation" end |
#reinterpret(to:) ⇒ Object
774 775 776 777 778 779 |
# File 'lib/wardite/value.rb', line 774 def reinterpret(to:) raise EvalError, "unsupported operation" if to != :i64 v = [value].pack("d").unpack("L!")[0] raise EvalError, "[BUG] String#unpack is broke, really?" if !v.is_a?(Integer) I64(v) end |
#sign ⇒ Object
627 628 629 630 631 632 633 |
# File 'lib/wardite/value.rb', line 627 def sign upper = [0.0].pack("G")[0]&.ord&.<<(7) if !upper raise "[BUG] Array#pack looks broken?" end upper.zero? ? :positive : :negative end |
#trunc_s(to:, saturating: false) ⇒ Object
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 |
# File 'lib/wardite/value.rb', line 663 def trunc_s(to:, saturating: false) v = value.to_i case to when :i32 if v >= 0 i32_signed_max = I32::I32_MAX >> 1 if v = i32_signed_max if v > i32_signed_max else v = v & i32_signed_max end I32(v & i32_signed_max) else i32_signed_min = -(I32::I32_MAX >> 1) - 1 if v = i32_signed_min if v < i32_signed_min else v = v & I32::I32_MAX if (v >> 31).zero? raise EvalError, "[undefined behavior] detected overflow: #{value}" end end I32(v) end when :i64 if v >= 0 i64_signed_max = I64::I64_MAX >> 1 if v = i64_signed_max if v > i64_signed_max else v = v & i64_signed_max end I64(v & i64_signed_max) else i64_signed_min = -(I64::I64_MAX >> 1) - 1 if v = i64_signed_min if v < i64_signed_min else v = v & I64::I64_MAX if (v >> 63).zero? raise EvalError, "[undefined behavior] detected overflow: #{value}" end end I64(v) end else raise EvalError, "unsupported operation to: #{to}" end end |
#trunc_sat_s(to:) ⇒ Object
796 797 798 |
# File 'lib/wardite/value.rb', line 796 def trunc_sat_s(to:) trunc_s(to: to, saturating: true) end |
#trunc_sat_u(to:) ⇒ Object
790 791 792 |
# File 'lib/wardite/value.rb', line 790 def trunc_sat_u(to:) trunc_u(to: to, saturating: true) end |
#trunc_u(to:, saturating: false) ⇒ Object
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 |
# File 'lib/wardite/value.rb', line 717 def trunc_u(to:, saturating: false) v = value.to_i if v < 0 if v = 0 else raise EvalError, "[undefined behavior] unexpected negative value" end end case to when :i32 if v = I32::I32_MAX if v > I32::I32_MAX else v = v & I32::I32_MAX end I32(v) when :i64 if v = I64::I64_MAX if v > I64::I64_MAX else v = v & I64::I64_MAX end I64(v) else raise EvalError, "unsupported operation to: #{to}" end end |
#wrap(to:) ⇒ Object
643 644 645 |
# File 'lib/wardite/value.rb', line 643 def wrap(to:) raise EvalError, "unsupported operation" end |