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
400 401 402 |
# File 'lib/wardite/value.rb', line 400 def value @value end |
Class Method Details
Instance Method Details
#==(other) ⇒ Object
597 598 599 |
# File 'lib/wardite/value.rb', line 597 def ==(other) return self.class == other.class && self.value == other.value end |
#convert_s(to:) ⇒ Object
542 543 544 |
# File 'lib/wardite/value.rb', line 542 def convert_s(to:) raise EvalError, "unsupported operation" end |
#convert_u(to:) ⇒ Object
548 549 550 |
# File 'lib/wardite/value.rb', line 548 def convert_u(to:) raise EvalError, "unsupported operation" end |
#demote(to:) ⇒ Object
554 555 556 |
# File 'lib/wardite/value.rb', line 554 def demote(to:) raise EvalError, "unsupported operation" end |
#extend_s(to:) ⇒ Object
440 441 442 |
# File 'lib/wardite/value.rb', line 440 def extend_s(to:) raise EvalError, "unsupported operation" end |
#extend_u(to:) ⇒ Object
446 447 448 |
# File 'lib/wardite/value.rb', line 446 def extend_u(to:) raise EvalError, "unsupported operation" end |
#extendN_s(from:, to:) ⇒ Object
577 578 579 |
# File 'lib/wardite/value.rb', line 577 def extendN_s(from:, to:) raise EvalError, "unsupported operation" end |
#inspect ⇒ Object
593 594 595 |
# File 'lib/wardite/value.rb', line 593 def inspect "F32(#{@value})" end |
#memsize ⇒ Object
413 414 415 |
# File 'lib/wardite/value.rb', line 413 def memsize 32 end |
#packed(size: nil) ⇒ Object
428 429 430 |
# File 'lib/wardite/value.rb', line 428 def packed(size: nil) [self.value].pack("e") end |
#promote(to:) ⇒ Object
560 561 562 563 |
# File 'lib/wardite/value.rb', line 560 def promote(to:) raise EvalError, "unsupported operation" if to != :f64 F64(value) end |
#reinterpret(to:) ⇒ Object
567 568 569 570 571 572 |
# File 'lib/wardite/value.rb', line 567 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
418 419 420 421 422 423 424 |
# File 'lib/wardite/value.rb', line 418 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…
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 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 |
# File 'lib/wardite/value.rb', line 456 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
589 590 591 |
# File 'lib/wardite/value.rb', line 589 def trunc_sat_s(to:) trunc_s(to: to, saturating: true) end |
#trunc_sat_u(to:) ⇒ Object
583 584 585 |
# File 'lib/wardite/value.rb', line 583 def trunc_sat_u(to:) trunc_u(to: to, saturating: true) end |
#trunc_u(to:, saturating: false) ⇒ Object
511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 |
# File 'lib/wardite/value.rb', line 511 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
434 435 436 |
# File 'lib/wardite/value.rb', line 434 def wrap(to:) raise EvalError, "unsupported operation" end |