Module: BOAST::Intrinsics
Constant Summary
collapse
- INTRINSICS =
Hash::new { |h, k| h[k] = Hash::new { |h2, k2| h2[k2] = {} } }
- CONVERSIONS =
Hash::new { |h, k| h[k] = Hash::new { |h2, k2| h2[k2] = {} } }
Class Method Summary
collapse
-
.check_coverage ⇒ Object
-
.get_conversion_path(type_dest, type_orig) ⇒ Object
-
.get_vector_decl(data_type) ⇒ Object
-
.get_vector_decl_ARM(data_type) ⇒ Object
-
.get_vector_decl_X86(data_type) ⇒ Object
-
.get_vector_name(type) ⇒ Object
-
.intrinsics(intr_symbol, type, type2 = nil) ⇒ Object
-
.intrinsics_by_vector_name(intr_symbol, type, type2 = nil) ⇒ Object
-
.type_name_ARM(type, size, sign = :signed) ⇒ Object
-
.type_name_X86(type, size, vector_size, sign = :signed) ⇒ Object
-
.vector_type_name(type, size, vector_size, sign = :signed) ⇒ Object
address_size, address_size=, annotate, annotate=, annotate?, annotate_indepth_list, annotate_indepth_list=, annotate_level, annotate_level=, annotate_list, annotate_list=, architecture, architecture=, array_start, array_start=, chain_code, chain_code=, chain_code?, debug, debug=, debug?, debug_source, debug_source=, debug_source?, decl_module, decl_module=, decl_module?, default_align, default_align=, default_int_signed, default_int_signed=, default_int_signed?, default_int_size, default_int_size=, default_real_size, default_real_size=, disable_openmp, disable_openmp=, disable_openmp?, ffi, ffi=, ffi?, fortran_line_length, fortran_line_length=, get_address_size, get_annotate, get_annotate_indepth_list, get_annotate_level, get_annotate_list, get_architecture, get_array_start, get_chain_code, get_debug, get_debug_source, get_decl_module, get_default_align, get_default_int_signed, get_default_int_size, get_default_real_size, get_disable_openmp, get_ffi, get_fortran_line_length, get_indent_increment, get_indent_level, get_keep_temp, get_lang, get_model, get_optimizer_log, get_optimizer_log_file, get_output, get_replace_constants, get_use_vla, get_verbose, indent_increment, indent_increment=, indent_level, indent_level=, keep_temp, keep_temp=, keep_temp?, lang, lang=, model, model=, optimizer_log, optimizer_log=, optimizer_log?, optimizer_log_file, optimizer_log_file=, output, output=, replace_constants, replace_constants=, replace_constants?, set_address_size, set_annotate, set_annotate_indepth_list, set_annotate_level, set_annotate_list, set_architecture, set_array_start, set_chain_code, set_debug, set_debug_source, set_decl_module, set_default_align, set_default_int_signed, set_default_int_size, set_default_real_size, set_disable_openmp, set_ffi, set_fortran_line_length, set_indent_increment, set_indent_level, set_keep_temp, set_lang, set_model, set_optimizer_log, set_optimizer_log_file, set_output, set_replace_constants, set_use_vla, set_verbose, use_vla, use_vla=, use_vla?, verbose, verbose=, verbose?
Class Method Details
.check_coverage ⇒ Object
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 41
def check_coverage
ins = []
INTRINSICS[X86].each { |i,v|
if i == :CVT then
v.each { |type1, h|
h.each { |type2, instr|
ins.push instr.to_s
}
}
else
v.each { |type, instr|
ins.push instr.to_s
}
end
}
return ins - INSTRUCTIONS.keys
end
|
.get_conversion_path(type_dest, type_orig) ⇒ Object
82
83
84
85
86
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 82
def get_conversion_path(type_dest, type_orig)
conversion_path = CONVERSIONS[get_architecture][get_vector_name(type_dest)][get_vector_name(type_orig)]
raise IntrinsicsError, "Unavailable conversion from #{get_vector_name(type_orig)} to #{get_vector_name(type_dest)} on #{get_architecture_name}!" unless conversion_path
return conversion_path
end
|
.get_vector_decl(data_type) ⇒ Object
124
125
126
127
128
129
130
131
132
133
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 124
def get_vector_decl( data_type )
case get_architecture
when X86
get_vector_decl_X86( data_type )
when ARM
get_vector_decl_ARM( data_type )
else
return get_vector_name( data_type )
end
end
|
.get_vector_decl_ARM(data_type) ⇒ Object
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 108
def get_vector_decl_ARM( data_type )
raise IntrinsicsError, "Unsupported vector size on ARM: #{data_type.total_size*8}!" unless [64,128].include?( data_type.total_size*8 )
case data_type
when Int
raise IntrinsicsError, "Unsupported data size for int vector on ARM: #{data_type.size*8}!" unless [1,2,4,8].include?( data_type.size )
return get_vector_name( data_type ).to_s
when Real
raise IntrinsicsError, "Unsupported data size for real vector on ARM: #{data_type.size*8}!" if data_type.size != 4
return get_vector_name( data_type ).to_s
else
raise IntrinsicsError, "Unsupported data type #{data_type} for vector on ARM!"
end
end
|
.get_vector_decl_X86(data_type) ⇒ Object
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 90
def get_vector_decl_X86( data_type )
raise IntrinsicsError, "Unsupported vector size on X86: #{data_type.total_size*8}!" unless [64,128,256].include?( data_type.total_size*8 )
s = "__m#{data_type.total_size*8}"
case data_type
when Int
raise IntrinsicsError, "Unsupported data size for int vector on X86: #{data_type.size*8}!" unless [1,2,4,8].include?( data_type.size )
return s+= "#{data_type.total_size*8>64 ? "i" : ""}"
when Real
return s if data_type.size == 4
return s += "d" if data_type.size == 8
raise IntrinsicsError, "Unsupported data size for real vector on X86: #{data_type.size*8}!"
else
raise IntrinsicsError, "Unsupported data type #{data_type} for vector on X86!"
end
end
|
.get_vector_name(type) ⇒ Object
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 137
def get_vector_name( type )
s = ""
case type
when Int
s += "u" unless type.signed?
s += "int"
when Real
s += "float"
else
raise InternalIntrinsicsError, "Undefined vector type!"
end
s += "#{type.size*8}"
s += "x#{type.vector_length}_t"
return s.to_sym
end
|
.intrinsics(intr_symbol, type, type2 = nil) ⇒ Object
76
77
78
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 76
def intrinsics(intr_symbol, type, type2=nil)
return intrinsics_by_vector_name(intr_symbol, get_vector_name(type), type2 ? get_vector_name(type2) : nil)
end
|
.intrinsics_by_vector_name(intr_symbol, type, type2 = nil) ⇒ Object
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 61
def intrinsics_by_vector_name(intr_symbol, type, type2=nil)
if type2 then
instruction = INTRINSICS[get_architecture][intr_symbol][type][type2]
else
instruction = INTRINSICS[get_architecture][intr_symbol][type]
end
raise IntrinsicsError, "Unsupported operation #{intr_symbol} for #{type}#{type2 ? " and #{type2}" : ""} on #{get_architecture_name}!" unless instruction
return instruction if get_architecture == ARM
supported = (INSTRUCTIONS[instruction.to_s] & MODELS[get_model.to_s]).size > 0
raise IntrinsicsError, "Unsupported operation #{intr_symbol} for #{type}#{type2 ? " and #{type2}" : ""} on #{get_model}! (requires #{INSTRUCTIONS[instruction.to_s].join(" or ")})" unless supported
return instruction
end
|
.type_name_ARM(type, size, sign = :signed) ⇒ Object
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 179
def type_name_ARM( type, size, sign = :signed )
s = ""
case type
when :int
case sign
when :signed
s += "s"
when :unsigned
s += "u"
else
raise InternalIntrinsicsError, "Invalid sign!"
end
when :float
s += "f"
else
raise InternalIntrinsicsError, "Invalid type!"
end
s += "#{size}"
return s
end
|
.type_name_X86(type, size, vector_size, sign = :signed) ⇒ Object
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 202
def type_name_X86( type, size, vector_size, sign = :signed )
s = ""
case type
when :int
e = ( vector_size > 64 ? "e" : "" )
s += "#{e}p"
case sign
when :signed
s += "i"
when :unsigned
s += "u"
else
raise InternalIntrinsicsError, "Invalid sign!"
end
s += "#{size}"
when :float
s += "p"
case size
when 32
s += "s"
when 64
s += "d"
else
raise InternalIntrinsicsError, "Invalid size!"
end
else
raise InternalIntrinsicsError, "Invalid type!"
end
return s
end
|
.vector_type_name(type, size, vector_size, sign = :signed) ⇒ Object
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# File 'lib/BOAST/Language/Intrinsics.rb', line 155
def vector_type_name( type, size, vector_size, sign = :signed )
s = ""
case type
when :int
case sign
when :signed
s += "int"
when :unsigned
s += "uint"
else
raise InternalIntrinsicsError, "Invalid sign!"
end
when :float
s += "float"
else
raise InternalIntrinsicsError, "Invalid type!"
end
s += "#{size}"
s += "x#{vector_size/size}_t"
return s.to_sym
end
|