Method: Voodoo::ARMGasGenerator#value_ref
- Defined in:
- lib/voodoo/generators/arm_gas_generator.rb
#value_ref(x, register) ⇒ Object
Returns a reference to a value. For immediate values that fit in 8 bits, this returns the value itself (in ARM syntax). For all other values, loads the value into a register and returns the name of the register. If the value is already in a register, the name of that register is returned. Else, the value is loaded into the register specified as the second argument.
963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 |
# File 'lib/voodoo/generators/arm_gas_generator.rb', line 963 def value_ref x, register if substitution? x x = substitute_number x[1] end if integer? x if x >= 0 && x <= 255 return "\##{x}" elsif x >= -255 && x < 0 emit "mvn #{register}, \##{-(x + 1)}\n" return register else lbl = add_constant x emit "ldr #{register}, #{lbl}\n" return register end elsif symbol? x binding = @environment[x] if binding.kind_of? Symbol # Value is already in a register. Return register name. return binding elsif binding.kind_of? Integer # Value is on the stack. Load from the stack. emit "ldr #{register}, #{offset_reference binding}\n" return register else # Assume global @symbol_tracker.use x lbl = add_constant x emit "ldr #{register}, #{lbl}\n" return register end elsif at_expr? x load_at x[1], register else raise "Don't know how to load #{x.inspect}" end end |