143868475SJanosch Frank /* 243868475SJanosch Frank * Tests vector instruction support 343868475SJanosch Frank * 443868475SJanosch Frank * Copyright 2018 IBM Corp. 543868475SJanosch Frank * 643868475SJanosch Frank * Authors: 743868475SJanosch Frank * Janosch Frank <frankja@de.ibm.com> 843868475SJanosch Frank * 943868475SJanosch Frank * This code is free software; you can redistribute it and/or modify it 1043868475SJanosch Frank * under the terms of the GNU Library General Public License version 2. 1143868475SJanosch Frank */ 1243868475SJanosch Frank #include <libcflat.h> 1343868475SJanosch Frank #include <asm/page.h> 1443868475SJanosch Frank #include <asm/facility.h> 1543868475SJanosch Frank #include <asm/interrupt.h> 1643868475SJanosch Frank #include <asm-generic/barrier.h> 1743868475SJanosch Frank 1843868475SJanosch Frank static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); 1943868475SJanosch Frank 2043868475SJanosch Frank /* Fills all vector registers with data from addr */ 2143868475SJanosch Frank static inline void vlm_all(unsigned long *addr) 2243868475SJanosch Frank { 2343868475SJanosch Frank asm volatile(" .machine z13\n" 2443868475SJanosch Frank " vlm 0, 15, %[a]\n" 2543868475SJanosch Frank : : [a] "Q" (*addr) 2643868475SJanosch Frank : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", 2743868475SJanosch Frank "v9", "v10", "v11", "v12", "v13", "v14", "v15"); 2843868475SJanosch Frank asm volatile(" .machine z13\n" 2943868475SJanosch Frank " vlm 16, 31, %[a]\n" 3043868475SJanosch Frank : : [a] "Q" (*(addr+256/8)) 3143868475SJanosch Frank : "v16", "v17", "v18", "v19", "v20", "v21", "v22", 3243868475SJanosch Frank "v23", "v24", "v25", "v26", "v27", "v28", "v29", 3343868475SJanosch Frank "v30", "v31"); 3443868475SJanosch Frank } 3543868475SJanosch Frank 3643868475SJanosch Frank static void test_add(void) 3743868475SJanosch Frank { 3843868475SJanosch Frank static struct prm { 3943868475SJanosch Frank __uint128_t a,b,c; 4043868475SJanosch Frank } prm __attribute__((aligned(16))); 4143868475SJanosch Frank 4243868475SJanosch Frank prm.a = prm.b = prm.c = 21; 4343868475SJanosch Frank 4443868475SJanosch Frank asm volatile(" .machine z13\n" 4543868475SJanosch Frank " vl 0, %[v1]\n" 4643868475SJanosch Frank " vl 1, %[v2]\n" 4743868475SJanosch Frank " va 2, 0, 1, 4\n" 4843868475SJanosch Frank " vst 2, %[v3]\n" 4943868475SJanosch Frank : [v3] "=Q" (prm.c) 5043868475SJanosch Frank : [v1] "Q" (prm.a), [v2] "Q" (prm.b) 5143868475SJanosch Frank : "v0", "v1", "v2", "memory"); 52*a299895bSThomas Huth report(prm.c == 42, "adding 21"); 5343868475SJanosch Frank } 5443868475SJanosch Frank 5543868475SJanosch Frank /* z14 vector extension test */ 5643868475SJanosch Frank static void test_ext1_nand(void) 5743868475SJanosch Frank { 5843868475SJanosch Frank bool has_vext = test_facility(134); 5943868475SJanosch Frank static struct prm { 6043868475SJanosch Frank __uint128_t a,b,c; 6143868475SJanosch Frank } prm __attribute__((aligned(16))); 6243868475SJanosch Frank 6390016cc5SThomas Huth if (!has_vext) { 6490016cc5SThomas Huth report_skip("Vector extensions 1 is not available"); 6543868475SJanosch Frank return; 6690016cc5SThomas Huth } 6743868475SJanosch Frank 6843868475SJanosch Frank memset(&prm, 0xff, sizeof(prm)); 6943868475SJanosch Frank 7043868475SJanosch Frank asm volatile(" .machine z13\n" 7143868475SJanosch Frank " vl 0, %[v1]\n" 7243868475SJanosch Frank " vl 1, %[v2]\n" 7343868475SJanosch Frank " .byte 0xe7, 0x20, 0x10, 0x00, 0x00, 0x6e\n" /* vnn */ 7443868475SJanosch Frank " vst 2, %[v3]\n" 7543868475SJanosch Frank : [v3] "=Q" (prm.c) 7643868475SJanosch Frank : [v1] "Q" (prm.a), [v2] "Q" (prm.b) 7743868475SJanosch Frank : "v0", "v1", "v2", "memory"); 78*a299895bSThomas Huth report(!prm.c, "nand ff"); 7943868475SJanosch Frank } 8043868475SJanosch Frank 8143868475SJanosch Frank /* z14 bcd extension test */ 8243868475SJanosch Frank static void test_bcd_add(void) 8343868475SJanosch Frank { 8443868475SJanosch Frank bool has_bcd = test_facility(135); 8543868475SJanosch Frank static struct prm { 8643868475SJanosch Frank __uint128_t a,b,c; 8743868475SJanosch Frank } prm __attribute__((aligned(16))); 8843868475SJanosch Frank 8990016cc5SThomas Huth if (!has_bcd) { 9090016cc5SThomas Huth report_skip("Vector BCD extensions is not available"); 9143868475SJanosch Frank return; 9290016cc5SThomas Huth } 9343868475SJanosch Frank 9443868475SJanosch Frank prm.c = 0; 9543868475SJanosch Frank prm.a = prm.b = 0b001000011100; 9643868475SJanosch Frank 9743868475SJanosch Frank asm volatile(" .machine z13\n" 9843868475SJanosch Frank " vl 0, %[v1]\n" 9943868475SJanosch Frank " vl 1, %[v2]\n" 10043868475SJanosch Frank " .byte 0xe6, 0x20, 0x10, 0x01, 0x00, 0x71\n" /* vap */ 10143868475SJanosch Frank " vst 2, %[v3]\n" 10243868475SJanosch Frank : [v3] "=Q" (prm.c) 10343868475SJanosch Frank : [v1] "Q" (prm.a), [v2] "Q" (prm.b) 10443868475SJanosch Frank : "v0", "v1", "v2", "memory"); 105*a299895bSThomas Huth report(prm.c == 0x42c, "bcd add 21"); 10643868475SJanosch Frank } 10743868475SJanosch Frank 10843868475SJanosch Frank static void init(void) 10943868475SJanosch Frank { 11043868475SJanosch Frank /* Enable vector instructions */ 11143868475SJanosch Frank ctl_set_bit(0, 17); 11243868475SJanosch Frank 11343868475SJanosch Frank /* Preset vector registers to 0xff */ 11443868475SJanosch Frank memset(pagebuf, 0xff, PAGE_SIZE); 11543868475SJanosch Frank vlm_all((u64*)pagebuf); 11643868475SJanosch Frank } 11743868475SJanosch Frank 11843868475SJanosch Frank int main(void) 11943868475SJanosch Frank { 12043868475SJanosch Frank bool has_vregs = test_facility(129); 12143868475SJanosch Frank 12243868475SJanosch Frank report_prefix_push("vector"); 12390016cc5SThomas Huth if (!has_vregs) { 12490016cc5SThomas Huth report_skip("Basic vector facility is not available"); 12543868475SJanosch Frank goto done; 12690016cc5SThomas Huth } 12743868475SJanosch Frank 12843868475SJanosch Frank init(); 12943868475SJanosch Frank test_add(); 13043868475SJanosch Frank test_ext1_nand(); 13143868475SJanosch Frank test_bcd_add(); 13243868475SJanosch Frank 13343868475SJanosch Frank done: 13443868475SJanosch Frank report_prefix_pop(); 13543868475SJanosch Frank return report_summary(); 13643868475SJanosch Frank } 137