Allow different instruction set prefixes within the same architecture
This commit is contained in:
parent
cb4f54dc04
commit
152055451c
13 changed files with 37 additions and 13 deletions
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"platform": "aarch64",
|
||||
"intrinsic_prefix": "aarch64_v",
|
||||
"platform": "aarch64_v",
|
||||
"intrinsic_prefix": "",
|
||||
"llvm_prefix": "llvm.aarch64.neon.",
|
||||
"number_info": {
|
||||
"signed": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"platform": "arm",
|
||||
"intrinsic_prefix": "arm_v",
|
||||
"platform": "arm_v",
|
||||
"intrinsic_prefix": "",
|
||||
"llvm_prefix": "llvm.neon.v",
|
||||
"number_info": {
|
||||
"signed": {
|
||||
|
|
|
|||
|
|
@ -26,18 +26,19 @@ SPEC = re.compile(
|
|||
class PlatformInfo(object):
|
||||
def __init__(self, json):
|
||||
self._platform = json['platform']
|
||||
self._intrinsic_prefix = json['intrinsic_prefix']
|
||||
|
||||
def intrinsic_prefix(self):
|
||||
return self._intrinsic_prefix
|
||||
def platform_prefix(self):
|
||||
return self._platform
|
||||
|
||||
class IntrinsicSet(object):
|
||||
def __init__(self, platform, json):
|
||||
|
||||
self._llvm_prefix = json['llvm_prefix']
|
||||
self._type_info = json['number_info']
|
||||
self._intrinsics = json['intrinsics']
|
||||
self._widths = json['width_info']
|
||||
self._platform = platform
|
||||
self._intrinsic_prefix = json['intrinsic_prefix']
|
||||
|
||||
def intrinsics(self):
|
||||
for raw in self._intrinsics:
|
||||
|
|
@ -48,6 +49,9 @@ class IntrinsicSet(object):
|
|||
def platform(self):
|
||||
return self._platform
|
||||
|
||||
def intrinsic_prefix(self):
|
||||
return self._intrinsic_prefix
|
||||
|
||||
def llvm_prefix(self):
|
||||
return self._llvm_prefix
|
||||
|
||||
|
|
@ -538,8 +542,14 @@ class MonomorphicIntrinsic(object):
|
|||
*self._args,
|
||||
width = self._width)
|
||||
|
||||
def platform_prefix(self):
|
||||
return self._platform.platform().platform_prefix()
|
||||
|
||||
def intrinsic_set_name(self):
|
||||
return self._platform.intrinsic_prefix()
|
||||
|
||||
def intrinsic_name(self):
|
||||
return self._platform.platform().intrinsic_prefix() + self.intrinsic_suffix()
|
||||
return self._platform.intrinsic_prefix() + self.intrinsic_suffix()
|
||||
|
||||
def compiler_args(self):
|
||||
return ', '.join(arg.compiler_ctor_ref() for arg in self._args_raw)
|
||||
|
|
@ -751,8 +761,9 @@ class ExternBlock(object):
|
|||
return 'extern "platform-intrinsic" {'
|
||||
|
||||
def render(self, mono):
|
||||
return ' fn {}{};'.format(mono.intrinsic_name(),
|
||||
mono.intrinsic_signature())
|
||||
return ' fn {}{}{};'.format(mono.platform_prefix(),
|
||||
mono.intrinsic_name(),
|
||||
mono.intrinsic_signature())
|
||||
|
||||
def close(self):
|
||||
return '}'
|
||||
|
|
@ -786,7 +797,7 @@ use IntrinsicDef::Named;
|
|||
#[inline(never)]
|
||||
pub fn find(name: &str) -> Option<Intrinsic> {{
|
||||
if !name.starts_with("{0}") {{ return None }}
|
||||
Some(match &name["{0}".len()..] {{'''.format(platform.intrinsic_prefix())
|
||||
Some(match &name["{0}".len()..] {{'''.format(platform.platform_prefix())
|
||||
|
||||
def render(self, mono):
|
||||
return '''\
|
||||
|
|
@ -794,7 +805,7 @@ pub fn find(name: &str) -> Option<Intrinsic> {{
|
|||
inputs: {{ static INPUTS: [&'static Type; {}] = [{}]; &INPUTS }},
|
||||
output: {},
|
||||
definition: Named("{}")
|
||||
}},'''.format(mono.intrinsic_suffix(),
|
||||
}},'''.format(mono.intrinsic_set_name() + mono.intrinsic_suffix(),
|
||||
len(mono._args_raw),
|
||||
mono.compiler_args(),
|
||||
mono.compiler_ret(),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.avx.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.avx2.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.fma.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,26 +1,30 @@
|
|||
{
|
||||
"platform": "x86",
|
||||
"intrinsic_prefix": "x86_mm",
|
||||
"number_info": {
|
||||
"signed": {
|
||||
"kind": "s",
|
||||
"kind_short": "",
|
||||
"data_type": { "pattern": "epi{bitwidth}" },
|
||||
"bitwidth": { "pattern": "{bitwidth}" },
|
||||
"data_type_short": { "8": "b", "16": "w", "32": "d", "64": "q" }
|
||||
},
|
||||
"unsigned": {
|
||||
"kind": "u",
|
||||
"kind_short": "u",
|
||||
"data_type": { "pattern": "epu{bitwidth}" },
|
||||
"bitwidth": { "pattern": "{bitwidth}" },
|
||||
"data_type_short": { "8": "b", "16": "w", "32": "d", "64": "q" }
|
||||
},
|
||||
"float": {
|
||||
"kind": "f",
|
||||
"data_type": { "32": "ps", "64": "pd" },
|
||||
"bitwidth": { "pattern": "{bitwidth}" },
|
||||
"data_type_short": { "32": "ps", "64": "pd" }
|
||||
}
|
||||
},
|
||||
"width_info": {
|
||||
"32": { "width_mm": "32", "width_suffix": "" },
|
||||
"64": { "width_mm": "64", "width_suffix": "" },
|
||||
"128": { "width_mm": "", "width_suffix": "" },
|
||||
"256": { "width_mm": "256", "width_suffix": ".256" },
|
||||
"512": { "width_mm": "512", "width_suffix": ".512" }
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.sse.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.sse2.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.sse3.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.sse41.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.sse42.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"intrinsic_prefix": "_mm",
|
||||
"llvm_prefix": "llvm.x86.ssse3.",
|
||||
"intrinsics": [
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue