#include <stdio.h> #include <assert.h> typedef signed long long int Long; typedef unsigned long long int ULong; typedef signed int Int; typedef unsigned int UInt; typedef union { double d64; float f32[2]; unsigned long long int i64; } U; //////////////////// D from X //////////////////// __attribute__((noinline)) double do_scvtf_d_x_imm1 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf d18,x13,#1; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_scvtf_d_x_imm32 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf d18,x13,#32; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_scvtf_d_x_imm64 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf d18,x13,#64; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_ucvtf_d_x_imm1 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf d18,x13,#1; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_ucvtf_d_x_imm32 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf d18,x13,#32; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_ucvtf_d_x_imm64 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf d18,x13,#64; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } //////////////////// D from W //////////////////// __attribute__((noinline)) double do_scvtf_d_w_imm1 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf d18,w13,#1; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_scvtf_d_w_imm16 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf d18,w13,#16; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_scvtf_d_w_imm32 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf d18,w13,#32; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_ucvtf_d_w_imm1 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf d18,w13,#1; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_ucvtf_d_w_imm16 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf d18,w13,#16; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } __attribute__((noinline)) double do_ucvtf_d_w_imm32 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf d18,w13,#32; str d18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return block[1].d64; } //////////////////// S from X //////////////////// __attribute__((noinline)) double do_scvtf_s_x_imm1 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf s18,x13,#1; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_scvtf_s_x_imm32 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf s18,x13,#32; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_scvtf_s_x_imm64 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf s18,x13,#64; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_ucvtf_s_x_imm1 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf s18,x13,#1; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_ucvtf_s_x_imm32 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf s18,x13,#32; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_ucvtf_s_x_imm64 ( Long x ) { U block[2]; block[0].i64 = x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf s18,x13,#64; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } //////////////////// S from W //////////////////// __attribute__((noinline)) double do_scvtf_s_w_imm1 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf s18,w13,#1; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_scvtf_s_w_imm16 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf s18,w13,#16; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_scvtf_s_w_imm32 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; scvtf s18,w13,#32; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_ucvtf_s_w_imm1 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf s18,w13,#1; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_ucvtf_s_w_imm16 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf s18,w13,#16; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } __attribute__((noinline)) double do_ucvtf_s_w_imm32 ( Int x ) { U block[2]; block[0].i64 = (Long)x; block[1].i64 = 0; __asm__ __volatile__( "ldr x13,[%0,#0]; ucvtf s18,w13,#32; str s18, [%0,#8]" ::"r"(&block[0]) : "memory", "x13","q18"); return (double)block[1].f32[0]; } int main ( void ) { assert(sizeof(U) == 8); //////////////////// D from X //////////////////// #if 1 printf("\nscvtf_d_x_imm1\n"); printf("%18.12e\n", do_scvtf_d_x_imm1(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_d_x_imm1(0)); printf("%18.12e\n", do_scvtf_d_x_imm1(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_d_x_imm1(1234)); printf("%18.12e\n", do_scvtf_d_x_imm1(-1234)); printf("%18.12e\n", do_scvtf_d_x_imm1(0x8000000000000000UL)); printf("\nscvtf_d_x_imm32\n"); printf("%18.12e\n", do_scvtf_d_x_imm32(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_d_x_imm32(0)); printf("%18.12e\n", do_scvtf_d_x_imm32(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_d_x_imm32(1234)); printf("%18.12e\n", do_scvtf_d_x_imm32(-1234)); printf("%18.12e\n", do_scvtf_d_x_imm32(0x8000000000000000UL)); printf("\nscvtf_d_x_imm64\n"); printf("%18.12e\n", do_scvtf_d_x_imm64(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_d_x_imm64(0)); printf("%18.12e\n", do_scvtf_d_x_imm64(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_d_x_imm64(1234)); printf("%18.12e\n", do_scvtf_d_x_imm64(-1234)); printf("%18.12e\n", do_scvtf_d_x_imm64(0x8000000000000000UL)); printf("\nucvtf_d_x_imm1\n"); printf("%18.12e\n", do_ucvtf_d_x_imm1(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_d_x_imm1(0)); printf("%18.12e\n", do_ucvtf_d_x_imm1(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_d_x_imm1(1234)); printf("%18.12e\n", do_ucvtf_d_x_imm1(-1234)); printf("%18.12e\n", do_ucvtf_d_x_imm1(0x8000000000000000UL)); printf("\nucvtf_d_x_imm32\n"); printf("%18.12e\n", do_ucvtf_d_x_imm32(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_d_x_imm32(0)); printf("%18.12e\n", do_ucvtf_d_x_imm32(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_d_x_imm32(1234)); printf("%18.12e\n", do_ucvtf_d_x_imm32(-1234)); printf("%18.12e\n", do_ucvtf_d_x_imm32(0x8000000000000000UL)); printf("\nucvtf_d_x_imm64\n"); printf("%18.12e\n", do_ucvtf_d_x_imm64(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_d_x_imm64(0)); printf("%18.12e\n", do_ucvtf_d_x_imm64(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_d_x_imm64(1234)); printf("%18.12e\n", do_ucvtf_d_x_imm64(-1234)); printf("%18.12e\n", do_ucvtf_d_x_imm64(0x8000000000000000UL)); //////////////////// D from W //////////////////// printf("\nscvtf_d_w_imm1\n"); printf("%18.12e\n", do_scvtf_d_w_imm1(0xFFFFFFFF)); printf("%18.12e\n", do_scvtf_d_w_imm1(0)); printf("%18.12e\n", do_scvtf_d_w_imm1(0x7FFFFFFF)); printf("%18.12e\n", do_scvtf_d_w_imm1(1234)); printf("%18.12e\n", do_scvtf_d_w_imm1(-1234)); printf("%18.12e\n", do_scvtf_d_w_imm1(0x80000000)); printf("\nscvtf_d_w_imm16\n"); printf("%18.12e\n", do_scvtf_d_w_imm16(0xFFFFFFFF)); printf("%18.12e\n", do_scvtf_d_w_imm16(0)); printf("%18.12e\n", do_scvtf_d_w_imm16(0x7FFFFFFF)); printf("%18.12e\n", do_scvtf_d_w_imm16(1234)); printf("%18.12e\n", do_scvtf_d_w_imm16(-1234)); printf("%18.12e\n", do_scvtf_d_w_imm16(0x80000000)); printf("\nscvtf_d_w_imm32\n"); printf("%18.12e\n", do_scvtf_d_w_imm32(0xFFFFFFFF)); printf("%18.12e\n", do_scvtf_d_w_imm32(0)); printf("%18.12e\n", do_scvtf_d_w_imm32(0x7FFFFFFF)); printf("%18.12e\n", do_scvtf_d_w_imm32(1234)); printf("%18.12e\n", do_scvtf_d_w_imm32(-1234)); printf("%18.12e\n", do_scvtf_d_w_imm32(0x80000000)); printf("\nucvtf_d_w_imm1\n"); printf("%18.12e\n", do_ucvtf_d_w_imm1(0xFFFFFFFF)); printf("%18.12e\n", do_ucvtf_d_w_imm1(0)); printf("%18.12e\n", do_ucvtf_d_w_imm1(0x7FFFFFFF)); printf("%18.12e\n", do_ucvtf_d_w_imm1(1234)); printf("%18.12e\n", do_ucvtf_d_w_imm1(-1234)); printf("%18.12e\n", do_ucvtf_d_w_imm1(0x80000000)); printf("\nucvtf_d_w_imm16\n"); printf("%18.12e\n", do_ucvtf_d_w_imm16(0xFFFFFFFF)); printf("%18.12e\n", do_ucvtf_d_w_imm16(0)); printf("%18.12e\n", do_ucvtf_d_w_imm16(0x7FFFFFFF)); printf("%18.12e\n", do_ucvtf_d_w_imm16(1234)); printf("%18.12e\n", do_ucvtf_d_w_imm16(-1234)); printf("%18.12e\n", do_ucvtf_d_w_imm16(0x80000000)); printf("\nucvtf_d_w_imm32\n"); printf("%18.12e\n", do_ucvtf_d_w_imm32(0xFFFFFFFF)); printf("%18.12e\n", do_ucvtf_d_w_imm32(0)); printf("%18.12e\n", do_ucvtf_d_w_imm32(0x7FFFFFFF)); printf("%18.12e\n", do_ucvtf_d_w_imm32(1234)); printf("%18.12e\n", do_ucvtf_d_w_imm32(-1234)); printf("%18.12e\n", do_ucvtf_d_w_imm32(0x80000000)); //////////////////// S from X //////////////////// printf("\nscvtf_s_x_imm1\n"); printf("%18.12e\n", do_scvtf_s_x_imm1(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_s_x_imm1(0)); printf("%18.12e\n", do_scvtf_s_x_imm1(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_s_x_imm1(1234)); printf("%18.12e\n", do_scvtf_s_x_imm1(-1234)); printf("%18.12e\n", do_scvtf_s_x_imm1(0x8000000000000000UL)); printf("\nscvtf_s_x_imm32\n"); printf("%18.12e\n", do_scvtf_s_x_imm32(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_s_x_imm32(0)); printf("%18.12e\n", do_scvtf_s_x_imm32(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_s_x_imm32(1234)); printf("%18.12e\n", do_scvtf_s_x_imm32(-1234)); printf("%18.12e\n", do_scvtf_s_x_imm32(0x8000000000000000UL)); printf("\nscvtf_s_x_imm64\n"); printf("%18.12e\n", do_scvtf_s_x_imm64(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_s_x_imm64(0)); printf("%18.12e\n", do_scvtf_s_x_imm64(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_scvtf_s_x_imm64(1234)); printf("%18.12e\n", do_scvtf_s_x_imm64(-1234)); printf("%18.12e\n", do_scvtf_s_x_imm64(0x8000000000000000UL)); printf("\nucvtf_s_x_imm1\n"); printf("%18.12e\n", do_ucvtf_s_x_imm1(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_s_x_imm1(0)); printf("%18.12e\n", do_ucvtf_s_x_imm1(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_s_x_imm1(1234)); printf("%18.12e\n", do_ucvtf_s_x_imm1(-1234)); printf("%18.12e\n", do_ucvtf_s_x_imm1(0x8000000000000000UL)); printf("\nucvtf_s_x_imm32\n"); printf("%18.12e\n", do_ucvtf_s_x_imm32(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_s_x_imm32(0)); printf("%18.12e\n", do_ucvtf_s_x_imm32(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_s_x_imm32(1234)); printf("%18.12e\n", do_ucvtf_s_x_imm32(-1234)); printf("%18.12e\n", do_ucvtf_s_x_imm32(0x8000000000000000UL)); printf("\nucvtf_s_x_imm64\n"); printf("%18.12e\n", do_ucvtf_s_x_imm64(0xFFFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_s_x_imm64(0)); printf("%18.12e\n", do_ucvtf_s_x_imm64(0x7FFFFFFFFFFFFFFFUL)); printf("%18.12e\n", do_ucvtf_s_x_imm64(1234)); printf("%18.12e\n", do_ucvtf_s_x_imm64(-1234)); printf("%18.12e\n", do_ucvtf_s_x_imm64(0x8000000000000000UL)); //////////////////// S from W //////////////////// printf("\nscvtf_s_w_imm1\n"); printf("%18.12e\n", do_scvtf_s_w_imm1(0xFFFFFFFF)); printf("%18.12e\n", do_scvtf_s_w_imm1(0)); printf("%18.12e\n", do_scvtf_s_w_imm1(0x7FFFFFFF)); printf("%18.12e\n", do_scvtf_s_w_imm1(1234)); printf("%18.12e\n", do_scvtf_s_w_imm1(-1234)); printf("%18.12e\n", do_scvtf_s_w_imm1(0x80000000)); printf("\nscvtf_s_w_imm16\n"); printf("%18.12e\n", do_scvtf_s_w_imm16(0xFFFFFFFF)); printf("%18.12e\n", do_scvtf_s_w_imm16(0)); printf("%18.12e\n", do_scvtf_s_w_imm16(0x7FFFFFFF)); printf("%18.12e\n", do_scvtf_s_w_imm16(1234)); printf("%18.12e\n", do_scvtf_s_w_imm16(-1234)); printf("%18.12e\n", do_scvtf_s_w_imm16(0x80000000)); printf("\nscvtf_s_w_imm32\n"); printf("%18.12e\n", do_scvtf_s_w_imm32(0xFFFFFFFF)); printf("%18.12e\n", do_scvtf_s_w_imm32(0)); printf("%18.12e\n", do_scvtf_s_w_imm32(0x7FFFFFFF)); printf("%18.12e\n", do_scvtf_s_w_imm32(1234)); printf("%18.12e\n", do_scvtf_s_w_imm32(-1234)); printf("%18.12e\n", do_scvtf_s_w_imm32(0x80000000)); printf("\nucvtf_s_w_imm1\n"); printf("%18.12e\n", do_ucvtf_s_w_imm1(0xFFFFFFFF)); printf("%18.12e\n", do_ucvtf_s_w_imm1(0)); printf("%18.12e\n", do_ucvtf_s_w_imm1(0x7FFFFFFF)); printf("%18.12e\n", do_ucvtf_s_w_imm1(1234)); printf("%18.12e\n", do_ucvtf_s_w_imm1(-1234)); printf("%18.12e\n", do_ucvtf_s_w_imm1(0x80000000)); printf("\nucvtf_s_w_imm16\n"); printf("%18.12e\n", do_ucvtf_s_w_imm16(0xFFFFFFFF)); printf("%18.12e\n", do_ucvtf_s_w_imm16(0)); printf("%18.12e\n", do_ucvtf_s_w_imm16(0x7FFFFFFF)); printf("%18.12e\n", do_ucvtf_s_w_imm16(1234)); printf("%18.12e\n", do_ucvtf_s_w_imm16(-1234)); printf("%18.12e\n", do_ucvtf_s_w_imm16(0x80000000)); printf("\nucvtf_s_w_imm32\n"); printf("%18.12e\n", do_ucvtf_s_w_imm32(0xFFFFFFFF)); printf("%18.12e\n", do_ucvtf_s_w_imm32(0)); printf("%18.12e\n", do_ucvtf_s_w_imm32(0x7FFFFFFF)); printf("%18.12e\n", do_ucvtf_s_w_imm32(1234)); printf("%18.12e\n", do_ucvtf_s_w_imm32(-1234)); #endif printf("%18.12e\n", do_ucvtf_s_w_imm32(0x80000000)); #if 0 int i; double d = -4.90; for (i = 0; i < 100; i++) { printf("frintx_d(%f) = %f\n", d, do_frintx_d(d)); d += 0.1 * (1.0 - 1.0 / 30.0); } float f = -4.90; for (i = 0; i < 100; i++) { printf("frintx_s(%f) = %f\n", f, do_frintx_s(f)); f += 0.1 * (1.0 - 1.0 / 30.0); } #endif return 0; }