Class: BOAST::BasicBinaryOperator

Inherits:
Operator
  • Object
show all
Defined in:
lib/BOAST/Operators.rb

Direct Known Subclasses

Addition, Division, Multiplication, Substraction

Class Method Summary collapse

Methods inherited from Operator

convert, get_vector_name, inspect

Methods included from PrivateStateAccessor

private_boolean_state_accessor, private_state_accessor

Class Method Details

.to_s(arg1, arg2, return_type) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/BOAST/Operators.rb', line 118

def BasicBinaryOperator.to_s(arg1, arg2, return_type)
  #puts "#{arg1.class} * #{arg2.class} : #{arg1} * #{arg2}"
  if lang == C and (arg1.class == Variable and arg2.class == Variable) and (arg1.type.vector_length > 1 or arg2.type.vector_length > 1) then
    raise "Vectors have different length: #{arg1} #{arg1.type.vector_length}, #{arg2} #{arg2.type.vector_length}" if arg1.type.vector_length != arg2.type.vector_length
    #puts "#{arg1.type.signed} #{arg2.type.signed} #{return_type.type.signed}"
	return_name = get_vector_name(return_type.type)
    size = return_type.type.total_size * 8
    case get_architecture
    when X86
      if arg1.type != return_type.type
        a1 = convert(arg1, return_type.type)
      else
        a1 = "#{arg1}"
      end
      if arg2.type != return_type.type
        a2 = convert(arg2, return_type.type)
      else
        a2 = "#{arg2}"
      end
      intr_name = "_mm"
      if size > 128 then
        intr_name += "#{size}"
      end
      intr_name += "_#{intr_name_X86}_#{return_name}"
      return "#{intr_name}( #{a1}, #{a2} )"
    when ARM
      if arg1.type.class != return_type.type.class then
        a1 = convert(arg1, return_type.type)
      else
        a1 = "#{arg1}"
      end
      if arg2.type.class != return_type.type.class then
        a2 = convert(arg2, return_type.type)
      else
        a2 = "#{arg2}"
      end
      intr_name = "#{intr_name_ARM}"
      intr_name += "q" if size == 128
      intr_name += "_" + return_name + "( #{a1}, #{a2} )"
      return intr_name
    else
      raise "Unsupported architecture!"
    end
  else
    return basic_usage( arg1, arg2 )
  end
end