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
- #convert_s(to:) ⇒ Object
- #convert_u(to:) ⇒ Object
- #demote(to:) ⇒ Object
- #extend_s(to:) ⇒ Object
- #extend_u(to:) ⇒ Object
- #inspect ⇒ Object
- #memsize ⇒ Object
- #packed(size: nil) ⇒ Object
- #promote(to:) ⇒ Object
- #reinterpret(to:) ⇒ Object
- #sign ⇒ Object
- #trunc_s(to:) ⇒ Object
- #trunc_u(to:) ⇒ Object
- #wrap(to:) ⇒ Object
Methods included from ValueHelper
Instance Attribute Details
#value ⇒ Object
: Float
343 344 345 |
# File 'lib/wardite/value.rb', line 343 def value @value end |
Class Method Details
Instance Method Details
#convert_s(to:) ⇒ Object
447 448 449 |
# File 'lib/wardite/value.rb', line 447 def convert_s(to:) raise EvalError, "unsupported operation" end |
#convert_u(to:) ⇒ Object
453 454 455 |
# File 'lib/wardite/value.rb', line 453 def convert_u(to:) raise EvalError, "unsupported operation" end |
#demote(to:) ⇒ Object
459 460 461 |
# File 'lib/wardite/value.rb', line 459 def demote(to:) raise EvalError, "unsupported operation" end |
#extend_s(to:) ⇒ Object
383 384 385 |
# File 'lib/wardite/value.rb', line 383 def extend_s(to:) raise EvalError, "unsupported operation" end |
#extend_u(to:) ⇒ Object
389 390 391 |
# File 'lib/wardite/value.rb', line 389 def extend_u(to:) raise EvalError, "unsupported operation" end |
#inspect ⇒ Object
479 480 481 |
# File 'lib/wardite/value.rb', line 479 def inspect "F32(#{@value})" end |
#memsize ⇒ Object
356 357 358 |
# File 'lib/wardite/value.rb', line 356 def memsize 32 end |
#packed(size: nil) ⇒ Object
371 372 373 |
# File 'lib/wardite/value.rb', line 371 def packed(size: nil) [self.value].pack("e") end |
#promote(to:) ⇒ Object
465 466 467 468 |
# File 'lib/wardite/value.rb', line 465 def promote(to:) raise EvalError, "unsupported operation" if to != :f64 F64(value) end |
#reinterpret(to:) ⇒ Object
472 473 474 475 476 477 |
# File 'lib/wardite/value.rb', line 472 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
361 362 363 364 365 366 367 |
# File 'lib/wardite/value.rb', line 361 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:) ⇒ Object
TODO:
need more testcase…
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 |
# File 'lib/wardite/value.rb', line 397 def trunc_s(to:) v = value.to_i case to when :i32 if v >= 0 I32(v & (I32::I32_MAX >> 1)) else v = v & I32::I32_MAX if (v >> 31).zero? raise EvalError, "[undefined behavior] detected overflow: #{value}" end I32(v) end when :i64 if v >= 0 I64(v & (I64::I64_MAX >> 1)) else v = v & I64::I64_MAX if (v >> 31).zero? raise EvalError, "[undefined behavior] detected overflow: #{value}" end I64(v) end else raise EvalError, "unsupported operation to: #{to}" end end |
#trunc_u(to:) ⇒ Object
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 |
# File 'lib/wardite/value.rb', line 428 def trunc_u(to:) v = value.to_i if v < 0 raise EvalError, "[undefined behavior] unexpected negative value" end case to when :i32 v = v & I32::I32_MAX I32(v) when :i64 v = v & I64::I64_MAX I64(v) else raise EvalError, "unsupported operation to: #{to}" end end |
#wrap(to:) ⇒ Object
377 378 379 |
# File 'lib/wardite/value.rb', line 377 def wrap(to:) raise EvalError, "unsupported operation" end |