Class: Wardite::F32
- Inherits:
-
Object
- Object
- Wardite::F32
- Includes:
- ValueHelper
- Defined in:
- lib/wardite/value.rb
Instance Attribute Summary collapse
-
#value ⇒ Object
: Float.
Class Method Summary collapse
Instance Method Summary collapse
- #==(other) ⇒ Object
- #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
421 422 423 |
# File 'lib/wardite/value.rb', line 421 def value @value end |
Class Method Details
Instance Method Details
#==(other) ⇒ Object
618 619 620 |
# File 'lib/wardite/value.rb', line 618 def ==(other) return self.class == other.class && self.value == other.value end |
#convert_s(to:) ⇒ Object
563 564 565 |
# File 'lib/wardite/value.rb', line 563 def convert_s(to:) raise EvalError, "unsupported operation" end |
#convert_u(to:) ⇒ Object
569 570 571 |
# File 'lib/wardite/value.rb', line 569 def convert_u(to:) raise EvalError, "unsupported operation" end |
#demote(to:) ⇒ Object
575 576 577 |
# File 'lib/wardite/value.rb', line 575 def demote(to:) raise EvalError, "unsupported operation" end |
#extend_s(to:) ⇒ Object
461 462 463 |
# File 'lib/wardite/value.rb', line 461 def extend_s(to:) raise EvalError, "unsupported operation" end |
#extend_u(to:) ⇒ Object
467 468 469 |
# File 'lib/wardite/value.rb', line 467 def extend_u(to:) raise EvalError, "unsupported operation" end |
#extendN_s(from:, to:) ⇒ Object
598 599 600 |
# File 'lib/wardite/value.rb', line 598 def extendN_s(from:, to:) raise EvalError, "unsupported operation" end |
#inspect ⇒ Object
614 615 616 |
# File 'lib/wardite/value.rb', line 614 def inspect "F32(#{@value})" end |
#memsize ⇒ Object
434 435 436 |
# File 'lib/wardite/value.rb', line 434 def memsize 32 end |
#packed(size: nil) ⇒ Object
449 450 451 |
# File 'lib/wardite/value.rb', line 449 def packed(size: nil) [self.value].pack("e") end |
#promote(to:) ⇒ Object
581 582 583 584 |
# File 'lib/wardite/value.rb', line 581 def promote(to:) raise EvalError, "unsupported operation" if to != :f64 F64(value) end |
#reinterpret(to:) ⇒ Object
588 589 590 591 592 593 |
# File 'lib/wardite/value.rb', line 588 def reinterpret(to:) raise EvalError, "unsupported operation" if to != :i32 v = [value].pack("f").unpack("I!")[0] raise EvalError, "[BUG] String#unpack is broke, really?" if !v.is_a?(Integer) I32(v) end |
#sign ⇒ Object
439 440 441 442 443 444 445 |
# File 'lib/wardite/value.rb', line 439 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
TODO:
need more testcase…
477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 |
# File 'lib/wardite/value.rb', line 477 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
610 611 612 |
# File 'lib/wardite/value.rb', line 610 def trunc_sat_s(to:) trunc_s(to: to, saturating: true) end |
#trunc_sat_u(to:) ⇒ Object
604 605 606 |
# File 'lib/wardite/value.rb', line 604 def trunc_sat_u(to:) trunc_u(to: to, saturating: true) end |
#trunc_u(to:, saturating: false) ⇒ Object
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 |
# File 'lib/wardite/value.rb', line 532 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
455 456 457 |
# File 'lib/wardite/value.rb', line 455 def wrap(to:) raise EvalError, "unsupported operation" end |