Skip to content

Commit 26c2b34

Browse files
feat: add amo instruction layout system for Zaamo, Zabha, Zacas extensions (#1240)
Adds handling for operand size and aq/rl mnemonics and semantics. fixes #223 fixes #361 --------- Co-authored-by: Abhijit Das <[email protected]>
1 parent 89d26be commit 26c2b34

File tree

176 files changed

+25576
-1092
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

176 files changed

+25576
-1092
lines changed

Rakefile

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ require "sorbet-runtime"
55
T.bind(self, T.all(Rake::DSL, Object))
66
extend T::Sig
77

8+
require 'pathname'
9+
require 'erb'
10+
811
Encoding.default_external = "UTF-8"
912

1013
$jobs = ENV["JOBS"].nil? ? 1 : ENV["JOBS"].to_i
@@ -360,6 +363,55 @@ file "#{$resolver.std_path}/csr/Zicntr/mcountinhibit.yaml" => [
360363
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
361364
end
362365

366+
# Define all acquire/release combinations
367+
aq_rl_variants = [
368+
{ suffix: "", aq: false, rl: false }, # base instruction
369+
{ suffix: ".aq", aq: true, rl: false }, # acquire only
370+
{ suffix: ".rl", aq: false, rl: true }, # release only
371+
{ suffix: ".aqrl", aq: true, rl: true } # both acquire and release
372+
]
373+
374+
# AMO instruction generation from layouts
375+
%w[amoadd amoand amomax amomaxu amomin amominu amoor amoswap amoxor].each do |op|
376+
["b", "h", "w", "d"].each do |size|
377+
# Determine target extension directory based on size
378+
extension_dir = %w[b h].include?(size) ? "Zabha" : "Zaamo"
379+
380+
aq_rl_variants.each do |variant|
381+
file "#{$resolver.std_path}/inst/#{extension_dir}/#{op}.#{size}#{variant[:suffix]}.yaml" => [
382+
"#{$resolver.std_path}/inst/Zaamo/#{op}.SIZE.AQRL.layout",
383+
__FILE__
384+
] do |t|
385+
aq = variant[:aq]
386+
rl = variant[:rl]
387+
erb = ERB.new(File.read($resolver.std_path / "inst/Zaamo/#{op}.SIZE.AQRL.layout"), trim_mode: "-")
388+
erb.filename = "#{$resolver.std_path}/inst/Zaamo/#{op}.SIZE.AQRL.layout"
389+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
390+
end
391+
end
392+
end
393+
end
394+
395+
# AMOCAS instruction generation from Zabha layout (supports both Zabha and Zacas)
396+
# Zabha variants (b, h) -> generated in Zabha directory
397+
["b", "h", "w", "d", "q" ].each do |size|
398+
# Determine target extension directory based on size
399+
extension_dir = %w[w d q].include?(size) ? "Zacas" : "Zabha"
400+
401+
aq_rl_variants.each do |variant|
402+
file "#{$resolver.std_path}/inst/#{extension_dir}/amocas.#{size}#{variant[:suffix]}.yaml" => [
403+
"#{$resolver.std_path}/inst/Zacas/amocas.SIZE.AQRL.layout",
404+
__FILE__
405+
] do |t|
406+
aq = variant[:aq]
407+
rl = variant[:rl]
408+
erb = ERB.new(File.read($resolver.std_path / "inst/Zacas/amocas.SIZE.AQRL.layout"), trim_mode: "-")
409+
erb.filename = "#{$resolver.std_path}/inst/Zacas/amocas.SIZE.AQRL.layout"
410+
File.write(t.name, insert_warning(erb.result(binding), t.prerequisites.first))
411+
end
412+
end
413+
end
414+
363415
namespace :gen do
364416
desc "Generate architecture files from layouts"
365417
task :arch do
@@ -386,6 +438,26 @@ namespace :gen do
386438
(0..15).each do |pmpcfg_num|
387439
Rake::Task["#{$resolver.std_path}/csr/I/pmpcfg#{pmpcfg_num}.yaml"].invoke
388440
end
441+
442+
# Generate AMO instruction files
443+
%w[amoadd amoand amomax amomaxu amomin amominu amoor amoswap amoxor].each do |op|
444+
["b", "h", "w", "d"].each do |size|
445+
extension_dir = %w[b h].include?(size) ? "Zabha" : "Zaamo"
446+
["", ".aq", ".rl", ".aqrl"].each do |suffix|
447+
Rake::Task["#{$resolver.std_path}/inst/#{extension_dir}/#{op}.#{size}#{suffix}.yaml"].invoke
448+
end
449+
end
450+
end
451+
452+
# Generate AMOCAS instruction files
453+
["b", "h", "w", "d", "q"].each do |size|
454+
["", ".aq", ".rl", ".aqrl"].each do |suffix|
455+
# Determine target extension directory based on size
456+
extension_dir = %w[w d q].include?(size) ? "Zacas" : "Zabha"
457+
458+
Rake::Task["#{$resolver.std_path}/inst/#{extension_dir}/amocas.#{size}#{suffix}.yaml"].invoke
459+
end
460+
end
389461
end
390462
end
391463

0 commit comments

Comments
 (0)