125c28e83SPiotr Jasiukajtis/* 225c28e83SPiotr Jasiukajtis * CDDL HEADER START 325c28e83SPiotr Jasiukajtis * 425c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the 525c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License"). 625c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License. 725c28e83SPiotr Jasiukajtis * 825c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 925c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing. 1025c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions 1125c28e83SPiotr Jasiukajtis * and limitations under the License. 1225c28e83SPiotr Jasiukajtis * 1325c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each 1425c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1525c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the 1625c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying 1725c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner] 1825c28e83SPiotr Jasiukajtis * 1925c28e83SPiotr Jasiukajtis * CDDL HEADER END 2025c28e83SPiotr Jasiukajtis */ 2125c28e83SPiotr Jasiukajtis/* 2225c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 2325c28e83SPiotr Jasiukajtis */ 2425c28e83SPiotr Jasiukajtis/* 2525c28e83SPiotr Jasiukajtis * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 2625c28e83SPiotr Jasiukajtis * Use is subject to license terms. 2725c28e83SPiotr Jasiukajtis */ 2825c28e83SPiotr Jasiukajtis 2925c28e83SPiotr Jasiukajtis .file "__swapFLAGS.s" 3025c28e83SPiotr Jasiukajtis 3125c28e83SPiotr Jasiukajtis#include "libm.h" 3225c28e83SPiotr Jasiukajtis 3325c28e83SPiotr Jasiukajtis/* 3425c28e83SPiotr Jasiukajtis * swap exception masks 3525c28e83SPiotr Jasiukajtis * 3625c28e83SPiotr Jasiukajtis * Put the complement of bits 5-0 of the argument into FPCW bits 5-0 3725c28e83SPiotr Jasiukajtis * and MXCSR bits 12-7, return the complement of the previous FPCW 3825c28e83SPiotr Jasiukajtis * bits 5-0. 3925c28e83SPiotr Jasiukajtis */ 4025c28e83SPiotr Jasiukajtis ENTRY(__swapTE) / di <-- NOT(desired xcptn_masks) 4125c28e83SPiotr Jasiukajtis subq $8,%rsp 4225c28e83SPiotr Jasiukajtis fstcw (%rsp) / push current_cw on '86 stack 4325c28e83SPiotr Jasiukajtis movq (%rsp),%rcx / cx <-- current_cw 4425c28e83SPiotr Jasiukajtis movw %cx,%ax / ax <-- current_cw 4525c28e83SPiotr Jasiukajtis orw $0x3f,%cx / cx <-- current_cw, but masking all xcptns 4625c28e83SPiotr Jasiukajtis andw $0x3f,%di / make sure bits > B5 are all zero 4725c28e83SPiotr Jasiukajtis xorw %di,%cx / cx <-- present_cw, with new xcptn_masks 4825c28e83SPiotr Jasiukajtis movw %cx,(%rsp) 49*55fea89dSDan Cross fldcw (%rsp) / load new cw 5025c28e83SPiotr Jasiukajtis stmxcsr (%rsp) 5125c28e83SPiotr Jasiukajtis movq (%rsp),%rcx 5225c28e83SPiotr Jasiukajtis orw $0x1f80,%cx / cx <-- current mxcsr, but masking all xcptns 5325c28e83SPiotr Jasiukajtis shlw $7,%di 5425c28e83SPiotr Jasiukajtis xorw %di,%cx / cx <-- present mxcsr, with new xcptn_masks 5525c28e83SPiotr Jasiukajtis movq %rcx,(%rsp) 5625c28e83SPiotr Jasiukajtis ldmxcsr (%rsp) 5725c28e83SPiotr Jasiukajtis andq $0x3f,%rax / al[5..0] <-- former xcptn_masks 5825c28e83SPiotr Jasiukajtis xorq $0x3f,%rax / al[5..0] <-- NOT(former xcptn_masks) 5925c28e83SPiotr Jasiukajtis addq $8,%rsp 6025c28e83SPiotr Jasiukajtis ret 6125c28e83SPiotr Jasiukajtis .align 16 6225c28e83SPiotr Jasiukajtis SET_SIZE(__swapTE) 6325c28e83SPiotr Jasiukajtis 6425c28e83SPiotr Jasiukajtis/* 6525c28e83SPiotr Jasiukajtis * swap exception flags 6625c28e83SPiotr Jasiukajtis * 6725c28e83SPiotr Jasiukajtis * Put bits 5-0 of the argument into FPSW bits 5-0 and MXCSR bits 5-0, 6825c28e83SPiotr Jasiukajtis * return the "or" of the previous FPSW bits 5-0 and MXCSR bits 5-0. 6925c28e83SPiotr Jasiukajtis */ 7025c28e83SPiotr Jasiukajtis ENTRY(__swapEX) 7125c28e83SPiotr Jasiukajtis fstsw %ax / ax = sw 7225c28e83SPiotr Jasiukajtis andq $0x3f,%rdi 7325c28e83SPiotr Jasiukajtis jnz .L1 7425c28e83SPiotr Jasiukajtis / input ex=0, clear all exception 75*55fea89dSDan Cross fnclex 7625c28e83SPiotr Jasiukajtis subq $8,%rsp 7725c28e83SPiotr Jasiukajtis stmxcsr (%rsp) 7825c28e83SPiotr Jasiukajtis movq (%rsp),%rcx 7925c28e83SPiotr Jasiukajtis orw %cx,%ax 8025c28e83SPiotr Jasiukajtis andw $0xffc0,%cx 8125c28e83SPiotr Jasiukajtis movq %rcx,(%rsp) 8225c28e83SPiotr Jasiukajtis ldmxcsr (%rsp) 8325c28e83SPiotr Jasiukajtis andq $0x3f,%rax 8425c28e83SPiotr Jasiukajtis addq $8,%rsp 8525c28e83SPiotr Jasiukajtis ret 8625c28e83SPiotr Jasiukajtis.L1: 8725c28e83SPiotr Jasiukajtis / input ex !=0, use fnstenv and fldenv 8825c28e83SPiotr Jasiukajtis subq $32,%rsp / only needed 28 8925c28e83SPiotr Jasiukajtis fnstenv (%rsp) 9025c28e83SPiotr Jasiukajtis movw %ax,%dx 9125c28e83SPiotr Jasiukajtis andw $0xffc0,%dx 9225c28e83SPiotr Jasiukajtis orw %cx,%dx 9325c28e83SPiotr Jasiukajtis movw %dx,4(%rsp) / replace old sw by new one 9425c28e83SPiotr Jasiukajtis fldenv (%rsp) 9525c28e83SPiotr Jasiukajtis stmxcsr (%rsp) 9625c28e83SPiotr Jasiukajtis movq (%rsp),%rdx 9725c28e83SPiotr Jasiukajtis orw %dx,%ax 9825c28e83SPiotr Jasiukajtis andw $0xffc0,%dx 9925c28e83SPiotr Jasiukajtis orw %cx,%dx 10025c28e83SPiotr Jasiukajtis movq %rdx,(%rsp) 10125c28e83SPiotr Jasiukajtis ldmxcsr (%rsp) 10225c28e83SPiotr Jasiukajtis andq $0x3f,%rax 10325c28e83SPiotr Jasiukajtis addq $32,%rsp 10425c28e83SPiotr Jasiukajtis ret 10525c28e83SPiotr Jasiukajtis .align 16 10625c28e83SPiotr Jasiukajtis SET_SIZE(__swapEX) 10725c28e83SPiotr Jasiukajtis 10825c28e83SPiotr Jasiukajtis/* 10925c28e83SPiotr Jasiukajtis * swap rounding precision 11025c28e83SPiotr Jasiukajtis * 11125c28e83SPiotr Jasiukajtis * Put bits 1-0 of the argument into FPCW bits 9-8, return the 11225c28e83SPiotr Jasiukajtis * previous FPCW bits 9-8. 11325c28e83SPiotr Jasiukajtis */ 11425c28e83SPiotr Jasiukajtis ENTRY(__swapRP) 11525c28e83SPiotr Jasiukajtis subq $8,%rsp 11625c28e83SPiotr Jasiukajtis fstcw (%rsp) 11725c28e83SPiotr Jasiukajtis movw (%rsp),%ax 11825c28e83SPiotr Jasiukajtis movw %ax,%cx 11925c28e83SPiotr Jasiukajtis andw $0xfcff,%cx 12025c28e83SPiotr Jasiukajtis andq $0x3,%rdi 12125c28e83SPiotr Jasiukajtis shlw $8,%di 12225c28e83SPiotr Jasiukajtis orw %di,%cx 12325c28e83SPiotr Jasiukajtis movq %rcx,(%rsp) 12425c28e83SPiotr Jasiukajtis fldcw (%rsp) 12525c28e83SPiotr Jasiukajtis shrw $8,%ax 12625c28e83SPiotr Jasiukajtis andq $0x3,%rax 12725c28e83SPiotr Jasiukajtis addq $8,%rsp 12825c28e83SPiotr Jasiukajtis ret 12925c28e83SPiotr Jasiukajtis .align 16 13025c28e83SPiotr Jasiukajtis SET_SIZE(__swapRP) 13125c28e83SPiotr Jasiukajtis 13225c28e83SPiotr Jasiukajtis/* 13325c28e83SPiotr Jasiukajtis * swap rounding direction 13425c28e83SPiotr Jasiukajtis * 13525c28e83SPiotr Jasiukajtis * Put bits 1-0 of the argument into FPCW bits 11-10 and MXCSR 13625c28e83SPiotr Jasiukajtis * bits 14-13, return the previous FPCW bits 11-10. 13725c28e83SPiotr Jasiukajtis */ 13825c28e83SPiotr Jasiukajtis ENTRY(__swapRD) 13925c28e83SPiotr Jasiukajtis subq $8,%rsp 14025c28e83SPiotr Jasiukajtis fstcw (%rsp) 14125c28e83SPiotr Jasiukajtis movw (%rsp),%ax 14225c28e83SPiotr Jasiukajtis movw %ax,%cx 14325c28e83SPiotr Jasiukajtis andw $0xf3ff,%cx 14425c28e83SPiotr Jasiukajtis andq $0x3,%rdi 14525c28e83SPiotr Jasiukajtis shlw $10,%di 14625c28e83SPiotr Jasiukajtis orw %di,%cx 14725c28e83SPiotr Jasiukajtis movq %rcx,(%rsp) 14825c28e83SPiotr Jasiukajtis fldcw (%rsp) 14925c28e83SPiotr Jasiukajtis stmxcsr (%rsp) 15025c28e83SPiotr Jasiukajtis movq (%rsp),%rcx 15125c28e83SPiotr Jasiukajtis andw $0x9fff,%cx 15225c28e83SPiotr Jasiukajtis shlw $3,%di 15325c28e83SPiotr Jasiukajtis orw %di,%cx 15425c28e83SPiotr Jasiukajtis movq %rcx,(%rsp) 15525c28e83SPiotr Jasiukajtis ldmxcsr (%rsp) 15625c28e83SPiotr Jasiukajtis shrw $10,%ax 15725c28e83SPiotr Jasiukajtis andq $0x3,%rax 15825c28e83SPiotr Jasiukajtis addq $8,%rsp 15925c28e83SPiotr Jasiukajtis ret 16025c28e83SPiotr Jasiukajtis .align 16 16125c28e83SPiotr Jasiukajtis SET_SIZE(__swapRD) 162