class Generator::Token

Public Class Methods

new(type, src = nil, dst = nil) click to toggle source
# File lib/special-giggle/generator.rb, line 5
def initialize(type, src = nil, dst = nil)
  @type, @src, @dst = type, src, dst
end

Public Instance Methods

need_imm?() click to toggle source
# File lib/special-giggle/generator.rb, line 9
def need_imm?
end
to_code() click to toggle source
# File lib/special-giggle/generator.rb, line 12
def to_code
  case @type
  when :Print
    [ "movq #{@src}, %rsi", "movq $__print_fmt, %rdi", "movq $0, %rax", "call printf" ]
  when :Move
    [ @src.is_a?(Integer) ? "movq $#{@src}, %r11" : "movq #{@src}, %r11", "movq %r11, #{@dst}" ]
  when :Tilde
    [ "movq #{@src}, %r11", "notq %r11", "movq %r11, #{@dst}" ]
  when :Negative
    [ "movq #{@src}, %r11", "negq %r11", "movq %r11, #{@dst}" ]
  when :Plus
    [ "movq #{@src[0]}, %r11", "movq %r11, #{@dst}", "movq #{@src[1]}, %r11", "addq %r11, #{@dst}"]
  when :Minus
    [ "movq #{@src[0]}, %r11", "movq %r11, #{@dst}", "movq #{@src[1]}, %r11", "subq %r11, #{@dst}"]
  when :Asterisk
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "imulq %rcx", "movq %rax, #{@dst}" ]
  when :Slash
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "cqo", "idivq %rcx", "movq %rax, #{@dst}" ]
  when :Percent
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "cqo", "idivq %rcx", "movq %rdx, #{@dst}" ]
  when :Bar
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "orq %rcx, %rax", "movq %rax, #{@dst}" ]
  when :Ampersand
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "andq %rcx, %rax", "movq %rax, #{@dst}" ]
  when :Caret
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "xorq %rcx, %rax", "movq %rax, #{@dst}" ]
  when :LeftShift
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "salq %cl, %rax", "movq %rax, #{@dst}" ]
  when :RightShift
    [ "movq #{@src[0]}, %rax", "movq #{@src[1]}, %rcx", "sarq %cl, %rax", "movq %rax, #{@dst}" ]
  end
end