long USBEndpointDataSend(unsigned long ulBase, unsigned long ulEndpoint,
                         unsigned long ulTransType) {
  unsigned long ulTxPktRdy;
  ;

  ;
  if (ulEndpoint == 0x00000000) {
    if ((*((volatile unsigned char *)(ulBase + 0x00000102))) & 0x00000002) {
      return (-1);
    }
    ulTxPktRdy = ulTransType & 0xff;
  } else {
    if ((*((volatile unsigned char *)(ulBase + 0x00000102 + ulEndpoint))) &
        0x00000001) {
      return (-1);
    }
    ulTxPktRdy = (ulTransType >> 8) & 0xff;
  }
  (*((volatile unsigned char *)(ulBase + 0x00000102 + ulEndpoint))) =
      ulTxPktRdy;
  return (0);
}


x86 assembly (clang, -O0):
<USBEndpointDataSend>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1154 <USBEndpointDataSend+0x54>
mov    -0x10(%rbp),%rax
mov    0x102(%rax),%al
movzbl %al,%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1141 <USBEndpointDataSend+0x41>
movq   $0xffffffffffffffff,-0x8(%rbp)
ff
jmp    11b0 <USBEndpointDataSend+0xb0>
mov    -0x20(%rbp),%rax
and    $0xff,%rax
mov    %rax,-0x28(%rbp)
jmp    1192 <USBEndpointDataSend+0x92>
mov    -0x10(%rbp),%rax
add    $0x102,%rax
add    -0x18(%rbp),%rax
mov    (%rax),%al
movzbl %al,%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1180 <USBEndpointDataSend+0x80>
movq   $0xffffffffffffffff,-0x8(%rbp)
ff
jmp    11b0 <USBEndpointDataSend+0xb0>
mov    -0x20(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %al,%cl
mov    -0x10(%rbp),%rax
add    $0x102,%rax
add    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<USBEndpointDataSend>:
add    $0x102,%rdi
mov    $0xffffffffffffffff,%rax
test   %rsi,%rsi
je     1122 <USBEndpointDataSend+0x22>
testb  $0x1,(%rdi,%rsi,1)
jne    112e <USBEndpointDataSend+0x2e>
add    %rsi,%rdi
shr    $0x8,%rdx
jmp    112a <USBEndpointDataSend+0x2a>
testb  $0x2,(%rdi)
jne    112e <USBEndpointDataSend+0x2e>
add    %rsi,%rdi
mov    %dl,(%rdi)
xor    %eax,%eax
ret

LLVM IR (-O0):
define i64 @USBEndpointDataSend(i64 %0, i64 %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
store i64 %0, i64* %5
store i64 %1, i64* %6
store i64 %2, i64* %7
%9 = load i64, i64* %6
%10 = icmp eq i64 %9, 0
br i1 %10, label %11, label %23
11: ; preds = %3
%12 = load i64, i64* %5
%13 = add i64 %12, 258
%14 = inttoptr i64 %13 to i8*
%15 = load volatile i8, i8* %14
%16 = zext i8 %15 to i32
%17 = and i32 %16, 2
%18 = icmp ne i32 %17, 0
br i1 %18, label %19, label %20
19: ; preds = %11
store i64 -1, i64* %4
br label %46
20: ; preds = %11
%21 = load i64, i64* %7
%22 = and i64 %21, 255
store i64 %22, i64* %8
br label %38
23: ; preds = %3
%24 = load i64, i64* %5
%25 = add i64 %24, 258
%26 = load i64, i64* %6
%27 = add i64 %25, %26
%28 = inttoptr i64 %27 to i8*
%29 = load volatile i8, i8* %28
%30 = zext i8 %29 to i32
%31 = and i32 %30, 1
%32 = icmp ne i32 %31, 0
br i1 %32, label %33, label %34
33: ; preds = %23
store i64 -1, i64* %4
br label %46
34: ; preds = %23
%35 = load i64, i64* %7
%36 = lshr i64 %35, 8
%37 = and i64 %36, 255
store i64 %37, i64* %8
br label %38
38: ; preds = %34, %20
%39 = load i64, i64* %8
%40 = trunc i64 %39 to i8
%41 = load i64, i64* %5
%42 = add i64 %41, 258
%43 = load i64, i64* %6
%44 = add i64 %42, %43
%45 = inttoptr i64 %44 to i8*
store volatile i8 %40, i8* %45
store i64 0, i64* %4
br label %46
46: ; preds = %38, %33, %19
%47 = load i64, i64* %4
ret i64 %47
}

LLVM IR (-O2):
define i64 @USBEndpointDataSend(i64 %0, i64 %1, i64 %2) {
%4 = icmp eq i64 %1, 0
%5 = add i64 %0, 258
br i1 %4, label %6, label %14
6: ; preds = %3
%7 = inttoptr i64 %5 to i8*
%8 = load volatile i8, i8* %7
%9 = and i8 %8, 2
%10 = icmp eq i8 %9, 0
br i1 %10, label %11, label %26
11: ; preds = %6
%12 = add nuw nsw i64 %5, %1
%13 = inttoptr i64 %12 to i8*
br label %22
14: ; preds = %3
%15 = add i64 %5, %1
%16 = inttoptr i64 %15 to i8*
%17 = load volatile i8, i8* %16
%18 = and i8 %17, 1
%19 = icmp eq i8 %18, 0
br i1 %19, label %20, label %26
20: ; preds = %14
%21 = lshr i64 %2, 8
br label %22
22: ; preds = %11, %20
%23 = phi i8* [ %13, %11 ], [ %16, %20 ]
%24 = phi i64 [ %2, %11 ], [ %21, %20 ]
%25 = trunc i64 %24 to i8
store volatile i8 %25, i8* %23
br label %26
26: ; preds = %14, %6, %22
%27 = phi i64 [ 0, %22 ], [ -1, %6 ], [ -1, %14 ]
ret i64 %27
}