Class: BOAST::BasicBinaryOperator
Class Method Summary
collapse
Methods inherited from Operator
convert, get_vector_name
Class Method Details
.to_s(arg1, arg2, return_type) ⇒ Object
111
112
113
114
115
116
117
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
|
# File 'lib/BOAST/Operators.rb', line 111
def BasicBinaryOperator.to_s(arg1, arg2, return_type)
if BOAST::get_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
return_name = get_vector_name(return_type.type)
size = return_type.type.total_size * 8
case BOAST::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
|