From ec666b7c792f1d74a1d49ad7fcec150ee78cbc58 Mon Sep 17 00:00:00 2001 From: JanLJL Date: Thu, 25 Jul 2019 23:17:10 +0200 Subject: [PATCH] bugfixes, nicer frontend and first AMD Zen data added --- osaca/data/csl.yml | 216 ++++++---- osaca/data/isa/x86.yml | 35 ++ osaca/data/zen1.yml | 566 +++++++++++++++++++++++++++ osaca/frontend.py | 48 ++- osaca/semantics/semanticsAppender.py | 6 +- 5 files changed, 778 insertions(+), 93 deletions(-) create mode 100644 osaca/data/zen1.yml diff --git a/osaca/data/csl.yml b/osaca/data/csl.yml index 6a4a91b..8a3f400 100644 --- a/osaca/data/csl.yml +++ b/osaca/data/csl.yml @@ -37,7 +37,7 @@ port_model_scheme: | | VNNI | ┌-------┐ └-------┘ | VNNI | └-------┘ -ports: ["0", "0DV", "1", "2", "3", "4", "5", "6", "7"] +ports: ["0", "0DV", "1", "2", "2D", "3", "3D", "4", "5", "6", "7"] instruction_forms: - name: addsd operands: @@ -46,8 +46,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: addss operands: - class: "register" @@ -55,8 +55,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: addl operands: - class: "immediate" @@ -64,8 +64,8 @@ instruction_forms: - class: "register" name: "gpr" throughput: 0.25 - latency: 1.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] + latency: 1.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] - name: addq operands: - class: "immediate" @@ -73,8 +73,8 @@ instruction_forms: - class: "register" name: "gpr" throughput: 0.25 - latency: 1.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] + latency: 1.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] - name: cmpl operands: - class: "register" @@ -82,8 +82,8 @@ instruction_forms: - class: "register" name: "gpr" throughput: 0.25 - latency: ~ # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] + latency: ~ # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] - name: cmpq operands: - class: "register" @@ -91,8 +91,8 @@ instruction_forms: - class: "register" name: "gpr" throughput: 0.25 - latency: ~ # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] + latency: ~ # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] - name: cmpq operands: - class: "register" @@ -103,20 +103,20 @@ instruction_forms: index: ~ scale: 1 throughput: 0.5 - latency: ~ # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.25, 0.0, 0.25, 0.5, 0.5, 0.0, 0.25, 0.25, 0.0] + latency: ~ # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.25, 0.0, 0.25, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.25, 0.25, 0.33333] - name: ja operands: - class: 'identifier' throughput: 0.0 - latency: 0.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 0.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: jne operands: - class: 'identifier' throughput: 0.0 - latency: 0.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 0.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: mulsd operands: - class: "register" @@ -124,8 +124,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: mulss operands: - class: "register" @@ -133,8 +133,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: rcpss operands: - class: "register" @@ -142,8 +142,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 1.0 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: sqrtsd operands: - class: "register" @@ -151,8 +151,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 6.0 - latency: 22.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [1.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 22.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [1.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: sqrtss operands: - class: "register" @@ -160,8 +160,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 3.0 - latency: 16.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 16.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: subq operands: - class: "immediate" @@ -169,8 +169,8 @@ instruction_forms: - class: "register" name: "gpr" throughput: 0.25 - latency: 1.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] + latency: 1.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.0] - name: vaddpd operands: - class: "register" @@ -180,8 +180,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 5.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: vaddpd operands: - class: "memory" @@ -194,8 +194,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 8.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vaddpd operands: - class: "memory" @@ -208,8 +208,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 8.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vaddsd operands: - class: "register" @@ -219,8 +219,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: vaddss operands: - class: "register" @@ -230,8 +230,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: vdivsd operands: - class: "register" @@ -241,8 +241,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 4.0 - latency: 14.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [1.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 14.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [1.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: vdivss operands: - class: "register" @@ -252,8 +252,22 @@ instruction_forms: - class: "register" name: "xmm" throughput: 3.0 - latency: 11.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 11.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vfmadd213pd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 0.5 + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vfmadd213pd operands: - class: "memory" @@ -266,8 +280,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vfmadd231pd operands: - class: "memory" @@ -280,8 +294,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vfmadd231pd operands: - class: "memory" @@ -294,8 +308,23 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + - name: vfmadd132pd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 0.5 + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + - name: vfmadd132pd operands: - class: "memory" @@ -308,8 +337,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vmulsd operands: - class: "register" @@ -319,8 +348,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: vmulss operands: - class: "register" @@ -330,8 +359,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - name: vmulpd operands: - class: "register" @@ -341,8 +370,37 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 4.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + latency: 4.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vmulpd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 0.5 + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] + + - name: vmulpd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 0.5 + latency: 7.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.5, 0.0, 0.5, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vmovapd operands: - class: "memory" @@ -353,8 +411,8 @@ instruction_forms: - class: "register" name: "xmm" throughput: 0.5 - latency: 2.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vmovapd operands: - class: "register" @@ -365,8 +423,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 0.0, 0.0, 0.0] + latency: 2.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] - name: vmovapd operands: - class: "memory" @@ -377,8 +435,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vmovapd operands: - class: "memory" @@ -389,8 +447,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vmovapd operands: - class: "register" @@ -401,8 +459,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] - name: vmovapd operands: - class: "register" @@ -413,8 +471,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] - name: vmovupd operands: - class: "register" @@ -425,8 +483,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] - name: vmovupd operands: - class: "register" @@ -437,8 +495,8 @@ instruction_forms: index: "gpr" scale: 1 throughput: 1.0 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.0, 0.33333, 0.0, 1.0, 0.0, 0.0, 0.33333] - name: vmovupd operands: - class: "memory" @@ -449,8 +507,8 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] - name: vmovupd operands: - class: "memory" @@ -461,6 +519,6 @@ instruction_forms: - class: "register" name: "ymm" throughput: 0.5 - latency: 3.0 # 0 0DV 1 2 3 4 5 6 7 - port_pressure: [0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0] + latency: 3.0 # 0 0DV 1 2 2D 3 3D 4 5 6 7 + port_pressure: [0.0, 0.0, 0.0, 0.33333, 0.5, 0.33333, 0.5, 0.0, 0.0, 0.0, 0.33333] diff --git a/osaca/data/isa/x86.yml b/osaca/data/isa/x86.yml index c95fa8a..3e0d7b6 100644 --- a/osaca/data/isa/x86.yml +++ b/osaca/data/isa/x86.yml @@ -110,6 +110,23 @@ instruction_forms: name: "ymm" source: true destination: true + - name: vfmadd132pd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + source: true + destination: false + - class: "register" + name: "ymm" + source: true + destination: false + - class: "register" + name: "ymm" + source: true + destination: true - name: vfmadd213pd operands: - class: "memory" @@ -127,6 +144,24 @@ instruction_forms: name: "ymm" source: true destination: true + - name: vfmadd213pd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + source: true + destination: false + - class: "register" + name: "ymm" + source: true + destination: false + - class: "register" + name: "ymm" + source: true + destination: true + - name: vfmadd231pd operands: - class: "memory" diff --git a/osaca/data/zen1.yml b/osaca/data/zen1.yml new file mode 100644 index 0000000..85ccf59 --- /dev/null +++ b/osaca/data/zen1.yml @@ -0,0 +1,566 @@ +osaca_version: 0.~ +micro_architecture: "AMD Zen (family 17h)" +isa: "x86" +port_model_scheme: | + ┌--------------------------------------┐ ┌-----------------------------------------------┐ + | 96 entries OoO scheduler | | 84 entries OoO scheduler | + └--------------------------------------┘ └-----------------------------------------------┘ + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ + ┌-------┐ ┌-------┐ ┌-------┐ ┌-------┐ ┌------┐ ┌-----┐ ┌-----┐ ┌------┐ ┌-----┐ ┌-----┐ + |SSE ALU| |SSE ALU| |SSE ALU| |SSE ALU| | ALU | | ALU | | ALU | | ALU | | AGU | | AGU | + └-------┘ └-------┘ └-------┘ └-------┘ └------┘ └-----┘ └-----┘ └------┘ └-----┘ └-----┘ + ┌-------┐ ┌-------┐ ┌-------┐ ┌-------┐ ┌------┐ ┌-----┐ ┌-----┐ ┌------┐ | | + |SSE MUL| |SSE MUL| |SSE ADD| |SSE ADD| |BRANCH| | MUL | | MUL | |BRANCH| ▼ ▼ + └-------┘ └-------┘ └-------┘ └-------┘ └------┘ └-----┘ └-----┘ └------┘ ┌-------------┐ + ┌-------┐ ┌-------┐ ┌-------┐ ┌-------┐ | LOAD | + |SSE FMA| |SSE FMA| | SSE | |SSE DIV| └-------------┘ + └-------┘ └-------┘ | SHUF | └-------┘ ┌-------------┐ + ┌-------┐ └-------┘ | LOAD | + | SSE | └-------------┘ + | SHUF | ┌-------------┐ + └-------┘ | STORE | + └-------------┘ +ports: ["0", "1", "2", "3", "3DV", "4", "5", "6", "7", "8", "8D", "9", "9D"] +instruction_forms: + - name: add + operands: + - class: "immediate" + imd: "int" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: 1.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: add + operands: + - class: "register" + name: "gpr" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: 1 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: addl + operands: + - class: "immediate" + imd: "int" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: 1.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: addq + operands: + - class: "immediate" + imd: "int" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: 1.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: cmpl + operands: + - class: "register" + name: "gpr" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: cmpq + operands: + - class: "register" + name: "gpr" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: cmpq + operands: + - class: "register" + name: "gpr" + - class: "memory" + base: "gpr" + offset: "imd" + index: ~ + scale: 1 + throughput: 0.25 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: ja + operands: + - class: 'identifier' + throughput: 0.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: jne + operands: + - class: 'identifier' + throughput: 0.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: mulsd + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: 4.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: mulss + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: rcpss + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: ~ #1.0 + latency: 5.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: sqrtsd + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: ~ #8.0 + latency: 23.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: sqrtss + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: ~ #5.0 + latency: 17.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: subq + operands: + - class: "register" + name: "gpr" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: 1.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: subq + operands: + - class: "immediate" + imd: "int" + - class: "register" + name: "gpr" + throughput: 0.25 + latency: 1.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.25, 0.25, 0.25, 0.25, 0.0, 0.0, 0.0, 0.0] + - name: vaddpd + operands: + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vaddpd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vaddpd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vaddsd + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vaddss + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vdivsd + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 4.0 + latency: 13.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 1.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vdivss + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 3.0 + latency: 10.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vfmadd213pd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vfmadd213pd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vfmadd231pd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vfmadd231pd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vfmadd132pd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vfmadd132pd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vmulsd + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: 4.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vmulss + operands: + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: 3.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vmulpd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5] + - name: vmulpd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "xmm" + - class: "register" + name: "xmm" + throughput: 0.5 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5] + - name: vmulpd + operands: + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: 4.0 # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + - name: vmulpd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vmulpd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vmovapd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "xmm" + throughput: 0.5 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5] + - name: vmovapd + operands: + - class: "register" + name: "xmm" + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 1.0, 0.5, 1.0] + - name: vmovapd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vmovapd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0] + - name: vmovapd + operands: + - class: "register" + name: "ymm" + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + throughput: 2.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] + - name: vmovapd + operands: + - class: "register" + name: "ymm" + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + throughput: 2.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] + - name: vmovaps + operands: + - class: "register" + name: "xmm" + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 1.0, 0.5, 1.0] + - name: vmovaps + operands: + - class: "register" + name: "xmm" + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + throughput: 1.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 1.0, 0.5, 1.0] + - name: vmovupd + operands: + - class: "register" + name: "ymm" + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + throughput: 2.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] + - name: vmovupd + operands: + - class: "register" + name: "ymm" + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + throughput: 2.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] + - name: vmovupd + operands: + - class: "memory" + base: "gpr" + offset: ~ + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + throughput: 2.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] + - name: vmovupd + operands: + - class: "memory" + base: "gpr" + offset: "imd" + index: "gpr" + scale: 1 + - class: "register" + name: "ymm" + throughput: 2.0 + latency: ~ # 0 1 2 3 3DV 4 5 6 7 8 8D 9 9D + port_pressure: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0, 2.0] diff --git a/osaca/frontend.py b/osaca/frontend.py index 201a2e7..aa7fc0d 100755 --- a/osaca/frontend.py +++ b/osaca/frontend.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import os +import re from functools import reduce from ruamel import yaml @@ -48,28 +49,47 @@ class Frontend(object): port_len = self._get_max_port_len(kernel) separator = '-' * sum([x + 3 for x in port_len]) + '-' separator += '--' + len(str(kernel[-1]['line_number'])) * '-' if show_lineno else '' + col_sep = '|' + sep_list = self._get_separator_list(col_sep) print(lineno_filler + self._get_port_number_line(port_len)) print(separator) for instruction_form in kernel: line = '{:4d} {} {} {}'.format( instruction_form['line_number'], - self._get_port_pressure(instruction_form['port_pressure'], port_len), + self._get_port_pressure(instruction_form['port_pressure'], port_len, sep_list), self._get_flag_symbols(instruction_form['flags']) if instruction_form['instruction'] is not None else ' ', instruction_form['line'].strip(), ) - line = line if show_lineno else '|' + '|'.join(line.split('|')[1:]) + line = line if show_lineno else col_sep + col_sep.join(line.split(col_sep)[1:]) if show_cmnts is False and self._is_comment(instruction_form): continue print(line) print() + tp_sum = self._get_throughput_sum(kernel) + print(lineno_filler + self._get_port_pressure(tp_sum, port_len, ' ')) + + def _get_throughput_sum(self, kernel): tp_sum = reduce( (lambda x, y: [sum(z) for z in zip(x, y)]), [instr['port_pressure'] for instr in kernel], ) tp_sum = [round(x, 2) for x in tp_sum] - print(lineno_filler + self._get_port_pressure(tp_sum, port_len, ' ')) + return tp_sum + + def _get_separator_list(self, separator, separator_2=' '): + separator_list = [] + for i in range(len(self._data['ports']) - 1): + if ( + re.search(r'\d+', self._data['ports'][i]).group() + == re.search(r'\d+', self._data['ports'][i + 1]).group() + ): + separator_list.append(separator_2) + else: + separator_list.append(separator) + separator_list.append(separator) + return separator_list def _get_flag_symbols(self, flag_obj): string_result = '' @@ -80,14 +100,16 @@ class Frontend(object): return string_result def _get_port_pressure(self, ports, port_len, separator='|'): - string_result = '{} '.format(separator) + if not isinstance(separator, list): + separator = [separator for x in ports] + string_result = '{} '.format(separator[-1]) for i in range(len(ports)): if float(ports[i]) == 0.0: - string_result += port_len[i] * ' ' + ' {} '.format(separator) + string_result += port_len[i] * ' ' + ' {} '.format(separator[i]) continue left_len = len(str(float(ports[i])).split('.')[0]) substr = '{:' + str(left_len) + '.' + str(max(port_len[i] - left_len - 1, 0)) + 'f}' - string_result += substr.format(ports[i]) + ' {} '.format(separator) + string_result += substr.format(ports[i]) + ' {} '.format(separator[i]) return string_result[:-1] def _get_max_port_len(self, kernel): @@ -98,21 +120,25 @@ class Frontend(object): port_len[i] = len('{:.2f}'.format(port)) return port_len - def _get_port_number_line(self, port_len): - string_result = '|' + def _get_port_number_line(self, port_len, separator='|'): + string_result = separator + separator_list = self._get_separator_list(separator, '-') for i, length in enumerate(port_len): substr = '{:^' + str(length + 2) + 's}' - string_result += substr.format(self._data['ports'][i]) + '|' + string_result += substr.format(self._data['ports'][i]) + separator_list[i] return string_result - def print_latency_analysis(self, cp_kernel): + def print_latency_analysis(self, cp_kernel, separator='|'): print('\n\n------------------------') for instruction_form in cp_kernel: print( - '{} | {} |{}| {}'.format( + '{} {} {} {}{}{} {}'.format( instruction_form['line_number'], + separator, instruction_form['latency'], + separator, 'X' if INSTR_FLAGS.LT_UNKWN in instruction_form['flags'] else ' ', + separator, instruction_form['line'], ) ) diff --git a/osaca/semantics/semanticsAppender.py b/osaca/semantics/semanticsAppender.py index 9150178..0c4fc19 100755 --- a/osaca/semantics/semanticsAppender.py +++ b/osaca/semantics/semanticsAppender.py @@ -51,7 +51,7 @@ class SemanticsAppender(object): assert isinstance(port_pressure, list) assert len(port_pressure) == port_number instruction_form['port_pressure'] = port_pressure - if sum(port_pressure) == 0: + if sum(port_pressure) == 0 and throughput is not None: # port pressure on all ports 0 --> not bound to a port flags.append(INSTR_FLAGS.NOT_BOUND) except AssertionError: @@ -60,11 +60,11 @@ class SemanticsAppender(object): + 'Please check entry for:\n {}'.format(instruction_form) ) instruction_form['port_pressure'] = [0.0 for i in range(port_number)] - flags.append(self.INSTR_FLAGS.TP_UNKWN) + flags.append(INSTR_FLAGS.TP_UNKWN) if throughput is None: # assume 0 cy and mark as unknown throughput = 0.0 - flags.append(self.INSTR_FLAGS.TP_UNKWN) + flags.append(INSTR_FLAGS.TP_UNKWN) latency = instruction_data['latency'] if latency is None: # assume 0 cy and mark as unknown