From 152055451c552121be35a179bb77194e02800baa Mon Sep 17 00:00:00 2001 From: gnzlbg Date: Wed, 22 Jun 2016 15:47:49 +0200 Subject: [PATCH] Allow different instruction set prefixes within the same architecture --- src/etc/platform-intrinsics/aarch64.json | 4 ++-- src/etc/platform-intrinsics/arm.json | 4 ++-- src/etc/platform-intrinsics/generator.py | 27 +++++++++++++++------- src/etc/platform-intrinsics/x86/avx.json | 1 + src/etc/platform-intrinsics/x86/avx2.json | 1 + src/etc/platform-intrinsics/x86/fma.json | 1 + src/etc/platform-intrinsics/x86/info.json | 6 ++++- src/etc/platform-intrinsics/x86/sse.json | 1 + src/etc/platform-intrinsics/x86/sse2.json | 1 + src/etc/platform-intrinsics/x86/sse3.json | 1 + src/etc/platform-intrinsics/x86/sse41.json | 1 + src/etc/platform-intrinsics/x86/sse42.json | 1 + src/etc/platform-intrinsics/x86/ssse3.json | 1 + 13 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/etc/platform-intrinsics/aarch64.json b/src/etc/platform-intrinsics/aarch64.json index 79fd76994288..c8cda4077b79 100644 --- a/src/etc/platform-intrinsics/aarch64.json +++ b/src/etc/platform-intrinsics/aarch64.json @@ -1,6 +1,6 @@ { - "platform": "aarch64", - "intrinsic_prefix": "aarch64_v", + "platform": "aarch64_v", + "intrinsic_prefix": "", "llvm_prefix": "llvm.aarch64.neon.", "number_info": { "signed": { diff --git a/src/etc/platform-intrinsics/arm.json b/src/etc/platform-intrinsics/arm.json index 97db7cbb3e0a..39e49e239f34 100644 --- a/src/etc/platform-intrinsics/arm.json +++ b/src/etc/platform-intrinsics/arm.json @@ -1,6 +1,6 @@ { - "platform": "arm", - "intrinsic_prefix": "arm_v", + "platform": "arm_v", + "intrinsic_prefix": "", "llvm_prefix": "llvm.neon.v", "number_info": { "signed": { diff --git a/src/etc/platform-intrinsics/generator.py b/src/etc/platform-intrinsics/generator.py index 2f2313d84ac6..d2f40f167142 100644 --- a/src/etc/platform-intrinsics/generator.py +++ b/src/etc/platform-intrinsics/generator.py @@ -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 {{ 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 {{ 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(), diff --git a/src/etc/platform-intrinsics/x86/avx.json b/src/etc/platform-intrinsics/x86/avx.json index 05a4721aed83..1f41e2ecf3e6 100644 --- a/src/etc/platform-intrinsics/x86/avx.json +++ b/src/etc/platform-intrinsics/x86/avx.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.avx.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/avx2.json b/src/etc/platform-intrinsics/x86/avx2.json index e88ff3d2b806..4e006c1c4cf4 100644 --- a/src/etc/platform-intrinsics/x86/avx2.json +++ b/src/etc/platform-intrinsics/x86/avx2.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.avx2.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/fma.json b/src/etc/platform-intrinsics/x86/fma.json index c922d166c8fb..dcc26cd501c9 100644 --- a/src/etc/platform-intrinsics/x86/fma.json +++ b/src/etc/platform-intrinsics/x86/fma.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.fma.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/info.json b/src/etc/platform-intrinsics/x86/info.json index d48bcd268a00..8e90b8579c49 100644 --- a/src/etc/platform-intrinsics/x86/info.json +++ b/src/etc/platform-intrinsics/x86/info.json @@ -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" } diff --git a/src/etc/platform-intrinsics/x86/sse.json b/src/etc/platform-intrinsics/x86/sse.json index adff0dc41b2a..d8eef8a3514a 100644 --- a/src/etc/platform-intrinsics/x86/sse.json +++ b/src/etc/platform-intrinsics/x86/sse.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.sse.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/sse2.json b/src/etc/platform-intrinsics/x86/sse2.json index d09980d95f31..4d6317d80a57 100644 --- a/src/etc/platform-intrinsics/x86/sse2.json +++ b/src/etc/platform-intrinsics/x86/sse2.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.sse2.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/sse3.json b/src/etc/platform-intrinsics/x86/sse3.json index ed13595929d1..119bf208f7e3 100644 --- a/src/etc/platform-intrinsics/x86/sse3.json +++ b/src/etc/platform-intrinsics/x86/sse3.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.sse3.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/sse41.json b/src/etc/platform-intrinsics/x86/sse41.json index de792cd1060b..b499637e0d3c 100644 --- a/src/etc/platform-intrinsics/x86/sse41.json +++ b/src/etc/platform-intrinsics/x86/sse41.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.sse41.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/sse42.json b/src/etc/platform-intrinsics/x86/sse42.json index c43ffef0dc57..fdee9c8a6671 100644 --- a/src/etc/platform-intrinsics/x86/sse42.json +++ b/src/etc/platform-intrinsics/x86/sse42.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.sse42.", "intrinsics": [ { diff --git a/src/etc/platform-intrinsics/x86/ssse3.json b/src/etc/platform-intrinsics/x86/ssse3.json index af6afbb19a26..5a5617957b3e 100644 --- a/src/etc/platform-intrinsics/x86/ssse3.json +++ b/src/etc/platform-intrinsics/x86/ssse3.json @@ -1,4 +1,5 @@ { + "intrinsic_prefix": "_mm", "llvm_prefix": "llvm.x86.ssse3.", "intrinsics": [ {