Class: BOAST::Set

Inherits:
Operator show all
Extended by:
Functor
Includes:
Arithmetic, Inspectable, Intrinsics, PrivateStateAccessor
Defined in:
lib/BOAST/Language/Operators.rb

Constant Summary

Constants included from Intrinsics

Intrinsics::CONVERSIONS, Intrinsics::INTRINSICS

Constants inherited from Operator

Operator::DISCARD_OPTIONS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Functor

extended

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?

Methods included from Inspectable

#inspect

Methods included from Arithmetic

#!, #!=, #*, #**, #+, #+@, #-, #-@, #/, #<, #<=, #==, #===, #>, #>=, #and, #cast, #components, #dereference, #or, #reference

Methods included from Intrinsics

check_coverage, get_conversion_path, get_vector_decl, get_vector_decl_ARM, get_vector_decl_X86, get_vector_name, intrinsics, intrinsics_by_vector_name, type_name_ARM, type_name_X86, vector_type_name

Methods inherited from Operator

convert, inspect

Constructor Details

#initialize(source, return_type) ⇒ Set

Returns a new instance of Set.



318
319
320
321
# File 'lib/BOAST/Language/Operators.rb', line 318

def initialize(source, return_type)
  @source = source
  @return_type = return_type.to_var
end

Instance Attribute Details

#return_typeObject (readonly)

Returns the value of attribute return_type.



316
317
318
# File 'lib/BOAST/Language/Operators.rb', line 316

def return_type
  @return_type
end

#sourceObject (readonly)

Returns the value of attribute source.



315
316
317
# File 'lib/BOAST/Language/Operators.rb', line 315

def source
  @source
end

Instance Method Details

#prObject



368
369
370
371
372
373
374
375
# File 'lib/BOAST/Language/Operators.rb', line 368

def pr
  s=""
  s += indent
  s += to_s
  s += ";" if [C, CL, CUDA].include?( lang )
  output.puts s
  return self
end

#to_sObject



364
365
366
# File 'lib/BOAST/Language/Operators.rb', line 364

def to_s
  return to_var.to_s
end

#to_varObject



327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# File 'lib/BOAST/Language/Operators.rb', line 327

def to_var
  if lang == C or lang == CL and @return_type.type.vector_length > 1 then
    if @source.kind_of?( Array ) then
      raise OperatorError,  "Invalid array length!" unless @source.length == @return_type.type.vector_length
      return @return_type.copy("(#{@return_type.type.decl})( #{@source.join(", ")} )", DISCARD_OPTIONS) if lang == CL
    return Set(@source.first, @return_type).to_var if @source.uniq.size == 1
      begin
        instruction = intrinsics(:SET, @return_type.type)
        raise IntrinsicsError unless instruction
        return @return_type.copy("#{instruction}( #{@source.join(", ")} )",  DISCARD_OPTIONS)
      rescue IntrinsicsError
        instruction = intrinsics(:SET_LANE, @return_type.type)
        raise IntrinsicsError, "Missing instruction for SET_LANE on #{get_architecture_name}!" unless instruction
        s = Set(0, @return_type).to_s
        @source.each_with_index { |v,i|
          s = "#{instruction}( #{v}, #{s}, #{i} )"
        }
        return @return_type.copy(s, DISCARD_OPTIONS)
      end
    elsif @source.class != Variable or @source.type.vector_length == 1 then
      return @return_type.copy("(#{@return_type.type.decl})( #{@source} )", DISCARD_OPTIONS) if lang == CL
      if (@source.is_a?(Numeric) and @source == 0) or (@source.class == Variable and @source.constant == 0) then
        begin
          instruction = intrinsics(:SETZERO, @return_type.type)
          return @return_type.copy("#{instruction}( )", DISCARD_OPTIONS) if instruction
        rescue IntrinsicsError
        end
      end
      instruction = intrinsics(:SET1, @return_type.type)
      return @return_type.copy("#{instruction}( #{@source} )", DISCARD_OPTIONS)
    elsif @return_type.type != @source.type
      return @return_type.copy("#{Operator.convert(@source, @return_type.type)}", DISCARD_OPTIONS)
    end
  end
  return @return_type.copy("#{@source}", DISCARD_OPTIONS)
end

#typeObject



323
324
325
# File 'lib/BOAST/Language/Operators.rb', line 323

def type
  return @return_type.type
end