Module: BOAST::Intrinsics

Extended by:
PrivateStateAccessor
Included in:
DataType, FMA, FMS, Load, MaskLoad, MaskStore, Operator, Set, Store
Defined in:
lib/BOAST/Language/Intrinsics.rb

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

Methods included from PrivateStateAccessor

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_coverageObject



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

Raises:



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

Raises:



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

Raises:



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

Raises:



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