@@ -269,13 +269,9 @@ class IntLiteralAst
269269 def gen_cpp ( symtab , indent = 0 , indent_spaces : 2 )
270270 v = value ( symtab )
271271 if v >= 0
272- if v . bit_length <= 64
273- "#{ ' ' * indent } #{ value ( symtab ) } ULL"
274- else
275- "#{ ' ' * indent } #{ value ( symtab ) } _b"
276- end
272+ "#{ ' ' * indent } #{ value ( symtab ) } _b"
277273 else
278- if v . bit_length <= 63
274+ if v . bit_length <= 127
279275 "#{ ' ' * indent } #{ value ( symtab ) } LL"
280276 else
281277 "#{ ' ' * indent } #{ value ( symtab ) } _b"
@@ -289,10 +285,10 @@ def gen_cpp(symtab, indent = 0, indent_spaces: 2)
289285 var = symtab . get ( text_value )
290286
291287 if !var . nil? && var . param?
292- if var . value . nil?
288+ if symtab . cfg_arch . params_without_value . any? { | p | p . name == text_value }
293289 "#{ ' ' * indent } __UDB_RUNTIME_PARAM(#{ text_value } )"
294290 else
295- "#{ ' ' * indent } __UDB_STATIC_PARAM(#{ text_value } )"
291+ "#{ ' ' * indent } __UDB_STATIC_PARAM(#{ text_value } ) /* #{ var . value } */ "
296292 end
297293 else
298294 "#{ ' ' * indent } #{ text_value } "
@@ -341,7 +337,15 @@ def gen_cpp(symtab, indent = 0, indent_spaces: 2)
341337 class BuiltinTypeNameAst
342338 def gen_cpp ( symtab , indent = 0 , indent_spaces : 2 )
343339 if @type_name == "Bits"
344- "#{ ' ' *indent } Bits<#{ bits_expression . gen_cpp ( symtab , 0 , indent_spaces :) } >"
340+ result = ""
341+ value_result = value_try do
342+ bits_expression . value ( symtab )
343+ result = "#{ ' ' *indent } Bits<#{ bits_expression . gen_cpp ( symtab , 0 , indent_spaces :) } >"
344+ end
345+ value_else ( value_result ) do
346+ result = "#{ ' ' *indent } Bits<BitsInfinitePrecision>"
347+ end
348+ result
345349 elsif @type_name == "XReg"
346350 "#{ ' ' *indent } Bits<#{ symtab . cfg_arch . possible_xlens . max ( ) } >"
347351 elsif @type_name == "Boolean"
@@ -407,7 +411,11 @@ def gen_cpp(symtab, indent = 0, indent_spaces: 2)
407411 #"#{' '*indent}#{var.gen_cpp(symtab, 0, indent_spaces:)}[#{index.gen_cpp(symtab, 0, indent_spaces:)}]"
408412 "#{ ' ' *indent } __UDB__FUNC__OBJ xregRef(#{ index . gen_cpp ( symtab , 0 , indent_spaces :) } )"
409413 else
410- "#{ ' ' *indent } #{ var . gen_cpp ( symtab , 0 , indent_spaces :) } [#{ index . gen_cpp ( symtab , 0 , indent_spaces :) } ]"
414+ if var . type ( symtab ) . integral?
415+ "#{ ' ' *indent } extract<#{ index . gen_cpp ( symtab , 0 ) } , 1, #{ var . type ( symtab ) . width } >(#{ var . gen_cpp ( symtab , 0 , indent_spaces :) } )"
416+ else
417+ "#{ ' ' *indent } #{ var . gen_cpp ( symtab , 0 , indent_spaces :) } [#{ index . gen_cpp ( symtab , 0 , indent_spaces :) } ]"
418+ end
411419 end
412420 end
413421 end
@@ -469,7 +477,14 @@ def gen_cpp(symtab, indent = 0, indent_spaces: 2)
469477
470478 class ReplicationExpressionAst
471479 def gen_cpp ( symtab , indent = 0 , indent_spaces : 2 )
472- "#{ ' ' *indent } replicate<#{ n . gen_cpp ( symtab , 0 , indent_spaces :) } >(#{ v . gen_cpp ( symtab , 0 , indent_spaces :) } )"
480+ result = ""
481+ value_result = value_try do
482+ result = "#{ ' ' *indent } replicate<#{ n . value ( symtab ) } >(#{ v . gen_cpp ( symtab , 0 , indent_spaces :) } )"
483+ end
484+ value_else ( value_result ) do
485+ result = "#{ ' ' *indent } replicate(#{ v . gen_cpp ( symtab , 0 , indent_spaces :) } , #{ n . gen_cpp ( symtab , 0 , indent_spaces :) } )"
486+ end
487+ result
473488 end
474489 end
475490
0 commit comments