float_mips2vms(ofn, on) register float *ofn;
int on;
{
  register unsigned long n;
  unsigned long nn;
  int i;
  unsigned char *cptr;
  unsigned char c1;
  float val;
  for (i = 0; i < on; i++, ofn++) {
    cptr = (unsigned char *)ofn;
    c1 = *cptr;
    *cptr = *(cptr + 1);
    *(cptr + 1) = c1;
    c1 = *(cptr + 2);
    *(cptr + 2) = *(cptr + 3);
    *(cptr + 3) = c1;
    val = *((float *)cptr);
    val *= 4;
    *ofn = val;
  }
}


x86 assembly (clang, -O0):
<float_mips2vms>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11ae <float_mips2vms+0xae>
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x39(%rbp)
mov    -0x38(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,(%rax)
mov    -0x39(%rbp),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x38(%rbp),%rax
mov    0x2(%rax),%al
mov    %al,-0x39(%rbp)
mov    -0x38(%rbp),%rax
mov    0x3(%rax),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x39(%rbp),%cl
mov    -0x38(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x38(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  0xe83(%rip),%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    1112 <float_mips2vms+0x12>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<float_mips2vms>:
test   %esi,%esi
jle    1175 <float_mips2vms+0x75>
cmp    $0x1,%esi
je     1156 <float_mips2vms+0x56>
mov    %esi,%eax
and    $0xfffffffe,%eax
movss  0xeea(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
rolw   $0x8,(%rdi)
rolw   $0x8,0x2(%rdi)
movss  (%rdi),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rdi)
rolw   $0x8,0x4(%rdi)
rolw   $0x8,0x6(%rdi)
movss  0x4(%rdi),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,0x4(%rdi)
add    $0x8,%rdi
add    $0xfffffffe,%eax
jne    1120 <float_mips2vms+0x20>
test   $0x1,%sil
je     1175 <float_mips2vms+0x75>
rolw   $0x8,(%rdi)
rolw   $0x8,0x2(%rdi)
movss  (%rdi),%xmm0
mulss  0xe8f(%rip),%xmm0
movss  %xmm0,(%rdi)
ret

LLVM IR (-O0):
define i32 @float_mips2vms(float* %0, i32 %1) {
%3 = alloca i32
%4 = alloca float*
%5 = alloca i32
%6 = alloca i64
%7 = alloca i64
%8 = alloca i32
%9 = alloca i8*
%10 = alloca i8
%11 = alloca float
store float* %0, float** %4
store i32 %1, i32* %5
store i32 0, i32* %8
br label %12
12: ; preds = %46, %2
%13 = load i32, i32* %8
%14 = load i32, i32* %5
%15 = icmp slt i32 %13, %14
br i1 %15, label %16, label %51
16: ; preds = %12
%17 = load float*, float** %4
%18 = bitcast float* %17 to i8*
store i8* %18, i8** %9
%19 = load i8*, i8** %9
%20 = load i8, i8* %19
store i8 %20, i8* %10
%21 = load i8*, i8** %9
%22 = getelementptr inbounds i8, i8* %21, i64 1
%23 = load i8, i8* %22
%24 = load i8*, i8** %9
store i8 %23, i8* %24
%25 = load i8, i8* %10
%26 = load i8*, i8** %9
%27 = getelementptr inbounds i8, i8* %26, i64 1
store i8 %25, i8* %27
%28 = load i8*, i8** %9
%29 = getelementptr inbounds i8, i8* %28, i64 2
%30 = load i8, i8* %29
store i8 %30, i8* %10
%31 = load i8*, i8** %9
%32 = getelementptr inbounds i8, i8* %31, i64 3
%33 = load i8, i8* %32
%34 = load i8*, i8** %9
%35 = getelementptr inbounds i8, i8* %34, i64 2
store i8 %33, i8* %35
%36 = load i8, i8* %10
%37 = load i8*, i8** %9
%38 = getelementptr inbounds i8, i8* %37, i64 3
store i8 %36, i8* %38
%39 = load i8*, i8** %9
%40 = bitcast i8* %39 to float*
%41 = load float, float* %40
store float %41, float* %11
%42 = load float, float* %11
%43 = fmul float %42, 4.000000e+00
store float %43, float* %11
%44 = load float, float* %11
%45 = load float*, float** %4
store float %44, float* %45
br label %46
46: ; preds = %16
%47 = load i32, i32* %8
%48 = add nsw i32 %47, 1
store i32 %48, i32* %8
%49 = load float*, float** %4
%50 = getelementptr inbounds float, float* %49, i32 1
store float* %50, float** %4
br label %12
51: ; preds = %12
%52 = load i32, i32* %3
ret i32 %52
}

LLVM IR (-O2):
define i32 @float_mips2vms(float* nocapture %0, i32 %1) {
%3 = icmp sgt i32 %1, 0
br i1 %3, label %4, label %50
4: ; preds = %2
%5 = and i32 %1, 1
%6 = icmp eq i32 %1, 1
br i1 %6, label %36, label %7
7: ; preds = %4
%8 = and i32 %1, -2
br label %9
9: ; preds = %9, %7
%10 = phi float* [ %0, %7 ], [ %33, %9 ]
%11 = phi i32 [ 0, %7 ], [ %34, %9 ]
%12 = bitcast float* %10 to i8*
%13 = load i8, i8* %12
%14 = getelementptr inbounds i8, i8* %12, i64 1
%15 = load i8, i8* %14
store i8 %15, i8* %12
store i8 %13, i8* %14
%16 = getelementptr inbounds i8, i8* %12, i64 2
%17 = load i8, i8* %16
%18 = getelementptr inbounds i8, i8* %12, i64 3
%19 = load i8, i8* %18
store i8 %19, i8* %16
store i8 %17, i8* %18
%20 = load float, float* %10
%21 = fmul float %20, 4.000000e+00
store float %21, float* %10
%22 = getelementptr inbounds float, float* %10, i64 1
%23 = bitcast float* %22 to i8*
%24 = load i8, i8* %23
%25 = getelementptr inbounds i8, i8* %23, i64 1
%26 = load i8, i8* %25
store i8 %26, i8* %23
store i8 %24, i8* %25
%27 = getelementptr inbounds i8, i8* %23, i64 2
%28 = load i8, i8* %27
%29 = getelementptr inbounds i8, i8* %23, i64 3
%30 = load i8, i8* %29
store i8 %30, i8* %27
store i8 %28, i8* %29
%31 = load float, float* %22
%32 = fmul float %31, 4.000000e+00
store float %32, float* %22
%33 = getelementptr inbounds float, float* %10, i64 2
%34 = add i32 %11, 2
%35 = icmp eq i32 %34, %8
br i1 %35, label %36, label %9
36: ; preds = %9, %4
%37 = phi float* [ %0, %4 ], [ %33, %9 ]
%38 = icmp eq i32 %5, 0
br i1 %38, label %50, label %39
39: ; preds = %36
%40 = bitcast float* %37 to i8*
%41 = load i8, i8* %40
%42 = getelementptr inbounds i8, i8* %40, i64 1
%43 = load i8, i8* %42
store i8 %43, i8* %40
store i8 %41, i8* %42
%44 = getelementptr inbounds i8, i8* %40, i64 2
%45 = load i8, i8* %44
%46 = getelementptr inbounds i8, i8* %40, i64 3
%47 = load i8, i8* %46
store i8 %47, i8* %44
store i8 %45, i8* %46
%48 = load float, float* %37
%49 = fmul float %48, 4.000000e+00
store float %49, float* %37
br label %50
50: ; preds = %39, %36, %2
ret i32 undef
}